fulldev-ui 0.5.0-beta.8 → 0.6.0-beta-4

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 (347) hide show
  1. package/.env.example +3 -0
  2. package/.prettierrc.yaml +1 -0
  3. package/astro.config.ts +10 -34
  4. package/cloudcannon.config.yml +217 -0
  5. package/package.json +25 -29
  6. package/pnpm-lock.yaml +943 -2157
  7. package/public/favicon/android-chrome-192x192.png +0 -0
  8. package/public/favicon/android-chrome-512x512.png +0 -0
  9. package/public/favicon/apple-touch-icon.png +0 -0
  10. package/public/favicon/manifest.webmanifest +7 -3
  11. package/public/favicon/mstile-150x150.png +0 -0
  12. package/src/blocks/Banner.astro +14 -29
  13. package/src/blocks/Contact1.astro +92 -0
  14. package/src/blocks/Cta1.astro +72 -0
  15. package/src/blocks/Feature1.astro +67 -0
  16. package/src/blocks/Features1.astro +75 -0
  17. package/src/blocks/Footer.astro +100 -3
  18. package/src/blocks/Header.astro +192 -3
  19. package/src/blocks/Hero1.astro +74 -0
  20. package/src/blocks/Job1.astro +97 -0
  21. package/src/blocks/Products1.astro +90 -0
  22. package/src/blocks/Reviews1.astro +75 -0
  23. package/src/blocks/_Hero.astro +245 -0
  24. package/src/components/Avatar.astro +28 -9
  25. package/src/components/Avatars.astro +36 -0
  26. package/src/components/Badge.astro +63 -24
  27. package/src/components/Badges.astro +16 -23
  28. package/src/components/Banner.astro +26 -0
  29. package/src/components/Block.astro +49 -0
  30. package/src/components/Blocks.astro +26 -0
  31. package/src/components/Breadcrumb.astro +58 -0
  32. package/src/components/Button.astro +49 -119
  33. package/src/components/Buttons.astro +23 -13
  34. package/src/components/Card.astro +9 -137
  35. package/src/components/Cards.astro +33 -35
  36. package/src/components/Carousel.astro +106 -0
  37. package/src/components/Cart.astro +18 -14
  38. package/src/components/CartAdd.svelte +76 -0
  39. package/src/components/CartCheckout.svelte +58 -0
  40. package/src/components/CartForm.svelte +130 -0
  41. package/src/components/CartList.svelte +88 -0
  42. package/src/components/CartQuantity.svelte +81 -0
  43. package/src/components/CartSummary.astro +16 -104
  44. package/src/components/CartTotal.svelte +15 -0
  45. package/src/components/Channel.astro +44 -35
  46. package/src/components/Channels.astro +20 -6
  47. package/src/components/Checkbox.astro +52 -27
  48. package/src/components/Code.astro +52 -0
  49. package/src/components/Container.astro +25 -0
  50. package/src/components/Dialog.astro +3 -2
  51. package/src/components/Drawer.astro +55 -146
  52. package/src/components/DrawerOld.astro +143 -0
  53. package/src/components/Element.astro +18 -8
  54. package/src/components/Form.astro +16 -13
  55. package/src/components/Gallery.astro +174 -0
  56. package/src/components/Head.astro +62 -25
  57. package/src/components/Header.astro +10 -115
  58. package/src/components/Heading.astro +51 -44
  59. package/src/components/Icon.astro +29 -33
  60. package/src/components/Image.astro +18 -68
  61. package/src/components/Input.astro +65 -51
  62. package/src/components/Label.astro +20 -15
  63. package/src/components/Layout.astro +35 -0
  64. package/src/components/Link.astro +51 -32
  65. package/src/components/Links.astro +42 -0
  66. package/src/components/List.astro +41 -16
  67. package/src/components/LocaleSwitcher.astro +2 -2
  68. package/src/components/Logo.astro +56 -0
  69. package/src/components/Menu.astro +21 -17
  70. package/src/components/Navigation.astro +39 -0
  71. package/src/components/Panel.astro +25 -0
  72. package/src/components/Paragraph.astro +55 -0
  73. package/src/components/Price.astro +4 -4
  74. package/src/components/Prose.astro +78 -0
  75. package/src/components/Rating.astro +23 -62
  76. package/src/components/Search.astro +107 -43
  77. package/src/components/Section.astro +13 -242
  78. package/src/components/Select.astro +45 -55
  79. package/src/components/Sidebar.astro +53 -76
  80. package/src/components/Social.astro +11 -9
  81. package/src/components/Socials.astro +9 -5
  82. package/src/components/Subheader.astro +59 -0
  83. package/src/components/Switch.astro +72 -29
  84. package/src/components/Table.astro +1 -1
  85. package/src/components/Tagline.astro +32 -14
  86. package/src/components/Textarea.astro +40 -50
  87. package/src/components/Themer.astro +76 -0
  88. package/src/components/Toc.astro +32 -31
  89. package/src/components/_Author.astro +90 -0
  90. package/src/components/_Header.astro +129 -0
  91. package/src/components/_Image.astro +79 -0
  92. package/src/components/_Prose copy.astro +172 -0
  93. package/src/components/_Sidebar copy.astro +87 -0
  94. package/src/components/docs/PropsTable.astro +38 -264
  95. package/src/components/experimental/Window.astro +5 -57
  96. package/src/content/config.ts +4 -10
  97. package/src/content/{presets → layouts}/base.yml +52 -73
  98. package/src/content/pages/blocks/_categories.mdx +0 -2
  99. package/src/content/pages/blocks/_footer.mdx +0 -2
  100. package/src/content/pages/blocks/_header.mdx +0 -4
  101. package/src/content/pages/blocks/_jobs.mdx +0 -2
  102. package/src/content/pages/blocks/_prices.mdx +0 -2
  103. package/src/content/pages/blocks/_product.mdx +0 -2
  104. package/src/content/pages/blocks/_products.mdx +0 -2
  105. package/src/content/pages/blocks/_stats.mdx +0 -2
  106. package/src/content/pages/blocks/banner.mdx +0 -2
  107. package/src/content/pages/blocks/colleagues.mdx +0 -3
  108. package/src/content/pages/blocks/contact.mdx +0 -2
  109. package/src/content/pages/blocks/content.mdx +0 -6
  110. package/src/content/pages/blocks/cta.mdx +0 -10
  111. package/src/content/pages/blocks/features.mdx +0 -5
  112. package/src/content/pages/blocks/hero.mdx +0 -5
  113. package/src/content/pages/blocks/intro.mdx +0 -5
  114. package/src/content/pages/blocks/posts.mdx +0 -2
  115. package/src/content/pages/blocks/reviews.mdx +0 -3
  116. package/src/content/pages/categories/category.md +7 -0
  117. package/src/content/pages/docs/_internationalization.mdx +55 -0
  118. package/src/content/pages/docs/_using-blocks.mdx +33 -0
  119. package/src/content/pages/docs/_using-presets.mdx +49 -0
  120. package/src/content/pages/docs/blocks.mdx +33 -0
  121. package/src/content/pages/docs/collections/images.mdx +102 -0
  122. package/src/content/pages/docs/collections/pages.mdx +119 -0
  123. package/src/content/pages/docs/collections/presets.mdx +60 -0
  124. package/src/content/pages/docs/collections.mdx +42 -0
  125. package/src/content/pages/{base/card.mdx → docs/components/_card.mdx} +2 -5
  126. package/src/content/pages/{base → docs/components}/_dialog.mdx +1 -2
  127. package/src/content/pages/{base → docs/components}/_drawer.mdx +1 -2
  128. package/src/content/pages/{base → docs/components}/_localeswitcher.mdx +1 -2
  129. package/src/content/pages/{base → docs/components}/_switch.mdx +3 -4
  130. package/src/content/pages/{typography → docs/components}/_tagline.mdx +3 -4
  131. package/src/content/pages/docs/components/_toggle.mdx +30 -0
  132. package/src/content/pages/docs/components/avatar.mdx +34 -0
  133. package/src/content/pages/{base → docs/components}/badge.mdx +28 -10
  134. package/src/content/pages/docs/components/badges.mdx +46 -0
  135. package/src/content/pages/docs/components/button.mdx +78 -0
  136. package/src/content/pages/docs/components/buttons.mdx +51 -0
  137. package/src/content/pages/docs/components/channel.mdx +91 -0
  138. package/src/content/pages/docs/components/channels.mdx +89 -0
  139. package/src/content/pages/docs/components/checkbox.mdx +34 -0
  140. package/src/content/pages/docs/components/code.mdx +45 -0
  141. package/src/content/pages/docs/components/heading.mdx +59 -0
  142. package/src/content/pages/docs/components/icon.mdx +48 -0
  143. package/src/content/pages/docs/components/image.mdx +25 -0
  144. package/src/content/pages/docs/components/input.mdx +40 -0
  145. package/src/content/pages/{typography → docs/components}/label.mdx +9 -6
  146. package/src/content/pages/{typography → docs/components}/link.mdx +24 -10
  147. package/src/content/pages/docs/components/links.mdx +99 -0
  148. package/src/content/pages/docs/components/list.mdx +44 -0
  149. package/src/content/pages/docs/components/logo.mdx +36 -0
  150. package/src/content/pages/docs/components/menu.mdx +89 -0
  151. package/src/content/pages/docs/components/prose.mdx +36 -0
  152. package/src/content/pages/docs/components/rating.mdx +76 -0
  153. package/src/content/pages/{base → docs/components}/section.mdx +2 -3
  154. package/src/content/pages/{base → docs/components}/select.mdx +1 -11
  155. package/src/content/pages/docs/components/social.mdx +94 -0
  156. package/src/content/pages/docs/components/socials.mdx +102 -0
  157. package/src/content/pages/docs/components/switch.mdx +34 -0
  158. package/src/content/pages/{base → docs/components}/table.mdx +1 -4
  159. package/src/content/pages/docs/components/tagline.mdx +46 -0
  160. package/src/content/pages/docs/components/text.mdx +48 -0
  161. package/src/content/pages/docs/components/textarea.mdx +34 -0
  162. package/src/content/pages/docs/components/themer.mdx +49 -0
  163. package/src/content/pages/docs/components.mdx +37 -0
  164. package/src/content/pages/docs/customization.mdx +151 -0
  165. package/src/content/pages/docs/frameworks.mdx +29 -0
  166. package/src/content/pages/docs/generating-pages.mdx +129 -0
  167. package/src/content/pages/docs/index.mdx +20 -0
  168. package/src/content/pages/docs/installation.mdx +50 -0
  169. package/src/content/pages/docs/layouts.mdx +33 -0
  170. package/src/content/pages/index.mdx +25 -33
  171. package/src/content/pages/posts/post.md +7 -0
  172. package/src/content/pages/products/product.md +20 -0
  173. package/src/content/pages/showcase/anti-slip-profiles.md +2 -2
  174. package/src/content/pages/showcase/fulldev-ui.md +1 -1
  175. package/src/content/pages/showcase/lavis-detailing.md +1 -1
  176. package/src/content/pages/showcase/leren-trainingsacteren.md +1 -1
  177. package/src/content/pages/showcase/miele-witgoedcenter-amsterdam.md +1 -1
  178. package/src/content/pages/showcase/sloepverhuur-bolsward.md +1 -1
  179. package/src/content/pages/showcase/stark-vulcanising-products.md +1 -1
  180. package/src/content/pages/showcase/the-gym-haren.md +1 -1
  181. package/src/content/pages/showcase/van-dillen-antieke-bouwmaterialen.md +1 -1
  182. package/src/content/pages/showcase.mdx +4 -3
  183. package/src/css/color.css +0 -10
  184. package/src/css/custom.css +10 -12
  185. package/src/css/size.css +2 -11
  186. package/src/css/theme.css +95 -0
  187. package/src/env.d.ts +1 -0
  188. package/src/images/favicon/android-chrome-192x192.png +0 -0
  189. package/src/images/favicon/android-chrome-512x512.png +0 -0
  190. package/src/images/favicon/apple-touch-icon.png +0 -0
  191. package/src/images/favicon/browserconfig.xml +9 -0
  192. package/src/images/favicon/favicon-16x16.png +0 -0
  193. package/src/images/favicon/favicon-32x32.png +0 -0
  194. package/src/images/favicon/favicon-48x48.png +0 -0
  195. package/src/images/favicon/favicon.ico +0 -0
  196. package/src/images/favicon/favicon.svg +16 -0
  197. package/src/images/favicon/manifest.webmanifest +30 -0
  198. package/src/images/favicon/mstile-150x150.png +0 -0
  199. package/src/images/favicon/safari-pinned-tab.svg +16 -0
  200. package/src/images/favicon/yandex-browser-50x50.png +0 -0
  201. package/src/images/favicon/yandex-browser-manifest.json +9 -0
  202. package/src/images/logo-1.svg +11 -0
  203. package/src/images/logo-2.svg +13 -0
  204. package/src/images/logo-basic.svg +10 -0
  205. package/src/images/logo-simple.svg +13 -0
  206. package/src/images/logo-thin.svg +15 -0
  207. package/src/images/logo.svg +14 -0
  208. package/src/images/logofat.svg +11 -0
  209. package/src/integration/index.ts +110 -140
  210. package/src/layouts/Category.astro +131 -0
  211. package/src/layouts/Doc.astro +72 -0
  212. package/src/layouts/Job.astro +64 -0
  213. package/src/layouts/Page.astro +30 -0
  214. package/src/layouts/Post.astro +20 -0
  215. package/src/layouts/Product.astro +110 -0
  216. package/src/pages/[...page].astro +29 -24
  217. package/src/pages/test.astro +37 -0
  218. package/src/schemas/blocks/banner.ts +10 -0
  219. package/src/schemas/blocks/categories.ts +14 -0
  220. package/src/schemas/blocks/contact.ts +18 -0
  221. package/src/schemas/blocks/cta.ts +19 -0
  222. package/src/schemas/blocks/feature.ts +18 -0
  223. package/src/schemas/blocks/features.ts +24 -0
  224. package/src/schemas/blocks/hero.ts +20 -0
  225. package/src/schemas/blocks/intro.ts +16 -0
  226. package/src/schemas/blocks/products.ts +14 -0
  227. package/src/schemas/blocks/reviews.ts +24 -0
  228. package/src/schemas/components/avatar.ts +4 -1
  229. package/src/schemas/components/badge.ts +16 -11
  230. package/src/schemas/components/block.ts +22 -0
  231. package/src/schemas/components/button.ts +17 -14
  232. package/src/schemas/components/channel.ts +15 -9
  233. package/src/schemas/components/footer.ts +15 -21
  234. package/src/schemas/components/head.ts +17 -0
  235. package/src/schemas/components/header.ts +19 -7
  236. package/src/schemas/components/heading.ts +7 -1
  237. package/src/schemas/components/icon.ts +7 -1
  238. package/src/schemas/components/image.ts +38 -16
  239. package/src/schemas/components/link.ts +17 -0
  240. package/src/schemas/components/logo.ts +12 -2
  241. package/src/schemas/components/menu.ts +11 -11
  242. package/src/schemas/components/navigation.ts +10 -0
  243. package/src/schemas/components/paragraph.ts +9 -0
  244. package/src/schemas/components/price.ts +7 -1
  245. package/src/schemas/components/rating.ts +8 -13
  246. package/src/schemas/components/sidebar.ts +14 -11
  247. package/src/schemas/components/social.ts +16 -1
  248. package/src/schemas/components/tagline.ts +7 -1
  249. package/src/schemas/imageSchema.ts +30 -1
  250. package/src/schemas/layoutSchema.ts +22 -0
  251. package/src/schemas/pageSchema.ts +26 -96
  252. package/src/stores/cart.svelte.ts +79 -0
  253. package/src/stores/cart.ts +59 -6
  254. package/src/types/global-props.ts +0 -9
  255. package/src/types/{virtual-modules.d.ts → virtual.d.ts} +1 -1
  256. package/src/utils/cart.ts +1 -10
  257. package/src/utils/formatEntries.ts +8 -0
  258. package/src/utils/formatEntry.ts +29 -0
  259. package/src/utils/getDeepReferenceChildren.ts +14 -0
  260. package/src/utils/getHref.ts +6 -0
  261. package/src/utils/getReferenceChildren.ts +1 -1
  262. package/src/utils/setTheme.ts +18 -0
  263. package/src/utils/slugify.ts +6 -0
  264. package/svelte.config.js +5 -0
  265. package/tailwind.config.ts +67 -0
  266. package/tsconfig.json +1 -3
  267. package/src/blocks/Article.astro +0 -40
  268. package/src/blocks/Categories.astro +0 -12
  269. package/src/blocks/Colleagues.astro +0 -13
  270. package/src/blocks/Contact.astro +0 -116
  271. package/src/blocks/Content.astro +0 -12
  272. package/src/blocks/Cta.astro +0 -15
  273. package/src/blocks/Excerpt.astro +0 -14
  274. package/src/blocks/Features.astro +0 -11
  275. package/src/blocks/Hero.astro +0 -15
  276. package/src/blocks/Intro.astro +0 -23
  277. package/src/blocks/Jobs.astro +0 -12
  278. package/src/blocks/Posts.astro +0 -11
  279. package/src/blocks/Prices.astro +0 -24
  280. package/src/blocks/Product.astro +0 -106
  281. package/src/blocks/Products.astro +0 -11
  282. package/src/blocks/Reviews.astro +0 -13
  283. package/src/components/CartForm.astro +0 -121
  284. package/src/components/CartList.astro +0 -134
  285. package/src/components/Footer.astro +0 -193
  286. package/src/components/Text.astro +0 -43
  287. package/src/components/ThemeSelect.astro +0 -41
  288. package/src/components/Writeup.astro +0 -90
  289. package/src/components/experimental/Form.astro +0 -53
  290. package/src/components/experimental/Gallery.astro +0 -104
  291. package/src/components/experimental/Logo.astro +0 -38
  292. package/src/components/experimental/Prose.astro +0 -192
  293. package/src/components/sections.astro +0 -28
  294. package/src/content/pages/base/button.mdx +0 -60
  295. package/src/content/pages/base/checkbox.mdx +0 -42
  296. package/src/content/pages/base/icon.mdx +0 -55
  297. package/src/content/pages/base/image.mdx +0 -42
  298. package/src/content/pages/base/input.mdx +0 -56
  299. package/src/content/pages/base/rating.mdx +0 -55
  300. package/src/content/pages/base/textarea.mdx +0 -58
  301. package/src/content/pages/base/theme-select.mdx +0 -15
  302. package/src/content/pages/layouts/_layout.mdx +0 -14
  303. package/src/content/pages/layouts/docslayout.mdx +0 -14
  304. package/src/content/pages/overview/components.mdx +0 -75
  305. package/src/content/pages/overview/content-collections.mdx +0 -139
  306. package/src/content/pages/overview/frameworks.mdx +0 -198
  307. package/src/content/pages/overview/installation.mdx +0 -53
  308. package/src/content/pages/overview/introduction.mdx +0 -30
  309. package/src/content/pages/overview/theming.mdx +0 -69
  310. package/src/content/pages/schemas/page.mdx +0 -17
  311. package/src/content/pages/schemas/preset.mdx +0 -9
  312. package/src/content/pages/showcase/record.md +0 -3
  313. package/src/content/pages/typography/heading.mdx +0 -73
  314. package/src/content/pages/typography/list.mdx +0 -51
  315. package/src/content/pages/typography/text.mdx +0 -61
  316. package/src/content/presets/blocks.yml +0 -1
  317. package/src/content/presets/docs.yml +0 -6
  318. package/src/css/space.css +0 -77
  319. package/src/css/styles.css +0 -0
  320. package/src/images/avatar-1.yml +0 -1
  321. package/src/integration/generate-colors.ts +0 -639
  322. package/src/integration/tailwind-plugin.ts +0 -80
  323. package/src/integration/unocss-preset.ts +0 -84
  324. package/src/layouts/BlockLayout.astro +0 -19
  325. package/src/layouts/ContactLayout.astro +0 -21
  326. package/src/layouts/DocsLayout.astro +0 -73
  327. package/src/layouts/Layout.astro +0 -163
  328. package/src/layouts/OverviewLayout.astro +0 -42
  329. package/src/layouts/PostLayout.astro +0 -21
  330. package/src/layouts/ProductLayout.astro +0 -21
  331. package/src/loaders/imageLoader.ts +0 -26
  332. package/src/schemas/components/avatars.ts +0 -4
  333. package/src/schemas/components/buttons.ts +0 -4
  334. package/src/schemas/components/card.ts +0 -25
  335. package/src/schemas/components/cards.ts +0 -4
  336. package/src/schemas/components/channels.ts +0 -4
  337. package/src/schemas/components/images.ts +0 -4
  338. package/src/schemas/components/list.ts +0 -3
  339. package/src/schemas/components/section.ts +0 -15
  340. package/src/schemas/components/sections.ts +0 -3
  341. package/src/schemas/components/socials.ts +0 -4
  342. package/src/schemas/components/text.ts +0 -3
  343. package/src/schemas/components/toc.ts +0 -3
  344. package/src/schemas/components/writeup.ts +0 -20
  345. package/src/schemas/presetSchema.ts +0 -3
  346. package/src/schemas/utils/navigation.ts +0 -8
  347. package/src/schemas/utils/parents.ts +0 -3
