fulldev-ui 0.5.0-beta.9 → 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 -105
  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 -110
  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
@@ -1,160 +1,90 @@
1
1
  ---
2
- import type { ComponentProps, HTMLAttributes } from 'astro/types'
3
- import type { CollectionEntry } from 'astro:content'
4
- import { getEntry } from 'astro:content'
5
- import Avatar from 'fulldev-ui/components/Avatar.astro'
2
+ import type { HTMLAttributes, HTMLTag } from 'astro/types'
6
3
  import Element from 'fulldev-ui/components/Element.astro'
7
4
  import Icon from 'fulldev-ui/components/Icon.astro'
8
- import type { GlobalProps } from 'fulldev-ui/types/global-props'
5
+ import type { ButtonSchema } from 'fulldev-ui/schemas/components/button'
9
6
 
10
7
  interface Props
11
- extends GlobalProps,
12
- HTMLAttributes<'button'>,
13
- HTMLAttributes<'a'>,
14
- HTMLAttributes<'label'> {
8
+ extends HTMLAttributes<'button'>,
9
+ Omit<HTMLAttributes<'a'>, 'href' | 'target'>,
10
+ ButtonSchema {
11
+ as?: HTMLTag
15
12
  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
13
+ for?: HTMLAttributes<'label'>['for']
22
14
  }
23
15
 
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
16
+ const {
17
+ href,
18
+ as = href ? 'a' : 'button',
19
+ variant = 'primary',
20
+ size = 'md',
21
+ text,
22
+ icon,
23
+ ...rest
24
+ } = Astro.props
34
25
  ---
35
26
 
36
27
  <Element
37
- class:list="button"
38
- _target={href?.startsWith('http') ? '_blank' : undefined}
39
- type={as === 'button' ? 'button' : undefined}
28
+ class:list={['button']}
40
29
  {as}
41
30
  {href}
42
- {color}
43
31
  {variant}
32
+ {size}
44
33
  {...rest}
45
34
  >
46
- <slot>
47
- <Avatar src={avatar} />
48
- <Icon name={icon} />
49
- <Fragment set:html={text ?? entry?.data.title} />
50
- </slot>
35
+ <Element as="span">
36
+ <Fragment set:html={text} />
37
+ <slot />
38
+ </Element>
39
+ <Icon name={icon} />
51
40
  </Element>
52
41
 
53
- <style is:global lang="scss">
42
+ <style is:global>
54
43
  @layer fulldev {
55
44
  .button {
56
- display: inline-flex;
57
- flex-shrink: 0;
58
- justify-content: center;
59
- align-items: center;
60
- vertical-align: top;
61
- gap: var(--space-2);
62
- appearance: none;
63
- transition: all 0.15s ease;
64
- cursor: pointer;
65
- outline: none;
66
- box-shadow: none;
67
- border-width: 0px;
68
- border-radius: var(--radius-1);
69
- padding: 0 var(--space-4);
70
- height: calc(var(--text-2) + 2 * var(--space-4));
71
- color: var(--text);
72
- font-weight: 500;
73
- font-size: var(--text-2);
74
- line-height: 1;
75
- text-align: center;
76
- text-decoration: none;
77
- white-space: nowrap;
78
-
79
- .avatar {
80
- margin-right: calc(-1 * (var(--space-4)));
81
- margin-left: var(--space-1);
82
- padding: calc(var(--space-1) / 3);
83
- width: calc(var(--text-2) + 2 * var(--space-4)) !important;
84
- height: calc(var(--text-2) + 2 * var(--space-4)) !important;
85
- }
45
+ @apply inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium leading-none ring-offset-background transition-colors;
46
+ @apply focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2;
47
+ @apply disabled:pointer-events-none disabled:opacity-50;
86
48
 
87
- &:focus-visible {
88
- outline: 2px solid var(--focus) !important;
89
- outline-offset: 2px;
49
+ &.size-sm {
50
+ @apply h-9 min-h-9 min-w-9 px-2;
90
51
  }
91
52
 
92
- &.reverse > * {
93
- order: 999;
53
+ &.size-md {
54
+ @apply h-10 min-h-10 min-w-10 px-4;
94
55
  }
95
56
 
96
- &:disabled {
97
- opacity: 0.5;
98
- cursor: not-allowed;
99
- pointer-events: none;
57
+ &.size-lg {
58
+ @apply h-11 min-h-11 min-w-11 px-5;
100
59
  }
101
60
 
102
61
  &.variant-primary {
103
- background-color: var(--color-9);
104
- color: var(--color-contrast);
105
-
106
- .icon {
107
- color: inherit;
108
- }
109
-
110
- &:hover,
111
- &:active {
112
- background-color: var(--color-10);
113
- }
62
+ @apply bg-primary text-primary-foreground hover:bg-primary-hover;
114
63
  }
115
64
 
116
65
  &.variant-secondary {
117
- border-style: solid;
118
- border-color: var(--color-7);
119
- background-color: var(--color-3);
120
- color: var(--color-11);
121
-
122
- &:hover {
123
- border-color: var(--color-8);
124
- background-color: var(--color-4);
125
- }
126
-
127
- &:active {
128
- border-color: var(--color-8);
129
- background-color: var(--color-5);
130
- }
66
+ @apply bg-secondary text-secondary-foreground hover:bg-secondary-hover;
131
67
  }
132
68
 
133
- &.variant-tertiary {
134
- color: var(--color-11);
135
-
136
- &:hover {
137
- background-color: var(--color-3);
138
- }
69
+ &.variant-outline {
70
+ @apply border border-input text-accent-foreground hover:bg-accent;
71
+ }
139
72
 
140
- &:active {
141
- background-color: var(--color-4);
142
- }
73
+ &.variant-ghost {
74
+ @apply text-accent-foreground hover:bg-accent;
143
75
  }
144
76
 
145
- &.variant-link {
146
- justify-content: flex-start;
147
- padding: 0;
148
- height: auto;
149
- color: var(--color-11);
150
- font-weight: 400;
77
+ .icon {
78
+ @apply first:last:absolute;
79
+ }
151
80
 
152
- &:hover {
153
- color: var(--color-12);
154
- }
81
+ span {
82
+ @apply text-inherit;
83
+ }
155
84
 
156
- &:active {
157
- color: var(--color-12);
85
+ &.reverse {
86
+ .icon {
87
+ @apply order-last;
158
88
  }
159
89
  }
160
90
  }
@@ -6,44 +6,54 @@ import type { GlobalProps } from 'fulldev-ui/types/global-props'
6
6
 
7
7
  interface Props extends GlobalProps, HTMLAttributes<'div'> {
8
8
  variant?: ComponentProps<typeof Button>['variant']
9
+ button?: ComponentProps<typeof Button> | undefined
9
10
  buttons?: ComponentProps<typeof Button>[] | undefined
11
+ direction?: 'row' | 'column' | undefined
10
12
  }
11
13
 
12
- const { variant = 'secondary', buttons, ...rest } = Astro.props
14
+ const {
15
+ direction = 'row',
16
+ variant = 'primary',
17
+ buttons = [],
18
+ button,
19
+ size,
20
+ ...rest
21
+ } = Astro.props
13
22
 
14
23
  const buttonVariant = (i: number) => {
15
24
  if (variant === 'primary' && i === 0) return 'primary'
16
25
  else if (variant === 'primary' && i === 1) return 'secondary'
17
- else if (variant === 'primary' && i > 1) return 'tertiary'
26
+ else if (variant === 'primary' && i > 1) return 'ghost'
18
27
  else if (variant === 'secondary' && i === 0) return 'secondary'
19
- else if (variant === 'secondary' && i > 0) return 'tertiary'
20
- else if (variant === 'tertiary') return 'tertiary'
21
- else return 'tertiary'
28
+ else return 'ghost'
22
29
  }
23
30
  ---
24
31
 
25
32
  <Element
26
33
  class:list="buttons"
34
+ {direction}
27
35
  {...rest}
28
36
  >
29
37
  {
30
- buttons?.map((button, i) => (
38
+ [button, ...buttons].filter(Boolean).map((button, i) => (
31
39
  <Button
32
- variant={variant === 'link' ? 'link' : buttonVariant(i)}
40
+ variant={buttonVariant(i)}
41
+ {size}
33
42
  {...button}
34
43
  />
35
44
  ))
36
45
  }
46
+ <slot />
37
47
  </Element>
38
48
 
39
- <style is:global lang="scss">
49
+ <style is:global>
40
50
  @layer fulldev {
41
51
  .buttons {
42
- display: inline-flex;
43
- flex-wrap: wrap;
44
- justify-content: stretch;
45
- gap: var(--space-2);
46
- width: auto;
52
+ @apply inline-flex flex-wrap justify-stretch gap-2;
53
+
54
+ &.direction-column {
55
+ @apply flex-col items-start;
56
+ }
47
57
  }
48
58
  }
49
59
  </style>
@@ -1,158 +1,30 @@
1
1
  ---
2
- import type { ComponentProps, HTMLAttributes } from 'astro/types'
3
- import type { CollectionEntry } from 'astro:content'
4
- import { getEntry } from 'astro:content'
5
- import Button from 'fulldev-ui/components/Button.astro'
6
- import Buttons from 'fulldev-ui/components/Buttons.astro'
2
+ import type { HTMLAttributes, HTMLTag } from 'astro/types'
7
3
  import Element from 'fulldev-ui/components/Element.astro'
8
- import Image from 'fulldev-ui/components/Image.astro'
9
- import Writeup from 'fulldev-ui/components/Writeup.astro'
10
- import type { GlobalProps } from 'fulldev-ui/types/global-props'
11
- import Icon from './Icon.astro'
12
- import Price from './Price.astro'
13
4
 
14
- interface Props
15
- extends GlobalProps,
16
- ComponentProps<typeof Writeup>,
17
- Omit<HTMLAttributes<'a'>, 'title'> {
18
- image?: ComponentProps<typeof Image>
19
- images?: ComponentProps<typeof Image>[]
20
- position?: ComponentProps<typeof Image>['position']
21
- buttons?: ComponentProps<typeof Buttons>['buttons']
22
- button?: ComponentProps<typeof Button> | undefined
23
- variant?: ComponentProps<typeof Button>['variant']
24
- align?: ComponentProps<typeof Writeup>['align']
25
- icon?: ComponentProps<typeof Icon>['name']
26
- price?: ComponentProps<typeof Price>['value']
27
- slug?: CollectionEntry<'pages'>['slug'] | undefined
28
- id?: any
29
- panel?: boolean | undefined
30
- title?: ComponentProps<typeof Writeup>['heading']
5
+ interface Props extends HTMLAttributes<'a'>, HTMLAttributes<'div'> {
6
+ as?: HTMLTag
31
7
  }
32
8
 
33
- const { slug } = Astro.props
34
- const page = slug ? (await getEntry('pages', slug)).data : {}
35
-
36
- const entryProps = {
37
- heading: page.title,
38
- text: page.description,
39
- href: slug ? `/${slug}/` : undefined,
40
- ...page,
41
- }
42
-
43
- const {
44
- align = 'start',
45
- level = 4,
46
- href,
47
- badge,
48
- tagline,
49
- rating,
50
- heading,
51
- text,
52
- variant,
53
- price,
54
- list,
55
- button,
56
- buttons,
57
- panel,
58
- image,
59
- icon,
60
- title,
61
- images,
62
- position,
63
- ...rest
64
- } = {
65
- ...entryProps,
66
- ...Astro.props,
67
- }
9
+ const { href, as = href ? 'a' : 'div', ...rest } = Astro.props
68
10
  ---
69
11
 
70
12
  <Element
71
13
  class:list="card"
72
- as={href ? 'a' : 'div'}
14
+ {as}
73
15
  {href}
74
- {align}
75
- {panel}
76
16
  {...rest}
77
17
  >
78
- <slot name="image">
79
- <Image
80
- position={panel ? position : undefined}
81
- {...image || images?.[0]}
82
- />
83
- </slot>
84
- <slot name="icon">
85
- <Icon name={icon} />
86
- </slot>
87
- <slot name="writeup">
88
- <Writeup
89
- heading={heading || title}
90
- {level}
91
- {rating}
92
- {badge}
93
- {tagline}
94
- {text}
95
- {list}
96
- />
97
- <Price value={price} />
98
- </slot>
99
- <slot name="buttons">
100
- <Button
101
- {variant}
102
- {...button}
103
- />
104
- <Buttons
105
- {variant}
106
- {buttons}
107
- />
108
- </slot>
109
18
  <slot />
110
19
  </Element>
111
20
 
112
- <style is:global lang="scss">
21
+ <style is:global>
113
22
  @layer fulldev {
114
23
  .card {
115
- --inset-top: 0px;
116
- --inset-left: 0px;
117
- --inset-right: 0px;
118
- --inset-bottom: 0px;
119
-
120
- display: flex;
121
- position: relative;
122
- flex-direction: column;
123
- align-items: flex-start;
124
- gap: var(--space-4);
125
- text-decoration: none;
126
-
127
- &[href] {
128
- cursor: pointer;
129
-
130
- > .image {
131
- transition: all 0.2s ease;
132
- }
133
-
134
- &:hover {
135
- > .image {
136
- opacity: 0.8;
137
- }
138
- }
139
- }
140
-
141
- &.panel {
142
- --inset-top: var(--space-4);
143
- --inset-left: var(--space-4);
144
- --inset-right: var(--space-4);
145
- --inset-bottom: 0px;
146
-
147
- border: 1px solid var(--color-a6);
148
- border-radius: var(--radius-2);
149
- background-color: var(--color-2);
150
- padding: var(--space-4);
151
- overflow: hidden;
24
+ @apply w-full rounded-lg border bg-card p-4 text-card-foreground;
152
25
 
153
- &[href]:hover {
154
- border: 1px solid var(--color-a7);
155
- }
26
+ &:is(a[href]) {
27
+ @apply focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2;
156
28
  }
157
29
  }
158
30
  }
@@ -12,19 +12,30 @@ interface Props extends GlobalProps, HTMLAttributes<'div'> {
12
12
  structure?: 'grid' | 'masonry' | 'stack' | 'carousel' | 'bento' | undefined
13
13
  }
14
14
 
15
- const { level, panel, position, cards, ...rest } = Astro.props
15
+ const {
16
+ structure = 'grid',
17
+ level,
18
+ panel,
19
+ position,
20
+ cards,
21
+ size,
22
+ ...rest
23
+ } = Astro.props
16
24
  ---
17
25
 
18
26
  <Element
19
27
  class:list="cards"
20
28
  {panel}
29
+ {size}
30
+ {structure}
21
31
  {...rest}
22
32
  >
23
33
  {
24
34
  cards?.map((card: any) => (
25
35
  <Card
26
- {level}
36
+ level={level + 3}
27
37
  {panel}
38
+ {size}
28
39
  {position}
29
40
  {...card}
30
41
  />
@@ -32,51 +43,26 @@ const { level, panel, position, cards, ...rest } = Astro.props
32
43
  }
33
44
  </Element>
34
45
 
35
- <style is:global lang="scss">
46
+ <style is:global>
36
47
  @layer fulldev {
37
48
  .cards {
38
- --column-width: calc(21 * var(--space-4));
39
- --gap: var(--space-5);
40
-
41
- position: relative;
42
- width: 100%;
43
-
44
- &.panel {
45
- --gap: var(--space-4);
46
- }
47
-
48
- &.position-inset {
49
- margin-right: calc(var(--inset-right) * -1);
50
- margin-left: calc(var(--inset-left) * -1);
51
- padding-right: var(--inset-right);
52
- padding-left: var(--inset-left);
53
- width: calc(100% + var(--inset-left) + var(--inset-right));
54
- }
49
+ --column-width: 20rem;
50
+ @apply relative w-full;
55
51
 
56
52
  &.structure-grid {
57
- display: grid;
58
- grid-template-columns: repeat(
59
- auto-fill,
60
- minmax(var(--column-width), 1fr)
61
- );
62
- gap: var(--gap);
63
- width: 100%;
53
+ @apply grid w-full grid-cols-[repeat(auto-fill,minmax(var(--column-width),1fr))] gap-5;
64
54
  }
65
55
 
66
56
  &.structure-masonry {
67
- column-gap: var(--gap);
57
+ @apply w-full columns-6 break-inside-avoid gap-5 space-y-5;
68
58
  column-fill: balance;
69
59
  column-width: var(--column-width);
70
- column-count: 6;
71
- break-inside: avoid;
72
- width: 100%;
73
60
 
74
- & > .root + .root,
75
- & > * + * {
61
+ /* & > * + * {
76
62
  break-inside: avoid;
77
63
  margin-top: var(--gap);
78
64
  margin-bottom: var(--gap);
79
- }
65
+ } */
80
66
  }
81
67
 
82
68
  &.structure-carousel {
@@ -88,7 +74,7 @@ const { level, panel, position, cards, ...rest } = Astro.props
88
74
  scroll-behavior: smooth;
89
75
  scroll-snap-type: x mandatory;
90
76
 
91
- > .root {
77
+ > * {
92
78
  flex-grow: 0;
93
79
  flex-shrink: 0;
94
80
  width: var(--column-width);
@@ -130,6 +116,18 @@ const { level, panel, position, cards, ...rest } = Astro.props
130
116
  }
131
117
  }
132
118
  }
119
+
120
+ &.size-sm {
121
+ --column-width: 16rem;
122
+ }
123
+
124
+ &.size-md {
125
+ --column-width: 20rem;
126
+ }
127
+
128
+ &.size-lg {
129
+ --column-width: 26rem;
130
+ }
133
131
  }
134
132
  }
135
133
  </style>
@@ -0,0 +1,106 @@
1
+ ---
2
+ import Button from 'fulldev-ui/components/Button.astro'
3
+ import Element from 'fulldev-ui/components/Element.astro'
4
+
5
+ interface Props {}
6
+ ---
7
+
8
+ <script>
9
+ function scrollLeft(content: HTMLElement) {
10
+ content.scrollLeft -= content.clientWidth
11
+ }
12
+
13
+ function scrollRight(content: HTMLElement) {
14
+ content.scrollLeft += content.clientWidth
15
+ }
16
+
17
+ const updateButtons = (
18
+ left: HTMLElement,
19
+ right: HTMLElement,
20
+ content: HTMLElement
21
+ ) => {
22
+ const isScrollable = content.scrollWidth > content.clientWidth
23
+ const atStart = content.scrollLeft <= 0
24
+ const atEnd =
25
+ content.scrollLeft >= content.scrollWidth - content.clientWidth
26
+
27
+ left?.classList.toggle('hide', !isScrollable || atStart)
28
+ right?.classList.toggle('hide', !isScrollable || atEnd)
29
+ }
30
+
31
+ document.addEventListener('astro:page-load', () => {
32
+ const carousels = document.querySelectorAll('.carousel')
33
+ carousels.forEach((carousel) => {
34
+ const left = carousel?.querySelector('.carousel-left')
35
+ const right = carousel?.querySelector('.carousel-right')
36
+ const content = carousel?.querySelector('.carousel-content')
37
+
38
+ if (!(content instanceof HTMLElement)) return
39
+ if (!(left instanceof HTMLElement)) return
40
+ if (!(right instanceof HTMLElement)) return
41
+
42
+ left?.addEventListener('click', () => scrollLeft(content))
43
+ right?.addEventListener('click', () => scrollRight(content))
44
+
45
+ const observer = new ResizeObserver(() => {
46
+ updateButtons(left, right, content)
47
+ })
48
+
49
+ observer.observe(content)
50
+
51
+ content.addEventListener('scroll', () => {
52
+ updateButtons(left, right, content)
53
+ })
54
+ })
55
+ })
56
+ </script>
57
+
58
+ <Element class:list="carousel">
59
+ <Button
60
+ class="carousel-left hide"
61
+ icon="chevron-left"
62
+ variant="secondary"
63
+ size="sm"
64
+ />
65
+ <Element class:list="carousel-content">
66
+ <slot />
67
+ </Element>
68
+ <Button
69
+ class="carousel-right hide"
70
+ icon="chevron-right"
71
+ variant="secondary"
72
+ size="sm"
73
+ />
74
+ </Element>
75
+
76
+ <style is:global>
77
+ @layer fulldev {
78
+ .carousel {
79
+ @apply container relative flex w-full items-center overflow-hidden px-0;
80
+
81
+ .button {
82
+ @apply absolute z-10 bg-secondary-hover opacity-50 hover:opacity-100;
83
+
84
+ &.hide {
85
+ @apply !hidden;
86
+ }
87
+ }
88
+
89
+ .carousel-left {
90
+ @apply left-2;
91
+ }
92
+
93
+ .carousel-right {
94
+ @apply right-2;
95
+ }
96
+
97
+ .carousel-content {
98
+ @apply inline-flex w-full snap-x snap-mandatory gap-2 overflow-x-auto scroll-smooth px-gutter scrollbar-none;
99
+
100
+ > * {
101
+ @apply snap-center;
102
+ }
103
+ }
104
+ }
105
+ }
106
+ </style>