fulldev-ui 0.4.33 → 0.5.0-beta-16

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 (315) hide show
  1. package/.env.example +3 -0
  2. package/CONTRIBUTING.md +10 -4
  3. package/astro.config.ts +11 -11
  4. package/package.json +31 -17
  5. package/pnpm-lock.yaml +1353 -438
  6. package/public/favicon/android-chrome-192x192.png +0 -0
  7. package/public/favicon/android-chrome-512x512.png +0 -0
  8. package/public/favicon/apple-touch-icon.png +0 -0
  9. package/public/favicon/browserconfig.xml +7 -7
  10. package/public/favicon/favicon-16x16-dark.png +0 -0
  11. package/public/favicon/favicon-16x16.png +0 -0
  12. package/public/favicon/favicon-32x32-dark.png +0 -0
  13. package/public/favicon/favicon-32x32.png +0 -0
  14. package/public/favicon/favicon-48x48-dark.png +0 -0
  15. package/public/favicon/favicon-48x48.png +0 -0
  16. package/public/favicon/favicon-dark.ico +0 -0
  17. package/public/favicon/favicon.ico +0 -0
  18. package/public/favicon/favicon.svg +16 -0
  19. package/public/favicon/manifest.webmanifest +26 -0
  20. package/public/favicon/mstile-150x150.png +0 -0
  21. package/public/favicon/safari-pinned-tab.svg +14 -15
  22. package/public/favicon/yandex-browser-50x50.png +0 -0
  23. package/public/favicon/yandex-browser-manifest.json +9 -0
  24. package/src/blocks/Article.astro +40 -0
  25. package/src/blocks/Banner.astro +48 -0
  26. package/src/blocks/Colleagues.astro +2 -1
  27. package/src/blocks/Contact.astro +61 -99
  28. package/src/blocks/Cta.astro +2 -1
  29. package/src/blocks/Excerpt.astro +14 -0
  30. package/src/blocks/Hero.astro +1 -2
  31. package/src/blocks/Intro.astro +4 -1
  32. package/src/blocks/Jobs.astro +1 -1
  33. package/src/blocks/Prices.astro +1 -1
  34. package/src/blocks/Product.astro +75 -27
  35. package/src/blocks/Reviews.astro +1 -1
  36. package/src/components/Avatar.astro +3 -20
  37. package/src/components/Badge.astro +17 -54
  38. package/src/components/Badges.astro +40 -0
  39. package/src/components/Button.astro +65 -46
  40. package/src/components/Buttons.astro +49 -0
  41. package/src/components/Card.astro +100 -178
  42. package/src/components/Cards.astro +135 -0
  43. package/src/components/Cart.astro +38 -0
  44. package/src/components/CartForm.astro +122 -0
  45. package/src/components/CartList.astro +134 -0
  46. package/src/components/CartSummary.astro +148 -0
  47. package/src/components/Channel.astro +70 -0
  48. package/src/components/Channels.astro +37 -0
  49. package/src/components/Checkbox.astro +12 -16
  50. package/src/components/Dialog.astro +10 -12
  51. package/src/components/Drawer.astro +131 -63
  52. package/src/components/Element.astro +58 -0
  53. package/src/components/Footer.astro +142 -93
  54. package/src/components/Form.astro +49 -0
  55. package/src/components/Head.astro +11 -45
  56. package/src/components/Header.astro +91 -163
  57. package/src/components/Heading.astro +18 -26
  58. package/src/components/Icon.astro +9 -9
  59. package/src/components/Image.astro +42 -152
  60. package/src/components/Input.astro +16 -28
  61. package/src/components/Label.astro +14 -17
  62. package/src/components/Link.astro +22 -44
  63. package/src/components/List.astro +12 -10
  64. package/src/components/LocaleSwitcher.astro +25 -0
  65. package/src/components/Menu.astro +57 -0
  66. package/src/components/Price.astro +34 -0
  67. package/src/components/Rating.astro +29 -25
  68. package/src/components/Search.astro +4 -7
  69. package/src/components/Section.astro +196 -234
  70. package/src/components/Select.astro +16 -34
  71. package/src/components/Sidebar.astro +85 -58
  72. package/src/components/Social.astro +36 -0
  73. package/src/components/Socials.astro +37 -0
  74. package/src/components/Switch.astro +14 -22
  75. package/src/components/Table.astro +23 -36
  76. package/src/components/Tagline.astro +11 -16
  77. package/src/components/Text.astro +17 -19
  78. package/src/components/Textarea.astro +8 -22
  79. package/src/components/ThemeSelect.astro +41 -0
  80. package/src/components/Toc.astro +59 -56
  81. package/src/components/Writeup.astro +90 -0
  82. package/src/components/docs/PropsTable.astro +229 -56
  83. package/src/components/experimental/Form.astro +36 -17
  84. package/src/components/experimental/Gallery.astro +50 -126
  85. package/src/components/experimental/Logo.astro +26 -9
  86. package/src/components/experimental/Prose.astro +41 -5
  87. package/src/components/experimental/Video.astro +1 -1
  88. package/src/components/experimental/Window.astro +3 -4
  89. package/src/components/sections.astro +28 -0
  90. package/src/content/config.ts +10 -7
  91. package/src/content/pages/base/_dialog.mdx +1 -2
  92. package/src/content/pages/base/_drawer.mdx +1 -2
  93. package/src/content/pages/base/_localeswitcher.mdx +17 -0
  94. package/src/content/pages/base/_switch.mdx +1 -2
  95. package/src/content/pages/base/badge.mdx +1 -12
  96. package/src/content/pages/base/button.mdx +1 -12
  97. package/src/content/pages/base/card.mdx +2 -29
  98. package/src/content/pages/base/checkbox.mdx +1 -2
  99. package/src/content/pages/base/icon.mdx +1 -2
  100. package/src/content/pages/base/image.mdx +42 -0
  101. package/src/content/pages/base/input.mdx +1 -12
  102. package/src/content/pages/base/rating.mdx +3 -14
  103. package/src/content/pages/base/section.mdx +2 -3
  104. package/src/content/pages/base/select.mdx +1 -20
  105. package/src/content/pages/base/table.mdx +1 -28
  106. package/src/content/pages/base/textarea.mdx +1 -16
  107. package/src/content/pages/base/theme-select.mdx +15 -0
  108. package/src/content/pages/blocks/_categories.mdx +3 -5
  109. package/src/content/pages/blocks/{footer.mdx → _footer.mdx} +2 -4
  110. package/src/content/pages/blocks/{header.mdx → _header.mdx} +2 -7
  111. package/src/content/pages/blocks/_jobs.mdx +1 -2
  112. package/src/content/pages/blocks/{prices.mdx → _prices.mdx} +5 -7
  113. package/src/content/pages/blocks/_product.mdx +74 -4
  114. package/src/content/pages/blocks/_products.mdx +1 -2
  115. package/src/content/pages/blocks/_stats.mdx +1 -1
  116. package/src/content/pages/blocks/{_banner.mdx → banner.mdx} +2 -2
  117. package/src/content/pages/blocks/colleagues.mdx +6 -8
  118. package/src/content/pages/blocks/contact.mdx +69 -0
  119. package/src/content/pages/blocks/content.mdx +1 -19
  120. package/src/content/pages/blocks/cta.mdx +2 -25
  121. package/src/content/pages/blocks/features.mdx +2 -3
  122. package/src/content/pages/blocks/hero.mdx +5 -3
  123. package/src/content/pages/blocks/intro.mdx +2 -5
  124. package/src/content/pages/blocks/posts.mdx +9 -2
  125. package/src/content/pages/blocks/reviews.mdx +23 -18
  126. package/src/content/pages/index.mdx +16 -20
  127. package/src/content/pages/layouts/_layout.mdx +14 -0
  128. package/src/content/pages/layouts/docslayout.mdx +14 -0
  129. package/src/content/pages/overview/components.mdx +75 -0
  130. package/src/content/pages/overview/content-collections.mdx +139 -0
  131. package/src/content/pages/overview/frameworks.mdx +4 -4
  132. package/src/content/pages/overview/installation.mdx +36 -3
  133. package/src/content/pages/overview/introduction.mdx +19 -9
  134. package/src/content/pages/overview/theming.mdx +53 -67
  135. package/src/content/pages/schemas/page.mdx +17 -0
  136. package/src/content/pages/schemas/preset.mdx +9 -0
  137. package/src/content/pages/showcase/anti-slip-profiles.md +5 -0
  138. package/src/content/pages/showcase/fulldev-ui.md +5 -0
  139. package/src/content/pages/showcase/lavis-detailing.md +5 -0
  140. package/src/content/pages/showcase/leren-trainingsacteren.md +5 -0
  141. package/src/content/pages/showcase/miele-witgoedcenter-amsterdam.md +5 -0
  142. package/src/content/{records/record.yml → pages/showcase/record.md} +2 -0
  143. package/src/content/pages/showcase/sloepverhuur-bolsward.md +5 -0
  144. package/src/content/pages/showcase/stark-vulcanising-products.md +5 -0
  145. package/src/content/pages/showcase/the-gym-haren.md +5 -0
  146. package/src/content/pages/showcase/van-dillen-antieke-bouwmaterialen.md +5 -0
  147. package/src/content/pages/showcase.mdx +11 -41
  148. package/src/content/pages/typography/_tagline.mdx +1 -2
  149. package/src/content/pages/typography/heading.mdx +1 -2
  150. package/src/content/pages/typography/label.mdx +1 -2
  151. package/src/content/pages/typography/link.mdx +1 -13
  152. package/src/content/pages/typography/list.mdx +1 -2
  153. package/src/content/pages/typography/text.mdx +1 -2
  154. package/src/content/{settings → presets}/base.yml +62 -45
  155. package/src/content/presets/blocks.yml +1 -0
  156. package/src/content/presets/docs.yml +6 -0
  157. package/src/css/color.css +0 -82
  158. package/src/css/custom.css +9 -56
  159. package/src/css/size.css +10 -0
  160. package/src/css/space.css +0 -8
  161. package/src/css/styles.css +0 -15
  162. package/src/env.d.ts +1 -1
  163. package/src/images/avatar-1.yml +1 -0
  164. package/src/images/favicon.svg +16 -0
  165. package/src/integration/generate-colors.ts +2 -0
  166. package/src/integration/index.ts +95 -7
  167. package/src/layouts/BlockLayout.astro +10 -15
  168. package/src/layouts/ContactLayout.astro +21 -0
  169. package/src/layouts/DocsLayout.astro +73 -0
  170. package/src/layouts/Layout.astro +114 -133
  171. package/src/layouts/OverviewLayout.astro +28 -31
  172. package/src/layouts/PostLayout.astro +12 -23
  173. package/src/layouts/ProductLayout.astro +10 -20
  174. package/src/loaders/imageLoader.ts +26 -0
  175. package/src/pages/[...page].astro +25 -21
  176. package/src/schemas/components/avatar.ts +3 -0
  177. package/src/schemas/components/avatars.ts +4 -0
  178. package/src/schemas/components/badge.ts +13 -0
  179. package/src/schemas/components/button.ts +16 -0
  180. package/src/schemas/components/buttons.ts +4 -0
  181. package/src/schemas/components/card.ts +25 -0
  182. package/src/schemas/components/cards.ts +4 -0
  183. package/src/schemas/components/channel.ts +13 -0
  184. package/src/schemas/components/channels.ts +4 -0
  185. package/src/schemas/components/footer.ts +25 -0
  186. package/src/schemas/components/header.ts +11 -0
  187. package/src/schemas/components/heading.ts +3 -0
  188. package/src/schemas/components/icon.ts +3 -0
  189. package/src/schemas/components/image.ts +25 -0
  190. package/src/schemas/components/images.ts +4 -0
  191. package/src/schemas/components/list.ts +3 -0
  192. package/src/schemas/components/logo.ts +3 -0
  193. package/src/schemas/components/menu.ts +13 -0
  194. package/src/schemas/components/price.ts +3 -0
  195. package/src/schemas/components/rating.ts +15 -0
  196. package/src/schemas/components/section.ts +15 -0
  197. package/src/schemas/components/sections.ts +3 -0
  198. package/src/schemas/components/sidebar.ts +15 -0
  199. package/src/schemas/components/social.ts +3 -0
  200. package/src/schemas/components/socials.ts +4 -0
  201. package/src/schemas/components/tagline.ts +3 -0
  202. package/src/schemas/components/text.ts +3 -0
  203. package/src/schemas/components/toc.ts +3 -0
  204. package/src/schemas/components/writeup.ts +20 -0
  205. package/src/schemas/imageSchema.ts +12 -0
  206. package/src/schemas/pageSchema.ts +91 -0
  207. package/src/schemas/presetSchema.ts +3 -0
  208. package/src/schemas/utils/component.ts +17 -0
  209. package/src/schemas/utils/navigation.ts +8 -0
  210. package/src/schemas/utils/parents.ts +3 -0
  211. package/src/schemas/{utils.ts → utils/pathSchema.ts} +2 -11
  212. package/src/stores/cart.ts +23 -0
  213. package/src/types/global-props.ts +16 -0
  214. package/src/types/virtual-modules.d.ts +5 -0
  215. package/src/utils/_archive/Childmorphic.ts +1 -1
  216. package/src/utils/_archive/mergeEntries.ts +28 -0
  217. package/src/utils/cart.ts +32 -0
  218. package/src/utils/getDeepReferenceChildren.ts +14 -0
  219. package/src/utils/getFolderChildren.ts +18 -0
  220. package/src/utils/getReferenceChildren.ts +14 -0
  221. package/src/utils/getSiblingPages.ts +14 -0
  222. package/tsconfig.json +2 -5
  223. package/public/favicon/site.webmanifest +0 -19
  224. package/public/images/avatars/1.jpeg +0 -0
  225. package/public/images/avatars/2.jpeg +0 -0
  226. package/public/images/avatars/3.jpeg +0 -0
  227. package/public/images/avatars/300/1.jpeg +0 -0
  228. package/public/images/avatars/300/2.jpeg +0 -0
  229. package/public/images/avatars/300/3.jpeg +0 -0
  230. package/public/images/avatars/300/4.jpeg +0 -0
  231. package/public/images/avatars/4.jpeg +0 -0
  232. package/public/images/avatars/5.jpeg +0 -0
  233. package/public/images/avatars/6.jpeg +0 -0
  234. package/public/images/avatars/7.jpeg +0 -0
  235. package/public/images/avatars/8.jpeg +0 -0
  236. package/public/images/blocks/colleagues.png +0 -0
  237. package/public/images/blocks/content.png +0 -0
  238. package/public/images/blocks/cta.png +0 -0
  239. package/public/images/blocks/features.png +0 -0
  240. package/public/images/blocks/footer.png +0 -0
  241. package/public/images/blocks/header.png +0 -0
  242. package/public/images/blocks/hero.png +0 -0
  243. package/public/images/blocks/intro.png +0 -0
  244. package/public/images/blocks/posts.png +0 -0
  245. package/public/images/blocks/prices.png +0 -0
  246. package/public/images/blocks/reviews.png +0 -0
  247. package/public/images/logo-placeholder.svg +0 -1
  248. package/src/components/Bento.astro +0 -43
  249. package/src/components/Block.astro +0 -157
  250. package/src/components/Blocks.astro +0 -5
  251. package/src/components/Box.astro +0 -63
  252. package/src/components/Carousel.astro +0 -54
  253. package/src/components/Column.astro +0 -73
  254. package/src/components/Grid.astro +0 -32
  255. package/src/components/Masonry.astro +0 -42
  256. package/src/components/Root.astro +0 -94
  257. package/src/components/Row.astro +0 -49
  258. package/src/components/Split.astro +0 -59
  259. package/src/components/Spread.astro +0 -46
  260. package/src/components/Stack.astro +0 -36
  261. package/src/components/Toggle.astro +0 -46
  262. package/src/components/Wrap.astro +0 -42
  263. package/src/components/docs/NavigationButtons.astro +0 -59
  264. package/src/components/experimental/Channel.astro +0 -74
  265. package/src/components/experimental/GalleryVertical.astro +0 -161
  266. package/src/components/experimental/Price.astro +0 -40
  267. package/src/content/pages/_changelog.mdx +0 -10
  268. package/src/content/pages/_segment/footer.mdx +0 -244
  269. package/src/content/pages/_segment/header.mdx +0 -210
  270. package/src/content/pages/base/_image.mdx +0 -14
  271. package/src/content/pages/base/toggle.mdx +0 -32
  272. package/src/content/pages/blocks.mdx +0 -10
  273. package/src/content/pages/overview/integration.mdx +0 -37
  274. package/src/content/pages/structure/_row.mdx +0 -23
  275. package/src/content/pages/structure/_wrap.mdx +0 -25
  276. package/src/content/pages/structure/carousel.mdx +0 -31
  277. package/src/content/pages/structure/column.mdx +0 -21
  278. package/src/content/pages/structure/grid.mdx +0 -26
  279. package/src/content/pages/structure/masonry.mdx +0 -32
  280. package/src/content/pages/structure/split.mdx +0 -21
  281. package/src/content/pages/structure/spread.mdx +0 -21
  282. package/src/content/pages/structure/stack.mdx +0 -22
  283. package/src/content/settings/components.yml +0 -29
  284. package/src/layouts/BlockOverviewLayout.astro +0 -39
  285. package/src/layouts/ComponentLayout.astro +0 -23
  286. package/src/layouts/JobsLayout.astro +0 -40
  287. package/src/layouts/PageLayout.astro +0 -32
  288. package/src/schemas/base.ts +0 -90
  289. package/src/schemas/block.ts +0 -15
  290. package/src/schemas/card.ts +0 -3
  291. package/src/schemas/page.ts +0 -43
  292. package/src/utils/mergeEntries.ts +0 -28
  293. /package/{public/showcase → src/images}/anti-slip-profiles.webp +0 -0
  294. /package/{public/images/avatars/500/1.jpeg → src/images/avatar-1.jpeg} +0 -0
  295. /package/{public/images/avatars/500/2.jpeg → src/images/avatar-2.jpeg} +0 -0
  296. /package/{public/images/avatars/500/3.jpeg → src/images/avatar-3.jpeg} +0 -0
  297. /package/{public/images/avatars/500/4.jpeg → src/images/avatar-4.jpeg} +0 -0
  298. /package/{public → src}/images/avatar-placeholder.jpg +0 -0
  299. /package/{public → src}/images/block-code.png +0 -0
  300. /package/{public → src}/images/component-code.png +0 -0
  301. /package/{public/showcase → src/images}/fulldev-ui.webp +0 -0
  302. /package/{public/showcase → src/images}/lavis-detailing.webp +0 -0
  303. /package/{public/showcase → src/images}/leren-trainingsacteren.webp +0 -0
  304. /package/{public/showcase → src/images}/miele-witgoedcenter-amsterdam.webp +0 -0
  305. /package/{public → src}/images/og-image.png +0 -0
  306. /package/{public → src}/images/placeholder-center.webp +0 -0
  307. /package/{public → src}/images/placeholder-landscape-dark.png +0 -0
  308. /package/{public → src}/images/placeholder-landscape.webp +0 -0
  309. /package/{public → src}/images/placeholder-portrait.webp +0 -0
  310. /package/{public → src}/images/placeholder-right.webp +0 -0
  311. /package/{public → src}/images/placeholder.webp +0 -0
  312. /package/{public/showcase → src/images}/sloepverhuur-bolsward.webp +0 -0
  313. /package/{public/showcase → src/images}/stark-vulcanising-products.webp +0 -0
  314. /package/{public/showcase → src/images}/the-gym-haren.webp +0 -0
  315. /package/{public/showcase → src/images}/van-dillen-antieke-bouwmaterialen.webp +0 -0
