fulldev-ui 0.5.0-beta.9 → 0.6.0-beta-5

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 (342) hide show
  1. package/.env.example +3 -0
  2. package/.prettierrc.yaml +1 -0
  3. package/astro.config.ts +10 -34
  4. package/cloudcannon.config.yml +235 -0
  5. package/package.json +25 -29
  6. package/pnpm-lock.yaml +943 -2157
  7. package/public/favicon/android-chrome-192x192.png +0 -0
  8. package/public/favicon/android-chrome-512x512.png +0 -0
  9. package/public/favicon/apple-touch-icon.png +0 -0
  10. package/public/favicon/manifest.webmanifest +7 -3
  11. package/public/favicon/mstile-150x150.png +0 -0
  12. package/src/blocks/Banner.astro +14 -29
  13. package/src/blocks/Contact1.astro +92 -0
  14. package/src/blocks/Content1.astro +77 -0
  15. package/src/blocks/Content2.astro +91 -0
  16. package/src/blocks/Content3.astro +70 -0
  17. package/src/blocks/Content4.astro +72 -0
  18. package/src/blocks/Cta1.astro +58 -0
  19. package/src/blocks/Feature1.astro +61 -0
  20. package/src/blocks/Features1.astro +66 -0
  21. package/src/blocks/Footer.astro +100 -3
  22. package/src/blocks/Header.astro +192 -3
  23. package/src/blocks/Hero1.astro +60 -0
  24. package/src/blocks/Logos1.astro +55 -0
  25. package/src/blocks/Products1.astro +90 -0
  26. package/src/blocks/Reviews1.astro +75 -0
  27. package/src/blocks/_Hero.astro +245 -0
  28. package/src/components/Avatar.astro +28 -9
  29. package/src/components/Avatars.astro +36 -0
  30. package/src/components/Badge.astro +63 -24
  31. package/src/components/Badges.astro +16 -23
  32. package/src/components/Block.astro +30 -0
  33. package/src/components/Blocks.astro +26 -0
  34. package/src/components/Breadcrumb.astro +58 -0
  35. package/src/components/Button.astro +49 -119
  36. package/src/components/Buttons.astro +23 -13
  37. package/src/components/Card.astro +9 -137
  38. package/src/components/Cards.astro +33 -35
  39. package/src/components/Carousel.astro +106 -0
  40. package/src/components/Cart.astro +18 -14
  41. package/src/components/CartAdd.svelte +76 -0
  42. package/src/components/CartCheckout.svelte +58 -0
  43. package/src/components/CartForm.svelte +130 -0
  44. package/src/components/CartList.svelte +88 -0
  45. package/src/components/CartQuantity.svelte +81 -0
  46. package/src/components/CartSummary.astro +16 -105
  47. package/src/components/CartTotal.svelte +15 -0
  48. package/src/components/Channel.astro +44 -35
  49. package/src/components/Channels.astro +20 -6
  50. package/src/components/Checkbox.astro +52 -27
  51. package/src/components/Code.astro +52 -0
  52. package/src/components/Container.astro +25 -0
  53. package/src/components/Dialog.astro +3 -2
  54. package/src/components/Drawer.astro +55 -146
  55. package/src/components/DrawerOld.astro +143 -0
  56. package/src/components/Element.astro +18 -8
  57. package/src/components/Form.astro +16 -13
  58. package/src/components/Gallery.astro +174 -0
  59. package/src/components/Group.astro +25 -0
  60. package/src/components/Head.astro +62 -25
  61. package/src/components/Header.astro +10 -115
  62. package/src/components/Heading.astro +51 -44
  63. package/src/components/Icon.astro +29 -33
  64. package/src/components/Image.astro +18 -68
  65. package/src/components/Input.astro +65 -51
  66. package/src/components/Label.astro +20 -15
  67. package/src/components/Layout.astro +35 -0
  68. package/src/components/Link.astro +51 -32
  69. package/src/components/Links.astro +42 -0
  70. package/src/components/List.astro +41 -16
  71. package/src/components/LocaleSwitcher.astro +2 -2
  72. package/src/components/Logo.astro +56 -0
  73. package/src/components/Menu.astro +21 -17
  74. package/src/components/Navigation.astro +39 -0
  75. package/src/components/Panel.astro +25 -0
  76. package/src/components/Paragraph.astro +55 -0
  77. package/src/components/Price.astro +4 -4
  78. package/src/components/Prose.astro +86 -0
  79. package/src/components/Rating.astro +23 -62
  80. package/src/components/Search.astro +107 -43
  81. package/src/components/Section.astro +13 -242
  82. package/src/components/Select.astro +45 -55
  83. package/src/components/Sidebar.astro +53 -76
  84. package/src/components/Social.astro +11 -9
  85. package/src/components/Socials.astro +9 -5
  86. package/src/components/Stack.astro +25 -0
  87. package/src/components/Subheader.astro +59 -0
  88. package/src/components/Switch.astro +72 -29
  89. package/src/components/Table.astro +1 -1
  90. package/src/components/Tagline.astro +31 -13
  91. package/src/components/Textarea.astro +40 -50
  92. package/src/components/Themer.astro +76 -0
  93. package/src/components/Toc.astro +30 -37
  94. package/src/components/Writeup.astro +34 -65
  95. package/src/components/_Author.astro +90 -0
  96. package/src/components/_Header.astro +129 -0
  97. package/src/components/_Image.astro +79 -0
  98. package/src/components/_Prose copy.astro +172 -0
  99. package/src/components/_Sidebar copy.astro +87 -0
  100. package/src/components/docs/PropsTable.astro +38 -264
  101. package/src/components/experimental/Window.astro +5 -57
  102. package/src/content/config.ts +3 -10
  103. package/src/content/{presets → layouts}/base.yml +52 -73
  104. package/src/content/pages/blocks/_categories.mdx +0 -2
  105. package/src/content/pages/blocks/_footer.mdx +0 -2
  106. package/src/content/pages/blocks/_header.mdx +0 -4
  107. package/src/content/pages/blocks/_jobs.mdx +0 -2
  108. package/src/content/pages/blocks/_prices.mdx +0 -2
  109. package/src/content/pages/blocks/_product.mdx +0 -2
  110. package/src/content/pages/blocks/_products.mdx +0 -2
  111. package/src/content/pages/blocks/_stats.mdx +0 -2
  112. package/src/content/pages/blocks/banner.mdx +0 -2
  113. package/src/content/pages/blocks/colleagues.mdx +0 -3
  114. package/src/content/pages/blocks/contact.mdx +0 -2
  115. package/src/content/pages/blocks/content.mdx +0 -6
  116. package/src/content/pages/blocks/cta.mdx +0 -10
  117. package/src/content/pages/blocks/features.mdx +0 -5
  118. package/src/content/pages/blocks/hero.mdx +0 -5
  119. package/src/content/pages/blocks/intro.mdx +0 -5
  120. package/src/content/pages/blocks/posts.mdx +0 -2
  121. package/src/content/pages/blocks/reviews.mdx +0 -3
  122. package/src/content/pages/categories/category.md +7 -0
  123. package/src/content/pages/docs/_internationalization.mdx +55 -0
  124. package/src/content/pages/docs/_using-blocks.mdx +33 -0
  125. package/src/content/pages/docs/_using-presets.mdx +49 -0
  126. package/src/content/pages/docs/blocks.mdx +33 -0
  127. package/src/content/pages/docs/collections/images.mdx +102 -0
  128. package/src/content/pages/docs/collections/pages.mdx +119 -0
  129. package/src/content/pages/docs/collections/presets.mdx +60 -0
  130. package/src/content/pages/docs/collections.mdx +42 -0
  131. package/src/content/pages/{base/card.mdx → docs/components/_card.mdx} +2 -5
  132. package/src/content/pages/{base → docs/components}/_dialog.mdx +1 -2
  133. package/src/content/pages/{base → docs/components}/_drawer.mdx +1 -2
  134. package/src/content/pages/{base → docs/components}/_localeswitcher.mdx +1 -2
  135. package/src/content/pages/{base → docs/components}/_switch.mdx +3 -4
  136. package/src/content/pages/{typography → docs/components}/_tagline.mdx +3 -4
  137. package/src/content/pages/docs/components/_toggle.mdx +30 -0
  138. package/src/content/pages/docs/components/avatar.mdx +34 -0
  139. package/src/content/pages/{base → docs/components}/badge.mdx +28 -10
  140. package/src/content/pages/docs/components/badges.mdx +46 -0
  141. package/src/content/pages/docs/components/button.mdx +78 -0
  142. package/src/content/pages/docs/components/buttons.mdx +51 -0
  143. package/src/content/pages/docs/components/channel.mdx +91 -0
  144. package/src/content/pages/docs/components/channels.mdx +89 -0
  145. package/src/content/pages/docs/components/checkbox.mdx +34 -0
  146. package/src/content/pages/docs/components/code.mdx +45 -0
  147. package/src/content/pages/docs/components/heading.mdx +59 -0
  148. package/src/content/pages/docs/components/icon.mdx +48 -0
  149. package/src/content/pages/docs/components/image.mdx +25 -0
  150. package/src/content/pages/docs/components/input.mdx +40 -0
  151. package/src/content/pages/{typography → docs/components}/label.mdx +9 -6
  152. package/src/content/pages/{typography → docs/components}/link.mdx +24 -10
  153. package/src/content/pages/docs/components/links.mdx +99 -0
  154. package/src/content/pages/docs/components/list.mdx +44 -0
  155. package/src/content/pages/docs/components/logo.mdx +36 -0
  156. package/src/content/pages/docs/components/menu.mdx +89 -0
  157. package/src/content/pages/docs/components/prose.mdx +36 -0
  158. package/src/content/pages/docs/components/rating.mdx +76 -0
  159. package/src/content/pages/{base → docs/components}/section.mdx +2 -3
  160. package/src/content/pages/{base → docs/components}/select.mdx +1 -11
  161. package/src/content/pages/docs/components/social.mdx +94 -0
  162. package/src/content/pages/docs/components/socials.mdx +102 -0
  163. package/src/content/pages/docs/components/switch.mdx +34 -0
  164. package/src/content/pages/{base → docs/components}/table.mdx +1 -4
  165. package/src/content/pages/docs/components/tagline.mdx +46 -0
  166. package/src/content/pages/docs/components/text.mdx +48 -0
  167. package/src/content/pages/docs/components/textarea.mdx +34 -0
  168. package/src/content/pages/docs/components/themer.mdx +49 -0
  169. package/src/content/pages/docs/components.mdx +37 -0
  170. package/src/content/pages/docs/customization.mdx +151 -0
  171. package/src/content/pages/docs/frameworks.mdx +29 -0
  172. package/src/content/pages/docs/generating-pages.mdx +129 -0
  173. package/src/content/pages/docs/index.mdx +20 -0
  174. package/src/content/pages/docs/installation.mdx +50 -0
  175. package/src/content/pages/docs/layouts.mdx +33 -0
  176. package/src/content/pages/index.mdx +25 -33
  177. package/src/content/pages/posts/post.md +7 -0
  178. package/src/content/pages/products/product.md +20 -0
  179. package/src/content/pages/showcase/anti-slip-profiles.md +2 -2
  180. package/src/content/pages/showcase/fulldev-ui.md +1 -1
  181. package/src/content/pages/showcase/lavis-detailing.md +1 -1
  182. package/src/content/pages/showcase/leren-trainingsacteren.md +1 -1
  183. package/src/content/pages/showcase/miele-witgoedcenter-amsterdam.md +1 -1
  184. package/src/content/pages/showcase/sloepverhuur-bolsward.md +1 -1
  185. package/src/content/pages/showcase/stark-vulcanising-products.md +1 -1
  186. package/src/content/pages/showcase/the-gym-haren.md +1 -1
  187. package/src/content/pages/showcase/van-dillen-antieke-bouwmaterialen.md +1 -1
  188. package/src/content/pages/showcase.mdx +4 -3
  189. package/src/css/color.css +0 -10
  190. package/src/css/custom.css +10 -12
  191. package/src/css/size.css +2 -11
  192. package/src/css/theme.css +95 -0
  193. package/src/env.d.ts +1 -0
  194. package/src/images/favicon/android-chrome-192x192.png +0 -0
  195. package/src/images/favicon/android-chrome-512x512.png +0 -0
  196. package/src/images/favicon/apple-touch-icon.png +0 -0
  197. package/src/images/favicon/browserconfig.xml +9 -0
  198. package/src/images/favicon/favicon-16x16.png +0 -0
  199. package/src/images/favicon/favicon-32x32.png +0 -0
  200. package/src/images/favicon/favicon-48x48.png +0 -0
  201. package/src/images/favicon/favicon.ico +0 -0
  202. package/src/images/favicon/favicon.svg +16 -0
  203. package/src/images/favicon/manifest.webmanifest +30 -0
  204. package/src/images/favicon/mstile-150x150.png +0 -0
  205. package/src/images/favicon/safari-pinned-tab.svg +16 -0
  206. package/src/images/favicon/yandex-browser-50x50.png +0 -0
  207. package/src/images/favicon/yandex-browser-manifest.json +9 -0
  208. package/src/images/logo-1.svg +11 -0
  209. package/src/images/logo-2.svg +13 -0
  210. package/src/images/logo-basic.svg +10 -0
  211. package/src/images/logo-simple.svg +13 -0
  212. package/src/images/logo-thin.svg +15 -0
  213. package/src/images/logo.svg +14 -0
  214. package/src/images/logofat.svg +11 -0
  215. package/src/integration/index.ts +110 -140
  216. package/src/layouts/Category.astro +136 -0
  217. package/src/layouts/Doc.astro +56 -0
  218. package/src/layouts/Job.astro +60 -0
  219. package/src/layouts/Page.astro +29 -0
  220. package/src/layouts/Post.astro +52 -0
  221. package/src/layouts/Product.astro +114 -0
  222. package/src/pages/[...page].astro +29 -24
  223. package/src/pages/test.astro +37 -0
  224. package/src/schemas/components/avatar.ts +4 -1
  225. package/src/schemas/components/badge.ts +16 -11
  226. package/src/schemas/components/block.ts +60 -0
  227. package/src/schemas/components/button.ts +17 -14
  228. package/src/schemas/components/channel.ts +15 -9
  229. package/src/schemas/components/footer.ts +15 -21
  230. package/src/schemas/components/head.ts +17 -0
  231. package/src/schemas/components/header.ts +19 -7
  232. package/src/schemas/components/heading.ts +7 -1
  233. package/src/schemas/components/icon.ts +7 -1
  234. package/src/schemas/components/image.ts +38 -16
  235. package/src/schemas/components/link.ts +17 -0
  236. package/src/schemas/components/logo.ts +12 -2
  237. package/src/schemas/components/menu.ts +11 -11
  238. package/src/schemas/components/navigation.ts +10 -0
  239. package/src/schemas/components/paragraph.ts +9 -0
  240. package/src/schemas/components/price.ts +7 -1
  241. package/src/schemas/components/rating.ts +8 -13
  242. package/src/schemas/components/sidebar.ts +14 -11
  243. package/src/schemas/components/social.ts +16 -1
  244. package/src/schemas/components/tagline.ts +7 -1
  245. package/src/schemas/imageSchema.ts +33 -4
  246. package/src/schemas/page.ts +39 -0
  247. package/src/stores/cart.svelte.ts +79 -0
  248. package/src/stores/cart.ts +59 -6
  249. package/src/types/global-props.ts +0 -9
  250. package/src/types/{virtual-modules.d.ts → virtual.d.ts} +1 -1
  251. package/src/utils/cart.ts +1 -10
  252. package/src/utils/formatEntries.ts +8 -0
  253. package/src/utils/formatEntry.ts +29 -0
  254. package/src/utils/getDeepReferenceChildren.ts +14 -0
  255. package/src/utils/getHref.ts +6 -0
  256. package/src/utils/getReferenceChildren.ts +1 -1
  257. package/src/utils/setTheme.ts +18 -0
  258. package/src/utils/slugify.ts +6 -0
  259. package/svelte.config.js +5 -0
  260. package/tailwind.config.ts +71 -0
  261. package/tsconfig.json +1 -3
  262. package/src/blocks/Article.astro +0 -40
  263. package/src/blocks/Categories.astro +0 -12
  264. package/src/blocks/Colleagues.astro +0 -13
  265. package/src/blocks/Contact.astro +0 -116
  266. package/src/blocks/Content.astro +0 -12
  267. package/src/blocks/Cta.astro +0 -15
  268. package/src/blocks/Excerpt.astro +0 -14
  269. package/src/blocks/Features.astro +0 -11
  270. package/src/blocks/Hero.astro +0 -15
  271. package/src/blocks/Intro.astro +0 -23
  272. package/src/blocks/Jobs.astro +0 -12
  273. package/src/blocks/Posts.astro +0 -11
  274. package/src/blocks/Prices.astro +0 -24
  275. package/src/blocks/Product.astro +0 -110
  276. package/src/blocks/Products.astro +0 -11
  277. package/src/blocks/Reviews.astro +0 -13
  278. package/src/components/CartForm.astro +0 -121
  279. package/src/components/CartList.astro +0 -134
  280. package/src/components/Footer.astro +0 -193
  281. package/src/components/Text.astro +0 -43
  282. package/src/components/ThemeSelect.astro +0 -41
  283. package/src/components/experimental/Form.astro +0 -53
  284. package/src/components/experimental/Gallery.astro +0 -104
  285. package/src/components/experimental/Logo.astro +0 -38
  286. package/src/components/experimental/Prose.astro +0 -192
  287. package/src/components/sections.astro +0 -28
  288. package/src/content/pages/base/button.mdx +0 -60
  289. package/src/content/pages/base/checkbox.mdx +0 -42
  290. package/src/content/pages/base/icon.mdx +0 -55
  291. package/src/content/pages/base/image.mdx +0 -42
  292. package/src/content/pages/base/input.mdx +0 -56
  293. package/src/content/pages/base/rating.mdx +0 -55
  294. package/src/content/pages/base/textarea.mdx +0 -58
  295. package/src/content/pages/base/theme-select.mdx +0 -15
  296. package/src/content/pages/layouts/_layout.mdx +0 -14
  297. package/src/content/pages/layouts/docslayout.mdx +0 -14
  298. package/src/content/pages/overview/components.mdx +0 -75
  299. package/src/content/pages/overview/content-collections.mdx +0 -139
  300. package/src/content/pages/overview/frameworks.mdx +0 -198
  301. package/src/content/pages/overview/installation.mdx +0 -53
  302. package/src/content/pages/overview/introduction.mdx +0 -30
  303. package/src/content/pages/overview/theming.mdx +0 -69
  304. package/src/content/pages/schemas/page.mdx +0 -17
  305. package/src/content/pages/schemas/preset.mdx +0 -9
  306. package/src/content/pages/showcase/record.md +0 -3
  307. package/src/content/pages/typography/heading.mdx +0 -73
  308. package/src/content/pages/typography/list.mdx +0 -51
  309. package/src/content/pages/typography/text.mdx +0 -61
  310. package/src/content/presets/blocks.yml +0 -1
  311. package/src/content/presets/docs.yml +0 -6
  312. package/src/css/space.css +0 -77
  313. package/src/css/styles.css +0 -0
  314. package/src/images/avatar-1.yml +0 -1
  315. package/src/integration/generate-colors.ts +0 -639
  316. package/src/integration/tailwind-plugin.ts +0 -80
  317. package/src/integration/unocss-preset.ts +0 -84
  318. package/src/layouts/BlockLayout.astro +0 -19
  319. package/src/layouts/ContactLayout.astro +0 -21
  320. package/src/layouts/DocsLayout.astro +0 -73
  321. package/src/layouts/Layout.astro +0 -163
  322. package/src/layouts/OverviewLayout.astro +0 -42
  323. package/src/layouts/PostLayout.astro +0 -21
  324. package/src/layouts/ProductLayout.astro +0 -21
  325. package/src/loaders/imageLoader.ts +0 -26
  326. package/src/schemas/components/avatars.ts +0 -4
  327. package/src/schemas/components/buttons.ts +0 -4
  328. package/src/schemas/components/card.ts +0 -25
  329. package/src/schemas/components/cards.ts +0 -4
  330. package/src/schemas/components/channels.ts +0 -4
  331. package/src/schemas/components/images.ts +0 -4
  332. package/src/schemas/components/list.ts +0 -3
  333. package/src/schemas/components/section.ts +0 -15
  334. package/src/schemas/components/sections.ts +0 -3
  335. package/src/schemas/components/socials.ts +0 -4
  336. package/src/schemas/components/text.ts +0 -3
  337. package/src/schemas/components/toc.ts +0 -3
  338. package/src/schemas/components/writeup.ts +0 -20
  339. package/src/schemas/pageSchema.ts +0 -101
  340. package/src/schemas/presetSchema.ts +0 -3
  341. package/src/schemas/utils/navigation.ts +0 -8
  342. package/src/schemas/utils/parents.ts +0 -3
