fulldev-ui 0.5.0-beta.8 → 0.6.0-beta-4

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 (347) 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 +217 -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/Cta1.astro +72 -0
  15. package/src/blocks/Feature1.astro +67 -0
  16. package/src/blocks/Features1.astro +75 -0
  17. package/src/blocks/Footer.astro +100 -3
  18. package/src/blocks/Header.astro +192 -3
  19. package/src/blocks/Hero1.astro +74 -0
  20. package/src/blocks/Job1.astro +97 -0
  21. package/src/blocks/Products1.astro +90 -0
  22. package/src/blocks/Reviews1.astro +75 -0
  23. package/src/blocks/_Hero.astro +245 -0
  24. package/src/components/Avatar.astro +28 -9
  25. package/src/components/Avatars.astro +36 -0
  26. package/src/components/Badge.astro +63 -24
  27. package/src/components/Badges.astro +16 -23
  28. package/src/components/Banner.astro +26 -0
  29. package/src/components/Block.astro +49 -0
  30. package/src/components/Blocks.astro +26 -0
  31. package/src/components/Breadcrumb.astro +58 -0
  32. package/src/components/Button.astro +49 -119
  33. package/src/components/Buttons.astro +23 -13
  34. package/src/components/Card.astro +9 -137
  35. package/src/components/Cards.astro +33 -35
  36. package/src/components/Carousel.astro +106 -0
  37. package/src/components/Cart.astro +18 -14
  38. package/src/components/CartAdd.svelte +76 -0
  39. package/src/components/CartCheckout.svelte +58 -0
  40. package/src/components/CartForm.svelte +130 -0
  41. package/src/components/CartList.svelte +88 -0
  42. package/src/components/CartQuantity.svelte +81 -0
  43. package/src/components/CartSummary.astro +16 -104
  44. package/src/components/CartTotal.svelte +15 -0
  45. package/src/components/Channel.astro +44 -35
  46. package/src/components/Channels.astro +20 -6
  47. package/src/components/Checkbox.astro +52 -27
  48. package/src/components/Code.astro +52 -0
  49. package/src/components/Container.astro +25 -0
  50. package/src/components/Dialog.astro +3 -2
  51. package/src/components/Drawer.astro +55 -146
  52. package/src/components/DrawerOld.astro +143 -0
  53. package/src/components/Element.astro +18 -8
  54. package/src/components/Form.astro +16 -13
  55. package/src/components/Gallery.astro +174 -0
  56. package/src/components/Head.astro +62 -25
  57. package/src/components/Header.astro +10 -115
  58. package/src/components/Heading.astro +51 -44
  59. package/src/components/Icon.astro +29 -33
  60. package/src/components/Image.astro +18 -68
  61. package/src/components/Input.astro +65 -51
  62. package/src/components/Label.astro +20 -15
  63. package/src/components/Layout.astro +35 -0
  64. package/src/components/Link.astro +51 -32
  65. package/src/components/Links.astro +42 -0
  66. package/src/components/List.astro +41 -16
  67. package/src/components/LocaleSwitcher.astro +2 -2
  68. package/src/components/Logo.astro +56 -0
  69. package/src/components/Menu.astro +21 -17
  70. package/src/components/Navigation.astro +39 -0
  71. package/src/components/Panel.astro +25 -0
  72. package/src/components/Paragraph.astro +55 -0
  73. package/src/components/Price.astro +4 -4
  74. package/src/components/Prose.astro +78 -0
  75. package/src/components/Rating.astro +23 -62
  76. package/src/components/Search.astro +107 -43
  77. package/src/components/Section.astro +13 -242
  78. package/src/components/Select.astro +45 -55
  79. package/src/components/Sidebar.astro +53 -76
  80. package/src/components/Social.astro +11 -9
  81. package/src/components/Socials.astro +9 -5
  82. package/src/components/Subheader.astro +59 -0
  83. package/src/components/Switch.astro +72 -29
  84. package/src/components/Table.astro +1 -1
  85. package/src/components/Tagline.astro +32 -14
  86. package/src/components/Textarea.astro +40 -50
  87. package/src/components/Themer.astro +76 -0
  88. package/src/components/Toc.astro +32 -31
  89. package/src/components/_Author.astro +90 -0
  90. package/src/components/_Header.astro +129 -0
  91. package/src/components/_Image.astro +79 -0
  92. package/src/components/_Prose copy.astro +172 -0
  93. package/src/components/_Sidebar copy.astro +87 -0
  94. package/src/components/docs/PropsTable.astro +38 -264
  95. package/src/components/experimental/Window.astro +5 -57
  96. package/src/content/config.ts +4 -10
  97. package/src/content/{presets → layouts}/base.yml +52 -73
  98. package/src/content/pages/blocks/_categories.mdx +0 -2
  99. package/src/content/pages/blocks/_footer.mdx +0 -2
  100. package/src/content/pages/blocks/_header.mdx +0 -4
  101. package/src/content/pages/blocks/_jobs.mdx +0 -2
  102. package/src/content/pages/blocks/_prices.mdx +0 -2
  103. package/src/content/pages/blocks/_product.mdx +0 -2
  104. package/src/content/pages/blocks/_products.mdx +0 -2
  105. package/src/content/pages/blocks/_stats.mdx +0 -2
  106. package/src/content/pages/blocks/banner.mdx +0 -2
  107. package/src/content/pages/blocks/colleagues.mdx +0 -3
  108. package/src/content/pages/blocks/contact.mdx +0 -2
  109. package/src/content/pages/blocks/content.mdx +0 -6
  110. package/src/content/pages/blocks/cta.mdx +0 -10
  111. package/src/content/pages/blocks/features.mdx +0 -5
  112. package/src/content/pages/blocks/hero.mdx +0 -5
  113. package/src/content/pages/blocks/intro.mdx +0 -5
  114. package/src/content/pages/blocks/posts.mdx +0 -2
  115. package/src/content/pages/blocks/reviews.mdx +0 -3
  116. package/src/content/pages/categories/category.md +7 -0
  117. package/src/content/pages/docs/_internationalization.mdx +55 -0
  118. package/src/content/pages/docs/_using-blocks.mdx +33 -0
  119. package/src/content/pages/docs/_using-presets.mdx +49 -0
  120. package/src/content/pages/docs/blocks.mdx +33 -0
  121. package/src/content/pages/docs/collections/images.mdx +102 -0
  122. package/src/content/pages/docs/collections/pages.mdx +119 -0
  123. package/src/content/pages/docs/collections/presets.mdx +60 -0
  124. package/src/content/pages/docs/collections.mdx +42 -0
  125. package/src/content/pages/{base/card.mdx → docs/components/_card.mdx} +2 -5
  126. package/src/content/pages/{base → docs/components}/_dialog.mdx +1 -2
  127. package/src/content/pages/{base → docs/components}/_drawer.mdx +1 -2
  128. package/src/content/pages/{base → docs/components}/_localeswitcher.mdx +1 -2
  129. package/src/content/pages/{base → docs/components}/_switch.mdx +3 -4
  130. package/src/content/pages/{typography → docs/components}/_tagline.mdx +3 -4
  131. package/src/content/pages/docs/components/_toggle.mdx +30 -0
  132. package/src/content/pages/docs/components/avatar.mdx +34 -0
  133. package/src/content/pages/{base → docs/components}/badge.mdx +28 -10
  134. package/src/content/pages/docs/components/badges.mdx +46 -0
  135. package/src/content/pages/docs/components/button.mdx +78 -0
  136. package/src/content/pages/docs/components/buttons.mdx +51 -0
  137. package/src/content/pages/docs/components/channel.mdx +91 -0
  138. package/src/content/pages/docs/components/channels.mdx +89 -0
  139. package/src/content/pages/docs/components/checkbox.mdx +34 -0
  140. package/src/content/pages/docs/components/code.mdx +45 -0
  141. package/src/content/pages/docs/components/heading.mdx +59 -0
  142. package/src/content/pages/docs/components/icon.mdx +48 -0
  143. package/src/content/pages/docs/components/image.mdx +25 -0
  144. package/src/content/pages/docs/components/input.mdx +40 -0
  145. package/src/content/pages/{typography → docs/components}/label.mdx +9 -6
  146. package/src/content/pages/{typography → docs/components}/link.mdx +24 -10
  147. package/src/content/pages/docs/components/links.mdx +99 -0
  148. package/src/content/pages/docs/components/list.mdx +44 -0
  149. package/src/content/pages/docs/components/logo.mdx +36 -0
  150. package/src/content/pages/docs/components/menu.mdx +89 -0
  151. package/src/content/pages/docs/components/prose.mdx +36 -0
  152. package/src/content/pages/docs/components/rating.mdx +76 -0
  153. package/src/content/pages/{base → docs/components}/section.mdx +2 -3
  154. package/src/content/pages/{base → docs/components}/select.mdx +1 -11
  155. package/src/content/pages/docs/components/social.mdx +94 -0
  156. package/src/content/pages/docs/components/socials.mdx +102 -0
  157. package/src/content/pages/docs/components/switch.mdx +34 -0
  158. package/src/content/pages/{base → docs/components}/table.mdx +1 -4
  159. package/src/content/pages/docs/components/tagline.mdx +46 -0
  160. package/src/content/pages/docs/components/text.mdx +48 -0
  161. package/src/content/pages/docs/components/textarea.mdx +34 -0
  162. package/src/content/pages/docs/components/themer.mdx +49 -0
  163. package/src/content/pages/docs/components.mdx +37 -0
  164. package/src/content/pages/docs/customization.mdx +151 -0
  165. package/src/content/pages/docs/frameworks.mdx +29 -0
  166. package/src/content/pages/docs/generating-pages.mdx +129 -0
  167. package/src/content/pages/docs/index.mdx +20 -0
  168. package/src/content/pages/docs/installation.mdx +50 -0
  169. package/src/content/pages/docs/layouts.mdx +33 -0
  170. package/src/content/pages/index.mdx +25 -33
  171. package/src/content/pages/posts/post.md +7 -0
  172. package/src/content/pages/products/product.md +20 -0
  173. package/src/content/pages/showcase/anti-slip-profiles.md +2 -2
  174. package/src/content/pages/showcase/fulldev-ui.md +1 -1
  175. package/src/content/pages/showcase/lavis-detailing.md +1 -1
  176. package/src/content/pages/showcase/leren-trainingsacteren.md +1 -1
  177. package/src/content/pages/showcase/miele-witgoedcenter-amsterdam.md +1 -1
  178. package/src/content/pages/showcase/sloepverhuur-bolsward.md +1 -1
  179. package/src/content/pages/showcase/stark-vulcanising-products.md +1 -1
  180. package/src/content/pages/showcase/the-gym-haren.md +1 -1
  181. package/src/content/pages/showcase/van-dillen-antieke-bouwmaterialen.md +1 -1
  182. package/src/content/pages/showcase.mdx +4 -3
  183. package/src/css/color.css +0 -10
  184. package/src/css/custom.css +10 -12
  185. package/src/css/size.css +2 -11
  186. package/src/css/theme.css +95 -0
  187. package/src/env.d.ts +1 -0
  188. package/src/images/favicon/android-chrome-192x192.png +0 -0
  189. package/src/images/favicon/android-chrome-512x512.png +0 -0
  190. package/src/images/favicon/apple-touch-icon.png +0 -0
  191. package/src/images/favicon/browserconfig.xml +9 -0
  192. package/src/images/favicon/favicon-16x16.png +0 -0
  193. package/src/images/favicon/favicon-32x32.png +0 -0
  194. package/src/images/favicon/favicon-48x48.png +0 -0
  195. package/src/images/favicon/favicon.ico +0 -0
  196. package/src/images/favicon/favicon.svg +16 -0
  197. package/src/images/favicon/manifest.webmanifest +30 -0
  198. package/src/images/favicon/mstile-150x150.png +0 -0
  199. package/src/images/favicon/safari-pinned-tab.svg +16 -0
  200. package/src/images/favicon/yandex-browser-50x50.png +0 -0
  201. package/src/images/favicon/yandex-browser-manifest.json +9 -0
  202. package/src/images/logo-1.svg +11 -0
  203. package/src/images/logo-2.svg +13 -0
  204. package/src/images/logo-basic.svg +10 -0
  205. package/src/images/logo-simple.svg +13 -0
  206. package/src/images/logo-thin.svg +15 -0
  207. package/src/images/logo.svg +14 -0
  208. package/src/images/logofat.svg +11 -0
  209. package/src/integration/index.ts +110 -140
  210. package/src/layouts/Category.astro +131 -0
  211. package/src/layouts/Doc.astro +72 -0
  212. package/src/layouts/Job.astro +64 -0
  213. package/src/layouts/Page.astro +30 -0
  214. package/src/layouts/Post.astro +20 -0
  215. package/src/layouts/Product.astro +110 -0
  216. package/src/pages/[...page].astro +29 -24
  217. package/src/pages/test.astro +37 -0
  218. package/src/schemas/blocks/banner.ts +10 -0
  219. package/src/schemas/blocks/categories.ts +14 -0
  220. package/src/schemas/blocks/contact.ts +18 -0
  221. package/src/schemas/blocks/cta.ts +19 -0
  222. package/src/schemas/blocks/feature.ts +18 -0
  223. package/src/schemas/blocks/features.ts +24 -0
  224. package/src/schemas/blocks/hero.ts +20 -0
  225. package/src/schemas/blocks/intro.ts +16 -0
  226. package/src/schemas/blocks/products.ts +14 -0
  227. package/src/schemas/blocks/reviews.ts +24 -0
  228. package/src/schemas/components/avatar.ts +4 -1
  229. package/src/schemas/components/badge.ts +16 -11
  230. package/src/schemas/components/block.ts +22 -0
  231. package/src/schemas/components/button.ts +17 -14
  232. package/src/schemas/components/channel.ts +15 -9
  233. package/src/schemas/components/footer.ts +15 -21
  234. package/src/schemas/components/head.ts +17 -0
  235. package/src/schemas/components/header.ts +19 -7
  236. package/src/schemas/components/heading.ts +7 -1
  237. package/src/schemas/components/icon.ts +7 -1
  238. package/src/schemas/components/image.ts +38 -16
  239. package/src/schemas/components/link.ts +17 -0
  240. package/src/schemas/components/logo.ts +12 -2
  241. package/src/schemas/components/menu.ts +11 -11
  242. package/src/schemas/components/navigation.ts +10 -0
  243. package/src/schemas/components/paragraph.ts +9 -0
  244. package/src/schemas/components/price.ts +7 -1
  245. package/src/schemas/components/rating.ts +8 -13
  246. package/src/schemas/components/sidebar.ts +14 -11
  247. package/src/schemas/components/social.ts +16 -1
  248. package/src/schemas/components/tagline.ts +7 -1
  249. package/src/schemas/imageSchema.ts +30 -1
  250. package/src/schemas/layoutSchema.ts +22 -0
  251. package/src/schemas/pageSchema.ts +26 -96
  252. package/src/stores/cart.svelte.ts +79 -0
  253. package/src/stores/cart.ts +59 -6
  254. package/src/types/global-props.ts +0 -9
  255. package/src/types/{virtual-modules.d.ts → virtual.d.ts} +1 -1
  256. package/src/utils/cart.ts +1 -10
  257. package/src/utils/formatEntries.ts +8 -0
  258. package/src/utils/formatEntry.ts +29 -0
  259. package/src/utils/getDeepReferenceChildren.ts +14 -0
  260. package/src/utils/getHref.ts +6 -0
  261. package/src/utils/getReferenceChildren.ts +1 -1
  262. package/src/utils/setTheme.ts +18 -0
  263. package/src/utils/slugify.ts +6 -0
  264. package/svelte.config.js +5 -0
  265. package/tailwind.config.ts +67 -0
  266. package/tsconfig.json +1 -3
  267. package/src/blocks/Article.astro +0 -40
  268. package/src/blocks/Categories.astro +0 -12
  269. package/src/blocks/Colleagues.astro +0 -13
  270. package/src/blocks/Contact.astro +0 -116
  271. package/src/blocks/Content.astro +0 -12
  272. package/src/blocks/Cta.astro +0 -15
  273. package/src/blocks/Excerpt.astro +0 -14
  274. package/src/blocks/Features.astro +0 -11
  275. package/src/blocks/Hero.astro +0 -15
  276. package/src/blocks/Intro.astro +0 -23
  277. package/src/blocks/Jobs.astro +0 -12
  278. package/src/blocks/Posts.astro +0 -11
  279. package/src/blocks/Prices.astro +0 -24
  280. package/src/blocks/Product.astro +0 -106
  281. package/src/blocks/Products.astro +0 -11
  282. package/src/blocks/Reviews.astro +0 -13
  283. package/src/components/CartForm.astro +0 -121
  284. package/src/components/CartList.astro +0 -134
  285. package/src/components/Footer.astro +0 -193
  286. package/src/components/Text.astro +0 -43
  287. package/src/components/ThemeSelect.astro +0 -41
  288. package/src/components/Writeup.astro +0 -90
  289. package/src/components/experimental/Form.astro +0 -53
  290. package/src/components/experimental/Gallery.astro +0 -104
  291. package/src/components/experimental/Logo.astro +0 -38
  292. package/src/components/experimental/Prose.astro +0 -192
  293. package/src/components/sections.astro +0 -28
  294. package/src/content/pages/base/button.mdx +0 -60
  295. package/src/content/pages/base/checkbox.mdx +0 -42
  296. package/src/content/pages/base/icon.mdx +0 -55
  297. package/src/content/pages/base/image.mdx +0 -42
  298. package/src/content/pages/base/input.mdx +0 -56
  299. package/src/content/pages/base/rating.mdx +0 -55
  300. package/src/content/pages/base/textarea.mdx +0 -58
  301. package/src/content/pages/base/theme-select.mdx +0 -15
  302. package/src/content/pages/layouts/_layout.mdx +0 -14
  303. package/src/content/pages/layouts/docslayout.mdx +0 -14
  304. package/src/content/pages/overview/components.mdx +0 -75
  305. package/src/content/pages/overview/content-collections.mdx +0 -139
  306. package/src/content/pages/overview/frameworks.mdx +0 -198
  307. package/src/content/pages/overview/installation.mdx +0 -53
  308. package/src/content/pages/overview/introduction.mdx +0 -30
  309. package/src/content/pages/overview/theming.mdx +0 -69
  310. package/src/content/pages/schemas/page.mdx +0 -17
  311. package/src/content/pages/schemas/preset.mdx +0 -9
  312. package/src/content/pages/showcase/record.md +0 -3
  313. package/src/content/pages/typography/heading.mdx +0 -73
  314. package/src/content/pages/typography/list.mdx +0 -51
  315. package/src/content/pages/typography/text.mdx +0 -61
  316. package/src/content/presets/blocks.yml +0 -1
  317. package/src/content/presets/docs.yml +0 -6
  318. package/src/css/space.css +0 -77
  319. package/src/css/styles.css +0 -0
  320. package/src/images/avatar-1.yml +0 -1
  321. package/src/integration/generate-colors.ts +0 -639
  322. package/src/integration/tailwind-plugin.ts +0 -80
  323. package/src/integration/unocss-preset.ts +0 -84
  324. package/src/layouts/BlockLayout.astro +0 -19
  325. package/src/layouts/ContactLayout.astro +0 -21
  326. package/src/layouts/DocsLayout.astro +0 -73
  327. package/src/layouts/Layout.astro +0 -163
  328. package/src/layouts/OverviewLayout.astro +0 -42
  329. package/src/layouts/PostLayout.astro +0 -21
  330. package/src/layouts/ProductLayout.astro +0 -21
  331. package/src/loaders/imageLoader.ts +0 -26
  332. package/src/schemas/components/avatars.ts +0 -4
  333. package/src/schemas/components/buttons.ts +0 -4
  334. package/src/schemas/components/card.ts +0 -25
  335. package/src/schemas/components/cards.ts +0 -4
  336. package/src/schemas/components/channels.ts +0 -4
  337. package/src/schemas/components/images.ts +0 -4
  338. package/src/schemas/components/list.ts +0 -3
  339. package/src/schemas/components/section.ts +0 -15
  340. package/src/schemas/components/sections.ts +0 -3
  341. package/src/schemas/components/socials.ts +0 -4
  342. package/src/schemas/components/text.ts +0 -3
  343. package/src/schemas/components/toc.ts +0 -3
  344. package/src/schemas/components/writeup.ts +0 -20
  345. package/src/schemas/presetSchema.ts +0 -3
  346. package/src/schemas/utils/navigation.ts +0 -8
  347. package/src/schemas/utils/parents.ts +0 -3
