fulldev-ui 0.4.29 → 0.5.0-beta.1

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 (301) hide show
  1. package/CONTRIBUTING.md +2 -2
  2. package/astro.config.ts +15 -4
  3. package/package.json +26 -16
  4. package/pnpm-lock.yaml +6473 -0
  5. package/public/favicon/android-chrome-192x192.png +0 -0
  6. package/public/favicon/android-chrome-512x512.png +0 -0
  7. package/public/favicon/apple-touch-icon.png +0 -0
  8. package/public/favicon/browserconfig.xml +7 -7
  9. package/public/favicon/favicon-16x16-dark.png +0 -0
  10. package/public/favicon/favicon-16x16.png +0 -0
  11. package/public/favicon/favicon-32x32-dark.png +0 -0
  12. package/public/favicon/favicon-32x32.png +0 -0
  13. package/public/favicon/favicon-48x48-dark.png +0 -0
  14. package/public/favicon/favicon-48x48.png +0 -0
  15. package/public/favicon/favicon-dark.ico +0 -0
  16. package/public/favicon/favicon.ico +0 -0
  17. package/public/favicon/favicon.svg +16 -0
  18. package/public/favicon/manifest.webmanifest +26 -0
  19. package/public/favicon/mstile-150x150.png +0 -0
  20. package/public/favicon/safari-pinned-tab.svg +14 -15
  21. package/public/favicon/yandex-browser-50x50.png +0 -0
  22. package/public/favicon/yandex-browser-manifest.json +9 -0
  23. package/src/blocks/Article.astro +21 -0
  24. package/src/blocks/Banner.astro +47 -0
  25. package/src/blocks/Colleagues.astro +2 -1
  26. package/src/blocks/Contact.astro +84 -99
  27. package/src/blocks/Cta.astro +2 -1
  28. package/src/blocks/Hero.astro +1 -2
  29. package/src/blocks/Intro.astro +1 -1
  30. package/src/blocks/Jobs.astro +1 -1
  31. package/src/blocks/Prices.astro +1 -1
  32. package/src/blocks/Product.astro +23 -10
  33. package/src/blocks/Reviews.astro +1 -1
  34. package/src/components/Avatar.astro +3 -20
  35. package/src/components/Badge.astro +17 -54
  36. package/src/components/Badges.astro +50 -0
  37. package/src/components/Button.astro +65 -45
  38. package/src/components/Buttons.astro +49 -0
  39. package/src/components/Card.astro +94 -177
  40. package/src/components/Cards.astro +135 -0
  41. package/src/components/Channel.astro +70 -0
  42. package/src/components/Channels.astro +37 -0
  43. package/src/components/Checkbox.astro +12 -16
  44. package/src/components/Dialog.astro +10 -12
  45. package/src/components/Drawer.astro +16 -22
  46. package/src/components/Element.astro +58 -0
  47. package/src/components/Footer.astro +139 -93
  48. package/src/components/Head.astro +7 -45
  49. package/src/components/Header.astro +78 -160
  50. package/src/components/Heading.astro +18 -26
  51. package/src/components/Icon.astro +9 -9
  52. package/src/components/Image.astro +43 -152
  53. package/src/components/Input.astro +10 -28
  54. package/src/components/Label.astro +14 -17
  55. package/src/components/Link.astro +22 -44
  56. package/src/components/List.astro +12 -10
  57. package/src/components/LocaleSwitcher.astro +25 -0
  58. package/src/components/Price.astro +38 -0
  59. package/src/components/Rating.astro +29 -25
  60. package/src/components/Search.astro +3 -3
  61. package/src/components/Section.astro +196 -236
  62. package/src/components/Select.astro +16 -34
  63. package/src/components/Sidebar.astro +123 -46
  64. package/src/components/Social.astro +28 -0
  65. package/src/components/Socials.astro +37 -0
  66. package/src/components/Switch.astro +14 -22
  67. package/src/components/Table.astro +23 -36
  68. package/src/components/Tagline.astro +11 -16
  69. package/src/components/Text.astro +17 -19
  70. package/src/components/Textarea.astro +8 -22
  71. package/src/components/ThemeSelect.astro +38 -0
  72. package/src/components/Toc.astro +98 -41
  73. package/src/components/Writeup.astro +90 -0
  74. package/src/components/docs/PropsTable.astro +229 -56
  75. package/src/components/experimental/Form.astro +10 -17
  76. package/src/components/experimental/Logo.astro +26 -9
  77. package/src/components/experimental/Prose.astro +9 -5
  78. package/src/components/experimental/Video.astro +1 -1
  79. package/src/components/experimental/Window.astro +3 -4
  80. package/src/components/sections.astro +28 -0
  81. package/src/content/config.ts +10 -7
  82. package/src/content/pages/base/_dialog.mdx +1 -2
  83. package/src/content/pages/base/_drawer.mdx +1 -2
  84. package/src/content/pages/base/_localeswitcher.mdx +17 -0
  85. package/src/content/pages/base/_switch.mdx +1 -2
  86. package/src/content/pages/base/badge.mdx +1 -12
  87. package/src/content/pages/base/button.mdx +1 -12
  88. package/src/content/pages/base/card.mdx +2 -29
  89. package/src/content/pages/base/checkbox.mdx +1 -2
  90. package/src/content/pages/base/icon.mdx +1 -2
  91. package/src/content/pages/base/image.mdx +42 -0
  92. package/src/content/pages/base/input.mdx +1 -12
  93. package/src/content/pages/base/rating.mdx +3 -14
  94. package/src/content/pages/base/section.mdx +2 -3
  95. package/src/content/pages/base/select.mdx +1 -12
  96. package/src/content/pages/base/table.mdx +1 -28
  97. package/src/content/pages/base/textarea.mdx +1 -11
  98. package/src/content/pages/base/theme-select.mdx +15 -0
  99. package/src/content/pages/blocks/_categories.mdx +3 -5
  100. package/src/content/pages/blocks/{footer.mdx → _footer.mdx} +2 -4
  101. package/src/content/pages/blocks/{header.mdx → _header.mdx} +2 -7
  102. package/src/content/pages/blocks/_jobs.mdx +1 -2
  103. package/src/content/pages/blocks/{prices.mdx → _prices.mdx} +5 -7
  104. package/src/content/pages/blocks/_product.mdx +1 -2
  105. package/src/content/pages/blocks/_products.mdx +1 -2
  106. package/src/content/pages/blocks/_stats.mdx +1 -1
  107. package/src/content/pages/blocks/{_banner.mdx → banner.mdx} +2 -2
  108. package/src/content/pages/blocks/colleagues.mdx +6 -8
  109. package/src/content/pages/blocks/contact.mdx +69 -0
  110. package/src/content/pages/blocks/content.mdx +1 -19
  111. package/src/content/pages/blocks/cta.mdx +2 -25
  112. package/src/content/pages/blocks/features.mdx +2 -3
  113. package/src/content/pages/blocks/hero.mdx +5 -3
  114. package/src/content/pages/blocks/intro.mdx +2 -5
  115. package/src/content/pages/blocks/posts.mdx +9 -2
  116. package/src/content/pages/blocks/reviews.mdx +23 -18
  117. package/src/content/pages/index.mdx +19 -20
  118. package/src/content/pages/layouts/docslayout.mdx +5 -0
  119. package/src/content/pages/layouts/layout.mdx +21 -0
  120. package/src/content/pages/layouts/pagelayout.mdx +21 -0
  121. package/src/content/pages/overview/components.mdx +70 -0
  122. package/src/content/pages/overview/content-layer.mdx +128 -0
  123. package/src/content/pages/overview/{theming.mdx → customization.mdx} +6 -6
  124. package/src/content/pages/overview/frameworks.mdx +4 -4
  125. package/src/content/pages/overview/installation.mdx +37 -3
  126. package/src/content/pages/overview/introduction.mdx +6 -2
  127. package/src/content/pages/schemas/page.mdx +11 -0
  128. package/src/content/pages/schemas/preset.mdx +9 -0
  129. package/src/content/pages/showcase/anti-slip-profiles.md +5 -0
  130. package/src/content/pages/showcase/fulldev-ui.md +5 -0
  131. package/src/content/pages/showcase/lavis-detailing.md +5 -0
  132. package/src/content/pages/showcase/leren-trainingsacteren.md +5 -0
  133. package/src/content/pages/showcase/miele-witgoedcenter-amsterdam.md +5 -0
  134. package/src/content/{records/record.yml → pages/showcase/record.md} +2 -0
  135. package/src/content/pages/showcase/sloepverhuur-bolsward.md +5 -0
  136. package/src/content/pages/showcase/stark-vulcanising-products.md +5 -0
  137. package/src/content/pages/showcase/the-gym-haren.md +5 -0
  138. package/src/content/pages/showcase/van-dillen-antieke-bouwmaterialen.md +5 -0
  139. package/src/content/pages/showcase.mdx +11 -41
  140. package/src/content/pages/typography/_tagline.mdx +1 -2
  141. package/src/content/pages/typography/heading.mdx +1 -2
  142. package/src/content/pages/typography/label.mdx +1 -2
  143. package/src/content/pages/typography/link.mdx +1 -13
  144. package/src/content/pages/typography/list.mdx +1 -2
  145. package/src/content/pages/typography/text.mdx +1 -2
  146. package/src/content/presets/base.yml +70 -0
  147. package/src/content/presets/blocks.yml +4 -0
  148. package/src/content/presets/docs.yml +65 -0
  149. package/src/css/color.css +0 -82
  150. package/src/css/custom.css +9 -56
  151. package/src/css/size.css +10 -0
  152. package/src/css/space.css +0 -8
  153. package/src/css/styles.css +0 -15
  154. package/src/images/avatar-1.yml +1 -0
  155. package/src/images/favicon.svg +16 -0
  156. package/src/integration/generate-colors.ts +2 -0
  157. package/src/integration/index.ts +67 -7
  158. package/src/layouts/BlockLayout.astro +10 -15
  159. package/src/layouts/ContactLayout.astro +21 -0
  160. package/src/layouts/ContentLayout.astro +16 -0
  161. package/src/layouts/DocsLayout.astro +85 -0
  162. package/src/layouts/Layout.astro +111 -133
  163. package/src/layouts/OverviewLayout.astro +22 -32
  164. package/src/layouts/PageLayout.astro +7 -24
  165. package/src/layouts/PostLayout.astro +8 -19
  166. package/src/layouts/ProductLayout.astro +9 -22
  167. package/src/loaders/imageLoader.ts +26 -0
  168. package/src/pages/[...page].astro +25 -21
  169. package/src/schemas/components/avatar.ts +3 -0
  170. package/src/schemas/components/avatars.ts +4 -0
  171. package/src/schemas/components/badge.ts +13 -0
  172. package/src/schemas/components/button.ts +16 -0
  173. package/src/schemas/components/buttons.ts +4 -0
  174. package/src/schemas/components/card.ts +25 -0
  175. package/src/schemas/components/cards.ts +4 -0
  176. package/src/schemas/components/channel.ts +13 -0
  177. package/src/schemas/components/channels.ts +4 -0
  178. package/src/schemas/components/footer.ts +24 -0
  179. package/src/schemas/components/header.ts +10 -0
  180. package/src/schemas/components/heading.ts +3 -0
  181. package/src/schemas/components/icon.ts +3 -0
  182. package/src/schemas/components/image.ts +18 -0
  183. package/src/schemas/components/images.ts +4 -0
  184. package/src/schemas/components/list.ts +3 -0
  185. package/src/schemas/components/logo.ts +3 -0
  186. package/src/schemas/components/price.ts +3 -0
  187. package/src/schemas/components/rating.ts +15 -0
  188. package/src/schemas/components/section.ts +15 -0
  189. package/src/schemas/components/sections.ts +3 -0
  190. package/src/schemas/components/social.ts +3 -0
  191. package/src/schemas/components/socials.ts +4 -0
  192. package/src/schemas/components/tagline.ts +3 -0
  193. package/src/schemas/components/text.ts +3 -0
  194. package/src/schemas/components/writeup.ts +20 -0
  195. package/src/schemas/imageSchema.ts +12 -0
  196. package/src/schemas/pageSchema.ts +63 -0
  197. package/src/schemas/presetSchema.ts +29 -0
  198. package/src/schemas/utils/categories.ts +3 -0
  199. package/src/schemas/utils/component.ts +17 -0
  200. package/src/schemas/utils/navigation.ts +53 -0
  201. package/src/schemas/{utils.ts → utils/pathSchema.ts} +2 -11
  202. package/src/types/global-props.d.ts +16 -0
  203. package/src/types/virtual-modules.d.ts +5 -0
  204. package/src/utils/_archive/Childmorphic.ts +1 -1
  205. package/src/utils/_archive/mergeEntries.ts +28 -0
  206. package/src/utils/getCategoryPages.ts +11 -0
  207. package/src/utils/getChildPages.ts +16 -0
  208. package/src/utils/getSiblingPages.ts +14 -0
  209. package/tsconfig.json +1 -2
  210. package/public/favicon/site.webmanifest +0 -19
  211. package/public/images/avatars/1.jpeg +0 -0
  212. package/public/images/avatars/2.jpeg +0 -0
  213. package/public/images/avatars/3.jpeg +0 -0
  214. package/public/images/avatars/300/1.jpeg +0 -0
  215. package/public/images/avatars/300/2.jpeg +0 -0
  216. package/public/images/avatars/300/3.jpeg +0 -0
  217. package/public/images/avatars/300/4.jpeg +0 -0
  218. package/public/images/avatars/4.jpeg +0 -0
  219. package/public/images/avatars/5.jpeg +0 -0
  220. package/public/images/avatars/6.jpeg +0 -0
  221. package/public/images/avatars/7.jpeg +0 -0
  222. package/public/images/avatars/8.jpeg +0 -0
  223. package/public/images/blocks/colleagues.png +0 -0
  224. package/public/images/blocks/content.png +0 -0
  225. package/public/images/blocks/cta.png +0 -0
  226. package/public/images/blocks/features.png +0 -0
  227. package/public/images/blocks/footer.png +0 -0
  228. package/public/images/blocks/header.png +0 -0
  229. package/public/images/blocks/hero.png +0 -0
  230. package/public/images/blocks/intro.png +0 -0
  231. package/public/images/blocks/posts.png +0 -0
  232. package/public/images/blocks/prices.png +0 -0
  233. package/public/images/blocks/reviews.png +0 -0
  234. package/public/images/logo-placeholder.svg +0 -1
  235. package/src/components/Bento.astro +0 -43
  236. package/src/components/Block.astro +0 -157
  237. package/src/components/Blocks.astro +0 -5
  238. package/src/components/Box.astro +0 -63
  239. package/src/components/Carousel.astro +0 -54
  240. package/src/components/Column.astro +0 -73
  241. package/src/components/Grid.astro +0 -32
  242. package/src/components/Masonry.astro +0 -42
  243. package/src/components/Root.astro +0 -94
  244. package/src/components/Row.astro +0 -49
  245. package/src/components/Split.astro +0 -59
  246. package/src/components/Spread.astro +0 -46
  247. package/src/components/Stack.astro +0 -36
  248. package/src/components/Toggle.astro +0 -46
  249. package/src/components/Wrap.astro +0 -42
  250. package/src/components/docs/NavigationButtons.astro +0 -59
  251. package/src/components/experimental/Channel.astro +0 -74
  252. package/src/components/experimental/Price.astro +0 -40
  253. package/src/content/pages/_changelog.mdx +0 -10
  254. package/src/content/pages/_segment/footer.mdx +0 -244
  255. package/src/content/pages/_segment/header.mdx +0 -210
  256. package/src/content/pages/base/_image.mdx +0 -14
  257. package/src/content/pages/base/toggle.mdx +0 -32
  258. package/src/content/pages/blocks.mdx +0 -10
  259. package/src/content/pages/overview/integration.mdx +0 -37
  260. package/src/content/pages/structure/_row.mdx +0 -23
  261. package/src/content/pages/structure/_wrap.mdx +0 -25
  262. package/src/content/pages/structure/carousel.mdx +0 -31
  263. package/src/content/pages/structure/column.mdx +0 -21
  264. package/src/content/pages/structure/grid.mdx +0 -26
  265. package/src/content/pages/structure/masonry.mdx +0 -32
  266. package/src/content/pages/structure/split.mdx +0 -21
  267. package/src/content/pages/structure/spread.mdx +0 -21
  268. package/src/content/pages/structure/stack.mdx +0 -22
  269. package/src/content/settings/base.yml +0 -55
  270. package/src/content/settings/components.yml +0 -29
  271. package/src/layouts/BlockOverviewLayout.astro +0 -39
  272. package/src/layouts/ComponentLayout.astro +0 -23
  273. package/src/layouts/JobsLayout.astro +0 -40
  274. package/src/schemas/base.ts +0 -90
  275. package/src/schemas/block.ts +0 -15
  276. package/src/schemas/card.ts +0 -3
  277. package/src/schemas/page.ts +0 -43
  278. package/src/utils/mergeEntries.ts +0 -28
  279. /package/{public/showcase → src/images}/anti-slip-profiles.webp +0 -0
  280. /package/{public/images/avatars/500/1.jpeg → src/images/avatar-1.jpeg} +0 -0
  281. /package/{public/images/avatars/500/2.jpeg → src/images/avatar-2.jpeg} +0 -0
  282. /package/{public/images/avatars/500/3.jpeg → src/images/avatar-3.jpeg} +0 -0
  283. /package/{public/images/avatars/500/4.jpeg → src/images/avatar-4.jpeg} +0 -0
  284. /package/{public → src}/images/avatar-placeholder.jpg +0 -0
  285. /package/{public → src}/images/block-code.png +0 -0
  286. /package/{public → src}/images/component-code.png +0 -0
  287. /package/{public/showcase → src/images}/fulldev-ui.webp +0 -0
  288. /package/{public/showcase → src/images}/lavis-detailing.webp +0 -0
  289. /package/{public/showcase → src/images}/leren-trainingsacteren.webp +0 -0
  290. /package/{public/showcase → src/images}/miele-witgoedcenter-amsterdam.webp +0 -0
  291. /package/{public → src}/images/og-image.png +0 -0
  292. /package/{public → src}/images/placeholder-center.webp +0 -0
  293. /package/{public → src}/images/placeholder-landscape-dark.png +0 -0
  294. /package/{public → src}/images/placeholder-landscape.webp +0 -0
  295. /package/{public → src}/images/placeholder-portrait.webp +0 -0
  296. /package/{public → src}/images/placeholder-right.webp +0 -0
  297. /package/{public → src}/images/placeholder.webp +0 -0
  298. /package/{public/showcase → src/images}/sloepverhuur-bolsward.webp +0 -0
  299. /package/{public/showcase → src/images}/stark-vulcanising-products.webp +0 -0
  300. /package/{public/showcase → src/images}/the-gym-haren.webp +0 -0
  301. /package/{public/showcase → src/images}/van-dillen-antieke-bouwmaterialen.webp +0 -0