@@ -1,169 +1,150 @@
1
1
  ---
2
+ import type { ComponentProps, HTMLAttributes } from 'astro/types'
2
3
  import type { CollectionEntry } from 'astro:content'
3
- import Block from 'fulldev-ui/components/Block.astro'
4
- import Blocks from 'fulldev-ui/components/Blocks.astro'
5
- import Button from 'fulldev-ui/components/Button.astro'
4
+ import Article from 'fulldev-ui/blocks/Article.astro'
5
+ import Banner from 'fulldev-ui/blocks/Banner.astro'
6
+ import Footer from 'fulldev-ui/blocks/Footer.astro'
7
+ import Element from 'fulldev-ui/components/Element.astro'
6
8
  import Head from 'fulldev-ui/components/Head.astro'
7
9
  import Header from 'fulldev-ui/components/Header.astro'
10
+ import Section from 'fulldev-ui/components/Section.astro'
11
+ import Sections from 'fulldev-ui/components/sections.astro'
8
12
  import Sidebar from 'fulldev-ui/components/Sidebar.astro'
9
- import Toc from 'fulldev-ui/components/Toc.astro'
10
- import NavigationButtons from '../components/docs/NavigationButtons.astro'
11
-
12
- type Props = Partial<CollectionEntry<'pages'>> & {
13
- class?: string
14
- theme?: 'light' | 'dark'
15
- }
16
-
17
- const { slug, data, theme, class: classes, render } = Astro.props
18
- const { logo, header, footer, footers, channels, sidebar, toc } = data || {}
19
-
20
- const { headings } = render ? await render() : { headings: [] }
21
-
22
- const h2Headings = headings.filter((heading: any) => heading.depth === 2)
13
+ import type { GlobalProps } from 'fulldev-ui/types/global-props'
14
+
15
+ type Props = GlobalProps &
16
+ HTMLAttributes<'html'> & {
17
+ render: CollectionEntry<'pages'>['render']
18
+ slug: CollectionEntry<'pages'>['slug']
19
+ header?: ComponentProps<typeof Header>
20
+ footer?: ComponentProps<typeof Footer>
21
+ sections?: ComponentProps<typeof Sections>['sections']
22
+ section?: ComponentProps<typeof Section> | undefined
23
+ banner?: any
24
+ toc?: any
25
+ sidebar?: any
26
+ navigation?: any
27
+ themeselect?: any
28
+ code?: {
29
+ head?: string
30
+ body?: string
31
+ }
32
+ title?: string
33
+ description?: string
34
+ image?: string
35
+ seo?: {
36
+ title?: string
37
+ description?: string
38
+ image?: string
39
+ }
40
+ }
41
+
42
+ const {
43
+ render,
44
+ header,
45
+ navigation,
46
+ footer,
47
+ sidebar,
48
+ toc,
49
+ sections,
50
+ theme,
51
+ section,
52
+ banner,
53
+ code,
54
+ themeselect,
55
+ ...rest
56
+ } = Astro.props
23
57
  ---