@@ -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>
@@ -1,15 +1,10 @@
1
1
  import { z } from 'astro:content'
2
- import avatar from './avatar'
3
- import avatars from './avatars'
4
- import text from './text'
5
2
 
6
- export default z.number().or(
7
- z
8
- .object({
9
- value: z.number(),
10
- avatar,
11
- avatars,
12
- text,
13
- })
14
- .partial()
15
- )
3
+ export const ratingSchema = z
4
+ .object({
5
+ score: z.number().optional(),
6
+ size: z.enum(['sm', 'md', 'lg']).default('md').optional(),
7
+ })
8
+ .strict()
9
+
10
+ export type RatingSchema = z.infer<typeof ratingSchema>
@@ -1,15 +1,18 @@
1
1
  import { z } from 'astro:content'
2
- import logo from '../components/logo'
3
- import menu from '../components/menu'
4
- import heading from './heading'
5
- import toc from './toc'
2
+ import { logoSchema } from '../components/logo'
3
+ import { headingSchema } from './heading'
4
+ import { linkSchema } from './link'
5
+ import { menuSchema } from './menu'
6
6
 
7
- export default z
7
+ export const sidebarSchema = z
8
8
  .object({
9
- logo,
10
- heading,
11
- menu,
12
- toc,
9
+ company: z.string().optional(),
10
+ logo: logoSchema.optional(),
11
+ heading: headingSchema.shape.text,
12
+ themer: z.boolean().optional(),
13
+ menus: menuSchema.array().optional(),
14
+ links: linkSchema.array().optional(),
13
15
  })
