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

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 (236) hide show
  1. package/.env.example +3 -0
  2. package/.prettierrc.yaml +1 -0
  3. package/astro.config.ts +6 -32
  4. package/package.json +21 -30
  5. package/pnpm-lock.yaml +696 -2176
  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/manifest.webmanifest +7 -3
  10. package/public/favicon/mstile-150x150.png +0 -0
  11. package/src/blocks/Banner.astro +6 -19
  12. package/src/blocks/Colleagues.astro +0 -1
  13. package/src/blocks/Contact.astro +75 -74
  14. package/src/blocks/Content.astro +124 -6
  15. package/src/blocks/Cta.astro +0 -2
  16. package/src/blocks/Excerpt.astro +0 -2
  17. package/src/blocks/Footer.astro +107 -3
  18. package/src/blocks/Hero.astro +238 -9
  19. package/src/blocks/Intro.astro +89 -11
  20. package/src/blocks/Prices.astro +1 -1
  21. package/src/blocks/Product.astro +49 -70
  22. package/src/blocks/Products.astro +114 -5
  23. package/src/blocks/Reviews.astro +0 -1
  24. package/src/blocks/_Contact.astro +112 -0
  25. package/src/components/Avatar.astro +28 -9
  26. package/src/components/Avatars.astro +36 -0
  27. package/src/components/Badge.astro +73 -26
  28. package/src/components/Badges.astro +16 -23
  29. package/src/components/Breadcrumb.astro +58 -0
  30. package/src/components/Button.astro +56 -112
  31. package/src/components/Buttons.astro +23 -13
  32. package/src/components/Card.astro +129 -115
  33. package/src/components/Cards.astro +33 -35
  34. package/src/components/Carousel.astro +106 -0
  35. package/src/components/Cart.astro +1 -1
  36. package/src/components/CartForm.astro +10 -10
  37. package/src/components/CartList.astro +11 -28
  38. package/src/components/CartSummary.astro +11 -14
  39. package/src/components/Channel.astro +40 -22
  40. package/src/components/Channels.astro +20 -6
  41. package/src/components/Checkbox.astro +52 -27
  42. package/src/components/Code.astro +52 -0
  43. package/src/components/Dialog.astro +2 -2
  44. package/src/components/Drawer.astro +34 -64
  45. package/src/components/Element.astro +16 -8
  46. package/src/components/Form.astro +14 -13
  47. package/src/components/Gallery.astro +172 -0
  48. package/src/components/Head.astro +52 -1
  49. package/src/components/Header.astro +73 -83
  50. package/src/components/Heading.astro +74 -30
  51. package/src/components/Icon.astro +25 -30
  52. package/src/components/Image.astro +23 -38
  53. package/src/components/Input.astro +59 -53
  54. package/src/components/Label.astro +20 -15
  55. package/src/components/Lead.astro +46 -0
  56. package/src/components/Link.astro +51 -26
  57. package/src/components/Links.astro +42 -0
  58. package/src/components/List.astro +41 -16
  59. package/src/components/LocaleSwitcher.astro +2 -2
  60. package/src/components/Logo.astro +45 -0
  61. package/src/components/Menu.astro +21 -17
  62. package/src/components/Paragraph.astro +38 -0
  63. package/src/components/Price.astro +1 -1
  64. package/src/components/Prose.astro +169 -0
  65. package/src/components/Rating.astro +50 -38
  66. package/src/components/Search.astro +1 -1
  67. package/src/components/Section.astro +196 -158
  68. package/src/components/Select.astro +44 -55
  69. package/src/components/Sidebar.astro +31 -38
  70. package/src/components/Social.astro +3 -8
  71. package/src/components/Socials.astro +9 -5
  72. package/src/components/Subheader.astro +59 -0
  73. package/src/components/Switch.astro +72 -29
  74. package/src/components/Table.astro +1 -1
  75. package/src/components/Tagline.astro +40 -12
  76. package/src/components/Text.astro +4 -4
  77. package/src/components/Textarea.astro +40 -50
  78. package/src/components/Themer.astro +76 -0
  79. package/src/components/Toc.astro +24 -32
  80. package/src/components/Writeup.astro +26 -8
  81. package/src/components/docs/PropsTable.astro +38 -264
  82. package/src/components/experimental/Window.astro +5 -57
  83. package/src/components/sections.astro +1 -1
  84. package/src/content/pages/blocks/_categories.mdx +1 -1
  85. package/src/content/pages/blocks/_footer.mdx +1 -1
  86. package/src/content/pages/blocks/_header.mdx +1 -3
  87. package/src/content/pages/blocks/_jobs.mdx +1 -1
  88. package/src/content/pages/blocks/_prices.mdx +1 -1
  89. package/src/content/pages/blocks/_product.mdx +1 -1
  90. package/src/content/pages/blocks/_products.mdx +1 -1
  91. package/src/content/pages/blocks/_stats.mdx +1 -1
  92. package/src/content/pages/blocks/banner.mdx +1 -1
  93. package/src/content/pages/blocks/colleagues.mdx +1 -2
  94. package/src/content/pages/blocks/contact.mdx +1 -1
  95. package/src/content/pages/blocks/content.mdx +1 -5
  96. package/src/content/pages/blocks/cta.mdx +1 -9
  97. package/src/content/pages/blocks/features.mdx +1 -4
  98. package/src/content/pages/blocks/hero.mdx +1 -4
  99. package/src/content/pages/blocks/intro.mdx +1 -4
  100. package/src/content/pages/blocks/posts.mdx +1 -1
  101. package/src/content/pages/blocks/reviews.mdx +1 -2
  102. package/src/content/pages/docs/_internationalization.mdx +55 -0
  103. package/src/content/pages/docs/_using-blocks.mdx +33 -0
  104. package/src/content/pages/docs/_using-presets.mdx +49 -0
  105. package/src/content/pages/docs/blocks.mdx +33 -0
  106. package/src/content/pages/docs/collections/images.mdx +100 -0
  107. package/src/content/pages/docs/collections/pages.mdx +119 -0
  108. package/src/content/pages/docs/collections/presets.mdx +60 -0
  109. package/src/content/pages/docs/collections.mdx +42 -0
  110. package/src/content/pages/{base/card.mdx → docs/components/_card.mdx} +1 -3
  111. package/src/content/pages/{base → docs/components}/_switch.mdx +2 -2
  112. package/src/content/pages/{typography → docs/components}/_tagline.mdx +2 -2
  113. package/src/content/pages/docs/components/_toggle.mdx +31 -0
  114. package/src/content/pages/docs/components/avatar.mdx +35 -0
  115. package/src/content/pages/{base → docs/components}/badge.mdx +27 -8
  116. package/src/content/pages/docs/components/badges.mdx +47 -0
  117. package/src/content/pages/{base → docs/components}/button.mdx +29 -10
  118. package/src/content/pages/docs/components/buttons.mdx +52 -0
  119. package/src/content/pages/docs/components/channel.mdx +92 -0
  120. package/src/content/pages/docs/components/channels.mdx +90 -0
  121. package/src/content/pages/{base → docs/components}/checkbox.mdx +10 -17
  122. package/src/content/pages/docs/components/code.mdx +46 -0
  123. package/src/content/pages/docs/components/heading.mdx +60 -0
  124. package/src/content/pages/docs/components/icon.mdx +49 -0
  125. package/src/content/pages/docs/components/image.mdx +26 -0
  126. package/src/content/pages/docs/components/input.mdx +41 -0
  127. package/src/content/pages/{typography → docs/components}/label.mdx +8 -4
  128. package/src/content/pages/docs/components/lead.mdx +51 -0
  129. package/src/content/pages/{typography → docs/components}/link.mdx +23 -8
  130. package/src/content/pages/docs/components/links.mdx +100 -0
  131. package/src/content/pages/docs/components/list.mdx +45 -0
  132. package/src/content/pages/docs/components/logo.mdx +37 -0
  133. package/src/content/pages/docs/components/menu.mdx +90 -0
  134. package/src/content/pages/docs/components/paragraph.mdx +51 -0
  135. package/src/content/pages/docs/components/prose.mdx +37 -0
  136. package/src/content/pages/docs/components/rating.mdx +77 -0
  137. package/src/content/pages/{base → docs/components}/section.mdx +1 -1
  138. package/src/content/pages/{base → docs/components}/select.mdx +0 -9
  139. package/src/content/pages/docs/components/social.mdx +95 -0
  140. package/src/content/pages/docs/components/socials.mdx +103 -0
  141. package/src/content/pages/docs/components/switch.mdx +35 -0
  142. package/src/content/pages/{base → docs/components}/table.mdx +0 -2
  143. package/src/content/pages/docs/components/tagline.mdx +47 -0
  144. package/src/content/pages/docs/components/textarea.mdx +35 -0
  145. package/src/content/pages/docs/components/themer.mdx +50 -0
  146. package/src/content/pages/docs/components.mdx +40 -0
  147. package/src/content/pages/docs/customization.mdx +151 -0
  148. package/src/content/pages/docs/frameworks.mdx +29 -0
  149. package/src/content/pages/docs/generating-pages.mdx +129 -0
  150. package/src/content/pages/docs/index.mdx +23 -0
  151. package/src/content/pages/docs/installation.mdx +50 -0
  152. package/src/content/pages/docs/layouts.mdx +33 -0
  153. package/src/content/pages/index.mdx +11 -9
  154. package/src/content/pages/showcase.mdx +4 -2
  155. package/src/content/presets/base.yml +80 -63
  156. package/src/content/presets/docs.yml +2 -2
  157. package/src/css/color.css +0 -10
  158. package/src/css/custom.css +10 -12
  159. package/src/css/size.css +2 -11
  160. package/src/css/theme.css +93 -0
  161. package/src/images/logo-1.svg +11 -0
  162. package/src/images/logo-2.svg +13 -0
  163. package/src/images/logo-basic.svg +10 -0
  164. package/src/images/logo-simple.svg +13 -0
  165. package/src/images/logo-thin.svg +15 -0
  166. package/src/images/logo.svg +14 -0
  167. package/src/images/logofat.svg +11 -0
  168. package/src/integration/index.ts +71 -144
  169. package/src/layouts/CategoryLayout.astro +135 -0
  170. package/src/layouts/Layout.astro +62 -117
  171. package/src/layouts/PageLayout.astro +26 -0
  172. package/src/layouts/PostLayout.astro +13 -8
  173. package/src/layouts/ProductLayout.astro +94 -10
  174. package/src/pages/[...page].astro +14 -22
  175. package/src/pages/test.astro +20 -0
  176. package/src/schemas/components/button.ts +21 -13
  177. package/src/schemas/components/card.ts +36 -18
  178. package/src/schemas/components/footer.ts +2 -10
  179. package/src/schemas/components/global.ts +16 -0
  180. package/src/schemas/components/header.ts +8 -0
  181. package/src/schemas/components/image.ts +8 -3
  182. package/src/schemas/components/link.ts +16 -0
  183. package/src/schemas/components/links.ts +4 -0
  184. package/src/schemas/components/menu.ts +2 -0
  185. package/src/schemas/components/sidebar.ts +2 -2
  186. package/src/schemas/components/subheader.ts +9 -0
  187. package/src/schemas/components/themer.ts +3 -0
  188. package/src/schemas/pageSchema.ts +14 -21
  189. package/src/utils/cart.ts +1 -10
  190. package/src/utils/getDeepReferenceChildren.ts +14 -0
  191. package/src/utils/getReferenceChildren.ts +1 -1
  192. package/src/utils/setTheme.ts +18 -0
  193. package/src/utils/slugify.ts +6 -0
  194. package/tailwind.config.ts +67 -0
  195. package/src/blocks/Article.astro +0 -40
  196. package/src/components/Footer.astro +0 -193
  197. package/src/components/ThemeSelect.astro +0 -41
  198. package/src/components/experimental/Form.astro +0 -53
  199. package/src/components/experimental/Gallery.astro +0 -104
  200. package/src/components/experimental/Logo.astro +0 -38
  201. package/src/components/experimental/Prose.astro +0 -192
  202. package/src/content/pages/base/icon.mdx +0 -55
  203. package/src/content/pages/base/image.mdx +0 -42
  204. package/src/content/pages/base/input.mdx +0 -56
  205. package/src/content/pages/base/rating.mdx +0 -55
  206. package/src/content/pages/base/textarea.mdx +0 -58
  207. package/src/content/pages/base/theme-select.mdx +0 -15
  208. package/src/content/pages/layouts/_layout.mdx +0 -14
  209. package/src/content/pages/layouts/docslayout.mdx +0 -14
  210. package/src/content/pages/overview/components.mdx +0 -75
  211. package/src/content/pages/overview/content-collections.mdx +0 -139
  212. package/src/content/pages/overview/frameworks.mdx +0 -198
  213. package/src/content/pages/overview/installation.mdx +0 -53
  214. package/src/content/pages/overview/introduction.mdx +0 -30
  215. package/src/content/pages/overview/theming.mdx +0 -69
  216. package/src/content/pages/schemas/page.mdx +0 -17
  217. package/src/content/pages/schemas/preset.mdx +0 -9
  218. package/src/content/pages/showcase/record.md +0 -3
  219. package/src/content/pages/typography/heading.mdx +0 -73
  220. package/src/content/pages/typography/list.mdx +0 -51
  221. package/src/content/pages/typography/text.mdx +0 -61
  222. package/src/content/presets/blocks.yml +0 -1
  223. package/src/css/space.css +0 -77
  224. package/src/css/styles.css +0 -0
  225. package/src/images/avatar-1.yml +0 -1
  226. package/src/integration/generate-colors.ts +0 -639
  227. package/src/integration/tailwind-plugin.ts +0 -80
  228. package/src/integration/unocss-preset.ts +0 -84
  229. package/src/layouts/BlockLayout.astro +0 -19
  230. package/src/layouts/ContactLayout.astro +0 -21
  231. package/src/layouts/DocsLayout.astro +0 -73
  232. package/src/layouts/OverviewLayout.astro +0 -42
  233. /package/src/content/pages/{base → docs/components}/_dialog.mdx +0 -0
  234. /package/src/content/pages/{base → docs/components}/_drawer.mdx +0 -0
  235. /package/src/content/pages/{base → docs/components}/_localeswitcher.mdx +0 -0
  236. /package/src/schemas/utils/{parents.ts → categories.ts} +0 -0