24
58
 
25
59
  <!doctype html>
26
- <html
27
- lang="nl"
28
- class:list={[
29
- slug,
30
- {
31
- 'theme-dark': theme === 'dark',
32
- 'theme-light': theme === 'light',
33
- },
34
- ]}
35
- >
60
+ <html {...rest}>
36
61
  <Head {...Astro.props} />
37
- <body
38
- class:list={[
39
- classes,
40
- {
41
- 'has-sidebar': sidebar,
42
- 'has-toc': toc,
43
- 'theme-dark': theme === 'dark',
44
- 'theme-light': theme === 'light',
45
- },
46
- ]}
62
+ <Element
63
+ as="body"
64
+ {theme}
47
65
  >
48
- <Header {...header} />
66
+ <slot name="banner">
67
+ <Banner text={banner} />
68
+ </slot>
69
+ <slot name="header">
70
+ <Header
71
+ open={navigation?.header}
72
+ {...navigation}
73
+ {...header}
74
+ />
75
+ </slot>
49
76
  <div class="core">
50
- <Sidebar {sidebar} />
51
- <main data-pagefind-body>
52
- <Toc
53
- toc={toc}
54
- headings={h2Headings}
77
+ <slot name="sidebar">
78
+ <Sidebar
79
+ {...navigation?.sidebar === true ? navigation : {}}
80
+ logo={navigation?.header ? undefined : navigation?.logo}
81
+ company={navigation?.header ? undefined : navigation?.company}
82
+ {...sidebar}
55
83
  />
