fulldev-ui 0.4.33 → 0.5.0-beta-16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. package/.env.example +3 -0
  2. package/CONTRIBUTING.md +10 -4
  3. package/astro.config.ts +11 -11
  4. package/package.json +31 -17
  5. package/pnpm-lock.yaml +1353 -438
  6. package/public/favicon/android-chrome-192x192.png +0 -0
  7. package/public/favicon/android-chrome-512x512.png +0 -0
  8. package/public/favicon/apple-touch-icon.png +0 -0
  9. package/public/favicon/browserconfig.xml +7 -7
  10. package/public/favicon/favicon-16x16-dark.png +0 -0
  11. package/public/favicon/favicon-16x16.png +0 -0
  12. package/public/favicon/favicon-32x32-dark.png +0 -0
  13. package/public/favicon/favicon-32x32.png +0 -0
  14. package/public/favicon/favicon-48x48-dark.png +0 -0
  15. package/public/favicon/favicon-48x48.png +0 -0
  16. package/public/favicon/favicon-dark.ico +0 -0
  17. package/public/favicon/favicon.ico +0 -0
  18. package/public/favicon/favicon.svg +16 -0
  19. package/public/favicon/manifest.webmanifest +26 -0
  20. package/public/favicon/mstile-150x150.png +0 -0
  21. package/public/favicon/safari-pinned-tab.svg +14 -15
  22. package/public/favicon/yandex-browser-50x50.png +0 -0
  23. package/public/favicon/yandex-browser-manifest.json +9 -0
  24. package/src/blocks/Article.astro +40 -0
  25. package/src/blocks/Banner.astro +48 -0
  26. package/src/blocks/Colleagues.astro +2 -1
  27. package/src/blocks/Contact.astro +61 -99
  28. package/src/blocks/Cta.astro +2 -1
  29. package/src/blocks/Excerpt.astro +14 -0
  30. package/src/blocks/Hero.astro +1 -2
  31. package/src/blocks/Intro.astro +4 -1
  32. package/src/blocks/Jobs.astro +1 -1
  33. package/src/blocks/Prices.astro +1 -1
  34. package/src/blocks/Product.astro +75 -27
  35. package/src/blocks/Reviews.astro +1 -1
  36. package/src/components/Avatar.astro +3 -20
  37. package/src/components/Badge.astro +17 -54
  38. package/src/components/Badges.astro +40 -0
  39. package/src/components/Button.astro +65 -46
  40. package/src/components/Buttons.astro +49 -0
  41. package/src/components/Card.astro +100 -178
  42. package/src/components/Cards.astro +135 -0
  43. package/src/components/Cart.astro +38 -0
  44. package/src/components/CartForm.astro +122 -0
  45. package/src/components/CartList.astro +134 -0
  46. package/src/components/CartSummary.astro +148 -0
  47. package/src/components/Channel.astro +70 -0
  48. package/src/components/Channels.astro +37 -0
  49. package/src/components/Checkbox.astro +12 -16
  50. package/src/components/Dialog.astro +10 -12
  51. package/src/components/Drawer.astro +131 -63
  52. package/src/components/Element.astro +58 -0
  53. package/src/components/Footer.astro +142 -93
  54. package/src/components/Form.astro +49 -0
  55. package/src/components/Head.astro +11 -45
  56. package/src/components/Header.astro +91 -163
  57. package/src/components/Heading.astro +18 -26
  58. package/src/components/Icon.astro +9 -9
  59. package/src/components/Image.astro +42 -152
  60. package/src/components/Input.astro +16 -28
  61. package/src/components/Label.astro +14 -17
  62. package/src/components/Link.astro +22 -44
  63. package/src/components/List.astro +12 -10
  64. package/src/components/LocaleSwitcher.astro +25 -0
  65. package/src/components/Menu.astro +57 -0
  66. package/src/components/Price.astro +34 -0
  67. package/src/components/Rating.astro +29 -25
  68. package/src/components/Search.astro +4 -7
  69. package/src/components/Section.astro +196 -234
  70. package/src/components/Select.astro +16 -34
  71. package/src/components/Sidebar.astro +85 -58
  72. package/src/components/Social.astro +36 -0
  73. package/src/components/Socials.astro +37 -0
  74. package/src/components/Switch.astro +14 -22
  75. package/src/components/Table.astro +23 -36
  76. package/src/components/Tagline.astro +11 -16
  77. package/src/components/Text.astro +17 -19
  78. package/src/components/Textarea.astro +8 -22
  79. package/src/components/ThemeSelect.astro +41 -0
  80. package/src/components/Toc.astro +59 -56
  81. package/src/components/Writeup.astro +90 -0
  82. package/src/components/docs/PropsTable.astro +229 -56
  83. package/src/components/experimental/Form.astro +36 -17
  84. package/src/components/experimental/Gallery.astro +50 -126
  85. package/src/components/experimental/Logo.astro +26 -9
  86. package/src/components/experimental/Prose.astro +41 -5
  87. package/src/components/experimental/Video.astro +1 -1
  88. package/src/components/experimental/Window.astro +3 -4
  89. package/src/components/sections.astro +28 -0
  90. package/src/content/config.ts +10 -7
  91. package/src/content/pages/base/_dialog.mdx +1 -2
  92. package/src/content/pages/base/_drawer.mdx +1 -2
  93. package/src/content/pages/base/_localeswitcher.mdx +17 -0
  94. package/src/content/pages/base/_switch.mdx +1 -2
  95. package/src/content/pages/base/badge.mdx +1 -12
  96. package/src/content/pages/base/button.mdx +1 -12
  97. package/src/content/pages/base/card.mdx +2 -29
  98. package/src/content/pages/base/checkbox.mdx +1 -2
  99. package/src/content/pages/base/icon.mdx +1 -2
  100. package/src/content/pages/base/image.mdx +42 -0
  101. package/src/content/pages/base/input.mdx +1 -12
  102. package/src/content/pages/base/rating.mdx +3 -14
  103. package/src/content/pages/base/section.mdx +2 -3
  104. package/src/content/pages/base/select.mdx +1 -20
  105. package/src/content/pages/base/table.mdx +1 -28
  106. package/src/content/pages/base/textarea.mdx +1 -16
  107. package/src/content/pages/base/theme-select.mdx +15 -0
  108. package/src/content/pages/blocks/_categories.mdx +3 -5
  109. package/src/content/pages/blocks/{footer.mdx → _footer.mdx} +2 -4
  110. package/src/content/pages/blocks/{header.mdx → _header.mdx} +2 -7
  111. package/src/content/pages/blocks/_jobs.mdx +1 -2
  112. package/src/content/pages/blocks/{prices.mdx → _prices.mdx} +5 -7
  113. package/src/content/pages/blocks/_product.mdx +74 -4
  114. package/src/content/pages/blocks/_products.mdx +1 -2
  115. package/src/content/pages/blocks/_stats.mdx +1 -1
  116. package/src/content/pages/blocks/{_banner.mdx → banner.mdx} +2 -2
  117. package/src/content/pages/blocks/colleagues.mdx +6 -8
  118. package/src/content/pages/blocks/contact.mdx +69 -0
  119. package/src/content/pages/blocks/content.mdx +1 -19
  120. package/src/content/pages/blocks/cta.mdx +2 -25
  121. package/src/content/pages/blocks/features.mdx +2 -3
  122. package/src/content/pages/blocks/hero.mdx +5 -3
  123. package/src/content/pages/blocks/intro.mdx +2 -5
  124. package/src/content/pages/blocks/posts.mdx +9 -2
  125. package/src/content/pages/blocks/reviews.mdx +23 -18
  126. package/src/content/pages/index.mdx +16 -20
  127. package/src/content/pages/layouts/_layout.mdx +14 -0
  128. package/src/content/pages/layouts/docslayout.mdx +14 -0
  129. package/src/content/pages/overview/components.mdx +75 -0
  130. package/src/content/pages/overview/content-collections.mdx +139 -0
  131. package/src/content/pages/overview/frameworks.mdx +4 -4
  132. package/src/content/pages/overview/installation.mdx +36 -3
  133. package/src/content/pages/overview/introduction.mdx +19 -9
  134. package/src/content/pages/overview/theming.mdx +53 -67
  135. package/src/content/pages/schemas/page.mdx +17 -0
  136. package/src/content/pages/schemas/preset.mdx +9 -0
  137. package/src/content/pages/showcase/anti-slip-profiles.md +5 -0
  138. package/src/content/pages/showcase/fulldev-ui.md +5 -0
  139. package/src/content/pages/showcase/lavis-detailing.md +5 -0
  140. package/src/content/pages/showcase/leren-trainingsacteren.md +5 -0
  141. package/src/content/pages/showcase/miele-witgoedcenter-amsterdam.md +5 -0
  142. package/src/content/{records/record.yml → pages/showcase/record.md} +2 -0
  143. package/src/content/pages/showcase/sloepverhuur-bolsward.md +5 -0
  144. package/src/content/pages/showcase/stark-vulcanising-products.md +5 -0
  145. package/src/content/pages/showcase/the-gym-haren.md +5 -0
  146. package/src/content/pages/showcase/van-dillen-antieke-bouwmaterialen.md +5 -0
  147. package/src/content/pages/showcase.mdx +11 -41
  148. package/src/content/pages/typography/_tagline.mdx +1 -2
  149. package/src/content/pages/typography/heading.mdx +1 -2
  150. package/src/content/pages/typography/label.mdx +1 -2
  151. package/src/content/pages/typography/link.mdx +1 -13
  152. package/src/content/pages/typography/list.mdx +1 -2
  153. package/src/content/pages/typography/text.mdx +1 -2
  154. package/src/content/{settings → presets}/base.yml +62 -45
  155. package/src/content/presets/blocks.yml +1 -0
  156. package/src/content/presets/docs.yml +6 -0
  157. package/src/css/color.css +0 -82
  158. package/src/css/custom.css +9 -56
  159. package/src/css/size.css +10 -0
  160. package/src/css/space.css +0 -8
  161. package/src/css/styles.css +0 -15
  162. package/src/env.d.ts +1 -1
  163. package/src/images/avatar-1.yml +1 -0
  164. package/src/images/favicon.svg +16 -0
  165. package/src/integration/generate-colors.ts +2 -0
  166. package/src/integration/index.ts +95 -7
  167. package/src/layouts/BlockLayout.astro +10 -15
  168. package/src/layouts/ContactLayout.astro +21 -0
  169. package/src/layouts/DocsLayout.astro +73 -0
  170. package/src/layouts/Layout.astro +114 -133
  171. package/src/layouts/OverviewLayout.astro +28 -31
  172. package/src/layouts/PostLayout.astro +12 -23
  173. package/src/layouts/ProductLayout.astro +10 -20
  174. package/src/loaders/imageLoader.ts +26 -0
  175. package/src/pages/[...page].astro +25 -21
  176. package/src/schemas/components/avatar.ts +3 -0
  177. package/src/schemas/components/avatars.ts +4 -0
  178. package/src/schemas/components/badge.ts +13 -0
  179. package/src/schemas/components/button.ts +16 -0
  180. package/src/schemas/components/buttons.ts +4 -0
  181. package/src/schemas/components/card.ts +25 -0
  182. package/src/schemas/components/cards.ts +4 -0
  183. package/src/schemas/components/channel.ts +13 -0
  184. package/src/schemas/components/channels.ts +4 -0
  185. package/src/schemas/components/footer.ts +25 -0
  186. package/src/schemas/components/header.ts +11 -0
  187. package/src/schemas/components/heading.ts +3 -0
  188. package/src/schemas/components/icon.ts +3 -0
  189. package/src/schemas/components/image.ts +25 -0
  190. package/src/schemas/components/images.ts +4 -0
  191. package/src/schemas/components/list.ts +3 -0
  192. package/src/schemas/components/logo.ts +3 -0
  193. package/src/schemas/components/menu.ts +13 -0
  194. package/src/schemas/components/price.ts +3 -0
  195. package/src/schemas/components/rating.ts +15 -0
  196. package/src/schemas/components/section.ts +15 -0
  197. package/src/schemas/components/sections.ts +3 -0
  198. package/src/schemas/components/sidebar.ts +15 -0
  199. package/src/schemas/components/social.ts +3 -0
  200. package/src/schemas/components/socials.ts +4 -0
  201. package/src/schemas/components/tagline.ts +3 -0
  202. package/src/schemas/components/text.ts +3 -0
  203. package/src/schemas/components/toc.ts +3 -0
  204. package/src/schemas/components/writeup.ts +20 -0
  205. package/src/schemas/imageSchema.ts +12 -0
  206. package/src/schemas/pageSchema.ts +91 -0
  207. package/src/schemas/presetSchema.ts +3 -0
  208. package/src/schemas/utils/component.ts +17 -0
  209. package/src/schemas/utils/navigation.ts +8 -0
  210. package/src/schemas/utils/parents.ts +3 -0
  211. package/src/schemas/{utils.ts → utils/pathSchema.ts} +2 -11
  212. package/src/stores/cart.ts +23 -0
  213. package/src/types/global-props.ts +16 -0
  214. package/src/types/virtual-modules.d.ts +5 -0
  215. package/src/utils/_archive/Childmorphic.ts +1 -1
  216. package/src/utils/_archive/mergeEntries.ts +28 -0
  217. package/src/utils/cart.ts +32 -0
  218. package/src/utils/getDeepReferenceChildren.ts +14 -0
  219. package/src/utils/getFolderChildren.ts +18 -0
  220. package/src/utils/getReferenceChildren.ts +14 -0
  221. package/src/utils/getSiblingPages.ts +14 -0
  222. package/tsconfig.json +2 -5
  223. package/public/favicon/site.webmanifest +0 -19
  224. package/public/images/avatars/1.jpeg +0 -0
  225. package/public/images/avatars/2.jpeg +0 -0
  226. package/public/images/avatars/3.jpeg +0 -0
  227. package/public/images/avatars/300/1.jpeg +0 -0
  228. package/public/images/avatars/300/2.jpeg +0 -0
  229. package/public/images/avatars/300/3.jpeg +0 -0
  230. package/public/images/avatars/300/4.jpeg +0 -0
  231. package/public/images/avatars/4.jpeg +0 -0
  232. package/public/images/avatars/5.jpeg +0 -0
  233. package/public/images/avatars/6.jpeg +0 -0
  234. package/public/images/avatars/7.jpeg +0 -0
  235. package/public/images/avatars/8.jpeg +0 -0
  236. package/public/images/blocks/colleagues.png +0 -0
  237. package/public/images/blocks/content.png +0 -0
  238. package/public/images/blocks/cta.png +0 -0
  239. package/public/images/blocks/features.png +0 -0
  240. package/public/images/blocks/footer.png +0 -0
  241. package/public/images/blocks/header.png +0 -0
  242. package/public/images/blocks/hero.png +0 -0
  243. package/public/images/blocks/intro.png +0 -0
  244. package/public/images/blocks/posts.png +0 -0
  245. package/public/images/blocks/prices.png +0 -0
  246. package/public/images/blocks/reviews.png +0 -0
  247. package/public/images/logo-placeholder.svg +0 -1
  248. package/src/components/Bento.astro +0 -43
  249. package/src/components/Block.astro +0 -157
  250. package/src/components/Blocks.astro +0 -5
  251. package/src/components/Box.astro +0 -63
  252. package/src/components/Carousel.astro +0 -54
  253. package/src/components/Column.astro +0 -73
  254. package/src/components/Grid.astro +0 -32
  255. package/src/components/Masonry.astro +0 -42
  256. package/src/components/Root.astro +0 -94
  257. package/src/components/Row.astro +0 -49
  258. package/src/components/Split.astro +0 -59
  259. package/src/components/Spread.astro +0 -46
  260. package/src/components/Stack.astro +0 -36
  261. package/src/components/Toggle.astro +0 -46
  262. package/src/components/Wrap.astro +0 -42
  263. package/src/components/docs/NavigationButtons.astro +0 -59
  264. package/src/components/experimental/Channel.astro +0 -74
  265. package/src/components/experimental/GalleryVertical.astro +0 -161
  266. package/src/components/experimental/Price.astro +0 -40
  267. package/src/content/pages/_changelog.mdx +0 -10
  268. package/src/content/pages/_segment/footer.mdx +0 -244
  269. package/src/content/pages/_segment/header.mdx +0 -210
  270. package/src/content/pages/base/_image.mdx +0 -14
  271. package/src/content/pages/base/toggle.mdx +0 -32
  272. package/src/content/pages/blocks.mdx +0 -10
  273. package/src/content/pages/overview/integration.mdx +0 -37
  274. package/src/content/pages/structure/_row.mdx +0 -23
  275. package/src/content/pages/structure/_wrap.mdx +0 -25
  276. package/src/content/pages/structure/carousel.mdx +0 -31
  277. package/src/content/pages/structure/column.mdx +0 -21
  278. package/src/content/pages/structure/grid.mdx +0 -26
  279. package/src/content/pages/structure/masonry.mdx +0 -32
  280. package/src/content/pages/structure/split.mdx +0 -21
  281. package/src/content/pages/structure/spread.mdx +0 -21
  282. package/src/content/pages/structure/stack.mdx +0 -22
  283. package/src/content/settings/components.yml +0 -29
  284. package/src/layouts/BlockOverviewLayout.astro +0 -39
  285. package/src/layouts/ComponentLayout.astro +0 -23
  286. package/src/layouts/JobsLayout.astro +0 -40
  287. package/src/layouts/PageLayout.astro +0 -32
  288. package/src/schemas/base.ts +0 -90
  289. package/src/schemas/block.ts +0 -15
  290. package/src/schemas/card.ts +0 -3
  291. package/src/schemas/page.ts +0 -43
  292. package/src/utils/mergeEntries.ts +0 -28
  293. /package/{public/showcase → src/images}/anti-slip-profiles.webp +0 -0
  294. /package/{public/images/avatars/500/1.jpeg → src/images/avatar-1.jpeg} +0 -0
  295. /package/{public/images/avatars/500/2.jpeg → src/images/avatar-2.jpeg} +0 -0
  296. /package/{public/images/avatars/500/3.jpeg → src/images/avatar-3.jpeg} +0 -0
  297. /package/{public/images/avatars/500/4.jpeg → src/images/avatar-4.jpeg} +0 -0
  298. /package/{public → src}/images/avatar-placeholder.jpg +0 -0
  299. /package/{public → src}/images/block-code.png +0 -0
  300. /package/{public → src}/images/component-code.png +0 -0
  301. /package/{public/showcase → src/images}/fulldev-ui.webp +0 -0
  302. /package/{public/showcase → src/images}/lavis-detailing.webp +0 -0
  303. /package/{public/showcase → src/images}/leren-trainingsacteren.webp +0 -0
  304. /package/{public/showcase → src/images}/miele-witgoedcenter-amsterdam.webp +0 -0
  305. /package/{public → src}/images/og-image.png +0 -0
  306. /package/{public → src}/images/placeholder-center.webp +0 -0
  307. /package/{public → src}/images/placeholder-landscape-dark.png +0 -0
  308. /package/{public → src}/images/placeholder-landscape.webp +0 -0
  309. /package/{public → src}/images/placeholder-portrait.webp +0 -0
  310. /package/{public → src}/images/placeholder-right.webp +0 -0
  311. /package/{public → src}/images/placeholder.webp +0 -0
  312. /package/{public/showcase → src/images}/sloepverhuur-bolsward.webp +0 -0
  313. /package/{public/showcase → src/images}/stark-vulcanising-products.webp +0 -0
  314. /package/{public/showcase → src/images}/the-gym-haren.webp +0 -0
  315. /package/{public/showcase → src/images}/van-dillen-antieke-bouwmaterialen.webp +0 -0