@@ -0,0 +1,143 @@
1
+ ---
2
+ import type { ComponentProps, HTMLAttributes } from 'astro/types'
3
+ import Button from 'fulldev-ui/components/Button.astro'
4
+ import Element from 'fulldev-ui/components/Element.astro'
5
+ import Logo from 'fulldev-ui/components/Logo.astro'
6
+ import Menu from 'fulldev-ui/components/Menu.astro'
7
+ import links from 'fulldev-ui/schemas/components/links'
8
+ import type { GlobalProps } from 'fulldev-ui/types/global-props'
9
+ import Buttons from './Buttons.astro'
10
+ import Heading from './Heading.astro'
11
+ import Links from './Links.astro'
12
+
13
+ interface Props extends GlobalProps, HTMLAttributes<'aside'> {
14
+ variant?: ComponentProps<typeof Button>['variant']
15
+ text?: ComponentProps<typeof Button>['text']
16
+ icon?: ComponentProps<typeof Button>['icon']
17
+ heading?: ComponentProps<typeof Heading>['text']
18
+ logo?: ComponentProps<typeof Logo> | undefined
19
+ company?: ComponentProps<typeof Logo>['company']
20
+ menu?: ComponentProps<typeof Menu>['groups']
21
+ buttons?: ComponentProps<typeof Buttons>['buttons']
22
+ links?: ComponentProps<typeof Links>['links']
23
+ size?: 'sm' | 'md' | 'lg' | undefined
24
+ }
25
+
26
+ const {
27
+ id = 'drawer',
28
+ size = 'sm',
29
+ icon = 'menu-2',
30
+ color,
31
+ variant,
32
+ text,
33
+ buttons,
34
+ links,
35
+ heading,
36
+ logo,
37
+ company,
38
+ menu,
39
+ if: ifProp,
40
+ ...rest
41
+ } = Astro.props
42
+ ---
43
+
44
+ <Button
45
+ variant="secondary"
46
+ class:list={['drawer-button', `${id}-button`]}
47
+ onclick={`document.getElementById('${id}').showModal()`}
48
+ {variant}
49
+ {text}
50
+ {icon}
51
+ {color}
52
+ {size}
53
+ />
54
+
55
+ <Element
56
+ onclick={`event.target === this && this.close()`}
57
+ class:list="drawer"
58
+ as="dialog"
59
+ {id}
60
+ {text}
61
+ {size}
62
+ {icon}
63
+ {...rest}
64
+ >
65
+ <Element class:list="drawer-body">
66
+ <button autofocus></button>
67
+ <Element
68
+ class:list="drawer-header"
69
+ as="header"
70
+ >
71
+ <Logo
72
+ {size}
73
+ {company}
74
+ {...logo}
75
+ />
76
+ <Heading
77
+ level={4}
78
+ text={heading}
79
+ />
80
+ <Button
81
+ variant="secondary"
82
+ icon="x"
83
+ onclick={`document.getElementById('${id}').close()`}
84
+ />
85
+ <slot name="header" />
86
+ </Element>
87
+ <Element class:list="drawer-content">
88
+ <Links
89
+ direction="column"
90
+ {links}
91
+ />
92
+ <Menu groups={menu} />
93
+ <slot />
94
+ </Element>
95
+ <Element
96
+ class:list="drawer-footer"
97
+ as="footer"
98
+ >
99
+ <slot name="footer" />
100
+ </Element>
101
+ </Element>
102
+ </Element>
103
+
104
+ <style is:global>
105
+ @layer fulldev {
106
+ body:has(dialog[open]) {
107
+ @apply max-md:overflow-hidden;
108
+ }
109
+
110
+ .drawer {
111
+ @apply inset-0 m-0 h-full max-h-full w-full max-w-full p-0 md:max-w-md;
112
+
113
+ &::backdrop {
114
+ @apply cursor-pointer bg-background/50;
115
+ }
116
+
117
+ .drawer-body {
118
+ @apply flex h-full shrink flex-col overflow-auto bg-background;
119
+
120
+ .drawer-content {
121
+ @apply flex flex-col gap-6 px-gutter py-12;
122
+ }
123
+
124
+ .drawer-header,
125
+ .drawer-footer {
126
+ @apply sticky z-10 flex shrink-0 bg-background;
127
+ }
128
+
129
+ .drawer-header {
130
+ @apply top-0 h-14 items-center px-gutter;
131
+
132
+ .button {
133
+ @apply ml-auto;
134
+ }
135
+ }
136
+
137
+ .drawer-footer {
138
+ @apply bottom-0 mt-auto flex-col px-gutter py-8;
139
+ }
140
+ }
141
+ }
142
+ }
143
+ </style>
@@ -15,6 +15,13 @@ const {
15
15
  reverse,
16
16
  open,
17
17
  lead,
18
+ current,
19
+ direction,
20
+ center,
21
+ frame,
22
+ dark,
23
+ muted,
24
+ inset,
18
25
  ...rest
19
26
  } = Astro.props