14
- .partial()
15
- .passthrough()
16
+ .strict()
17
+
18
+ export type SidebarSchema = z.infer<typeof sidebarSchema>
@@ -1,3 +1,18 @@
1
1
  import { z } from 'astro:content'
2
+ import { iconSchema } from './icon'
2
3
 
3
- export default z.string()
4
+ export const socialSchema = z
5
+ .object({
6
+ icon: iconSchema.optional(),
7
+ text: z.string().optional(),
8
+ href: z.string().optional(),
9
+ target: z.literal('_blank').default('_blank').optional(),
10
+ size: z.enum(['sm', 'md', 'lg']).default('sm').optional(),
11
+ variant: z
12
+ .enum(['primary', 'secondary', 'outline', 'ghost'])
13
+ .default('secondary')
14
+ .optional(),
15
+ })
16
+ .strict()
17
+
18
+ export type ButtonSchema = z.infer<typeof socialSchema>
@@ -1,3 +1,9 @@
1
1
  import { z } from 'astro:content'
2
2
 
3
- export default z.string()
3
+ export const taglineSchema = z
4
+ .object({
5
+ text: z.string().optional(),
6
+ })
7
+ .strict()
8
+
9
+ export type TaglineSchema = z.infer<typeof taglineSchema>
@@ -1,6 +1,6 @@
1
1
  import { z } from 'astro:content'