@@ -0,0 +1,114 @@
1
+ ---
2
+ import type { ComponentProps } from 'astro/types'
3
+ import { getImage } from 'astro:assets'
4
+ import type { CollectionEntry } from 'astro:content'
5
+ import { getCollection, getEntry } from 'astro:content'
6
+ import Products1 from 'fulldev-ui/blocks/Products1.astro'
7
+ import CartForm from 'fulldev-ui/components/CartForm.svelte'
8
+ import Element from 'fulldev-ui/components/Element.astro'
9
+ import Gallery from 'fulldev-ui/components/Gallery.astro'
10
+ import Heading from 'fulldev-ui/components/Heading.astro'
11
+ import Layout from 'fulldev-ui/components/Layout.astro'
12
+ import List from 'fulldev-ui/components/List.astro'
13
+ import Paragraph from 'fulldev-ui/components/Paragraph.astro'
14
+ import Prose from 'fulldev-ui/components/Prose.astro'
15
+ import type { PageSchema } from 'fulldev-ui/schemas/page'
16
+
17
+ interface Props extends ComponentProps<typeof Layout>, PageSchema {
18
+ render: CollectionEntry<'pages'>['render']
19
+ }
20
+
21
+ const {
22
+ render,
23
+ title,
24
+ price,
25
+ images,
26
+ description,
27
+ soldout,
28
+ categories,
29
+ variants,
30
+ } = Astro.props
31
+
32
+ const slug = Astro.url.pathname.replace(/^\/|\/$/g, '') || 'index'
33
+ const imageId = images?.[0]?.id
34
+ const src = `/src/images/${imageId}`
35
+ const allImages = import.meta.glob<{ default: ImageMetadata }>('/src/images/*')
36
+ const foundImage = allImages[src]
37
+ const gotImage =
38
+ imageId && (await getImage({ src: foundImage ? foundImage() : src }))
39
+
40
+ const relatedProducts = await getCollection('products', (product) =>
41
+ product.data.categories?.some((category) =>
42
+ categories?.map((c) => c.slug).includes(category.slug)
43
+ )
44
+ )
45
+
46
+ const baseLayout = await getEntry('layouts', 'base')
47
+ ---
48
+
49
+ <Layout
50
+ class:list="product"
51
+ {...Astro.props}
52
+ >
53
+ <Element
54
+ class:list="product"
55
+ as="section"
56
+ >
57
+ <Element class:list="product-container">
58
+ <Element class:list="product-main">
59
+ <Gallery {images} />
60
+ <!-- <Prose {render} /> -->
61
+ </Element>
62
+ <Element class:list="product-segment">
63
+ <Element class:list="product-content">
64
+ <Heading
65
+ as="h1"
66
+ size="3xl"
67
+ text={title}
68
+ />
69
+ <Paragraph text={description} />
70
+ </Element>
71
+ <!-- <CartForm
72
+ product={Astro.props}
73
+ client:load
74
+ /> -->
75
+ <List
76
+ size="sm"
77
+ items={baseLayout.data.banner?.split('|')}
78
+ />
79
+ </Element>
80
+ </Element>
81
+ </Element>
82
+ <Products1
83
+ heading="Gerelateerde producten"
84
+ products={[...relatedProducts].sort(() => Math.random() - 0.5).slice(0, 6)}
85
+ />
86
+ <slot />
87
+ </Layout>
88
+
89
+ <style is:global>
90
+ .product {
91
+ @apply relative w-full;
92
+
93
+ .product-container {
94
+ @apply flex h-full w-full flex-col items-start gap-32 lg:container lg:grid lg:grid-cols-2 lg:py-8;
95
+ }
96
+
97
+ .product-segment {
98
+ @apply z-10 flex flex-col items-start gap-8 max-lg:container lg:sticky lg:top-0;
99
+
100
+ --height: calc(
101
+ var(--header-height, 0px) + var(--subheader-height, 0px) + 2rem
102
+ );
103
+ top: var(--height);
104
+ }
105
+
106
+ .product-content {
107
+ @apply flex max-w-screen-md flex-col gap-6;
108
+ }
109
+
110
+ &.dark {
111
+ @apply bg-background;
112
+ }
113
+ }
114
+ </style>
@@ -1,43 +1,48 @@
1
1
  ---