20
27
 
@@ -26,22 +33,25 @@ const render = 'if' in rest ? rest.if : slot?.trim().length > 0
26
33
  render && (
27
34
  <As
28
35
  class:list={[
29
- 'root',
30
36
  {
31
37
  contrast,
32
38
  panel,
33
39
  open,
34
40
  reverse,
35
- lead,
41
+ current,
42
+ center,
43
+ inset,
44
+ dark,
45
+ muted,
36
46
  [`size-${size}`]: size,
37
47
  [`color-${color}`]: color,
38
- [`theme-${theme}`]: theme,
39
48
  [`level-${level}`]: level,
49
+ [`frame-${frame}`]: frame,
40
50
  [`variant-${variant}`]: variant,
41
51
  [`structure-${structure}`]: structure,
42
52
  [`align-${align}`]: align,
43
53
  [`position-${position}`]: position,
44
- [`position-${position}`]: position,
54
+ [`direction-${direction}`]: direction,
45
55
  },
46
56
  ]}
47
57
  {...rest}
@@ -51,8 +61,8 @@ const render = 'if' in rest ? rest.if : slot?.trim().length > 0
51
61
  )
52
62
  }
53
63
 
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';
64
+ <style is:global>
65
+ @import 'tailwindcss/base' layer(fulldev);
66
+ @import 'fulldev-ui/css/theme' layer(fulldev);
67
+ @import 'tailwindcss/components';
58
68
  </style>