2
2
 
3
- export default z
3
+ export const imageSchema = z
4
4
  .object({
5
5
  id: z.string(),
6
6
  src: z.string(),
@@ -10,3 +10,32 @@ export default z
10
10
  format: z.string(),
11
11
  })
12
12
  .passthrough()
13
+
14
+ export type ImageSchema = z.infer<typeof imageSchema>
15
+
16
+ export const imageLoader = async () => {
17
+ const files = import.meta.glob('/src/images/**/*.{webp,png,jpg,jpeg,svg}', {
18
+ eager: true,
19
+ })
20
+ const entries = import.meta.glob('/src/images/**/*.{yml,yaml,json}', {
21
+ eager: true,
22
+ })
23
+
24
+ const allImages = Object.entries(files).map(([src, file]) => {
25
+ const id = src.split('/images/').pop()
26
+ const matchPath = Object.keys(entries).find(
27
+ (entry) => entry.split('.').shift() === src
28
+ ) as any
29
+ const matchFile = entries[matchPath]
30
+ const matchData = matchFile ? (matchFile as any).default : {}
31
+ const fileData = file ? (file as any).default : {}
32
+ return {
33
+ id,
34
+ ...fileData,
35
+ src,
36
+ ...matchData,
37
+ }
38
+ })
39
+
40
+ return allImages as any
41
+ }
@@ -0,0 +1,22 @@
1
+ import { z } from 'astro:content'
2
+ import { bannerSchema } from 'fulldev-ui/schemas/blocks/banner.ts'
3
+ import { footerSchema } from 'fulldev-ui/schemas/components/footer.ts'
4
+ import { headSchema } from 'fulldev-ui/schemas/components/head.ts'
5
+ import { headerSchema } from 'fulldev-ui/schemas/components/header.ts'
6
+ import { linkSchema } from 'fulldev-ui/schemas/components/link.ts'
7
+ import { navigationSchema } from 'fulldev-ui/schemas/components/navigation.ts'
8
+ import { sidebarSchema } from 'fulldev-ui/schemas/components/sidebar.ts'
9
+
10
+ export const layoutSchema = z
11
+ .object({
12
+ head: headSchema.optional(),
13
+ banner: bannerSchema.optional(),
14
+ navigation: navigationSchema.optional(),
15
+ header: headerSchema.optional(),
16
+ subheader: linkSchema.array().optional(),
17
+ sidebar: sidebarSchema.optional(),
18
+ footer: footerSchema.optional(),
19
+ })
20
+ .strict()
21
+
22
+ export type LayoutSchema = z.infer<typeof layoutSchema>
@@ -1,101 +1,31 @@
1
- import { getEntries, getEntry, z } from 'astro:content'
2
- import { assign } from 'radash'
3
- import fulldevConfig from 'virtual:fulldev-ui/config'
4
- import footer from './components/footer'
5
- import header from './components/header'
6
- import image from './components/image'
7
- import images from './components/images'
8
- import price from './components/price'
9
- import section from './components/section'
10
- import sections from './components/sections'
11
- import sidebar from './components/sidebar'
12
- import toc from './components/toc'
13
- import component from './utils/component'
14
- import navigation from './utils/navigation'
15
- import parents from './utils/parents'
16
- import pathSchema from './utils/pathSchema'
17
-
18
- export const i18n = z
19
- .object({
20
- i18n: pathSchema('pages').optional(),
21
- })
22
- .passthrough()
23
- .transform(async ({ i18n, ...rest }) => {
24
- if (!i18n) return rest
25
- const entry = await getEntry(i18n)
26
- const merged = assign(entry.data, rest) as typeof rest
27
- return merged as typeof rest
28
- })
29
-
30
- export const presets = z
31
- .object({
32
- presets: z.array(pathSchema('presets')).optional(),
33
- })
34
- .passthrough()
35
- .transform(async ({ presets, ...rest }) => {
36
- let mergedData = {}
37
-
38
- if (fulldevConfig.basePreset) {
39
- const baseEntry = await getEntry('presets', fulldevConfig.basePreset)
40
- mergedData = assign(mergedData, baseEntry?.data || {})
41
- }
42
-
43
- if (presets) {
44
- const entries = await getEntries(presets)
45
- entries.forEach(
46
- (preset: any) => (mergedData = assign(mergedData, preset.data))
47
- )
48
- }
49
-
50
- mergedData = assign(mergedData, rest)
51
- return mergedData as typeof rest
52
- })
53
-
54
- export const basePreset = z
55
- .object({})
56
- .passthrough()
57
- .transform(async (data) => {
58
- if (!fulldevConfig.basePreset) return data
59
- const baseEntry = await getEntry('presets', fulldevConfig.basePreset)
60
- const mergedData = assign(baseEntry?.data ?? {}, data)
61
- return mergedData as typeof data
62
- })
63
-
64
- export const page = z
1
+ import { z } from 'astro:content'
2
+ import { blockSchema } from 'fulldev-ui/schemas/components/block.ts'
3
+ import { buttonSchema } from 'fulldev-ui/schemas/components/button.ts'
4
+ import { headSchema } from 'fulldev-ui/schemas/components/head.ts'
5
+ import { imageSchema } from 'fulldev-ui/schemas/components/image.ts'
6
+ import { priceSchema } from 'fulldev-ui/schemas/components/price.ts'
7
+ import pathSchema from 'fulldev-ui/schemas/utils/pathSchema.ts'
8
+
9
+ export const pageSchema = z
65
10
  .object({
66
- component,
67
- parents,
68
- theme: z.enum(['light', 'dark']),
69
- lang: z.string(),
70
- seo: z
71
- .object({
72
- title: z.string().optional(),
73
- description: z.string().optional(),
74
- })
75
- .optional(),
76
- title: z.string(),
11
+ _layout: z.string().default('Page').optional(),
12
+ _schema: z.string().optional(),
13
+ href: z.string().optional(),
14
+ draft: z.boolean().optional(),
15
+ title: z.string().optional(),
77
16
  description: z.string().optional(),
78
- image,
79
- images,
80
- section,
81
- sections,
82
- footer,
83
- header: header,
84
- sidebar: sidebar,
85
- navigation,
86
- toc,
87
- price,
88
- code: z.any(),
89
- sizes: z.any(),
90
- banner: z.any(),
91
- _schema: z.any(),
92
- uitverkocht: z.any(),
93
- rating: z.any(),
94
- variants: z.any(),
95
- heading: z.any(),
96
- href: z.any(),
17
+ list: z.string().array().optional(),
18
+ image: imageSchema.optional(),
19
+ images: imageSchema.array().optional(),
20
+ price: priceSchema.shape.amount,
21
+ categories: pathSchema('pages').array().optional(),
22
+ blocks: blockSchema.array().optional(),
23
+ order: z.number().optional(),
24
+ variants: z.record(z.string(), z.string().array()).optional(),
25
+ soldout: z.boolean().optional(),
26
+ head: headSchema.optional(),
27
+ button: buttonSchema.optional(),
97
28
  })