@@ -1,43 +1,35 @@
1
1
  ---
2
- import type { Polymorphic } from 'astro/types'
3
- import Root from 'fulldev-ui/components/Root.astro'
2
+ import type { HTMLAttributes } from 'astro/types'
3
+ import Element from 'fulldev-ui/components/Element.astro'
4
+ import type { GlobalProps } from 'fulldev-ui/types/global-props'
4
5
 
5
- type Props<As extends 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span'> =
6
- Polymorphic<{
7
- as: As
8
- }> & {
9
- level?: 1 | 2 | 3 | 4 | 5 | 6
10
- size?: 'sm' | 'md' | 'lg'
11
- color?: 'base' | 'brand'
12
- contrast?: boolean
13
- html?: string
14
- text?: string
15
- }
6
+ interface Props
7
+ extends GlobalProps,
8
+ HTMLAttributes<'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'> {
9
+ level?: 1 | 2 | 3 | 4 | 5 | 6 | undefined
10
+ text?: string | undefined
11
+ }
16
12
 
17
13
  const {
18
- level = 2,
19
- as = `h${level}`,
20
- color = 'base',
21
14
  contrast = true,
22
- html,
15
+ color = 'base',
16
+ level = 2,
23
17
  text,
24
18
  ...rest
25
19
  } = Astro.props