@@ -8,12 +8,16 @@ 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> & {
17
+ type?: 'textarea' | undefined
18
+ })
19
+ )[]
20
+ | undefined
17
21
  }
18
22
 
19
23
  const { fields, submit, ...rest } = Astro.props
@@ -25,25 +29,24 @@ const { fields, submit, ...rest } = Astro.props
25
29
  {...rest}
26
30
  >
27
31
  {
28
- fields.map((field) => {
32
+ fields?.map((field) => {
29
33
  if ('options' in field) return <Select {...field} />
30
34
  if ('type' in field && field.type === 'textarea')
31
35
  return <Textarea {...field} />
32
36
  return <Input {...(field as any)} />
33
37
  })
34
38
  }
39
+ <slot />
35
40
  <Button
36
41
  type="submit"
37
42
  text={submit}
38
43
  />
39
44
  </Element>
40
45
 
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);
46
+ <style is:global>
47
+ @layer fulldev {
48
+ .form {
49
+ @apply flex w-full max-w-screen-md flex-col gap-4;
50
+ }
48
51
  }
49
52
  </style>
@@ -0,0 +1,174 @@
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?:
9
+ | (ComponentProps<typeof Image> | ComponentProps<typeof Image>['src'])[]
10
+ | undefined
11
+ }
12
+
13
+ const { images } = Astro.props
14
+
15
+ const hasMultiple = images?.length > 1
16
+ const hasMany = images?.length > 5
17
+ ---
18
+
19
+ <script>
20
+ function scrollLeft(carousel: HTMLElement) {
21
+ carousel.scrollLeft -= carousel.clientWidth
22
+ }
23
+
24
+ function scrollRight(carousel: HTMLElement) {
25
+ carousel.scrollLeft += carousel.clientWidth
26
+ }
27
+
28
+ function scrollTo(carousel: HTMLElement, index: number) {
29
+ carousel.scrollLeft = index * carousel.clientWidth
30
+ }
31
+
32
+ document.addEventListener('astro:page-load', () => {
33
+ const galleries = document.querySelectorAll('.gallery')
34
+ galleries.forEach((gallery) => {
35
+ // Apply left and right event listeners to large and small carousels
36
+ const containers = gallery.querySelectorAll(
37
+ '.gallery-small, .gallery-large'
38
+ )
39
+ containers?.forEach((element) => {
40
+ const left = element?.querySelector('.gallery-left')
41
+ const right = element?.querySelector('.gallery-right')
42
+ const carousel = element?.querySelector(
43
+ '.gallery-carousel'
44
+ ) as HTMLElement
45
+
46
+ left?.addEventListener('click', () => scrollLeft(carousel))
47
+ right?.addEventListener('click', () => scrollRight(carousel))
48
+ })
49
+
50
+ // Apply item click event listener to small carousel items
51
+ const items = gallery.querySelectorAll('.gallery-small .gallery-item')
52
+ const largeCarousel = gallery.querySelector(
53
+ '.gallery-large .gallery-carousel'
54
+ ) as HTMLElement
55
+ items?.forEach((item, i) => {
56
+ item.addEventListener('click', () => {
57
+ scrollTo(largeCarousel, i)
58
+ })
59
+ })
60
+ })
61
+ })
62
+ </script>
63
+
64
+ <Element class:list="gallery">
65
+ <Element class:list="gallery-large">
66
+ <Button
67
+ if={hasMultiple}
68
+ class="gallery-left"
69
+ icon="chevron-left"
70
+ variant="secondary"
71
+ size="sm"
72
+ />
73
+ <Element class:list="gallery-carousel">
74
+ {
75
+ images?.map((image: any) => (
76
+ <Element class:list="gallery-item">
77
+ <Image {...(typeof image === 'string' ? { src: image } : image)} />
78
+ </Element>
79
+ ))
80
+ }
81
+ </Element>
82
+ <Button
83
+ if={hasMultiple}
84
+ class="gallery-right"
85
+ icon="chevron-right"
86
+ variant="secondary"
87
+ size="sm"
88
+ />
89
+ </Element>
90
+ <Element
91
+ if={hasMultiple}
92
+ class:list="gallery-small"
93
+ >
94
+ <Button
95
+ if={hasMany}
96
+ class="gallery-left"
97
+ icon="chevron-left"
98
+ variant="secondary"
99
+ size="sm"
100
+ />
101
+ <Element class:list="gallery-carousel">
102
+ {
103
+ images?.map((image: any) => (
104
+ <Element
105
+ as="button"
106
+ class:list="gallery-item"
107
+ >
108
+ <Image {...(typeof image === 'string' ? { src: image } : image)} />
109
+ </Element>
110
+ ))
111
+ }
112
+ </Element>
113
+ <Button
114
+ if={hasMany}
115
+ class="gallery-right"
116
+ icon="chevron-right"
117
+ variant="ghost"
118
+ size="sm"
119
+ />
120
+ </Element>
121
+ </Element>
122
+
123
+ <style is:global>
124
+ @layer fulldev {
125
+ .gallery {
126
+ @apply relative flex flex-col gap-2;
127
+
128
+ .gallery-large,
129
+ .gallery-small {
130
+ @apply relative flex items-center;
131
+ }
132
+
133
+ .image {
134
+ @apply rounded;
135
+ }
136
+
137
+ .button {
138
+ @apply absolute z-10 bg-secondary-hover opacity-50 hover:opacity-100;
139
+ }
140
+
141
+ .gallery-left {
142
+ @apply left-2;
143
+ }
144
+
145
+ .gallery-right {
146
+ @apply right-2;
147
+ }
148
+
149
+ .gallery-carousel {
150
+ @apply inline-flex w-full snap-x snap-mandatory overflow-x-auto scroll-smooth scrollbar-none;
151
+ }
152
+
153
+ .gallery-large {
154
+ .gallery-item {
155
+ @apply flex w-full min-w-full snap-start;
156
+ }
157
+
158
+ .image {
159
+ @apply h-full max-h-[768px] w-full object-contain;
160
+ }
161
+ }
162
+
163
+ .gallery-small {
164
+ .gallery-carousel {
165
+ @apply gap-2;
166
+ }
167
+
168
+ .gallery-item {
169
+ @apply min-w-[calc(20%-0.4rem)] snap-start overflow-hidden transition hover:opacity-80;
170
+ }
171
+ }
172
+ }
173
+ }
174
+ </style>
@@ -1,18 +1,13 @@
1
1
  ---
