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
@@ -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,12 +1,41 @@
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(),
7
7
  alt: z.string().default(''),
8
- width: z.number(),
9
- height: z.number(),
10
- format: z.string(),
8
+ width: z.number().optional(),
9
+ height: z.number().optional(),
10
+ format: z.string().optional(),
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,39 @@
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
10
+ .object({
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(),
16
+ description: z.string().optional(),
17
+ list: z.string().array().optional(),
18
+ image: imageSchema.optional(),
19
+ images: imageSchema.array().optional(),
20
+ price: priceSchema.shape.amount,
21
+ order: z.number().optional(),
22
+ variants: z.record(z.string(), z.string().array()).optional(),
23
+ soldout: z.boolean().optional(),
24
+ head: headSchema.optional(),
25
+ button: buttonSchema.optional(),
26
+ banner: blockSchema.optional(),
27
+ navigation: blockSchema.optional(),
28
+ header: blockSchema.optional(),
29
+ blocks: blockSchema.array().optional(),
30
+ subheader: blockSchema.array().optional(),
31
+ sidebar: blockSchema.optional(),
32
+ footer: blockSchema.optional(),
33
+ parents: pathSchema('pages').array().optional(),
34
+ children: pathSchema('pages').array().optional(),
35
+ siblings: pathSchema('pages').array().optional(),
36
+ })
37
+ .strict()
38
+
39
+ 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
+ })
@@ -1,23 +1,76 @@
1
1
  import { persistentAtom } from '@nanostores/persistent'
2
2
  import { computed } from 'nanostores'
3
3
 
4
- // type Item = CollectionEntry<'products'>['data'] & {
5
- // quantity: number
6
- // }
4
+ type Item = {
5
+ slug: string
6
+ title: string
7
+ price: number
8
+ image: string
9
+ quantity: number
10
+ variants: string[]
11
+ }
7
12
 
8
- type Item = any
13
+ type Cart = Item[] | []
9
14
 