@@ -1,101 +1,169 @@
1
1
  ---
2
- import type { ComponentProps, HTMLTag } from 'astro/types'
3
- import Box from './Box.astro'
4
- import Button from './Button.astro'
5
- import Card from './Card.astro'
6
- import Root from './Root.astro'
7
-
8
- type Props<As extends HTMLTag = 'a'> = ComponentProps<typeof Card<As>> & {
9
- label?: string
10
- icon?: string
11
- position?: 'left' | 'right'
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/experimental/Logo.astro'
6
+ import Menu from 'fulldev-ui/components/Menu.astro'
7
+ import type { GlobalProps } from 'fulldev-ui/types/global-props'
8
+ import Buttons from './Buttons.astro'
9
+ import Heading from './Heading.astro'
10
+
11
+ interface Props extends GlobalProps, HTMLAttributes<'aside'> {
12
+ variant?: ComponentProps<typeof Button>['variant']
13
+ text?: ComponentProps<typeof Button>['text']
14
+ icon?: ComponentProps<typeof Button>['icon']
15
+ heading?: ComponentProps<typeof Heading>['text']
16
+ logo?: ComponentProps<typeof Logo> | undefined
17
+ company?: ComponentProps<typeof Logo>['company']
18
+ menu?: ComponentProps<typeof Menu>['groups']
19
+ buttons?: ComponentProps<typeof Buttons>['buttons']
12
20
  }
13
21
 
14
22
  const {
15
23
  id = 'drawer',
16
- frame = 'fill',
17
- position = 'left',
18
- label,
19
- icon,
24
+ size = 'sm',
25
+ icon = 'menu-2',
26
+ color,
27
+ variant,
28
+ text,
29
+ buttons,
30
+ heading,
31
+ logo,
32
+ company,
33
+ menu,
34
+ if: ifProp,
20
35
  ...rest
21
36
  } = Astro.props
37
+
38
+ const buttonsGroup = { heading: '', buttons: buttons }
39
+ const mergedMenu = [buttonsGroup, ...(menu || [])] as typeof menu
22
40
  ---
23
41
 
24
42
  <Button
25
- class:list="drawer-button"
26
- as="button"
27
43
  variant="secondary"
28
- type="button"
29
- id={`${id}-button`}
30
- html={label}
31
- icon={icon}
44
+ class:list={['drawer-button', `${id}-button`]}
32
45
  onclick={`document.getElementById('${id}').showModal()`}
46
+ {variant}
47
+ {text}
48
+ {icon}
49
+ {color}
33
50
  />
34
51
 
35
- <Root
52
+ <Element
53
+ onclick={`event.target === this && this.close()`}
54
+ class:list="drawer"
36
55
  as="dialog"
37
- class="drawer"
38
56
  {id}
39
- {position}
40
- onclick={`event.target === this && this.close()`}
57
+ {text}
58
+ {icon}
59
+ {...rest}
41
60
  >
42
- <Box
43
- class:list={[`frame-${frame}`, `position-${position}`]}
44
- {...rest}
45
- >
46
- <slot />
47
- </Box>
48
- </Root>
61
+ <Element class:list="drawer-body">
62
+ <Element
63
+ class:list="drawer-header"
64
+ as="header"
65
+ >
66
+ <Logo
67
+ {company}
68
+ {...logo}
69
+ />
70
+ <Heading
71
+ level={4}
72
+ text={heading}
73
+ />
74
+ <Button
75
+ variant="secondary"
76
+ icon="x"
77
+ onclick={`document.getElementById('${id}').close()`}
78
+ />
79
+ <slot name="header" />
80
+ </Element>
81
+ <Element class:list="drawer-content">
82
+ <Menu groups={mergedMenu} />
83
+ <slot />
84
+ </Element>
85
+ <Element
86
+ class:list="drawer-footer"
87
+ as="footer"
88
+ >
89
+ <slot name="footer" />
90
+ </Element>
91
+ </Element>
92
+ </Element>
49
93
 
50
94
  <style lang="scss" is:global>
51
95
  @layer fulldev {
96
+ body:has(dialog[open]) {
97
+ overflow: hidden;
98
+
99
+ @media (min-width: 768px) {
100
+ overflow: auto;
101
+ }
102
+ }
103
+
52
104
  .drawer {
53
- flex-shrink: 0;
54
- align-items: stretch;
55
- box-sizing: border-box;
56
- margin: 0 !important;
57
- outline: 0;
58
- border: 0;
59
- background: var(--color-2);
105
+ top: 0;
106
+ bottom: 0;
107
+ margin: 0;
60
108
  padding: 0;
61
- padding: var(--space-7) var(--space-7) var(--space-7) var(--gutter);
62
- min-width: 260px;
63
- max-width: 360px;
64
- height: 100vh;
65
- max-height: 100vh;
109
+ width: 100%;
110
+ max-width: 100%;
111
+ height: 100%;
112
+ max-height: 100%;
113
+
114
+ @media (min-width: 768px) {
115
+ width: 440px;
116
+ }
66
117
 
67
118
  &::backdrop {
119
+ cursor: pointer;
68
120
  background: rgba(0, 0, 0, 0.5);
69
121
  }
70
122
 
71
- &.position-left {
72
- margin-right: 0;
123
+ .drawer-body {
124
+ display: flex;
125
+ flex-shrink: 1;
126
+ flex-direction: column;
127
+ border-right: 1px solid var(--color-a6);
128
+ height: 100%;
129
+ overflow: auto;
73
130
  }
74
131
 
75
- &.position-right {
76
- right: 0;
132
+ .drawer-content {
133
+ display: flex;
134
+ flex-direction: column;
135
+ padding: var(--space-6) var(--gutter);
77
136
  }
78
137
 
79
- .box {
80
- padding: calc(var(--space-5) * 2) calc(var(--space-7) * 3);
81
- min-width: calc(var(--space-7) * 14);
82
- height: 100vh;
83
- overflow-x: hidden;
84
- overflow-y: auto;
138
+ .drawer-header,
139
+ .drawer-footer {
140
+ display: flex;
141
+ position: sticky;
142
+ flex-shrink: 0;
143
+ z-index: 1;
144
+ border-style: solid;
145
+ border-color: var(--color-a6);
146
+ background-color: var(--base-background);
147
+ }
85
148
 
86
- &.position-left {
87
- border-right: 1px solid var(--color-a6);
88
- padding-left: var(--gutter);
89
- }
149
+ .drawer-header {
150
+ top: 0;
151
+ align-items: center;
152
+ border-bottom-width: 1px;
153
+ padding: 0 var(--gutter);
154
+ height: 56px;
90
155
 
91
- &.position-right {
92
- border-left: 1px solid var(--color-a6);
93
- padding-right: var(--gutter);
156
+ .button {
157
+ margin-left: auto;
94
158
  }
159
+ }
95
160
 
96
- &.frame-fill {
97
- background-color: var(--color-2);
98
- }
161
+ .drawer-footer {
162
+ bottom: 0;
163
+ flex-direction: column;
164
+ margin-top: auto;
165
+ border-top-width: 1px;
166
+ padding: var(--space-5) var(--gutter);
99
167
  }
100
168
  }
101
169
  }
@@ -0,0 +1,58 @@
1
+ ---
2
+ const {
3
+ as: As = 'div',
4
+ theme,
5
+ variant,
6
+ size,
7
+ align,
8
+ color,
9
+ position,
10
+ panel,
11
+ contrast,
12
+ structure,
13
+ level,
14
+ placement,
15
+ reverse,
16
+ open,
17
+ lead,
18
+ ...rest
19
+ } = Astro.props
20
+
21
+ const slot = await Astro.slots.render('default')
22
+ const render = 'if' in rest ? rest.if : slot?.trim().length > 0
23
+ ---
24
+
25
+ {
26
+ render && (
27
+ <As
28
+ class:list={[
29
+ 'root',
30
+ {
31
+ contrast,
32
+ panel,
33
+ open,
34
+ reverse,
35
+ lead,
36
+ [`size-${size}`]: size,
37
+ [`color-${color}`]: color,
38
+ [`theme-${theme}`]: theme,
39
+ [`level-${level}`]: level,
40
+ [`variant-${variant}`]: variant,
41
+ [`structure-${structure}`]: structure,
42
+ [`align-${align}`]: align,
43
+ [`position-${position}`]: position,
44
+ [`position-${position}`]: position,
45
+ },
46
+ ]}
47
+ {...rest}
48
+ >
49
+ <Fragment set:html={slot} />
50
+ </As>
51
+ )
52
+ }
53
+
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';
58
+ </style>
@@ -1,143 +1,192 @@
1
1
  ---
2
- import type { ComponentProps, HTMLTag, Polymorphic } from 'astro/types'
3
- import Column from 'fulldev-ui/components/Column.astro'
2
+ import type { ComponentProps, HTMLAttributes } from 'astro/types'
3
+ import Button from 'fulldev-ui/components/Button.astro'
4
+ import Channels from 'fulldev-ui/components/Channels.astro'
5
+ import Element from 'fulldev-ui/components/Element.astro'
4
6
  import Heading from 'fulldev-ui/components/Heading.astro'
5
- import Link from 'fulldev-ui/components/Link.astro'
6
- import Root from 'fulldev-ui/components/Root.astro'
7
+ import Social from 'fulldev-ui/components/Social.astro'
8
+ import Socials from 'fulldev-ui/components/Socials.astro'
7
9
  import Text from 'fulldev-ui/components/Text.astro'
8
10
  import Logo from 'fulldev-ui/components/experimental/Logo.astro'
11
+ import type { GlobalProps } from 'fulldev-ui/types/global-props'
9
12
 
10
- type Props<As extends HTMLTag = 'footer'> = Polymorphic<{ as: As }> & {
11
- structure?: 'spread' | 'row' | 'split' | 'column' | 'stack'
12
- variant?: 'base' | 'ghost' | 'subtle' | 'soft' | 'surface' | 'outline'
13
- frame?: 'fill' | 'panel' | 'contain' | 'none'
14
- align?: 'start' | 'center' | 'end'
15
- size?: 'sm' | 'md' | 'lg'
16
- theme?: 'light' | 'dark'
17
- color?: 'base' | 'brand'
18
- space?: 'none' | 'auto'
19
- logo?: string
20
- heading?: string
21
- title?: string
22
- description?: string
23
- text?: string
24
- html?: string
13
+ interface Props extends GlobalProps, HTMLAttributes<'footer'> {
14
+ screen?: number | undefined
15
+ logo?: ComponentProps<typeof Logo>['src']
16
+ company?: ComponentProps<typeof Logo>['company']
17
+ text?: ComponentProps<typeof Text>['text']
18
+ hours?: any
19
+ socials?: ComponentProps<typeof Social>['href'][] | undefined
20
+ buttons?: ComponentProps<typeof Button>[] | undefined
21
+ panel?: boolean | undefined
22
+ channels?: ComponentProps<typeof Channels>['channels'] | undefined
25
23
  columns?: {
26
- heading: string
27
- links: ComponentProps<typeof Link<'a'>>[]
24
+ heading: ComponentProps<typeof Heading>['text']
25
+ buttons: ComponentProps<typeof Button>[] | undefined
28
26
  }[]
29
27
  }
30
28
 
31
29
  const {
32
- as = 'footer',
33
- space = 'auto',
34
- variant = 'subtle',
35
- frame = 'fill',
36
- structure = 'grid',
37
30
  size = 'sm',
31
+ screen = 1280,
32
+ hours,
33
+ panel,
38
34
  logo,
39
- heading,
35
+ company,
36
+ socials,
37
+ buttons,
40
38
  columns,
41
39
  text,
42
40
  title,
43
- description,
44
- html,
41
+ channels,
45
42
  ...rest
46
43
  } = Astro.props
47
44
  ---
48
45
 
49
- <Root
46
+ <Element
50
47
  class:list="footer"
51
- {structure}
52
- {as}
53
- {variant}
54
- {frame}
55
- {space}
48
+ style={{ '--screen': `${screen}px` }}
49
+ structure="stack"
50
+ {panel}
56
51
  {size}
57
52
  {...rest}
58
53
  >
59
- <Column>
60
- <Column
61
- style={{ textDecoration: 'none' }}
62
- as="a"
63
- href="/"
64
- >
65
- <Logo src={logo} />
66
- <Heading
67
- level={4}
68
- color="base"
69
- html={heading || title}
70
- />
71
- </Column>
54
+ <Element class:list="column">
55
+ <Logo
56
+ {company}
57
+ {...typeof logo === 'string' ? { src: logo } : logo}
58
+ />
72
59
  <Text
73
60
  color="base"
74
- html={html || text || description}
61
+ {text}
75
62
  />
76
- </Column>
77
-
78
- {
79
- columns?.map(({ heading, links }) => (
80
- <Column>
81
- <Heading
82
- html={heading}
83
- level={4}
84
- />
85
- {links.map((link) => (
86
- <Link {...link} />
87
- ))}
88
- </Column>
89
- ))
90
- }
91
- </Root>
63
+ <Socials {socials} />
64
+ </Element>
65
+ <Channels {channels} />
66
+ <Element class:list="hours column">
67
+ <Heading
68
+ text={hours?.heading}
69
+ level={5}
70
+ />
71
+ <Element>
72
+ {
73
+ Object.entries(hours?.days ?? {})?.map(([key, value]: any) => (
74
+ <Element class:list="spread">
75
+ <Text text={key} />
76
+ <Text text={value} />
77
+ </Element>
78
+ ))
79
+ }
80
+ </Element>
81
+ </Element>
82
+
83
+ <Element class:list="buttons column">
84
+ {
85
+ columns?.map(({ heading, buttons }: any) => (
86
+ <Element class:list="column">
87
+ <Heading
88
+ level={5}
89
+ text={heading}
90
+ />
91
+ {buttons?.map((button: any) => (
92
+ <Button
93
+ variant="link"
94
+ {...button}
95
+ />
96
+ ))}
97
+ </Element>
98
+ ))
99
+ }
100
+ </Element>
101
+ </Element>
92
102
 
93
103
  <style is:global lang="scss">
94
104
  @layer fulldev {
95
105
  .footer {
96
- --inset-top: var(--space-7);
97
- --inset-left: var(--gutter-left);
98
- --inset-right: var(--gutter-right);
99
- --inset-bottom: var(--space-7);
100
-
106
+ display: grid;
107
+ position: relative;
108
+ grid-template-columns: 1fr;
109
+ align-items: flex-start;
110
+ gap: var(--space-6);
101
111
  margin-top: auto;
112
+ margin-top: auto;
113
+ border-top-width: 1px;
114
+ border-color: var(--base-a6);
115
+ background-color: var(--base-2);
116
+ padding: var(--space-7) var(--gutter);
102
117
  width: 100%;
103
118
 
104
- &.frame-none {
105
- border-top: 1px solid var(--base-a6);
106
- padding: var(--space-7) var(--gutter);
119
+ @media (min-width: 1024px) {
120
+ grid-auto-columns: 1fr;
121
+ grid-auto-flow: column;
122
+ }
123
+
124
+ .spread {
125
+ display: flex;
126
+ justify-content: space-between;
127
+ }
128
+
129
+ .column {
130
+ display: flex;
131
+ flex-direction: column;
132
+ }
133
+
134
+ > .column {
135
+ gap: var(--space-4);
107
136
  }
108
137
 
109
- &.frame-fill {
110
- border-top: 1px solid var(--base-a6);
111
- background-color: var(--color-2);
112
- padding: var(--space-7) var(--gutter);
138
+ .socials {
139
+ display: flex;
113
140
  }
114
141
 
115
- &.frame-panel {
116
- margin: var(--space-7) var(--gutter);
117
- border: 1px solid var(--base-a6);
142
+ .column {
143
+ h5 + * {
144
+ margin-top: var(--space-4);
145
+ }
146
+
147
+ .button.variant-link + .button.variant-link {
148
+ margin-top: var(--space-4);
149
+ }
150
+ }
151
+
152
+ &.panel {
153
+ margin: var(--spacer) var(--gutter);
154
+ border-width: 1px;
118
155
  border-radius: var(--radius-2);
119
- background-color: var(--color-2);
120
- padding: var(--space-6) min(var(--gutter), var(--space-7));
121
- max-width: calc(100vw - 2 * var(--gutter));
122
156
  overflow: hidden;
157
+ }
123
158
 
124
- @media (min-width: 1024px) {
125
- padding-top: var(--space-7);
126
- padding-bottom: var(--space-7);
127
- }
159
+ .channels {
160
+ gap: var(--space-3);
128
161
  }
129
162
 
130
- &.align-start {
163
+ .buttons {
164
+ display: grid;
165
+ position: relative;
166
+ grid-template-columns: 1fr;
131
167
  align-items: flex-start;
132
- text-align: left;
168
+ gap: var(--space-3);
169
+ gap: var(--space-6);
170
+ width: 100%;
171
+
172
+ @media (min-width: 1024px) {
173
+ grid-auto-columns: 1fr;
174
+ grid-auto-flow: column;
175
+ }
133
176
  }
134
177
 
135
- &.align-center {
136
- align-items: center;
178
+ .text {
179
+ max-width: calc(5 * var(--space-7));
137
180
  }
138
181
 
139
- &.align-end {
140
- align-items: flex-end;
182
+ .hours {
183
+ .column {
184
+ gap: 0;
185
+
186
+ .text {
187
+ font-size: var(--text-2);
188
+ }
189
+ }
141
190
  }
142
191
  }
143
192
  }
@@ -0,0 +1,49 @@
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 Input from 'fulldev-ui/components/Input.astro'
6
+ import Select from 'fulldev-ui/components/Select.astro'
7
+ import Textarea from 'fulldev-ui/components/Textarea.astro'
8
+ import type { GlobalProps } from 'fulldev-ui/types/global-props'
9
+
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
+ submit?: ComponentProps<typeof Button>['text']
17
+ }
18
+
19
+ const { fields, submit, ...rest } = Astro.props
20
+ ---
21
+
22
+ <Element
23
+ class:list="form"
24
+ as="form"
25
+ {...rest}
26
+ >
27
+ {
28
+ fields.map((field) => {
29
+ if ('options' in field) return <Select {...field} />
30
+ if ('type' in field && field.type === 'textarea')
31
+ return <Textarea {...field} />
32
+ return <Input {...(field as any)} />
33
+ })
34
+ }
35
+ <Button
36
+ type="submit"
37
+ text={submit}
38
+ />
39
+ </Element>
40
+
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);
48
+ }
49
+ </style>