2
2
  import { AstroSeo } from '@astrolib/seo'
3
- import type { ComponentProps } from 'astro/types'
4
- import { ViewTransitions } from 'astro:transitions'
5
- import type Layout from 'fulldev-ui/layouts/Layout.astro'
3
+ import type { HTMLAttributes } from 'astro/types'
4
+ import type { HeadSchema } from 'fulldev-ui/schemas/components/head'
6
5
 
7
- type Props = ComponentProps<typeof Layout>
6
+ type Props = HTMLAttributes<'head'> & HeadSchema & {}
8
7
 
9
- const { title, description, image, seo, code, render } = Astro.props
8
+ const { theme, title, description, image, code } = Astro.props
10
9
 
11
- const renderTitle = render && (await render()).headings[0]?.text
12
- const mergedTitle = seo?.title || title || renderTitle
13
- const mergedDescription = seo?.description || description
14
- const mergedImage =
15
- seo?.image || image ? Astro.url.origin + (seo?.image || image) : undefined
10
+ const src = image?.src && Astro.url.origin + image.src
16
11
  ---
17
12
 
18
13
  <head>
@@ -25,22 +20,64 @@ const mergedImage =
25
20
  name="generator"
26
21
  content={Astro.generator}
27
22
  />
28
- <ViewTransitions />
23
+ <link
24
+ rel="canonical"
25
+ href={Astro.url.href.endsWith('/') ? Astro.url.href : Astro.url.href + '/'}
26
+ />
29
27
  <AstroSeo