98
- .partial()
99
29
  .strict()
100
30
 
101
- export default i18n.pipe(basePreset).pipe(presets).pipe(page)
31
+ export type PageSchema = z.infer<typeof pageSchema>
@@ -0,0 +1,79 @@
1
+ import { derived, writable } from 'svelte/store'
2
+
3
+ export type CartItem = {
4
+ uid: string
5
+ quantity: number
6
+ slug: string
7
+ title: string
8
+ price?: number | undefined
9
+ image?: string | undefined
10
+ variants?:
11
+ | {
12
+ [k: string]: string | undefined
13
+ }
14
+ | undefined
15
+ }
16
+
17
+ export type Cart = CartItem[]
18
+
19
+ const isServer = import.meta.env.SSR
20
+ const storageJson = !isServer && localStorage.getItem('cart')
21
+ const storageData = storageJson ? JSON.parse(storageJson) : []
22
+
23
+ export const cart = writable<Cart>(storageData)
24
+
25
+ cart.subscribe((newCart) => {
26
+ if (isServer) return
27
+ const json = JSON.stringify(newCart)
28
+ localStorage.setItem('cart', json)
29
+ })
30
+
31
+ export const getUid = (
32
+ slug: CartItem['slug'],
33
+ variants?: CartItem['variants']
34
+ ) => (variants ? `${slug}-${Object.values(variants)?.join('-')}` : slug)
35
+
36
+ export const getItemIndex = (currentCart: Cart, uid: CartItem['uid']) => {
37
+ const index = currentCart.findIndex((i) => i.uid === uid)
38
+ if (index === -1) throw new Error(`Item with uid ${uid} not found`)
39
+ return index
40
+ }
41
+
42
+ export const addItem = (item: CartItem) =>
43
+ cart.update((currentCart) => [...currentCart, item])
44
+
45
+ export const removeItem = (uid: CartItem['uid']) =>
46
+ cart.update((currentCart) => {
47
+ const index = getItemIndex(currentCart, uid)
48
+ currentCart.splice(index, 1)
49
+ return [...currentCart]
50
+ })
51
+
52
+ export const updateQuantity = (
53
+ uid: CartItem['uid'],
54
+ quantity: CartItem['quantity']
55
+ ) =>
56
+ cart.update((currentCart) => {
57
+ const index = getItemIndex(currentCart, uid)
58
+ if (currentCart[index]) currentCart[index].quantity = quantity
59
+ return [...currentCart]
60
+ })
61
+
62
+ export const openCart = () => {
63
+ const cartDialog = document.querySelector('dialog#cart')
64
+ if (cartDialog instanceof HTMLDialogElement) cartDialog.showModal()
65
+ }
66
+
67
+ export const closeCart = () => {
68
+ const cartDialog = document.querySelector('dialog#cart')
69
+ if (cartDialog instanceof HTMLDialogElement) cartDialog.close()
70
+ }
71
+
72
+ export const totalPrice = derived(cart, ($cart) => {
73
+ console.log('DERIVED', $cart)
74
+ return $cart.length
75
+ // return $cart.reduce(
76
+ // (acc, item) => acc + (item.price || 0) * (item.quantity || 0),
77
+ // 0
78
+ // )
79
+ })