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
@@ -15,6 +15,12 @@ const {
15
15
  reverse,
16
16
  open,
17
17
  lead,
18
+ current,
19
+ direction,
20
+ center,
21
+ frame,
22
+ dark,
23
+ inset,
18
24
  ...rest
19
25
  } = Astro.props
20
26
 
@@ -26,22 +32,24 @@ const render = 'if' in rest ? rest.if : slot?.trim().length > 0
26
32
  render && (
27
33
  <As
28
34
  class:list={[
29
- 'root',
30
35
  {
31
36
  contrast,
32
37
  panel,
33
38
  open,
34
39
  reverse,
35
- lead,
40
+ current,
41
+ center,
42
+ inset,
43
+ dark,
36
44
  [`size-${size}`]: size,
37
45
  [`color-${color}`]: color,
38
- [`theme-${theme}`]: theme,
39
46
  [`level-${level}`]: level,
47
+ [`frame-${frame}`]: frame,
40
48
  [`variant-${variant}`]: variant,
41
49
  [`structure-${structure}`]: structure,
42
50
  [`align-${align}`]: align,
43
51
  [`position-${position}`]: position,
44
- [`position-${position}`]: position,
52
+ [`direction-${direction}`]: direction,
45
53
  },
46
54
  ]}
47
55
  {...rest}
@@ -51,8 +59,8 @@ const render = 'if' in rest ? rest.if : slot?.trim().length > 0
51
59
  )
52
60
  }
53
61
 
54
- <style is:global lang="scss">
55
- @import '@unocss/reset/tailwind.css' layer(fulldev);
56
- @import 'fulldev-ui/css/color.css';
57
- @import 'fulldev-ui/css/size.css';
62
+ <style is:global>
63
+ @import 'tailwindcss/base' layer(fulldev);
64
+ @import 'fulldev-ui/css/theme' layer(fulldev);
65
+ @import 'tailwindcss/components';
58
66
  </style>
@@ -8,12 +8,14 @@ import Textarea from 'fulldev-ui/components/Textarea.astro'
8
8
  import type { GlobalProps } from 'fulldev-ui/types/global-props'
9
9
 
10
10
  interface Props extends GlobalProps, HTMLAttributes<'form'> {
11
- fields: (
12
- | ComponentProps<typeof Input>
13
- | ComponentProps<typeof Select>
14
- | (ComponentProps<typeof Textarea> & { type?: 'textarea' | undefined })
15
- )[]
16
11
  submit?: ComponentProps<typeof Button>['text']
12
+ fields?:
13
+ | (
14
+ | ComponentProps<typeof Input>
15
+ | ComponentProps<typeof Select>
16
+ | (ComponentProps<typeof Textarea> & { type?: 'textarea' | undefined })
17
+ )[]
18
+ | undefined
17
19
  }
18
20
 
19
21
  const { fields, submit, ...rest } = Astro.props
@@ -25,25 +27,24 @@ const { fields, submit, ...rest } = Astro.props
25
27
  {...rest}
26
28
  >