30
- title={mergedTitle ?? ''}
31
- description={mergedDescription ?? ''}
28
+ title={title ?? ''}
29
+ description={description ?? ''}
32
30
  openGraph={{
33
- title: mergedTitle,
34
- description: mergedDescription,
35
- images: mergedImage
36
- ? [
37
- {
38
- url: mergedImage,
39
- alt: mergedTitle,
40
- },
41
- ]
42
- : undefined,
43
- } as any}
31
+ title: title ?? '',
32
+ description: description ?? '',
33
+ images: [
34
+ {
35
+ url: src ?? '',
36
+ alt: title ?? '',
37
+ },
38
+ ],
39
+ }}
44
40
  />
45
- <Fragment set:html={code?.head} />
41
+
42
+ <Fragment set:html={code} />
43
+
44
+ <script is:inline define:vars={{ theme }}>
45
+ function setTheme(document) {
46
+ const value = localStorage.getItem('theme') || theme
47
+
48
+ const isDark =
49
+ value === 'dark' ||
50
+ (value === 'system' &&
51
+ window.matchMedia('(prefers-color-scheme: dark)').matches)
52
+
53
+ document.documentElement.classList.toggle('dark', isDark)
54
+
55
+ document.querySelectorAll('.themer').forEach((themer) => {
56
+ themer?.querySelectorAll('option').forEach((option) => {
57
+ option.selected = option.value === value
58
+ })
59
+ })
60
+ }
61
+
62
+ function setOption(document) {
63
+ const value = localStorage.getItem('theme') || theme
64
+
65
+ document.querySelectorAll('.themer').forEach((themer) => {
66
+ themer?.querySelectorAll('option').forEach((option) => {
67
+ option.selected = option.value === value
68
+ })
69
+ })
70
+ }
71
+
72
+ setTheme(document)
73
+ setOption(document)
74
+
75
+ document.addEventListener('astro:before-swap', (event) => {
76
+ setTheme(event.newDocument)
77
+ })
78
+
79
+ document.addEventListener('astro:page-load', (event) => {
80
+ setOption(document)
81
+ })
82
+ </script>
46
83
  </head>