@@ -6,44 +6,54 @@ import type { GlobalProps } from 'fulldev-ui/types/global-props'
6
6
 
7
7
  interface Props extends GlobalProps, HTMLAttributes<'div'> {
8
8
  variant?: ComponentProps<typeof Button>['variant']
9
+ button?: ComponentProps<typeof Button> | undefined
9
10
  buttons?: ComponentProps<typeof Button>[] | undefined
11
+ direction?: 'row' | 'column' | undefined
10
12
  }
11
13
 
12
- const { variant = 'secondary', buttons, ...rest } = Astro.props
14
+ const {
15
+ direction = 'row',
16
+ variant = 'primary',
17
+ buttons = [],
18
+ button,
19
+ size,
20
+ ...rest
21
+ } = Astro.props
13
22
 
14
23
  const buttonVariant = (i: number) => {
15
24
  if (variant === 'primary' && i === 0) return 'primary'
16
25
  else if (variant === 'primary' && i === 1) return 'secondary'
17
- else if (variant === 'primary' && i > 1) return 'tertiary'
26
+ else if (variant === 'primary' && i > 1) return 'ghost'
18
27
  else if (variant === 'secondary' && i === 0) return 'secondary'
19
- else if (variant === 'secondary' && i > 0) return 'tertiary'
20
- else if (variant === 'tertiary') return 'tertiary'
21
- else return 'tertiary'
28
+ else return 'ghost'
22
29
  }