26
20
  ---
27
21
 
28
- <Root
22
+ <Element
29
23
  class:list="heading"
30
- {as}
24
+ as=`h${level}`
31
25
  {contrast}
32
26
  {color}
33
27
  {level}
34
28
  {...rest}
35
29
  >
36
- <slot>
37
- <Fragment set:html={html} />
38
- <Fragment set:text={text} />
39
- </slot>
40
- </Root>
30
+ <slot />
31
+ <Fragment set:text={text} />
32
+ </Element>
41
33
 
42
34
  <style is:global lang="scss">
43
35
  @layer fulldev {
@@ -46,15 +38,15 @@ const {
46
38
  max-width: calc(var(--space-4) * 44);
47
39
  scroll-margin: var(--space-5);
48
40
  color: var(--color-11);
49
- font-weight: var(--heading-font-weight);
50
41
  font-weight: 700;
51
42
  line-height: 1.1;
52
- font-family: var(--heading-font-family);
53
43
  letter-spacing: -0.025em;
44
+ text-align: inherit;
54
45
  text-decoration: none;
55
46
 
56
47
  &.level-1 {
57
48
  font-size: var(--text-8);
49
+ text-wrap: balance;
58
50
  }
59
51
 
60
52
  &.level-2 {
@@ -1,14 +1,14 @@
1
1
  ---
2
2
  import tablerIcons from '@iconify-json/tabler/icons.json'
3
- import type { HTMLTag, Polymorphic } from 'astro/types'
4
- import Root from 'fulldev-ui/components/Root.astro'
3
+ import type { HTMLAttributes } from 'astro/types'
4
+ import Element from 'fulldev-ui/components/Element.astro'
5
+ import type { GlobalProps } from 'fulldev-ui/types/global-props'
5
6
 
6
- type Props<As extends HTMLTag = 'i'> = Polymorphic<{ as: As }> & {
7
- name?: string
8
- color?: 'base' | 'brand'
7
+ interface Props extends GlobalProps, HTMLAttributes<'i'> {
8
+ name?: string | undefined
9
9
  }
10
10
 
11
- const { as = 'i', name, ...rest } = Astro.props
11
+ const { name, ...rest } = Astro.props
12
12
 
13
13
  const trimmedName = name?.trim() as string | undefined
14
14
  const icon = trimmedName
@@ -16,10 +16,10 @@ const icon = trimmedName
16
16
  : undefined
17
17
  ---
18
18
 
19
- <Root
19
+ <Element
20
20
  class:list="icon"
21
21
  if={icon}
22
- {as}
22
+ as="i"
23
23
  {...rest}
24
24
  >
25
25
  {
@@ -31,7 +31,7 @@ const icon = trimmedName
31
31
  />
32
32
  )
33
33
  }
34
- </Root>
34
+ </Element>
35
35
 
36
36
  <style is:global lang="scss">
37
37
  @layer fulldev {
@@ -1,72 +1,54 @@
1
1
  ---
2
+ import type { ImageMetadata } from 'astro'
2
3
  import type { HTMLAttributes } from 'astro/types'
3
4
  import { Image as AstroImage } from 'astro:assets'
4
- import Root from 'fulldev-ui/components/Root.astro'
5
- import { isString } from 'remeda'
5
+ import type { CollectionEntry } from 'astro:content'
6
+ import { getEntry } from 'astro:content'
6
7
 
7
- type Props = HTMLAttributes<'img'> & {
8
- position?: 'background' | 'cover' | 'inset'
9
- ratio?: 'landscape' | 'portrait' | 'square' | number
10
- frame?: 'inset'
11
- width?: number | 1920
12
- height?: number | 1920
13
- radius?: 'none' | 'auto' | 'full'
14
- mask?: 'sm' | 'md' | 'lg'
8
+ interface Props extends HTMLAttributes<'img'> {
9
+ src?: string | undefined
10
+ position?: 'background' | 'cover' | 'inset' | undefined
11
+ id?: CollectionEntry<'images'>['id'] | undefined
15
12
  }
16
13
 
17
- function getAltBySrc(): string {
18
- if (!isString(Astro.props.src)) return ''
19
- const filename = Astro.props.src?.split('/').pop()
20
- const slug = filename && filename.split('.')[0]
21
- const unslugged = slug?.replace(/-/g, ' ')
22
- return unslugged || ''
23
- }
14
+ const { id } = Astro.props
15
+ const entry = id ? (await getEntry('images', id))?.data : {}
24
16
 
25
17
  const {
26
- loading = 'lazy',
27
- alt = getAltBySrc(),
28
- src = Astro.props.src,
18
+ width = 1920,
19
+ height = 1920,
29
20
  position,
30
- frame,
31
- width,
32
- radius = 'auto',
33
- height,
21
+ src,
22
+ alt,
34
23
  ...rest
35
- } = Astro.props
24
+ } = {
25
+ ...Astro.props,
26
+ ...entry,
27
+ }
36
28
 
37
- // TODO get alt from image collection with yaml files
38
- // const imageEntry =
39
- // src && (await getEntry('images', src?.replace('/images/', '')))
29
+ function getAltBySrc() {
30
+ if (!src) return
31
+ const filename = src?.split('/').pop()
32
+ const slug = filename && filename.split('.')[0]
33
+ const unslugged = slug?.replace(/-/g, ' ')
34
+ return unslugged || ''
35
+ }
36
+
37
+ const images = import.meta.glob<{ default: ImageMetadata }>('/src/images/*')
38
+ const image = images[src as keyof typeof images]
40
39
  ---
41
40
 
42
41
  {
43
- src && (
44
- <>
45
- {!width && !height && (
46
- <Root
47
- class:list="image"
48
- if={src}
49
- {src}
50
- {alt}
51
- as="img"
52
- {frame}
53
- {position}
54
- {radius}
55
- {...rest}
56
- />
57
- )}
58
- {width && height && (
59
- <AstroImage
60
- class:list="image"
61
- {src}
62
- {alt}
63
- width={width}
64
- height={height}
65
- loading="eager"
66
- {...rest}
67
- />
68
- )}
69
- </>
42
+ image && (
43
+ <AstroImage
44
+ class:list={['image', position && `position-${position}`]}
45
+ style={{ '--screen': '100vw' }}
46
+ alt={alt || getAltBySrc()}
47
+ src={image ? image() : src}
48
+ width={width}
49
+ height={height}
50
+ {...(rest as any)}
51
+ />
70
52
  )
71
53
  }
72
54
 
@@ -77,40 +59,12 @@ const {
77
59
  width: 100%;
78
60
  height: auto;
79
61
 
80
- &.mask-sm {
81
- -webkit-mask-image: linear-gradient(to top, transparent 0%, black 30%);
82
- mask-image: linear-gradient(to top, transparent 0%, black 30%);
83
- }
84
-
85
- &.mask-md {
86
- -webkit-mask-image: linear-gradient(to top, transparent 0%, black 65%);
87
- mask-image: linear-gradient(to top, transparent 0%, black 65%);
88
- }
89
-
90
- &.mask-lg {
91
- -webkit-mask-image: linear-gradient(to top, transparent 0%, black 100%);
92
- mask-image: linear-gradient(to top, transparent 0%, black 100%);
93
- }
94
-
95
- &.radius-none {
96
- border-radius: 0;
97
- }
98
-
99
- &.radius-auto {
100
- border-radius: var(--radius-1);
101
- }
102
-
103
- &.radius-full {
104
- border-radius: 9999px;
105
- }
106
-
107
62
  &.position-background {
108
63
  position: absolute;
109
64
  top: 0;
110
65
  right: 0;
111
66
  bottom: 0;
112
67
  left: 0;
113
- z-index: -1;
114
68
  margin: 0 !important;
115
69
  border-radius: 0;
116
70
  width: 100%;
@@ -126,78 +80,15 @@ const {
126
80
  object-fit: cover;
127
81
  }
128
82
 
129
- &.position-container {
130
- width: 100%;
131
- height: 100%;
132
- object-fit: contain;
133
- object-position: center;
134
- }
135
-
136
83
  &.position-inset {
84
+ margin-top: calc(var(--inset-top) * -1);
85
+ margin-right: calc(var(--inset-right) * -1);
86
+ margin-bottom: calc(var(--inset-bottom) * -1);
87
+ margin-left: calc(var(--inset-left) * -1);
88
+ width: calc(100% + var(--inset-left) + var(--inset-right));
137
89
  max-width: none;
90
+ height: calc(100% + var(--inset-top) + var(--inset-bottom));
138
91
  object-fit: cover;
139
-
140
- &:is(.structure-column > &) {
141
- margin-right: calc(var(--inset-right) * -1);
142
- margin-left: calc(var(--inset-left) * -1);
143
- width: calc(100% + var(--inset-left) + var(--inset-right));
144
-
145
- &.image:first-child {
146
- margin-top: calc(var(--inset-top) * -1);
147
- height: calc(100% + var(--inset-top) * 1);
148
- }
149
-
150
- &.image:last-child {
151
- margin-bottom: calc(var(--inset-bottom) * -1);
152
- height: calc(100% + var(--inset-bottom) * 1);
153
- }
154
- }
155
-
156
- &:is(.structure-split > &) {
157
- @media (max-width: 1023.999px) {
158
- margin-right: calc(var(--inset-right) * -1);
159
- margin-left: calc(var(--inset-left) * -1);
160
- width: calc(100% + var(--inset-left) + var(--inset-right));
161
-
162
- &.image:first-child {
163
- margin-top: calc(var(--inset-top) * -1);
164
- height: calc(100% + var(--inset-top) * 1);
165
- }
166
-
167
- &.image:last-child {
168
- margin-bottom: calc(var(--inset-bottom) * -1);
169
- height: calc(100% + var(--inset-bottom) * 1);
170
- }
171
- }
172
-
173
- @media (min-width: 1024px) {
174
- margin-top: calc(var(--inset-top) * -1);
175
- margin-bottom: calc(var(--inset-bottom) * -1);
176
- height: calc(100% + var(--inset-top) * 1 + var(--inset-bottom) * 1);
177
-
178
- &.image:first-child {
179
- margin-left: calc(var(--inset-left) * -1);
180
- width: calc(100% + var(--inset-left) * 1);
181
- }
182
-
183
- &.image:last-child {
184
- margin-right: calc(var(--inset-right) * -1);
185
- width: calc(100% + var(--inset-right) * 1);
186
- }
187
- }
188
- }
189
- }
190
-
191
- &.ratio-landscape {
192
- aspect-ratio: 4/3;
193
- }
194
-
195
- &.ratio-square {
196
- aspect-ratio: 1/1;
197
- }
198
-
199
- &.ratio-portrait {
200
- aspect-ratio: 3/4;
201
92
  }
202
93
  }
203
94
  }
@@ -1,25 +1,21 @@
1
1
  ---
2
- import type { HTMLAttributes } from 'astro/types'
2
+ import type { ComponentProps, HTMLAttributes } from 'astro/types'
3
+ import Element from 'fulldev-ui/components/Element.astro'
3
4
  import Icon from 'fulldev-ui/components/Icon.astro'
4
5
  import Label from 'fulldev-ui/components/Label.astro'
5
- import Root from 'fulldev-ui/components/Root.astro'
6
+ import type { GlobalProps } from 'fulldev-ui/types/global-props'
6
7
 
7
- type Props = HTMLAttributes<'input'> & {
8
- variant?: 'outline'
9
- color?: 'base' | 'brand'
10
- label?: string
11
- icon?: string
12
- radius?: 'none' | 'auto' | 'full'
8
+ interface Props extends GlobalProps, HTMLAttributes<'input'> {
9
+ label?: ComponentProps<typeof Label>['text']
10
+ icon?: ComponentProps<typeof Icon>['name']
13
11
  }
14
12
 
15
13
  const {
16
- variant = 'outline',
17
14
  label,
18
15
  icon,
19
16
  value,
20
17
  disabled,
21
18
  required,
22
- radius = 'auto',
23
19
  placeholder,
24
20
  name = placeholder,
25
21
  type = 'text',
@@ -27,29 +23,27 @@ const {
27
23
  } = Astro.props
28
24
  ---
29
25
 
30
- <Root
26
+ <Element
31
27
  class:list="input"
32
28
  {...rest}
33
29
  >
34
30
  <Label
35
31
  for={name}
36
- html={label}
32
+ text={label}
37
33
  />
38
- <Root
34
+ <Element
39
35
  as="input"
40
36
  if={name}
41
37
  id={name}
42
38
  {name}
43
- {variant}
44
39
  {placeholder}
45
- {radius}
46
40
  {type}
47
41
  {value}
48
42
  {disabled}
49
43
  {required}
50
44
  />
51
45
  <Icon name={icon} />
52
- </Root>
46
+ </Element>
53
47
 
54
48
  <style is:global lang="scss">
55
49
  @layer fulldev {
@@ -84,18 +78,6 @@ const {
84
78
  font-size: var(--text-2);
85
79
  line-height: 1.25;
86
80
 
87
- &.radius-none {
88
- border-radius: 0;
89
- }
90
-
91
- &.radius-auto {
92
- border-radius: var(--radius-1);
93
- }
94
-
95
- &.radius-full {
96
- border-radius: 9999px;
97
- }
98
-
99
81
  &::placeholder {
100
82
  color: var(--color-11);
101
83
  }
@@ -1,28 +1,26 @@
1
1
  ---
2
- import type { HTMLTag, Polymorphic } from 'astro/types'
3
- import Root from 'fulldev-ui/components/Root.astro'
2
+ import type { HTMLAttributes } from 'astro/types'
3
+ import Element from 'fulldev-ui/components/Element.astro'
4
+ import type { GlobalProps } from 'fulldev-ui/types/global-props'
4
5
 
5
- type Props<As extends HTMLTag = 'label'> = Polymorphic<{ as: As }> & {
6
- size?: 'sm' | 'md' | 'lg'
7
- color?: 'base' | 'brand'
8
- contrast?: boolean
9
- html?: string
10
- text?: string
6
+ interface Props extends GlobalProps, HTMLAttributes<'label'> {
7
+ size?: 'sm' | 'md' | 'lg' | undefined
8
+ color?: 'base' | 'brand' | undefined
9
+ contrast?: boolean | undefined
10
+ text?: string | undefined
11
11
  }
12
12
 
13
- const { as = 'label', html, text, ...rest } = Astro.props
13
+ const { text, ...rest } = Astro.props
14
14
  ---
15
15
 
16
- <Root
16
+ <Element
17
17
  class:list="label"
18
- {as}
18
+ as="label"
19
19
  {...rest}
20
20
  >
21
- <slot>
22
- <Fragment set:html={html} />
23
- <Fragment set:text={text} />
24
- </slot>
25
- </Root>
21
+ <slot />
22
+ <Fragment set:text={text} />
23
+ </Element>
26
24
 
27
25
  <style is:global lang="scss">
28
26
  @layer fulldev {
@@ -32,7 +30,6 @@ const { as = 'label', html, text, ...rest } = Astro.props
32
30
  color: var(--color-11);
33
31
  font-size: var(--text-2);
34
32
  line-height: 1;
35
- font-family: var(--font-family);
36
33
  text-align: left;
37
34
  white-space: nowrap;
38
35
  }
@@ -1,30 +1,29 @@
1
1
  ---
2
- import type { HTMLTag, Polymorphic } from 'astro/types'
3
- import Root from 'fulldev-ui/components/Root.astro'
4
-
5
- type Props<As extends HTMLTag = 'a'> = Polymorphic<{ as: As }> & {
6
- underline?: 'auto' | 'always' | 'hover' | 'none'
7
- size?: 'sm' | 'md' | 'lg'
8
- color?: 'base' | 'brand'
9
- contrast?: boolean
10
- html?: string
11
- text?: string
2
+ import type { HTMLAttributes } from 'astro/types'
3
+ import type { CollectionEntry } from 'astro:content'
4
+ import { getEntry } from 'astro:content'
5
+ import Element from 'fulldev-ui/components/Element.astro'
6
+ import type { GlobalProps } from 'fulldev-ui/types/global-props'
7
+
8
+ interface Props extends GlobalProps, HTMLAttributes<'a'> {
9
+ slug?: CollectionEntry<'pages'>['slug'] | undefined
10
+ text?: string | undefined
12
11
  }
13
12
 
14
- const { html, text, as = 'a', underline = 'auto', ...rest } = Astro.props
13
+ const { slug, href, text, ...rest } = Astro.props
14
+
15
+ const entry = slug && (await getEntry('pages', slug))
15
16
  ---
16
17
 
17
- <Root
18
+ <Element
18
19
  class:list="link"
19
- {as}
20
- {underline}
20
+ href={slug ? `/${slug}/` : href}
21
+ as="a"
21
22
  {...rest}
22
23
  >
23
- <slot>
24
- <Fragment set:text={text} />
25
- <Fragment set:html={html} />
26
- </slot>
27
- </Root>
24
+ <slot />
25
+ <Fragment set:html={entry?.data?.title ?? text} />
26
+ </Element>
28
27
 
29
28
  <style is:global lang="scss">
30
29
  @layer fulldev {
@@ -37,38 +36,17 @@ const { html, text, as = 'a', underline = 'auto', ...rest } = Astro.props
37
36
  border: none;
38
37
  background: none;
39
38
  color: var(--color-11);
40
- font-weight: var(--font-weight);
41
39
  font-size: var(--text-3);
42
- font-family: var(--font-family);
43
40
  text-decoration-color: var(--border); // FIXME, werkt niet
41
+ text-decoration: none;
44
42
  white-space: nowrap;
45
43
 
46
- &:hover {
47
- color: var(--color-12);
48
- }
49
-
50
- &.underline-auto {
51
- text-decoration: none;
52
-
53
- &:is(p > &) {
54
- text-decoration: underline;
55
- }
56
- }
57
-
58
- &.underline-always {
44
+ &:is(p > &) {
59
45
  text-decoration: underline;
60
46
  }
61
47
 
62
- &.underline-hover {
63
- text-decoration: none;
64
-
65
- &:hover {
66
- text-decoration: underline;
67
- }
68
- }
69
-
70
- &.underline-none {
71
- text-decoration: none;
48
+ &:hover {
49
+ color: var(--color-12);
72
50
  }
73
51
  }
74
52
  }
@@ -1,24 +1,26 @@
1
1
  ---
2
- import type { HTMLTag, Polymorphic } from 'astro/types'
3
- import Root from 'fulldev-ui/components/Root.astro'
2
+ import type { HTMLAttributes } from 'astro/types'
3
+ import Element from 'fulldev-ui/components/Element.astro'
4
+ import type { GlobalProps } from 'fulldev-ui/types/global-props'
4
5
 
5
- type Props<As extends HTMLTag = 'ul'> = Polymorphic<{ as: As }> & {
6
- size?: 'sm' | 'md' | 'lg'
7
- color?: 'base' | 'brand'
8
- contrast?: boolean
9
- items?: (string | { text: string })[]
6
+ interface Props
7
+ extends GlobalProps,
8
+ HTMLAttributes<'ul'>,
9
+ HTMLAttributes<'ol'> {
10
+ items?: string[] | undefined
11
+ as?: 'ul' | 'ol'
10
12
  }
11
13
 
12
14
  const { as = 'ul', items, ...rest } = Astro.props
13
15
  ---
14
16
 
15
- <Root
17
+ <Element
16
18
  class:list="list"
17
19
  {as}
18
20
  {...rest}
19
21
  >
20
- {items?.map((item) => <li>{typeof item === 'string' ? item : item.text}</li>)}
21
- </Root>
22
+ {items?.map((item) => <li set:html={item} />)}
23
+ </Element>
22
24
 
23
25
  <style is:global lang="scss">
24
26
  @layer fulldev {
@@ -0,0 +1,25 @@
1
+ ---
2
+ import Select from 'fulldev-ui/components/Select.astro'
3
+ ---
4
+
5
+ {
6
+ Astro.props.locales && (
7
+ <Select
8
+ name="locale-switcher"
9
+ options={Astro.props.locales}
10
+ value={Astro.props.lang as string}
11
+ placeholder={Astro.props.lang as string}
12
+ />
13
+ )
14
+ }
15
+
16
+ <script>
17
+ const select = document.querySelector('.theme-switcher select')
18
+ select?.addEventListener('change', (event) => {
19
+ const target = event.target as HTMLSelectElement
20
+ const selectedLocale = target.value
21
+ const currentUrl = new URL(window.location.href)
22
+ currentUrl.pathname = '/' + selectedLocale + currentUrl.pathname
23
+ window.location.href = currentUrl.toString()
24
+ })
25
+ </script>
@@ -0,0 +1,38 @@
1
+ ---
2
+ import type { HTMLAttributes } from 'astro/types'
3
+ import Element from 'fulldev-ui/components/Element.astro'
4
+ import type { GlobalProps } from 'fulldev-ui/types/global-props'
5
+
6
+ interface Props extends GlobalProps, HTMLAttributes<'div'> {
7
+ size?: 'sm' | 'md' | 'lg' | undefined
8
+ color?: 'base' | 'brand' | undefined
9
+ contrast?: boolean | undefined
10
+ value?: number | undefined
11
+ }
12
+
13
+ const { value, ...rest } = Astro.props
14
+ ---
15
+
16
+ {
17
+ value && (
18
+ <Element
19
+ if={value}
20
+ class:list="price"
21
+ {...rest}
22
+ >
23
+ €{value?.toFixed(2).replace('.', ',')}
24
+ </Element>
25
+ )
26
+ }
27
+
28
+ <style is:global lang="scss">
29
+ @layer fulldev {
30
+ .price {
31
+ margin: 0;
32
+ max-width: calc(var(--space-4) * 44);
33
+ color: var(--color-12);
34
+ font-size: var(--text-5);
35
+ line-height: 1.25;
36
+ }
37
+ }
38
+ </style>