fulldev-ui 0.4.29 → 0.5.0-beta.1

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