23
30
  ---
24
31
 
25
32
  <Element
26
33
  class:list="buttons"
34
+ {direction}
27
35
  {...rest}
28
36
  >
29
37
  {
30
- buttons?.map((button, i) => (
38
+ [button, ...buttons].filter(Boolean).map((button, i) => (
31
39
  <Button
32
- variant={variant === 'link' ? 'link' : buttonVariant(i)}
40
+ variant={buttonVariant(i)}
41
+ {size}
33
42
  {...button}
34
43
  />
35
44
  ))
36
45
  }
46
+ <slot />
37
47
  </Element>
38
48
 
39
- <style is:global lang="scss">
49
+ <style is:global>
40
50
  @layer fulldev {
41
51
  .buttons {
42
- display: inline-flex;
43
- flex-wrap: wrap;
44
- justify-content: stretch;
45
- gap: var(--space-2);
46
- width: auto;
52
+ @apply inline-flex flex-wrap justify-stretch gap-2;
53
+
54
+ &.direction-column {
55
+ @apply flex-col items-start;
56
+ }
47
57
  }
48
58
  }
49
59
  </style>
@@ -1,157 +1,171 @@
1
1
  ---
2
- import type { ComponentProps, HTMLAttributes } from 'astro/types'
3
- import type { CollectionEntry } from 'astro:content'
4
2
  import { getEntry } from 'astro:content'
5
- import Button from 'fulldev-ui/components/Button.astro'
6
- import Buttons from 'fulldev-ui/components/Buttons.astro'
7
3
  import Element from 'fulldev-ui/components/Element.astro'
4
+ import Icon from 'fulldev-ui/components/Icon.astro'
8
5
  import Image from 'fulldev-ui/components/Image.astro'
9
- import Writeup from 'fulldev-ui/components/Writeup.astro'
10
- import type { GlobalProps } from 'fulldev-ui/types/global-props'
11
- import Icon from './Icon.astro'
12
- import Price from './Price.astro'
13
-
14
- interface Props
15
- extends GlobalProps,
16
- ComponentProps<typeof Writeup>,
17
- Omit<HTMLAttributes<'a'>, 'title'> {
18
- image?: ComponentProps<typeof Image>
19
- images?: ComponentProps<typeof Image>[]
20
- position?: ComponentProps<typeof Image>['position']
21
- buttons?: ComponentProps<typeof Buttons>['buttons']
22
- button?: ComponentProps<typeof Button> | undefined
23
- variant?: ComponentProps<typeof Button>['variant']
24
- align?: ComponentProps<typeof Writeup>['align']
25
- icon?: ComponentProps<typeof Icon>['name']
26
- price?: ComponentProps<typeof Price>['value']
27
- slug?: CollectionEntry<'pages'>['slug'] | undefined
28
- id?: any
29
- panel?: boolean | undefined
30
- title?: ComponentProps<typeof Writeup>['heading']
31
- }
6
+ import Price from 'fulldev-ui/components/Price.astro'
7
+ import Heading from './Heading.astro'
8
+ import Lead from './Lead.astro'
9
+ import Paragraph from './Paragraph.astro'
10
+ import Rating from './Rating.astro'
11
+
12
+ // interface Props
13
+ // extends GlobalProps,
14
+ // ComponentProps<typeof Writeup>,
15
+ // Omit<HTMLAttributes<'a'>, 'title'> {
16
+ // image?: ComponentProps<typeof Image>
17
+ // images?: ComponentProps<typeof Image>[]
18
+ // position?: ComponentProps<typeof Image>['position']
19
+ // buttons?: ComponentProps<typeof Buttons>['buttons']
20
+ // button?: ComponentProps<typeof Button> | undefined
21
+ // variant?: ComponentProps<typeof Button>['variant']
22
+ // align?: ComponentProps<typeof Writeup>['align']
23
+ // icon?: ComponentProps<typeof Icon>['name']
24
+ // price?: ComponentProps<typeof Price>['value']
25
+ // slug?: CollectionEntry<'pages'>['slug'] | undefined
26
+ // id?: any
27
+ // panel?: boolean | undefined
28
+ // title?: ComponentProps<typeof Writeup>['heading']
29
+ // }
32
30
 
33
- const { slug } = Astro.props
34
- const page = slug ? (await getEntry('pages', slug)).data : {}
31
+ const { slug, ...props } = Astro.props
32
+ const page = slug && (await getEntry('pages', slug))
35
33
 
36
- const entryProps = {
37
- heading: page.title,
38
- text: page.description,
39
- href: slug ? `/${slug}/` : undefined,
40
- ...page,
34
+ const merged = {
35
+ ...props,
36
+ ...page?.data,
41
37
  }
42
38
 
43
39
  const {
44
- align = 'start',
45
- level = 4,
46
- href,
47
- badge,
48
- tagline,
40
+ href = slug === 'index' ? undefined : `/${slug}/`,
41
+ as = href ? 'a' : 'div',
42
+ heading = page?.data.title || props.title,
43
+ image = page?.data.images?.[0] || props.images?.[0],
44
+ size = 'md',
45
+ panel = true,
46
+ inset = panel,
47
+ level = 3,
48
+ lead,
49
+ paragraph,
49
50
  rating,
50
- heading,
51
- text,
52
- variant,
53
51
  price,
54
- list,
55
- button,
56
- buttons,
57
- panel,
58
- image,
59
52
  icon,
60
- title,
61
- images,
62
53
  position,
63
54
  ...rest
64
- } = {
65
- ...entryProps,
66
- ...Astro.props,
67
- }
55
+ } = merged
68
56
  ---
69
57
 
70
58
  <Element
71
59
  class:list="card"
72
60
  as={href ? 'a' : 'div'}
73
61
  {href}
74
- {align}
75
62
  {panel}
63
+ {inset}
64
+ {size}
76
65
  {...rest}
77
66
  >
78
- <slot name="image">
79
- <Image
80
- position={panel ? position : undefined}
81
- {...image || images?.[0]}
82
- />
83
- </slot>
84
- <slot name="icon">
67
+ <Image
68
+ position={panel ? position : undefined}
69
+ {...image}
70
+ />
71
+ <Element class:list="card-content">
85
72
  <Icon name={icon} />
86
- </slot>
87
- <slot name="writeup">
88
- <Writeup
89
- heading={heading || title}
73
+ <Rating
74
+ {size}
75
+ value={rating}
76
+ />
77
+ <Heading
78
+ {size}
90
79
  {level}
91
- {rating}
92
- {badge}
93
- {tagline}
94
- {text}
95
- {list}
80
+ text={heading}
96
81
  />
97
- <Price value={price} />
98
- </slot>
99
- <slot name="buttons">
100
- <Button
101
- {variant}
102
- {...button}
82
+ <Lead
83
+ {size}
84
+ text={lead}
103
85
  />
104
- <Buttons
105
- {variant}
106
- {buttons}
86
+ <Paragraph
87
+ {size}
88
+ text={paragraph}
107
89
  />
108
- </slot>
90
+ <Price value={price} />
91
+ </Element>
109
92
  <slot />
110
93
  </Element>
111
94
 
112
- <style is:global lang="scss">
95
+ <style is:global>
113
96
  @layer fulldev {
114
97
  .card {
115
- --inset-top: 0px;
116
- --inset-left: 0px;
117
- --inset-right: 0px;
118
- --inset-bottom: 0px;
119
-
120
- display: flex;
121
- position: relative;
122
- flex-direction: column;
123
- align-items: flex-start;
124
- gap: var(--space-4);
125
- text-decoration: none;
126
-
127
- &[href] {
128
- cursor: pointer;
129
-
130
- > .image {
131
- transition: all 0.2s ease;
98
+ @apply relative flex flex-col items-start;
99
+
100
+ &:is(a[href]) > .image {
101
+ @apply transition hover:opacity-80;
102
+ }
103
+
104
+ .card-content {
105
+ @apply flex flex-col;
106
+ }
107
+
108
+ &.panel {
109
+ @apply overflow-hidden rounded-md border bg-card;
110
+ }
111
+
112
+ &.size-sm {
113
+ @apply gap-4;
114
+
115
+ .card-content {
116
+ @apply gap-2;
117
+ }
118
+
119
+ &.panel {
120
+ @apply p-4;
132
121
  }
133
122
 
134
- &:hover {
135
- > .image {
136
- opacity: 0.8;
123
+ &.inset {
124
+ @apply gap-0 p-0;
125
+
126
+ .card-content {
127
+ @apply p-4;
137
128
  }
138
129
  }
139
130
  }
140
131
 
141
- &.panel {
142
- --inset-top: var(--space-4);
143
- --inset-left: var(--space-4);
144
- --inset-right: var(--space-4);
145
- --inset-bottom: 0px;
146
-
147
- border: 1px solid var(--color-a6);
148
- border-radius: var(--radius-2);
149
- background-color: var(--color-2);
150
- padding: var(--space-4);
151
- overflow: hidden;
152
-
153
- &[href]:hover {
154
- border: 1px solid var(--color-a7);
132
+ &.size-md {
133
+ @apply gap-5;
134
+
135
+ .card-content {
136
+ @apply gap-2.5;
137
+ }
138
+
139
+ &.panel {
140
+ @apply p-5;
141
+ }
142
+
143
+ &.inset {
144
+ @apply gap-0 p-0;
145
+
146
+ .card-content {
147
+ @apply p-5;
148
+ }
149
+ }
150
+ }
151
+
152
+ &.size-lg {
153
+ @apply gap-6;
154
+
155
+ .card-content {
156
+ @apply gap-3;
157
+ }
158
+
159
+ &.panel {
160
+ @apply p-6;
161
+ }
162
+
163
+ &.inset {
164
+ @apply gap-0 p-0;
165
+
166
+ .card-content {
167
+ @apply p-6;
168
+ }
155
169
  }
156
170
  }
157
171
  }
@@ -12,19 +12,30 @@ interface Props extends GlobalProps, HTMLAttributes<'div'> {
12
12
  structure?: 'grid' | 'masonry' | 'stack' | 'carousel' | 'bento' | undefined
13
13
  }
14
14
 
15
- const { level, panel, position, cards, ...rest } = Astro.props
15
+ const {
16
+ structure = 'grid',
17
+ level,
18
+ panel,
19
+ position,
20
+ cards,
21
+ size,
22
+ ...rest
23
+ } = Astro.props
16
24
  ---
17
25
 
18
26
  <Element
19
27
  class:list="cards"
20
28
  {panel}
29
+ {size}
30
+ {structure}
21
31
  {...rest}
22
32
  >
23
33
  {
24
34
  cards?.map((card: any) => (
25
35
  <Card
26
- {level}
36
+ level={level + 3}
27
37
  {panel}
38
+ {size}
28
39
  {position}
29
40
  {...card}
30
41
  />
@@ -32,51 +43,26 @@ const { level, panel, position, cards, ...rest } = Astro.props
32
43
  }
33
44
  </Element>
34
45
 
35
- <style is:global lang="scss">
46
+ <style is:global>
36
47
  @layer fulldev {
37
48
  .cards {
38
- --column-width: calc(21 * var(--space-4));
39
- --gap: var(--space-5);
40
-
41
- position: relative;
42
- width: 100%;
43
-
44
- &.panel {
45
- --gap: var(--space-4);
46
- }
47
-
48
- &.position-inset {
49
- margin-right: calc(var(--inset-right) * -1);
50
- margin-left: calc(var(--inset-left) * -1);
51
- padding-right: var(--inset-right);
52
- padding-left: var(--inset-left);
53
- width: calc(100% + var(--inset-left) + var(--inset-right));
54
- }
49
+ --column-width: 20rem;
50
+ @apply relative w-full;
55
51
 
56
52
  &.structure-grid {
57
- display: grid;
58
- grid-template-columns: repeat(
59
- auto-fill,
60
- minmax(var(--column-width), 1fr)
61
- );
62
- gap: var(--gap);
63
- width: 100%;
53
+ @apply grid w-full grid-cols-[repeat(auto-fill,minmax(var(--column-width),1fr))] gap-5;
64
54
  }
65
55
 
66
56
  &.structure-masonry {
67
- column-gap: var(--gap);
57
+ @apply w-full columns-6 break-inside-avoid gap-5 space-y-5;
68
58
  column-fill: balance;
69
59
  column-width: var(--column-width);
70
- column-count: 6;
71
- break-inside: avoid;
72
- width: 100%;
73
60
 
74
- & > .root + .root,
75
- & > * + * {
61
+ /* & > * + * {
76
62
  break-inside: avoid;
77
63
  margin-top: var(--gap);
78
64
  margin-bottom: var(--gap);
79
- }
65
+ } */
80
66
  }
81
67
 
82
68
  &.structure-carousel {
@@ -88,7 +74,7 @@ const { level, panel, position, cards, ...rest } = Astro.props
88
74
  scroll-behavior: smooth;
89
75
  scroll-snap-type: x mandatory;
90
76
 
91
- > .root {
77
+ > * {
92
78
  flex-grow: 0;
93
79
  flex-shrink: 0;
94
80
  width: var(--column-width);
@@ -130,6 +116,18 @@ const { level, panel, position, cards, ...rest } = Astro.props
130
116
  }
131
117
  }
132
118
  }
119
+
120
+ &.size-sm {
121
+ --column-width: 16rem;
122
+ }
123
+
124
+ &.size-md {
125
+ --column-width: 20rem;
126
+ }
127
+
128
+ &.size-lg {
129
+ --column-width: 26rem;
130
+ }
133
131
  }
134
132
  }
135
133
  </style>
@@ -0,0 +1,106 @@
1
+ ---
2
+ import Button from 'fulldev-ui/components/Button.astro'
3
+ import Element from 'fulldev-ui/components/Element.astro'
4
+
5
+ interface Props {}
6
+ ---
7
+
8
+ <script>
9
+ function scrollLeft(content: HTMLElement) {
10
+ content.scrollLeft -= content.clientWidth
11
+ }
12
+
13
+ function scrollRight(content: HTMLElement) {
14
+ content.scrollLeft += content.clientWidth
15
+ }
16
+
17
+ const updateButtons = (
18
+ left: HTMLElement,
19
+ right: HTMLElement,
20
+ content: HTMLElement
21
+ ) => {
22
+ const isScrollable = content.scrollWidth > content.clientWidth
23
+ const atStart = content.scrollLeft <= 0
24
+ const atEnd =
25
+ content.scrollLeft >= content.scrollWidth - content.clientWidth
26
+
27
+ left?.classList.toggle('hide', !isScrollable || atStart)
28
+ right?.classList.toggle('hide', !isScrollable || atEnd)
29
+ }
30
+
31
+ document.addEventListener('astro:page-load', () => {
32
+ const carousels = document.querySelectorAll('.carousel')
33
+ carousels.forEach((carousel) => {
34
+ const left = carousel?.querySelector('.carousel-left')
35
+ const right = carousel?.querySelector('.carousel-right')
36
+ const content = carousel?.querySelector('.carousel-content')
37
+
38
+ if (!(content instanceof HTMLElement)) return
39
+ if (!(left instanceof HTMLElement)) return
40
+ if (!(right instanceof HTMLElement)) return
41
+
42
+ left?.addEventListener('click', () => scrollLeft(content))
43
+ right?.addEventListener('click', () => scrollRight(content))
44
+
45
+ const observer = new ResizeObserver(() => {
46
+ updateButtons(left, right, content)
47
+ })
48
+
49
+ observer.observe(content)
50
+
51
+ content.addEventListener('scroll', () => {
52
+ updateButtons(left, right, content)
53
+ })
54
+ })
55
+ })
56
+ </script>
57
+
58
+ <Element class:list="carousel">
59
+ <Button
60
+ class="carousel-left hide"
61
+ icon="chevron-left"
62
+ variant="secondary"
63
+ size="sm"
64
+ />
65
+ <Element class:list="carousel-content">
66
+ <slot />
67
+ </Element>
68
+ <Button
69
+ class="carousel-right hide"
70
+ icon="chevron-right"
71
+ variant="secondary"
72
+ size="sm"
73
+ />
74
+ </Element>
75
+
76
+ <style is:global>
77
+ @layer fulldev {
78
+ .carousel {
79
+ @apply container relative flex w-full items-center overflow-hidden px-0;
80
+
81
+ .button {
82
+ @apply absolute z-10 bg-secondary-hover opacity-50 hover:opacity-100;
83
+
84
+ &.hide {
85
+ @apply !hidden;
86
+ }
87
+ }
88
+
89
+ .carousel-left {
90
+ @apply left-2;
91
+ }
92
+
93
+ .carousel-right {
94
+ @apply right-2;
95
+ }
96
+
97
+ .carousel-content {
98
+ @apply inline-flex w-full snap-x snap-mandatory gap-2 overflow-x-auto scroll-smooth px-gutter scrollbar-none;
99
+
100
+ > * {
101
+ @apply snap-center;
102
+ }
103
+ }
104
+ }
105
+ }
106
+ </style>
@@ -27,7 +27,7 @@ const {
27
27
  <CartSummary slot="footer" />
28
28
  </Drawer>
29
29
 
30
- <style lang="scss" is:global>
30
+ <style is:global>
31
31
  @layer fulldev {
32
32
  form {
33
33
  display: flex;
@@ -4,7 +4,7 @@ import Button from 'fulldev-ui/components/Button.astro'
4
4
  import Input from 'fulldev-ui/components/Input.astro'
5
5
  import Select from 'fulldev-ui/components/Select.astro'
6
6
  import { capitalize } from 'radash'
7
- import Form from './experimental/Form.astro'
7
+ import Form from './Form.astro'
8
8
  import Price from './Price.astro'
9
9
 
10
10
  interface Props extends Omit<ComponentProps<typeof Form>, 'fields' | 'submit'> {
@@ -12,6 +12,7 @@ interface Props extends Omit<ComponentProps<typeof Form>, 'fields' | 'submit'> {
12
12
  slug: string
13
13
  price: number
14
14
  image?: string | undefined
15
+ soldout?: boolean
15
16
  variants?:
16
17
  | {
17
18
  [key: string]: string[]
@@ -19,7 +20,7 @@ interface Props extends Omit<ComponentProps<typeof Form>, 'fields' | 'submit'> {
19
20
  | undefined
20
21
  }
21
22
 
22
- const { title, slug, image, price, variants, ...rest } = Astro.props
23
+ const { title, slug, image, price, variants, soldout, ...rest } = Astro.props
23
24
  ---
24
25
 
25
26
  <Form
@@ -44,7 +45,7 @@ const { title, slug, image, price, variants, ...rest } = Astro.props
44
45
  <Input
45
46
  type="hidden"
46
47
  name="image"
47
- value={Astro.url.origin ? Astro.url.origin + image : undefined}
48
+ value={image}
48
49
  />
49
50
  {
50
51
  Object.entries(variants ?? {}).map(([key, options]) => (
@@ -52,6 +53,7 @@ const { title, slug, image, price, variants, ...rest } = Astro.props
52
53
  label={capitalize(key)}
53
54
  name={`variant-${key}`}
54
55
  options={options}
56
+ disabled={soldout}
55
57
  />
56
58
  ))
57
59
  }
@@ -63,10 +65,10 @@ const { title, slug, image, price, variants, ...rest } = Astro.props
63
65
  />
64
66
  <Button
65
67
  variant="primary"
66
- color="brand"
67
68
  type="submit"
68
69
  class="cart-add"
69
- text="Toevoegen aan winkelwagen"
70
+ text={soldout ? 'Uitverkocht' : 'Toevoegen aan winkelwagen'}
71
+ disabled={soldout}
70
72
  />
71
73
  </Form>
72
74
 
@@ -106,15 +108,13 @@ const { title, slug, image, price, variants, ...rest } = Astro.props
106
108
  })
107
109
  </script>
108
110
 
109
- <style is:global lang="scss">
111
+ <style is:global>
110
112
  @layer fulldev {
111
113
  .cart-form {
112
- display: flex;
113
- flex-direction: column;
114
- gap: var(--space-4);
114
+ @apply flex flex-col gap-4;
115
115
 
116
116
  .input {
117
- display: none;
117
+ @apply hidden;
118
118
  }
119
119
  }
120
120
  }