@@ -1,136 +1,31 @@
1
1
  ---
2
- import type { ComponentProps, HTMLAttributes } from 'astro/types'
3
- import Buttons from 'fulldev-ui/components/Buttons.astro'
2
+ import type { HTMLAttributes, HTMLTag } from 'astro/types'
4
3
  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 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
4
 
12
- interface Props extends GlobalProps, HTMLAttributes<'header'> {
13
- logo?: ComponentProps<typeof Logo>
14
- company?: ComponentProps<typeof Logo>['company']
15
- buttons?: ComponentProps<typeof Buttons>['buttons']
16
- menu?: ComponentProps<typeof Menu>['groups']
17
- panel?: boolean | undefined
18
- search?: boolean | undefined
19
- open?: boolean | undefined
20
- themeselect?: boolean | undefined
21
- cart?: string | undefined
5
+ interface Props extends HTMLAttributes<'header'> {
6
+ as?: HTMLTag
22
7
  }
23
8
 
24
- const {
25
- size = 'sm',
26
- open = true,
27
- logo,
28
- company,
29
- buttons,
30
- search,
31
- panel,
32
- menu,
33
- themeselect,
34
- cart,
35
- ...rest
36
- } = Astro.props
9
+ const { as = 'header', ...rest } = Astro.props
37
10
  ---
38
11
 
39
12
  <Element
40
- class:list={['header']}
41
- as="header"
42
- {panel}
43
- {size}
44
- {open}
13
+ class:list="header"
14
+ {as}
45
15
  {...rest}
46
16
  >
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
- />
17
+ <slot />
68
18
  </Element>
69
19
 
70
- <style lang="scss" is:global>
20
+ <style is:global>
71
21
  @layer fulldev {
72
22
  .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%;
23
+ @apply relative flex w-full items-center bg-background;
87
24
  height: var(--header-height);
88
- overflow: hidden;
89
25
 
90
26
  &,
91
27
  & ~ * {
92
- --header-height: 56px;
93
- }
94
-
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;
105
- }
106
-
107
- @media (min-width: 1024px) {
108
- &:not(.open) {
109
- display: none;
110
-
111
- & ~ * {
112
- --header-height: 0px;
113
- }
114
- }
115
- }
116
-
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
- }
128
- }
129
-
130
- .menu-button {
131
- @media (min-width: 1024px) {
132
- display: none;
133
- }
28
+ --header-height: 3.5rem;
134
29
  }
135
30
  }
136
31
  }