56
- <div class="blocks">
57
- <slot />
58
- <NavigationButtons {sidebar} />
59
- </div>
84
+ </slot>
85
+ <main data-pagefind-body>
86
+ <slot>
87
+ <Section {...section} />
88
+ <Article />
89
+ <Sections {sections} />
90
+ </slot>
60
91
  </main>
61
92
  </div>
93
+ <slot name="footer">
94
+ <Footer {...footer} />
95
+ </slot>
96
+ <Fragment set:html={code?.body} />
62
97
 
63
- {
64
- channels?.whatsapp && (
65
- <Button
66
- variant="primary"
67
- color="brand"
68
- icon="brand-whatsapp"
69
- size="lg"
70
- href={`https://wa.me/${channels.whatsapp}`}
71
- style={{
72
- position: 'fixed',
73
- right: 'var(--space-4)',
74
- bottom: 'var(--space-4)',
75
- backgroundColor: '#46A758',
76
- }}
77
- />
78
- )
79
- }
80
- <Block
81
- _bookshop_name="Footer"
82
- {logo}
83
- {...footer}
84
- />
85
- <Blocks {...footers} />
86
-
87
- <Fragment set:html={data?.code?.body} />
88
98
  <style lang="scss" is:global>
89
99
  @layer fulldev {
90
- :root {
91
- --screen: 1536px;
92
- --gutter: max(4vw, calc(100vw - var(--screen)) / 2);
93
- --gutter-left: var(--gutter);
94
- --gutter-right: var(--gutter);
95
- --sidebar-width: 0px;
96
- --toc-width: 0px;
97
- --header-height: calc(
98
- var(--text-2) + 2 * var(--space-4) + 2 * var(--space-3)
99
- );
100
- }
101
-
102
- html,
103
- body {
104
- box-sizing: border-box;
105
- margin: 0;
106
- background-color: var(--color-background);
107
- padding: 0;
100
+ html {
108
101
  width: 100%;
109
102
  min-height: 100vh;
110
- color: var(--base-11);
103
+ scroll-behavior: smooth;
111
104
  color-scheme: var(--color-scheme);
112
105
  font-size: var(--text-2);
113
- font-family: var(--font-family);
106
+ font-family: 'Inter', sans-serif;
114
107
  }
115
108
 
116
109
  body {
117
110
  display: flex;
118
111
  flex-direction: column;
119
-
120
- @media (min-width: 1024px) {
121
- &.has-sidebar .core {
122
- --gutter-left: var(--space-6);
123
- --sidebar-width: calc(var(--gutter) + 200px);
124
-
125
- display: grid;
126
- grid-template-columns: var(--sidebar-width) minmax(0, 1fr);
127
- }
128
-
129
- &.has-toc main {
130
- --gutter-right: var(--space-6);
131
- --toc-width: calc(var(--gutter) + 200px);
132
-
133
- display: grid;
134
- grid-template-columns: minmax(0, 1fr) var(--toc-width);
135
- }
136
- }
137
-
138
- .header {
139
- width: 100%;
140
- height: var(--header-height);
141
- }
112
+ background-color: var(--base-background);
113
+ width: 100%;
114
+ min-height: 100vh;
115
+ color: var(--base-11);
142
116
 
143
117
  .core {
144
- .sidebar {
145
- position: sticky;
146
- top: 0;
147
- padding-left: var(--gutter);
148
- }
118
+ display: flex;
119
+ position: relative;
120
+ flex-grow: 1;
121
+ height: 100%;
149
122
 
150
123
  main {
151
- .toc {
152
- position: sticky;
153
- top: 0;
154
- order: 1;
155
- padding-right: var(--gutter);
156
- }
157
-
158
- .blocks {
159
- display: flex;
160
- flex-direction: column;
161
- width: 100%;
162
- }
124
+ --screen: 1280px;
125
+ display: flex;
126
+ flex: 1;
127
+ flex-direction: column;
128
+ background-color: var(--color-background);
129
+ width: 100%;
130
+ max-width: 100vw;
163
131
  }
164
132
  }
165
133
  }
166
134
  }
167
135
  </style>
168
- </body>
136
+ </Element>
169
137
  </html>
138
+
139
+ <script>
140
+ const setTheme = (document: Document) => {
141
+ const theme = localStorage.getItem('theme') || ''
142
+ document.body.classList.add(`theme-${theme}`)
143
+ }
144
+
145
+ setTheme(document)
146
+
147
+ document.addEventListener('astro:before-swap', (event) => {
148
+ setTheme(event.newDocument)
149
+ })
150
+ </script>
@@ -1,45 +1,42 @@
1
1
  ---
2
- import type { CollectionEntry } from 'astro:content'
3
- import Block from 'fulldev-ui/components/Block.astro'
4
- import Blocks from 'fulldev-ui/components/Blocks.astro'
5
- import Prose from 'fulldev-ui/components/experimental/Prose.astro'
6
- import Section from 'fulldev-ui/components/Section.astro'
2
+ import type { ComponentProps } from 'astro/types'
3
+ import Article from 'fulldev-ui/blocks/Article.astro'
4
+ import Categories from 'fulldev-ui/blocks/Categories.astro'
5
+ import Intro from 'fulldev-ui/blocks/Intro.astro'
6
+ import Products from 'fulldev-ui/blocks/Products.astro'
7
+ import Sections from 'fulldev-ui/components/sections.astro'
7
8
  import Layout from 'fulldev-ui/layouts/Layout.astro'
9
+ import { getFolderChildren } from 'fulldev-ui/utils/getFolderChildren.ts'
10
+ import { getReferenceChildren } from 'fulldev-ui/utils/getReferenceChildren.ts'
8
11
 
9
- type Props = CollectionEntry<'pages'>
12
+ type Props = ComponentProps<typeof Layout>
10
13
 
11
- const { data, render } = Astro.props
12
- const { sections, blocks, children, references } = data
13
- const { Content } = await render()
14
+ const { slug, sections, title, description, render } = Astro.props
15
+
16
+ const folderChildren = await getFolderChildren(slug)
17
+ const referenceChildren = await getReferenceChildren(slug)
14
18
  ---
15
19
 
16
20
  <Layout {...Astro.props}>
17
- <Block
18
- _bookshop_name="Hero"
19
- size="lg"
20
- {...data}
21
+ <Intro
22
+ heading={title}
23
+ text={description}
21
24
  />
22
- <Block
23
- _bookshop_name="Categories"
24
- source="children"
25
+ <Categories
26
+ component="Categories"
27
+ cards={folderChildren}
25
28
  structure="grid"
26
- {...children ?? {}}
29
+ panel
27
30
  />
28
- <Block
29
- _bookshop_name="ProductDeck"
30
- heading={data.title && references
31
- ? `Alle ${data.title.toLowerCase()}`
32
- : undefined}
33
- source="references"
31
+ <Products
32
+ component="Products"
33
+ cards={referenceChildren}
34
34
  structure="grid"
35
- {...references ?? {}}
36
35
  />
37
- <Section style={{ '--screen': '768px' }}>
38
- <Prose id="prose">
39
- <Content />
40
- </Prose>
41
- </Section>
42
- <Blocks {...sections} />
43
- <Blocks {...blocks} />
36
+ <Article
37
+ {render}
38
+ toc={false}
39
+ />
40
+ <Sections {sections} />
44
41
  <slot />
45
42
  </Layout>
@@ -1,32 +1,21 @@
1
1
  ---
2
- import type { CollectionEntry } from 'astro:content'
3
- import Intro from 'fulldev-ui/blocks/Intro.astro'
4
- import Blocks from 'fulldev-ui/components/Blocks.astro'
5
- import Prose from 'fulldev-ui/components/experimental/Prose.astro'
6
- import Section from 'fulldev-ui/components/Section.astro'
2
+ import type { ComponentProps } from 'astro/types'
3
+ import Article from 'fulldev-ui/blocks/Article.astro'
4
+ import Sections from 'fulldev-ui/components/sections.astro'
7
5
  import Layout from 'fulldev-ui/layouts/Layout.astro'
8
6
 
9
- type Props = CollectionEntry<'pages'>
7
+ type Props = ComponentProps<typeof Layout>
10
8
 
11
- const { data, render } = Astro.props
12
- const { section, sections, blocks } = data
13
- const { Content } = await render()
9
+ const { sections, render, toc } = Astro.props
14
10
  ---
15
11
 
16
12
  <Layout {...Astro.props}>
17
- <Intro
18
- _bookshop_name="Intro"
19
- style={{ '--screen': '768px' }}
20
- align="start"
21
- {...section}
22
- {...data}
23
- />
24
- <Section>
25
- <Prose id="prose">
26
- <Content />
27
- </Prose>
28
- </Section>
29
- <Blocks {...sections} />
30
- <Blocks {...blocks} />
13
+ <Article
14
+ {render}
15
+ {toc}
16
+ >
17
+ <slot name="prose" />
18
+ </Article>
19
+ <Sections {sections} />
31
20
  <slot />
32
21
  </Layout>
@@ -1,31 +1,21 @@
1
1
  ---
2
- import type { CollectionEntry } from 'astro:content'
3
- import Block from 'fulldev-ui/components/Block.astro'
4
- import Blocks from 'fulldev-ui/components/Blocks.astro'
5
- import Prose from 'fulldev-ui/components/experimental/Prose.astro'
2
+ import type { ComponentProps } from 'astro/types'
3
+ import Article from 'fulldev-ui/blocks/Article.astro'
6
4
  import Section from 'fulldev-ui/components/Section.astro'
5
+ import Sections from 'fulldev-ui/components/sections.astro'
7
6
  import Layout from 'fulldev-ui/layouts/Layout.astro'
8
7
 
9
- type Props = CollectionEntry<'pages'>
8
+ type Props = ComponentProps<typeof Layout>
10
9
 
11
- const { data, render } = Astro.props
12
- const { section, sections, block, blocks } = data
13
- const { Content } = await render()
10
+ const { render, sections, ...rest } = Astro.props
14
11
  ---
15
12
 
16
13
  <Layout {...Astro.props}>
17
- <Block
18
- _bookshop_name="ProductSection"
19
- {...data}
14
+ <Section
15
+ component="Product"
16
+ {...rest as any}
20
17
  />
21
- <Block {...section} />
22
- <Block {...block} />
23
- <Section style={{ '--screen': '768px' }}>
24
- <Prose id="prose">
25
- <Content />
26
- </Prose>
27
- </Section>
28
- <Blocks {...sections} />
29
- <Blocks {...blocks} />
18
+ <Article />
19
+ <Sections {sections} />
30
20
  <slot />
31
21
  </Layout>
@@ -0,0 +1,26 @@
1
+ export default async () => {
2
+ const files = import.meta.glob('/src/images/**/*.{webp,png,jpg,jpeg,svg}', {
3
+ eager: true,
4
+ })
5
+ const entries = import.meta.glob('/src/images/**/*.{yml,yaml,json}', {
6
+ eager: true,
7
+ })
8
+
9
+ const allImages = Object.entries(files).map(([src, file]) => {
10
+ const id = src.split('/images/').pop()
11
+ const matchPath = Object.keys(entries).find(
12
+ (entry) => entry.split('.').shift() === src
13
+ ) as any
14
+ const matchFile = entries[matchPath]
15
+ const matchData = matchFile ? (matchFile as any).default : {}
16
+ const fileData = file ? (file as any).default : {}
17
+ return {
18
+ id,
19
+ ...fileData,
20
+ src,
21
+ ...matchData,
22
+ }
23
+ })
24
+
25
+ return allImages as any
26
+ }
@@ -1,8 +1,6 @@
1
1
  ---
2
2
  import { getCollection } from 'astro:content'
3
- import PageLayout from 'fulldev-ui/layouts/PageLayout.astro'
4
- import { mapKeys } from 'radash'
5
- import { mergeEntries } from '../utils/mergeEntries'
3
+ import Layout from 'fulldev-ui/layouts/Layout.astro'
6
4
 
7
5
  export async function getStaticPaths() {
8
6
  const pages = await getCollection('pages')
@@ -14,27 +12,33 @@ export async function getStaticPaths() {
14
12
  }))