2
- import { getCollection } from 'astro:content'
3
- import Layout from 'fulldev-ui/layouts/Layout.astro'
2
+ import { getCollection, getEntry } from 'astro:content'
3
+ import { getHref } from 'fulldev-ui/utils/getHref.ts'
4
+ import { dash, pascal } from 'radash'
5
+ import { mergeDeep } from 'remeda'
4
6
 
5
7
  export async function getStaticPaths() {
6
- const pages = await getCollection('pages')
7
- return pages.map((page) => ({
8
+ const collection = await getCollection('pages')
9
+ return collection.map((entry) => ({
8
10
  params: {
9
- page: page.slug === 'index' ? undefined : page.slug,
11
+ page: getHref(entry.slug),
10
12
  },
11
- props: page,
13
+ props: entry,
12
14
  }))
13
15
  }
14
16
 
15
- const { data, ...rest } = Astro.props
17
+ const layoutName = Astro.props.data._layout ?? 'Page'
18
+ const layoutComponentName = pascal(layoutName)
16
19
 
17
- const { component, ...restData } = data
18
-
19
- const allComponents = {
20
- ...import.meta.glob('/src/**/*.astro'),
21
- ...import.meta.glob('../../**/*.astro'),
20
+ const layoutsComponents = {
21
+ ...import.meta.glob('/src/layouts/**/*.astro'),
22
+ ...import.meta.glob('../layouts/**/*.astro'),
22
23
  }
23
24
 
24
- const componentPath = Object.keys(allComponents).find(
25
- (path) => path.split('/').pop()?.split('.')[0] === component
25
+ const layoutComponentPath = Object.keys(layoutsComponents).find(
26
+ (path) => path.split('/').pop()?.split('.')[0] === layoutComponentName
26
27
  )
27
28
 
28
- const Component =
29
- componentPath && (await (allComponents[componentPath] as any)()).default
29
+ const LayoutComponent =
30
+ layoutComponentPath &&
31
+ (await (layoutsComponents[layoutComponentPath] as any)()).default
32
+
33
+ const layoutEntryName = dash(layoutName)
34
+ const layoutEntry = await getEntry('layouts', layoutEntryName)
35
+ const baseLayout = await getEntry('layouts', 'base')
36
+ const mergedLayouts = mergeDeep(baseLayout || {}, layoutEntry || {})
37
+ const merged = mergeDeep(mergedLayouts, Astro.props)
38
+
39
+ const { data, ...rest } = merged
30
40
  ---
31
41
 
32
42
  {
33
- Component ? (
34
- <Component
35
- {...restData}
36
- {...rest}
37
- />
38
- ) : (
39
- <Layout
40
- {...(data as any)}
43
+ LayoutComponent && (
44
+ <LayoutComponent
45
+ {...data}
41
46
  {...rest}
42
47
  />
43
48
  )
@@ -0,0 +1,37 @@
1
+ ---
2
+ import Hero1 from 'fulldev-ui/blocks/Hero1.astro'
3
+ import Layout from 'fulldev-ui/components/Layout.astro'
4
+
5
+ import { $cart } from 'fulldev-ui/stores/cart'
6
+
7
+ const value = $cart.get()
8
+
9
+ console.log({ value })
10
+ ---
11
+
12
+ <Layout>
13
+ <Hero1
14
+ heading="hello world"
15
+ class="hoi"
16
+ />
17
+ {value}
18
+
19
+ <button id="myyy-button">Add item</button>
20
+
21
+ <script>
22
+ import { addItem } from 'fulldev-ui/stores/cart'
23
+
24
+ const button = document.querySelector('#myyy-button')
25
+ button?.addEventListener('click', () => {
26
+ console.log('clicked')
27
+ addItem({
28
+ slug: 'test',
29
+ title: 'title',
30
+ price: 10,
31
+ quantity: 10,
32
+ image: '',
33
+ variants: [],
34
+ })
35
+ })
36
+ </script>
37
+ </Layout>
@@ -1,3 +1,6 @@
1
1
  import { z } from 'astro:content'
2
+ import { imageSchema } from 'fulldev-ui/schemas/components/image.ts'
2
3
 
3
- export default z.string()
4
+ export const avatarSchema = imageSchema
5
+
6
+ export type AvatarSchema = z.infer<typeof avatarSchema>
@@ -1,13 +1,18 @@
1
1
  import { z } from 'astro:content'
2
- import pathSchema from '../utils/pathSchema'
2
+ import { iconSchema } from './icon'
3
3
 
4
- export default pathSchema('pages').or(
5
- z
6
- .object({
7
- text: z.string(),
8
- href: z.string(),
9
- icon: z.string(),
10
- })
11
- .partial()
12
- .passthrough()
13
- )
4
+ export const badgeSchema = z
5
+ .object({
6
+ icon: iconSchema.shape.name,
7
+ text: z.string().optional(),
8
+ href: z.string().optional(),
9
+ target: z.literal('_blank').optional(),
10
+ size: z.enum(['sm', 'md', 'lg']).default('md').optional(),
11
+ variant: z
12
+ .enum(['primary', 'secondary', 'outline', 'ghost'])
13
+ .default('outline')
14
+ .optional(),
15
+ })
16
+ .strict()
17
+
18
+ export type BadgeSchema = z.infer<typeof badgeSchema>
@@ -0,0 +1,60 @@
1
+ import { z } from 'astro:content'
2
+ import pathSchema from '../utils/pathSchema'
3
+ import { badgeSchema } from './badge'
4
+ import { buttonSchema } from './button'
5
+ import { channelSchema } from './channel'
6
+ import { headingSchema } from './heading'
7
+ import { iconSchema } from './icon'
8
+ import { imageSchema } from './image'
9
+ import { linkSchema } from './link'
10
+ import { logoSchema } from './logo'
11
+ import { menuSchema } from './menu'
12
+ import { paragraphSchema } from './paragraph'
13
+ import { socialSchema } from './social'
14
+ import { taglineSchema } from './tagline'
15
+
16
+ export const blockSchema = z.object({
17
+ _block: z.string().optional(),
18
+ dark: z.boolean().optional(),
19
+ logo: logoSchema.optional(),
20
+ link: linkSchema.optional(),
21
+ links: linkSchema.array().optional(),
22
+ menus: menuSchema.array().optional(),
23
+ themer: z.boolean().optional(),
24
+ search: z.boolean().optional(),
25
+ cart: z.boolean().optional(),
26
+ text: z.string().optional(),
27
+ tagline: taglineSchema.shape.text,
28
+ badge: badgeSchema.optional(),
29
+ badges: badgeSchema.array().optional(),
30
+ heading: headingSchema.shape.text,
31
+ paragraph: paragraphSchema.shape.text,
32
+ list: z.string().array().optional(),
33
+ content: z.string().optional(),
34
+ button: buttonSchema.optional(),
35
+ buttons: buttonSchema.array().optional(),
36
+ image: imageSchema.optional(),
37
+ images: imageSchema.array().optional(),
38
+ channels: channelSchema.array().optional(),
39
+ socials: socialSchema.shape.href.array().optional(),
40
+ pages: pathSchema('pages').array().optional(),
41
+ products: pathSchema('pages').array().optional(),
42
+ cards: z
43
+ .object({
44
+ image: imageSchema.optional(),
45
+ icon: iconSchema.shape.name,
46
+ tagline: taglineSchema.shape.text,
47
+ badge: badgeSchema.optional(),
48
+ badges: badgeSchema.array().optional(),
49
+ heading: headingSchema.shape.text,
50
+ paragraph: paragraphSchema.shape.text,
51
+ list: z.string().array().optional(),
52
+ button: buttonSchema.optional(),
53
+ buttons: buttonSchema.array().optional(),
54
+ })
55
+ .strict()
56
+ .array()
57
+ .optional(),
58
+ })
59
+
60
+ export type BlockSchema = z.infer<typeof blockSchema>
@@ -1,16 +1,19 @@
1
1
  import { z } from 'astro:content'
2
- import pathSchema from '../utils/pathSchema'
2
+ import { iconSchema } from './icon'
3
3
 
4
- export default z.union([pathSchema('pages'), z.object({}).passthrough()]).pipe(
5
- z
6
- .object({
7
- slug: z
8
- .string()
9
- .refine(async (data) => await pathSchema('pages').parseAsync(data)),
10
- text: z.string(),
11
- href: z.string(),
12
- icon: z.string(),
13
- })
14
- .partial()
15
- .passthrough()
16
- )
4
+ export const buttonSchema = z
5
+ .object({
6
+ icon: iconSchema.shape.name,
7
+ text: z.string().optional(),
8
+ href: z.string().optional(),
9
+ target: z.literal('_blank').optional(),
10
+ size: z.enum(['sm', 'md', 'lg']).default('md').optional(),
11
+ reverse: z.boolean().optional(),
12
+ variant: z
13
+ .enum(['primary', 'secondary', 'outline', 'ghost'])
14
+ .default('primary')
15
+ .optional(),
16
+ })
17
+ .strict()
18
+
19
+ export type ButtonSchema = z.infer<typeof buttonSchema>
@@ -1,13 +1,19 @@
1
1
  import { z } from 'astro:content'
2
- import heading from './heading'
3
- import icon from './icon'
4
- import text from './text'
2
+ import { headingSchema } from './heading'
3
+ import { iconSchema } from './icon'
5
4
 
6
- export default z
5
+ export const channelSchema = z
7
6
  .object({
8
- heading,
9
- text,
10
- icon,
11
- href: z.string(),
7
+ icon: iconSchema.shape.name,
8
+ heading: headingSchema.shape.text,
9
+ text: z.string().optional(),
10
+ href: z.string().optional(),
11
+ size: z.enum(['sm', 'md', 'lg']).default('md').optional(),
12
+ variant: z
13
+ .enum(['primary', 'secondary', 'outline', 'ghost'])
14
+ .default('secondary')
15
+ .optional(),
12
16
  })
13
- .partial()
17
+ .strict()
18
+
19
+ export type ChannelSchema = z.infer<typeof channelSchema>
@@ -1,25 +1,19 @@
1
1
  import { z } from 'astro:content'
2
- import buttons from './buttons'
3
- import channels from './channels'
4
- import heading from './heading'
5
- import logo from './logo'
6
- import socials from './socials'
7
- import text from './text'
2
+ import { channelSchema } from 'fulldev-ui/schemas/components/channel.ts'
3
+ import { logoSchema } from 'fulldev-ui/schemas/components/logo.ts'
4
+ import { menuSchema } from 'fulldev-ui/schemas/components/menu.ts'
5
+ import { headingSchema } from './heading'
6
+ import { paragraphSchema } from './paragraph'
8
7
 
9
- export default z
8
+ export const footerSchema = z
10
9
  .object({
11
- logo,
12
- text,
13
- socials,
14
- channels,
15
- columns: z.array(
16
- z
17
- .object({
18
- heading,
19
- buttons,
20
- })
21
- .partial()
22
- ),
10
+ logo: logoSchema.optional(),
11
+ heading: headingSchema.shape.text,
12
+ paragraph: paragraphSchema.shape.text,
13
+ socials: z.string().url().array().optional(),
14
+ channels: channelSchema.array().optional(),
15
+ menus: menuSchema.array().optional(),
23
16
  })
24
- .partial()
25
- .passthrough()
17
+ .strict()
18
+
19
+ export type FooterSchema = z.infer<typeof footerSchema>
@@ -0,0 +1,17 @@
1
+ import { z } from 'astro:content'
2
+ import { imageSchema } from 'fulldev-ui/schemas/components/image.ts'
3
+
4
+ export const headSchema = z
5
+ .object({
6
+ title: z.string().optional(),
7
+ description: z.string().optional(),
8
+ image: imageSchema.optional(),
9
+ theme: z.enum(['light', 'dark', 'system']).default('light').optional(),
10
+ favicon: z.string().optional(),
11
+ company: z.string().optional(),
12
+ scripts: z.string().array().optional(),
13
+ code: z.string().optional(),
14
+ })
15
+ .strict()
16
+
17
+ export type HeadSchema = z.infer<typeof headSchema>
@@ -1,11 +1,23 @@
1
1
  import { z } from 'astro:content'
2
- import buttons from './buttons'
3
- import logo from './logo'
2
+ import { buttonSchema } from 'fulldev-ui/schemas/components/button.ts'
3
+ import { linkSchema } from 'fulldev-ui/schemas/components/link.ts'
4
+ import { logoSchema } from 'fulldev-ui/schemas/components/logo.ts'
5
+ import { menuSchema } from 'fulldev-ui/schemas/components/menu.ts'
6
+ import { headingSchema } from './heading'
7
+ import { socialSchema } from './social'
4
8
 
5
- export default z
9
+ export const headerSchema = z
6
10
  .object({
7
- logo,
8
- buttons,
11
+ logo: logoSchema.optional(),
12
+ heading: headingSchema.shape.text,
13
+ links: linkSchema.array().optional(),
14
+ socials: socialSchema.shape.href.array().optional(),
15
+ buttons: buttonSchema.array().optional(),
16
+ menus: menuSchema.array().optional(),
17
+ themer: z.boolean().optional(),
18
+ cart: z.boolean().optional(),
19
+ search: z.boolean().optional(),
9
20
  })
10
- .partial()
11
- .passthrough()
21
+ .strict()
22
+
23
+ export type HeaderSchema = z.infer<typeof headerSchema>
@@ -1,3 +1,9 @@
1
1
  import { z } from 'astro:content'
2
2
 
3
- export default z.string()
3
+ export const headingSchema = z
4
+ .object({
5
+ text: z.string().optional(),
6
+ })
7
+ .strict()
8
+
9
+ export type HeadingSchema = z.infer<typeof headingSchema>
@@ -1,3 +1,9 @@
1
1
  import { z } from 'astro:content'
2
2
 
3
- export default z.string()
3
+ export const iconSchema = z
4
+ .object({
5
+ name: z.string().optional(),
6
+ })
7
+ .strict()
8
+
9
+ export type IconSchema = z.infer<typeof iconSchema>
@@ -1,18 +1,40 @@
1
- import { reference, z } from 'astro:content'
1
+ import { z } from 'astro:content'
2
2
 
3
- export default z.union([reference('images'), z.object({}).passthrough()]).pipe(
4
- z
5
- .object({
6
- id: z
7
- .string()
8
- .refine(async (data) => await reference('images').parseAsync(data)),
9
- src: z.string(),
10
- alt: z.string(),
11
- width: z.number(),
12
- height: z.number(),
13
- })
14
- .partial()
15
- .passthrough()
16
- )
3
+ // const imagePath = z.preprocess((data: unknown) => {
4
+ // if (typeof data === 'string') {
5
+ // return data.split('/').pop()
6
+ // }
7
+ // return data
8
+ // }, reference('images'))
17
9
 
18
- // export default z.any()
10
+ // export const imageSchema = z
11
+ // .union([imagePath, z.object({}).passthrough()])
12
+ // .pipe(
13
+ // z
14
+ // .object({
15
+ // id: z
16
+ // .string()
17
+ // .refine(async (data) => await reference('images').parseAsync(data)),
18
+ // src: z.string(),
19
+ // alt: z.string(),
20
+ // width: z.number(),
21
+ // height: z.number(),
22
+ // })
23
+ // .partial()
24
+ // .passthrough()
25
+ // )
26
+ // .optional()
27
+
28
+ export const imageSchema = z
29
+ .preprocess(
30
+ (data: unknown) => (typeof data === 'string' ? { src: data } : data),
31
+ z
32
+ .object({
33
+ src: z.string().optional(),
34
+ alt: z.string().optional(),
35
+ width: z.number().optional(),
36
+ height: z.number().optional(),
37
+ })
38
+ .strict()
39
+ )
40
+ .optional()
@@ -0,0 +1,17 @@
1
+ import { z } from 'astro:content'
2
+
3
+ export const linkSchema = z
4
+ .object({
5
+ text: z.string().optional(),
6
+ href: z.string().optional(),
7
+ icon: z.string().optional(),
8
+ target: z.literal('_blank').optional(),
9
+ size: z.enum(['sm', 'md', 'lg']).default('md').optional(),
10
+ variant: z
11
+ .enum(['primary', 'underline', 'muted'])
12
+ .default('primary')
13
+ .optional(),
14
+ })
15
+ .strict()
16
+
17
+ export type LinkSchema = z.infer<typeof linkSchema>
@@ -1,3 +1,13 @@
1
- import image from './image'
1
+ import { z } from 'astro:content'
2
+ import { imageSchema } from 'fulldev-ui/schemas/components/image.ts'
2
3
 
3
- export default image
4
+ export const logoSchema = z
5
+ .object({
6
+ image: imageSchema,
7
+ text: z.string().optional(),
8
+ href: z.string().optional(),
9
+ size: z.enum(['sm', 'md', 'lg']).default('md').optional(),
10
+ })
11
+ .strict()
12
+
13
+ export type LogoSchema = z.infer<typeof logoSchema>
@@ -1,13 +1,13 @@
1
1
  import { z } from 'astro:content'
2
- import buttons from './buttons'
3
- import heading from './heading'
2
+ import { linkSchema } from 'fulldev-ui/schemas/components/link.ts'
3
+ import { headingSchema } from './heading'
4
4
 
5
- export default z.array(
6
- z
7
- .object({
8
- heading,
9
- buttons,
10
- })
11
- .partial()
12
- .passthrough()
13
- )
5
+ export const menuSchema = z
6
+ .object({
7
+ heading: headingSchema.shape.text,
8
+ href: z.string().optional(),
9
+ links: linkSchema.array().optional(),
10
+ })
11
+ .strict()
12
+
13
+ export type MenuSchema = z.infer<typeof menuSchema>
@@ -0,0 +1,10 @@
1
+ import { z } from 'astro:content'
2
+ import { headerSchema } from './header'
3
+ import { sidebarSchema } from './sidebar'
4
+
5
+ export const navigationSchema = headerSchema.merge(sidebarSchema).extend({
6
+ header: z.boolean().optional(),
7
+ sidebar: z.boolean().optional(),
8
+ })
9
+
10
+ export type NavigationSchema = z.infer<typeof navigationSchema>
@@ -0,0 +1,9 @@
1
+ import { z } from 'astro:content'
2
+
3
+ export const paragraphSchema = z
4
+ .object({
5
+ text: z.string().optional(),
6
+ })
7
+ .strict()
8
+
9
+ export type ParagraphSchema = z.infer<typeof paragraphSchema>
@@ -1,3 +1,9 @@
1
1
  import { z } from 'astro:content'
2
2
 
3
- export default z.number()
3
+ export const priceSchema = z
4
+ .object({
5
+ amount: z.number().optional(),
6
+ })
7
+ .strict()
8
+
9
+ export type PriceSchema = z.infer<typeof priceSchema>