10
- export const $cart = persistentAtom<Item[] | []>('cart', [], {
15
+ export const $cart = persistentAtom<Cart>('cart', [], {
11
16
  encode: JSON.stringify,
12
17
  decode: JSON.parse,
13
18
  })
14
19
 
15
- // export const cartIsOpen = atom(false)
20
+ // for svelte files
21
+ export const cart = $cart
22
+
23
+ export const getCart = () => $cart.get()
24
+
25
+ export const setCart = (cart: Cart) => $cart.set(cart)
26
+
27
+ export const removeItem = (slug: string) => {
28
+ const currentCart = getCart()
29
+ const newCart = [...currentCart]
30
+ const index = currentCart.findIndex((item) => item.slug === slug)
31
+ newCart.splice(index, 1)
32
+ $cart.set(newCart)
33
+ }
34
+
35
+ export const addItem = (item: Item) => {
36
+ const currentCart = getCart()
37
+ const newCart = [...currentCart]
38
+ const index = currentCart.findIndex(
39
+ (i) => i.slug === item.slug && i.variants.join() === item.variants.join()
40
+ )
41
+ if (index === -1) newCart.push(item)
42
+ else {
43
+ let newItem = { ...newCart[index] } as Item
44
+ newItem.quantity += item.quantity
45
+ newCart[index] = newItem
46
+ }
47
+ setCart(newCart)
48
+ }
49
+
50
+ export const updateQuantity = (slug: string, quantity: number) => {
51
+ const currentCart = getCart()
52
+ const newCart = [...currentCart]
53
+ const index = currentCart.findIndex((item) => item.slug === slug)
54
+ let newItem = { ...newCart[index] } as Item
55
+ newItem.quantity = quantity
56
+ newCart[index] = newItem
57
+ setCart(newCart)
58
+ }
16
59
 
17
60
  export const $totalPrice = computed($cart, ($cart) =>
18
61
  $cart.reduce((a, b) => +a + b.price * b.quantity, 0)
19
62
  )
20
63
 
64
+ export const openCart = () => {
65
+ const cartDialog = document.querySelector('dialog#cart')
66
+ if (cartDialog instanceof HTMLDialogElement) cartDialog.showModal()
67
+ }
68
+
69
+ export const closeCart = () => {
70
+ const cartDialog = document.querySelector('dialog#cart')
71
+ if (cartDialog instanceof HTMLDialogElement) cartDialog.close()
72
+ }
73
+
21
74
  // export const totalQuantity = computed(cart, ($cart) =>
22
75
  // $cart.reduce((a, b) => +a + b.quantity, 0)
23
76
  // )
@@ -5,12 +5,3 @@ export type GlobalProps = {
5
5
  size?: 'sm' | 'md' | 'lg' | string | number | null | undefined
6
6
  contrast?: boolean | undefined
7
7
  }
8
-
9
- // declare global {
10
- // type GlobalProps = {
11
- // theme?: 'light' | 'dark' | undefined
12
- // color?: 'base' | 'brand' | undefined
13
- // size?: 'sm' | 'md' | 'lg' | undefined
14
- // contrast?: boolean | undefined
15
- // }
16
- // }
@@ -1,4 +1,4 @@
1
- declare module 'virtual:*' {
1
+ declare module 'virtual:fulldev-ui/config' {
2
2
  import type { Config } from 'fulldev-ui/integration'
3
3
  const content: Config
4
4
  export default content
package/src/utils/cart.ts CHANGED
@@ -1,13 +1,4 @@
1
- // import Stripe from 'stripe'
2
-
3
- // const stripe = new Stripe(import.meta.env.STRIPE_SECRET_KEY)
4
-
5
- const slugify = (input: string): string => {
6
- return input
7
- .toLowerCase()
8
- .replace(/[^a-z0-9]+/g, '-')
9
- .replace(/^-+|-+$/g, '')
10
- }
1
+ import { slugify } from './slugify'
11
2
 
12
3
  export const generateProductId = (
13
4
  slug: string,
@@ -0,0 +1,8 @@
1
+ import type { CollectionEntry } from 'astro:content'
2
+ import { formatEntry } from './formatEntry'
3
+
4
+ export const formatEntries = (
5
+ entries: CollectionEntry<
6
+ 'categories' | 'docs' | 'pages' | 'posts' | 'products'
7
+ >[]
8
+ ) => entries.map(formatEntry)
@@ -0,0 +1,29 @@
1
+ import type { CollectionEntry, ContentCollectionKey } from 'astro:content'
2
+
3
+ const routes: {
4
+ [key in ContentCollectionKey]: string
5
+ } = {
6
+ categories: 'categorieen',
7
+ docs: 'docs',
8
+ pages: '',
9
+ posts: 'blog',
10
+ products: 'producten',
11
+ }
12
+
13
+ export const formatEntry = ({
14
+ data,
15
+ slug,
16
+ ...rest
17
+ }: CollectionEntry<ContentCollectionKey>) => {
18
+ let href
19
+ if (slug !== 'index') href = `/${routes[rest.collection]}/${slug}/`
20
+
21
+ href?.replace('//', '/')
22
+
23
+ return {
24
+ href,
25
+ slug,
26
+ ...rest,
27
+ ...data,
28
+ }
29
+ }
@@ -0,0 +1,14 @@
1
+ import { getCollection, type CollectionEntry } from 'astro:content'
2
+
3
+ // Pages that reference the current page
4
+ export const getDeepReferenceChildren = async (
5
+ slug: CollectionEntry<'pages'>['slug']
6
+ ) =>
7
+ (
8
+ await getCollection('pages', (page) =>
9
+ page.data?.categories?.some((p: any) => p.slug.includes(slug))
10
+ )
11
+ )?.map(({ slug, data }) => ({
12
+ ...data,
13
+ href: `/${slug}/`,
14
+ }))
@@ -0,0 +1,6 @@
1
+ import type { CollectionEntry } from 'astro:content'
2
+
3
+ export function getHref(slug: CollectionEntry<'pages'>['slug']) {
4
+ if (slug === 'index') return '/'
5
+ else return `/${slug}/`
6
+ }
@@ -6,7 +6,7 @@ export const getReferenceChildren = async (
6
6
  ) =>
7
7
  (
8
8
  await getCollection('pages', (page) =>
9
- page.data?.parents?.some((p: any) => p.slug === slug)
9
+ page.data?.categories?.some((p: any) => p.slug === slug)
10
10
  )
11
11
  )?.map(({ slug, data }) => ({
12
12
  ...data,
@@ -0,0 +1,18 @@
1
+ export default function setTheme(newValue?: string) {
2
+ newValue && localStorage.setItem('theme', newValue)
3
+ const value = localStorage.getItem('theme')
4
+
5
+ const isDark =
6
+ value === 'dark' ||
7
+ (value === 'system' &&
8
+ window.matchMedia('(prefers-color-scheme: dark)').matches)
9
+
10
+ document.documentElement.classList.toggle('dark', isDark)
11
+
12
+ document.querySelectorAll('.themer').forEach((themer) => {
13
+ themer.classList.toggle('dark', isDark)
14
+ themer?.querySelectorAll('option').forEach((option) => {
15
+ option.selected = option.value === value
16
+ })
17
+ })
18
+ }
@@ -0,0 +1,6 @@
1
+ export const slugify = (input: string): string => {
2
+ return input
3
+ .toLowerCase()
4
+ .replace(/[^a-z0-9]+/g, '-')
5
+ .replace(/^-+|-+$/g, '')
6
+ }
@@ -0,0 +1,5 @@
1
+ import { vitePreprocess } from '@astrojs/svelte';
2
+
3
+ export default {
4
+ preprocess: vitePreprocess(),
5
+ }
@@ -0,0 +1,71 @@
1
+ import tailwindcssScrollbar from 'tailwind-scrollbar'
2
+ import type { Config } from 'tailwindcss'
3
+ import tailwindcssAnimate from 'tailwindcss-animate'
4
+
5
+ export default {
6
+ darkMode: ['class'],
7
+ content: ['src/**/*.{ts,tsx,astro,css,mdx}'],
8
+ theme: {
9
+ container: {
10
+ center: true,
11
+ padding: 'clamp(16px, 4vw, 32px)',
12
+ screens: ['1536px'],
13
+ },
14
+ extend: {
15
+ spacing: {
16
+ gutter: 'clamp(16px, 4vw, 32px)',
17
+ container: 'var(--container, 1536px)',
18
+ hero: 'calc(100vh - var(--header-height, 0px) - var(--subheader-height, 0px) - var(--banner-height, 0px))',
19
+ 'sticky-8':
20
+ 'calc(var(--header-height, 0px) + var(--subheader-height, 0px) + 2rem)',
21
+ 'sticky-16':
22
+ 'calc(var(--header-height, 0px) + var(--subheader-height, 0px) + 4rem)',
23
+ },
24
+ colors: {
25
+ border: 'hsl(var(--border))',
26
+ input: 'hsl(var(--input))',
27
+ ring: 'hsl(var(--ring))',
28
+ background: 'hsl(var(--background))',
29
+ foreground: 'hsl(var(--foreground))',
30
+ primary: {
31
+ DEFAULT: 'hsl(var(--primary))',
32
+ foreground: 'hsl(var(--primary-foreground))',
33
+ hover: 'hsl(var(--primary) / 85%)',
34
+ },
35
+ secondary: {
36
+ DEFAULT: 'hsl(var(--secondary))',
37
+ foreground: 'hsl(var(--secondary-foreground))',
38
+ hover: 'hsl(var(--secondary) / 75%)',
39
+ },
40
+ muted: {
41
+ DEFAULT: 'hsl(var(--muted))',
42
+ foreground: 'hsl(var(--muted-foreground))',
43
+ hover: 'hsl(var(--muted) / 75%)',
44
+ },
45
+ accent: {
46
+ DEFAULT: 'hsl(var(--accent))',
47
+ foreground: 'hsl(var(--accent-foreground))',
48
+ hover: 'hsl(var(--accent) / 75%)',
49
+ },
50
+ card: {
51
+ DEFAULT: 'hsl(var(--card))',
52
+ foreground: 'hsl(var(--card-foreground))',
53
+ hover: 'hsl(var(--card) / 75%)',
54
+ },
55
+ destructive: {
56
+ DEFAULT: 'hsl(var(--destructive))',
57
+ foreground: 'hsl(var(--destructive-foreground))',
58
+ },
59
+ },
60
+ borderRadius: {
61
+ lg: `var(--radius)`,
62
+ md: `calc(var(--radius) - 2px)`,
63
+ sm: 'calc(var(--radius) - 4px)',
64
+ },
65
+ borderColor: {
66
+ DEFAULT: 'hsl(var(--border))',
67
+ },
68
+ },
69
+ },
70
+ plugins: [tailwindcssAnimate, tailwindcssScrollbar({ nocompatible: true })],
71
+ } satisfies Config
package/tsconfig.json CHANGED
@@ -4,9 +4,7 @@
4
4
  "compilerOptions": {
5
5
  "baseUrl": ".",
6
6
  "paths": {
7
- "fulldev-ui/*": [
8
- "src/*"
9
- ]
7
+ "fulldev-ui/*": ["src/*"],
10
8
  }
11
9
  },
12
10
  }
@@ -1,40 +0,0 @@
1
- ---
2
- import Prose from 'fulldev-ui/components/experimental/Prose.astro'
3
- import Section from 'fulldev-ui/components/Section.astro'
4
- import Toc from 'fulldev-ui/components/Toc.astro'
5
-
6
- const { toc = 'Op deze pagina', render } = Astro.props
7
- const { Content } = (render && (await render())) || {}
8
- ---
9
-
10
- <Section class:list="article">
11
- <Prose>
12
- {Content && <Content />}
13
- <slot />
14
- </Prose>
15
- <Toc
16
- {render}
17
- heading={toc}
18
- />
19
- </Section>
20
-
21
- <style is:global lang="scss">
22
- .article {
23
- display: flex;
24
- position: relative;
25
- flex-grow: 1;
26
- flex-direction: row;
27
- align-items: start;
28
- height: 100%;
29
-
30
- &:first-child {
31
- padding-top: var(--space-6);
32
- }
33
-
34
- .prose {
35
- margin-right: auto;
36
- margin-left: auto;
37
- max-width: 768px;
38
- }
39
- }
40
- </style>
@@ -1,12 +0,0 @@
1
- ---
2
- import Section from 'fulldev-ui/components/Section.astro'
3
-
4
- const { ...rest } = Astro.props
5
- ---
6
-
7
- <Section
8
- class:list="categories"
9
- structure="grid"
10
- position="inset"
11
- {...rest}
12
- />
@@ -1,13 +0,0 @@
1
- ---
2
- import Section from 'fulldev-ui/components/Section.astro'
3
-
4
- const { ...rest } = Astro.props
5
- ---
6
-
7
- <Section
8
- class:list="colleagues"
9
- structure="grid"
10
- align="center"
11
- position="inset"
12
- {...rest}
13
- />