27
29
  {
28
- fields.map((field) => {
30
+ fields?.map((field) => {
29
31
  if ('options' in field) return <Select {...field} />
30
32
  if ('type' in field && field.type === 'textarea')
31
33
  return <Textarea {...field} />
32
34
  return <Input {...(field as any)} />
33
35
  })
34
36
  }
37
+ <slot />
35
38
  <Button
36
39
  type="submit"
37
40
  text={submit}
38
41
  />
39
42
  </Element>
40
43
 
41
- <style is:global lang="scss">
42
- .form {
43
- display: flex;
44
- flex-direction: column;
45
- gap: var(--space-4);
46
- width: 100%;
47
- max-width: calc(var(--space-4) * 44);
44
+ <style is:global>
45
+ @layer fulldev {
46
+ .form {
47
+ @apply flex w-full max-w-screen-md flex-col gap-4;
48
+ }
48
49
  }
49
50
  </style>
@@ -0,0 +1,172 @@
1
+ ---
2
+ import type { ComponentProps } from 'astro/types'
3
+ import Button from 'fulldev-ui/components/Button.astro'
4
+ import Element from 'fulldev-ui/components/Element.astro'
5
+ import Image from 'fulldev-ui/components/Image.astro'
6
+
7
+ interface Props {
8
+ images: (ComponentProps<typeof Image> | ComponentProps<typeof Image>['src'])[]
9
+ }
10
+
11
+ const { images } = Astro.props
12
+
13
+ const hasMultiple = images?.length > 1
14
+ const hasMany = images?.length > 5
15
+ ---
16
+
17
+ <script>
18
+ function scrollLeft(carousel: HTMLElement) {
19
+ carousel.scrollLeft -= carousel.clientWidth
20
+ }
21
+
22
+ function scrollRight(carousel: HTMLElement) {
23
+ carousel.scrollLeft += carousel.clientWidth
24
+ }
25
+
26
+ function scrollTo(carousel: HTMLElement, index: number) {
27
+ carousel.scrollLeft = index * carousel.clientWidth
28
+ }
29
+
30
+ document.addEventListener('astro:page-load', () => {
31
+ const galleries = document.querySelectorAll('.gallery')
32
+ galleries.forEach((gallery) => {
33
+ // Apply left and right event listeners to large and small carousels
34
+ const containers = gallery.querySelectorAll(
35
+ '.gallery-small, .gallery-large'
36
+ )
37
+ containers?.forEach((element) => {
38
+ const left = element?.querySelector('.gallery-left')
39
+ const right = element?.querySelector('.gallery-right')
40
+ const carousel = element?.querySelector(
41
+ '.gallery-carousel'
42
+ ) as HTMLElement
43
+
44
+ left?.addEventListener('click', () => scrollLeft(carousel))
45
+ right?.addEventListener('click', () => scrollRight(carousel))
46
+ })
47
+
48
+ // Apply item click event listener to small carousel items
49
+ const items = gallery.querySelectorAll('.gallery-small .gallery-item')
50
+ const largeCarousel = gallery.querySelector(
51
+ '.gallery-large .gallery-carousel'
52
+ ) as HTMLElement
53
+ items?.forEach((item, i) => {
54
+ item.addEventListener('click', () => {
55
+ scrollTo(largeCarousel, i)
56
+ })
57
+ })
58
+ })
59
+ })
60
+ </script>
61
+
62
+ <Element class:list="gallery">
63
+ <Element class:list="gallery-large">
64
+ <Button
65
+ if={hasMultiple}
66
+ class="gallery-left"
67
+ icon="chevron-left"
68
+ variant="secondary"
69
+ size="sm"
70
+ />
71
+ <Element class:list="gallery-carousel">
72
+ {
73
+ images?.map((image: any) => (
74
+ <Element class:list="gallery-item">
75
+ <Image {...(typeof image === 'string' ? { src: image } : image)} />
76
+ </Element>
77
+ ))
78
+ }
79
+ </Element>
80
+ <Button
81
+ if={hasMultiple}
82
+ class="gallery-right"
83
+ icon="chevron-right"
84
+ variant="secondary"
85
+ size="sm"
86
+ />
87
+ </Element>
88
+ <Element
89
+ if={hasMultiple}
90
+ class:list="gallery-small"
91
+ >
92
+ <Button
93
+ if={hasMany}
94
+ class="gallery-left"
95
+ icon="chevron-left"
96
+ variant="secondary"
97
+ size="sm"
98
+ />
99
+ <Element class:list="gallery-carousel">
100
+ {
101
+ images?.map((image: any) => (
102
+ <Element
103
+ as="button"
104
+ class:list="gallery-item"
105
+ >
106
+ <Image {...(typeof image === 'string' ? { src: image } : image)} />
107
+ </Element>
108
+ ))
109
+ }
110
+ </Element>
111
+ <Button
112
+ if={hasMany}
113
+ class="gallery-right"
114
+ icon="chevron-right"
115
+ variant="ghost"
116
+ size="sm"
117
+ />
118
+ </Element>
119
+ </Element>
120
+
121
+ <style is:global>
122
+ @layer fulldev {
123
+ .gallery {
124
+ @apply relative flex flex-col gap-2;
125
+
126
+ .gallery-large,
127
+ .gallery-small {
128
+ @apply relative flex items-center;
129
+ }
130
+
131
+ .image {
132
+ @apply rounded;
133
+ }
134
+
135
+ .button {
136
+ @apply absolute z-10 bg-secondary-hover opacity-50 hover:opacity-100;
137
+ }
138
+
139
+ .gallery-left {
140
+ @apply left-2;
141
+ }
142
+
143
+ .gallery-right {
144
+ @apply right-2;
145
+ }
146
+
147
+ .gallery-carousel {
148
+ @apply inline-flex w-full snap-x snap-mandatory overflow-x-auto scroll-smooth scrollbar-none;
149
+ }
150
+
151
+ .gallery-large {
152
+ .gallery-item {
153
+ @apply flex w-full min-w-full snap-start;
154
+ }
155
+
156
+ .image {
157
+ @apply h-full max-h-[768px] w-full object-contain;
158
+ }
159
+ }
160
+
161
+ .gallery-small {
162
+ .gallery-carousel {
163
+ @apply gap-2;
164
+ }
165
+
166
+ .gallery-item {
167
+ @apply min-w-[calc(20%-0.4rem)] snap-start overflow-hidden transition hover:opacity-80;
168
+ }
169
+ }
170
+ }
171
+ }
172
+ </style>
@@ -6,7 +6,7 @@ import type Layout from 'fulldev-ui/layouts/Layout.astro'
6
6
 
7
7
  type Props = ComponentProps<typeof Layout>
8
8
 
9
- const { title, description, image, seo, code, render } = Astro.props
9
+ const { theme, title, description, image, seo, code, render } = Astro.props
10
10
 
11
11
  const renderTitle = render && (await render()).headings[0]?.text
12
12
  const mergedTitle = seo?.title || title || renderTitle
@@ -25,6 +25,10 @@ const mergedImage =
25
25
  name="generator"
26
26
  content={Astro.generator}
27
27
  />
28
+ <link
29
+ rel="canonical"
30
+ href={Astro.url.href.endsWith('/') ? Astro.url.href : Astro.url.href + '/'}
31
+ />
28
32
  <ViewTransitions />
29
33
  <AstroSeo
30
34
  title={mergedTitle ?? ''}
@@ -43,4 +47,51 @@ const mergedImage =
43
47
  } as any}
44
48
  />
45
49
  <Fragment set:html={code?.head} />
50
+
51
+ <script is:inline define:vars={{ theme }}>
52
+ function setTheme(document) {
53
+ const value = localStorage.getItem('theme') || theme
54
+
55
+ const isDark =
56
+ value === 'dark' ||
57
+ (value === 'system' &&
58
+ window.matchMedia('(prefers-color-scheme: dark)').matches)
59
+
60
+ document.documentElement.classList.toggle('dark', isDark)
61
+
62
+ document.querySelectorAll('.themer').forEach((themer) => {
63
+ themer?.querySelectorAll('option').forEach((option) => {
64
+ option.selected = option.value === value
65
+ })
66
+ })
67
+ }
68
+
69
+ function setOption(document) {
70
+ const value = localStorage.getItem('theme') || theme
71
+
72
+ document.querySelectorAll('.themer').forEach((themer) => {
73
+ themer?.querySelectorAll('option').forEach((option) => {
74
+ option.selected = option.value === value
75
+ })
76
+ })
77
+ }
78
+
79
+ setTheme(document)
80
+ setOption(document)
81
+
82
+ document.addEventListener('astro:before-swap', (event) => {
83
+ setTheme(event.newDocument)
84
+ })
85
+
86
+ document.addEventListener('astro:page-load', (event) => {
87
+ setOption(document)
88
+ })
89
+ </script>
90
+
91
+ <!-- TrustBox script -->
92
+ <script
93
+ type="text/javascript"
94
+ src="//widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js"
95
+ async
96
+ ></script>
46
97
  </head>
@@ -1,136 +1,126 @@
1
1
  ---
2
2
  import type { ComponentProps, HTMLAttributes } from 'astro/types'
3
3
  import Buttons from 'fulldev-ui/components/Buttons.astro'
4
+ import Cart from 'fulldev-ui/components/Cart.astro'
5
+ import Drawer from 'fulldev-ui/components/Drawer.astro'
4
6
  import Element from 'fulldev-ui/components/Element.astro'
5
- import Logo from 'fulldev-ui/components/experimental/Logo.astro'
6
- import ThemeSelect from 'fulldev-ui/components/ThemeSelect.astro'
7
+ import Links from 'fulldev-ui/components/Links.astro'
8
+ import Logo from 'fulldev-ui/components/Logo.astro'
9
+ import Menu from 'fulldev-ui/components/Menu.astro'
10
+ import Socials from 'fulldev-ui/components/Socials.astro'
11
+ import Themer from 'fulldev-ui/components/Themer.astro'
7
12
  import type { GlobalProps } from 'fulldev-ui/types/global-props'
8
- import Cart from './Cart.astro'
9
- import Drawer from './Drawer.astro'
10
- import type Menu from './Menu.astro'
11
13
 
12
14
  interface Props extends GlobalProps, HTMLAttributes<'header'> {
13
15
  logo?: ComponentProps<typeof Logo>
14
16
  company?: ComponentProps<typeof Logo>['company']
15
17
  buttons?: ComponentProps<typeof Buttons>['buttons']
18
+ links?: ComponentProps<typeof Links>['links']
16
19
  menu?: ComponentProps<typeof Menu>['groups']
17
20
  panel?: boolean | undefined
18
21
  search?: boolean | undefined
19
22
  open?: boolean | undefined
20
- themeselect?: boolean | undefined
21
23
  cart?: string | undefined
24
+ socials?: ComponentProps<typeof Socials>['socials']
25
+ themer?: boolean | undefined
26
+ size?: 'sm' | 'md' | 'lg' | undefined
22
27
  }
23
28
 
24
29
  const {
25
30
  size = 'sm',
26
- open = true,
31
+ open,
27
32
  logo,
28
33
  company,
29
34
  buttons,
35
+ links,
30
36
  search,
31
37
  panel,
38
+ socials,
32
39
  menu,
33
- themeselect,
34
40
  cart,
41
+ themer,
35
42
  ...rest
36
43
  } = Astro.props
37
44
  ---
38
45
 
39
46
  <Element
40
- class:list={['header']}
47
+ class:list="header"
41
48
  as="header"
42
- {panel}
43
49
  {size}
44
50
  {open}
45
51
  {...rest}
46
52
  >
47
- <Logo
48
- {company}
49
- {...typeof logo === 'string' ? { src: logo } : logo}
50
- />
51
- <Buttons
52
- {buttons}
53
- variant="link"
54
- />
55
- {themeselect && <ThemeSelect />}
56
- <Drawer
57
- icon="menu-2"
58
- id="menu"
59
- {logo}
60
- {company}
61
- {buttons}
62
- {menu}
63
- />
64
- <Cart
65
- if={cart}
66
- heading={cart}
67
- />
53
+ <Element class:list="header-container">
54
+ <Logo
55
+ {company}
56
+ {size}
57
+ {...typeof logo === 'string' ? { src: logo } : logo}
58
+ />
59
+ <Links
60
+ class:list="header-links"
61
+ {size}
62
+ {links}
63
+ />
64
+ <Socials
65
+ {size}
66
+ variant="ghost"
67
+ {socials}
68
+ />
69
+ <Buttons
70
+ class:list="header-buttons"
71
+ {size}
72
+ {buttons}
73
+ >
74
+ <Themer
75
+ if={themer}
76
+ {size}
77
+ />
78
+ <Cart
79
+ if={cart}
80
+ variant="secondary"
81
+ heading={cart}
82
+ {size}
83
+ />
84
+ <Drawer
85
+ class:list={['header-button']}
86
+ icon="menu-2"
87
+ id="menu"
88
+ variant="secondary"
89
+ {logo}
90
+ {company}
91
+ {buttons}
92
+ {links}
93
+ {menu}
94
+ {size}
95
+ />
96
+ </Buttons>
97
+ </Element>
68
98
  </Element>
69
99
 
70
- <style lang="scss" is:global>
100
+ <style is:global>
71
101
  @layer fulldev {
72
102
  .header {
73
- display: flex;
74
- position: sticky;
75
- top: 0;
76
- left: 0;
77
- justify-content: flex-end;
78
- align-items: center;
79
- gap: var(--space-4);
80
- z-index: 20;
81
- border-bottom-width: 1px;
82
- border-style: solid;
83
- border-color: var(--base-a6);
84
- background-color: var(--base-2);
85
- padding: 0 var(--gutter);
86
- width: 100%;
87
- height: var(--header-height);
88
- overflow: hidden;
103
+ @apply sticky left-0 top-0 z-20 flex h-14 items-center overflow-hidden bg-background;
89
104
 
90
- &,
91
- & ~ * {
92
- --header-height: 56px;
105
+ .header-container {
106
+ @apply container flex w-full items-center justify-between gap-6;
93
107
  }
94
108
 
95
- &.panel {
96
- margin: var(--space-4) var(--gutter);
97
- border-width: 1px solid;
98
- border-radius: var(--radius-2);
99
- padding: var(--sapce-4) min(var(--gutter), var(--space-4));
100
- width: auto;
101
- }
102
-
103
- .logo {
104
- margin-right: auto;
109
+ &,
110
+ & ~ * {
111
+ --header-height: 3.5rem;
105
112
  }
106
113
 
107
- @media (min-width: 1024px) {
108
- &:not(.open) {
109
- display: none;
110
-
111
- & ~ * {
112
- --header-height: 0px;
113
- }
114
- }
114
+ .header-links {
115
+ @apply mr-auto max-lg:hidden;
115
116
  }
116
117
 
117
- .buttons {
118
- display: none;
119
-
120
- @media (min-width: 1024px) {
121
- display: flex;
122
- gap: var(--space-2);
123
-
124
- .button.variant-link + .button {
125
- margin-left: var(--space-3);
126
- }
127
- }
118
+ .header-socials {
119
+ @apply ml-auto max-lg:hidden;
128
120
  }
129
121
 
130
122
  .menu-button {
131
- @media (min-width: 1024px) {
132
- display: none;
133
- }
123
+ @apply lg:hidden;
134
124
  }
135
125
  }
136
126
  }