15
13
  }
16
14
 
17
- const { data, slug, ...rest } = Astro.props
15
+ const { data, ...rest } = Astro.props
18
16
 
19
- const merged = (await mergeEntries({ data, slug })) as any
17
+ const { component, ...restData } = data
20
18
 
21
- const packageLayouts = import.meta.glob('../layouts/**/*.astro')
22
- const userLayouts = import.meta.glob('/src/layouts/**/*.astro')
23
-
24
- const mapBlockKeys = (blocks: any) =>
25
- mapKeys(blocks, (key: any) => key.split('/').pop().split('.').shift())
26
-
27
- const components = {
28
- ...mapBlockKeys(packageLayouts),
29
- ...mapBlockKeys(userLayouts),
19
+ const allComponents = {
20
+ ...import.meta.glob('/src/**/*.astro'),
21
+ ...import.meta.glob('../../**/*.astro'),
30
22
  }
31
23
 
32
- const found = components[(merged.data._layout ?? 'PageLayout') as string] as any
33
- const functioncomp = found && (await found())
34
- const Layout = functioncomp?.default ?? PageLayout
24
+ const componentPath = Object.keys(allComponents).find(
25
+ (path) => path.split('/').pop()?.split('.')[0] === component
26
+ )
27
+
28
+ const Component =
29
+ componentPath && (await (allComponents[componentPath] as any)()).default
35
30
  ---
36
31
 
37
- <Layout
38
- data={merged.data}
39
- {...rest}
40
- />
32
+ {
33
+ Component ? (
34
+ <Component
35
+ {...restData}
36
+ {...rest}
37
+ />
38
+ ) : (
39
+ <Layout
40
+ {...(data as any)}
41
+ {...rest}
42
+ />
43
+ )
44
+ }
@@ -0,0 +1,3 @@
1
+ import { z } from 'astro:content'
2
+
3
+ export default z.string()
@@ -0,0 +1,4 @@
1
+ import { z } from 'astro:content'
2
+ import avatar from './avatar'
3
+
4
+ export default z.array(avatar)
@@ -0,0 +1,13 @@
1
+ import { z } from 'astro:content'
2
+ import pathSchema from '../utils/pathSchema'
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
+ )
@@ -0,0 +1,16 @@
1
+ import { z } from 'astro:content'
2
+ import pathSchema from '../utils/pathSchema'
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
+ )
@@ -0,0 +1,4 @@
1
+ import { z } from 'astro:content'
2
+ import button from './button'
3
+
4
+ export default z.array(button)
@@ -0,0 +1,25 @@
1
+ import button from './button'
2
+ import buttons from './buttons'
3
+ import icon from './icon'
4
+ import image from './image'
5
+ import images from './images'
6
+
7
+ import { z } from 'astro:content'
8
+ import pathSchema from '../utils/pathSchema'
9
+ import writeup from './writeup'
10
+
11
+ export default z.union([pathSchema('pages'), z.object({}).passthrough()]).pipe(
12
+ writeup
13
+ .extend({
14
+ slug: z
15
+ .string()
16
+ .refine(async (data) => await pathSchema('pages').parseAsync(data)),
17
+ image,
18
+ images,
19
+ buttons,
20
+ button,
21
+ icon,
22
+ })
23
+ .partial()
24
+ .passthrough()
25
+ )
@@ -0,0 +1,4 @@
1
+ import { z } from 'astro:content'
2
+ import card from './card'
3
+
4
+ export default z.array(card)
@@ -0,0 +1,13 @@
1
+ import { z } from 'astro:content'
2
+ import heading from './heading'
3
+ import icon from './icon'
4
+ import text from './text'
5
+
6
+ export default z
7
+ .object({
8
+ heading,
9
+ text,
10
+ icon,
11
+ href: z.string(),
12
+ })
13
+ .partial()
@@ -0,0 +1,4 @@
1
+ import { z } from 'astro:content'
2
+ import channel from './channel'
3
+
4
+ export default z.array(channel)
@@ -0,0 +1,25 @@
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'
8
+
9
+ export default z
10
+ .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
+ ),
23
+ })
24
+ .partial()
25
+ .passthrough()
@@ -0,0 +1,11 @@
1
+ import { z } from 'astro:content'
2
+ import buttons from './buttons'
3
+ import logo from './logo'
4
+
5
+ export default z
6
+ .object({
7
+ logo,
8
+ buttons,
9
+ })
10
+ .partial()
11
+ .passthrough()