fulldev-ui 0.5.0-beta.9 → 0.6.0-beta-5

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 (342) 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 +235 -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/Content1.astro +77 -0
  15. package/src/blocks/Content2.astro +91 -0
  16. package/src/blocks/Content3.astro +70 -0
  17. package/src/blocks/Content4.astro +72 -0
  18. package/src/blocks/Cta1.astro +58 -0
  19. package/src/blocks/Feature1.astro +61 -0
  20. package/src/blocks/Features1.astro +66 -0
  21. package/src/blocks/Footer.astro +100 -3
  22. package/src/blocks/Header.astro +192 -3
  23. package/src/blocks/Hero1.astro +60 -0
  24. package/src/blocks/Logos1.astro +55 -0
  25. package/src/blocks/Products1.astro +90 -0
  26. package/src/blocks/Reviews1.astro +75 -0
  27. package/src/blocks/_Hero.astro +245 -0
  28. package/src/components/Avatar.astro +28 -9
  29. package/src/components/Avatars.astro +36 -0
  30. package/src/components/Badge.astro +63 -24
  31. package/src/components/Badges.astro +16 -23
  32. package/src/components/Block.astro +30 -0
  33. package/src/components/Blocks.astro +26 -0
  34. package/src/components/Breadcrumb.astro +58 -0
  35. package/src/components/Button.astro +49 -119
  36. package/src/components/Buttons.astro +23 -13
  37. package/src/components/Card.astro +9 -137
  38. package/src/components/Cards.astro +33 -35
  39. package/src/components/Carousel.astro +106 -0
  40. package/src/components/Cart.astro +18 -14
  41. package/src/components/CartAdd.svelte +76 -0
  42. package/src/components/CartCheckout.svelte +58 -0
  43. package/src/components/CartForm.svelte +130 -0
  44. package/src/components/CartList.svelte +88 -0
  45. package/src/components/CartQuantity.svelte +81 -0
  46. package/src/components/CartSummary.astro +16 -105
  47. package/src/components/CartTotal.svelte +15 -0
  48. package/src/components/Channel.astro +44 -35
  49. package/src/components/Channels.astro +20 -6
  50. package/src/components/Checkbox.astro +52 -27
  51. package/src/components/Code.astro +52 -0
  52. package/src/components/Container.astro +25 -0
  53. package/src/components/Dialog.astro +3 -2
  54. package/src/components/Drawer.astro +55 -146
  55. package/src/components/DrawerOld.astro +143 -0
  56. package/src/components/Element.astro +18 -8
  57. package/src/components/Form.astro +16 -13
  58. package/src/components/Gallery.astro +174 -0
  59. package/src/components/Group.astro +25 -0
  60. package/src/components/Head.astro +62 -25
  61. package/src/components/Header.astro +10 -115
  62. package/src/components/Heading.astro +51 -44
  63. package/src/components/Icon.astro +29 -33
  64. package/src/components/Image.astro +18 -68
  65. package/src/components/Input.astro +65 -51
  66. package/src/components/Label.astro +20 -15
  67. package/src/components/Layout.astro +35 -0
  68. package/src/components/Link.astro +51 -32
  69. package/src/components/Links.astro +42 -0
  70. package/src/components/List.astro +41 -16
  71. package/src/components/LocaleSwitcher.astro +2 -2
  72. package/src/components/Logo.astro +56 -0
  73. package/src/components/Menu.astro +21 -17
  74. package/src/components/Navigation.astro +39 -0
  75. package/src/components/Panel.astro +25 -0
  76. package/src/components/Paragraph.astro +55 -0
  77. package/src/components/Price.astro +4 -4
  78. package/src/components/Prose.astro +86 -0
  79. package/src/components/Rating.astro +23 -62
  80. package/src/components/Search.astro +107 -43
  81. package/src/components/Section.astro +13 -242
  82. package/src/components/Select.astro +45 -55
  83. package/src/components/Sidebar.astro +53 -76
  84. package/src/components/Social.astro +11 -9
  85. package/src/components/Socials.astro +9 -5
  86. package/src/components/Stack.astro +25 -0
  87. package/src/components/Subheader.astro +59 -0
  88. package/src/components/Switch.astro +72 -29
  89. package/src/components/Table.astro +1 -1
  90. package/src/components/Tagline.astro +31 -13
  91. package/src/components/Textarea.astro +40 -50
  92. package/src/components/Themer.astro +76 -0
  93. package/src/components/Toc.astro +30 -37
  94. package/src/components/Writeup.astro +34 -65
  95. package/src/components/_Author.astro +90 -0
  96. package/src/components/_Header.astro +129 -0
  97. package/src/components/_Image.astro +79 -0
  98. package/src/components/_Prose copy.astro +172 -0
  99. package/src/components/_Sidebar copy.astro +87 -0
  100. package/src/components/docs/PropsTable.astro +38 -264
  101. package/src/components/experimental/Window.astro +5 -57
  102. package/src/content/config.ts +3 -10
  103. package/src/content/{presets → layouts}/base.yml +52 -73
  104. package/src/content/pages/blocks/_categories.mdx +0 -2
  105. package/src/content/pages/blocks/_footer.mdx +0 -2
  106. package/src/content/pages/blocks/_header.mdx +0 -4
  107. package/src/content/pages/blocks/_jobs.mdx +0 -2
  108. package/src/content/pages/blocks/_prices.mdx +0 -2
  109. package/src/content/pages/blocks/_product.mdx +0 -2
  110. package/src/content/pages/blocks/_products.mdx +0 -2
  111. package/src/content/pages/blocks/_stats.mdx +0 -2
  112. package/src/content/pages/blocks/banner.mdx +0 -2
  113. package/src/content/pages/blocks/colleagues.mdx +0 -3
  114. package/src/content/pages/blocks/contact.mdx +0 -2
  115. package/src/content/pages/blocks/content.mdx +0 -6
  116. package/src/content/pages/blocks/cta.mdx +0 -10
  117. package/src/content/pages/blocks/features.mdx +0 -5
  118. package/src/content/pages/blocks/hero.mdx +0 -5
  119. package/src/content/pages/blocks/intro.mdx +0 -5
  120. package/src/content/pages/blocks/posts.mdx +0 -2
  121. package/src/content/pages/blocks/reviews.mdx +0 -3
  122. package/src/content/pages/categories/category.md +7 -0
  123. package/src/content/pages/docs/_internationalization.mdx +55 -0
  124. package/src/content/pages/docs/_using-blocks.mdx +33 -0
  125. package/src/content/pages/docs/_using-presets.mdx +49 -0
  126. package/src/content/pages/docs/blocks.mdx +33 -0
  127. package/src/content/pages/docs/collections/images.mdx +102 -0
  128. package/src/content/pages/docs/collections/pages.mdx +119 -0
  129. package/src/content/pages/docs/collections/presets.mdx +60 -0
  130. package/src/content/pages/docs/collections.mdx +42 -0
  131. package/src/content/pages/{base/card.mdx → docs/components/_card.mdx} +2 -5
  132. package/src/content/pages/{base → docs/components}/_dialog.mdx +1 -2
  133. package/src/content/pages/{base → docs/components}/_drawer.mdx +1 -2
  134. package/src/content/pages/{base → docs/components}/_localeswitcher.mdx +1 -2
  135. package/src/content/pages/{base → docs/components}/_switch.mdx +3 -4
  136. package/src/content/pages/{typography → docs/components}/_tagline.mdx +3 -4
  137. package/src/content/pages/docs/components/_toggle.mdx +30 -0
  138. package/src/content/pages/docs/components/avatar.mdx +34 -0
  139. package/src/content/pages/{base → docs/components}/badge.mdx +28 -10
  140. package/src/content/pages/docs/components/badges.mdx +46 -0
  141. package/src/content/pages/docs/components/button.mdx +78 -0
  142. package/src/content/pages/docs/components/buttons.mdx +51 -0
  143. package/src/content/pages/docs/components/channel.mdx +91 -0
  144. package/src/content/pages/docs/components/channels.mdx +89 -0
  145. package/src/content/pages/docs/components/checkbox.mdx +34 -0
  146. package/src/content/pages/docs/components/code.mdx +45 -0
  147. package/src/content/pages/docs/components/heading.mdx +59 -0
  148. package/src/content/pages/docs/components/icon.mdx +48 -0
  149. package/src/content/pages/docs/components/image.mdx +25 -0
  150. package/src/content/pages/docs/components/input.mdx +40 -0
  151. package/src/content/pages/{typography → docs/components}/label.mdx +9 -6
  152. package/src/content/pages/{typography → docs/components}/link.mdx +24 -10
  153. package/src/content/pages/docs/components/links.mdx +99 -0
  154. package/src/content/pages/docs/components/list.mdx +44 -0
  155. package/src/content/pages/docs/components/logo.mdx +36 -0
  156. package/src/content/pages/docs/components/menu.mdx +89 -0
  157. package/src/content/pages/docs/components/prose.mdx +36 -0
  158. package/src/content/pages/docs/components/rating.mdx +76 -0
  159. package/src/content/pages/{base → docs/components}/section.mdx +2 -3
  160. package/src/content/pages/{base → docs/components}/select.mdx +1 -11
  161. package/src/content/pages/docs/components/social.mdx +94 -0
  162. package/src/content/pages/docs/components/socials.mdx +102 -0
  163. package/src/content/pages/docs/components/switch.mdx +34 -0
  164. package/src/content/pages/{base → docs/components}/table.mdx +1 -4
  165. package/src/content/pages/docs/components/tagline.mdx +46 -0
  166. package/src/content/pages/docs/components/text.mdx +48 -0
  167. package/src/content/pages/docs/components/textarea.mdx +34 -0
  168. package/src/content/pages/docs/components/themer.mdx +49 -0
  169. package/src/content/pages/docs/components.mdx +37 -0
  170. package/src/content/pages/docs/customization.mdx +151 -0
  171. package/src/content/pages/docs/frameworks.mdx +29 -0
  172. package/src/content/pages/docs/generating-pages.mdx +129 -0
  173. package/src/content/pages/docs/index.mdx +20 -0
  174. package/src/content/pages/docs/installation.mdx +50 -0
  175. package/src/content/pages/docs/layouts.mdx +33 -0
  176. package/src/content/pages/index.mdx +25 -33
  177. package/src/content/pages/posts/post.md +7 -0
  178. package/src/content/pages/products/product.md +20 -0
  179. package/src/content/pages/showcase/anti-slip-profiles.md +2 -2
  180. package/src/content/pages/showcase/fulldev-ui.md +1 -1
  181. package/src/content/pages/showcase/lavis-detailing.md +1 -1
  182. package/src/content/pages/showcase/leren-trainingsacteren.md +1 -1
  183. package/src/content/pages/showcase/miele-witgoedcenter-amsterdam.md +1 -1
  184. package/src/content/pages/showcase/sloepverhuur-bolsward.md +1 -1
  185. package/src/content/pages/showcase/stark-vulcanising-products.md +1 -1
  186. package/src/content/pages/showcase/the-gym-haren.md +1 -1
  187. package/src/content/pages/showcase/van-dillen-antieke-bouwmaterialen.md +1 -1
  188. package/src/content/pages/showcase.mdx +4 -3
  189. package/src/css/color.css +0 -10
  190. package/src/css/custom.css +10 -12
  191. package/src/css/size.css +2 -11
  192. package/src/css/theme.css +95 -0
  193. package/src/env.d.ts +1 -0
  194. package/src/images/favicon/android-chrome-192x192.png +0 -0
  195. package/src/images/favicon/android-chrome-512x512.png +0 -0
  196. package/src/images/favicon/apple-touch-icon.png +0 -0
  197. package/src/images/favicon/browserconfig.xml +9 -0
  198. package/src/images/favicon/favicon-16x16.png +0 -0
  199. package/src/images/favicon/favicon-32x32.png +0 -0
  200. package/src/images/favicon/favicon-48x48.png +0 -0
  201. package/src/images/favicon/favicon.ico +0 -0
  202. package/src/images/favicon/favicon.svg +16 -0
  203. package/src/images/favicon/manifest.webmanifest +30 -0
  204. package/src/images/favicon/mstile-150x150.png +0 -0
  205. package/src/images/favicon/safari-pinned-tab.svg +16 -0
  206. package/src/images/favicon/yandex-browser-50x50.png +0 -0
  207. package/src/images/favicon/yandex-browser-manifest.json +9 -0
  208. package/src/images/logo-1.svg +11 -0
  209. package/src/images/logo-2.svg +13 -0
  210. package/src/images/logo-basic.svg +10 -0
  211. package/src/images/logo-simple.svg +13 -0
  212. package/src/images/logo-thin.svg +15 -0
  213. package/src/images/logo.svg +14 -0
  214. package/src/images/logofat.svg +11 -0
  215. package/src/integration/index.ts +110 -140
  216. package/src/layouts/Category.astro +136 -0
  217. package/src/layouts/Doc.astro +56 -0
  218. package/src/layouts/Job.astro +60 -0
  219. package/src/layouts/Page.astro +29 -0
  220. package/src/layouts/Post.astro +52 -0
  221. package/src/layouts/Product.astro +114 -0
  222. package/src/pages/[...page].astro +29 -24
  223. package/src/pages/test.astro +37 -0
  224. package/src/schemas/components/avatar.ts +4 -1
  225. package/src/schemas/components/badge.ts +16 -11
  226. package/src/schemas/components/block.ts +60 -0
  227. package/src/schemas/components/button.ts +17 -14
  228. package/src/schemas/components/channel.ts +15 -9
  229. package/src/schemas/components/footer.ts +15 -21
  230. package/src/schemas/components/head.ts +17 -0
  231. package/src/schemas/components/header.ts +19 -7
  232. package/src/schemas/components/heading.ts +7 -1
  233. package/src/schemas/components/icon.ts +7 -1
  234. package/src/schemas/components/image.ts +38 -16
  235. package/src/schemas/components/link.ts +17 -0
  236. package/src/schemas/components/logo.ts +12 -2
  237. package/src/schemas/components/menu.ts +11 -11
  238. package/src/schemas/components/navigation.ts +10 -0
  239. package/src/schemas/components/paragraph.ts +9 -0
  240. package/src/schemas/components/price.ts +7 -1
  241. package/src/schemas/components/rating.ts +8 -13
  242. package/src/schemas/components/sidebar.ts +14 -11
  243. package/src/schemas/components/social.ts +16 -1
  244. package/src/schemas/components/tagline.ts +7 -1
  245. package/src/schemas/imageSchema.ts +33 -4
  246. package/src/schemas/page.ts +39 -0
  247. package/src/stores/cart.svelte.ts +79 -0
  248. package/src/stores/cart.ts +59 -6
  249. package/src/types/global-props.ts +0 -9
  250. package/src/types/{virtual-modules.d.ts → virtual.d.ts} +1 -1
  251. package/src/utils/cart.ts +1 -10
  252. package/src/utils/formatEntries.ts +8 -0
  253. package/src/utils/formatEntry.ts +29 -0
  254. package/src/utils/getDeepReferenceChildren.ts +14 -0
  255. package/src/utils/getHref.ts +6 -0
  256. package/src/utils/getReferenceChildren.ts +1 -1
  257. package/src/utils/setTheme.ts +18 -0
  258. package/src/utils/slugify.ts +6 -0
  259. package/svelte.config.js +5 -0
  260. package/tailwind.config.ts +71 -0
  261. package/tsconfig.json +1 -3
  262. package/src/blocks/Article.astro +0 -40
  263. package/src/blocks/Categories.astro +0 -12
  264. package/src/blocks/Colleagues.astro +0 -13
  265. package/src/blocks/Contact.astro +0 -116
  266. package/src/blocks/Content.astro +0 -12
  267. package/src/blocks/Cta.astro +0 -15
  268. package/src/blocks/Excerpt.astro +0 -14
  269. package/src/blocks/Features.astro +0 -11
  270. package/src/blocks/Hero.astro +0 -15
  271. package/src/blocks/Intro.astro +0 -23
  272. package/src/blocks/Jobs.astro +0 -12
  273. package/src/blocks/Posts.astro +0 -11
  274. package/src/blocks/Prices.astro +0 -24
  275. package/src/blocks/Product.astro +0 -110
  276. package/src/blocks/Products.astro +0 -11
  277. package/src/blocks/Reviews.astro +0 -13
  278. package/src/components/CartForm.astro +0 -121
  279. package/src/components/CartList.astro +0 -134
  280. package/src/components/Footer.astro +0 -193
  281. package/src/components/Text.astro +0 -43
  282. package/src/components/ThemeSelect.astro +0 -41
  283. package/src/components/experimental/Form.astro +0 -53
  284. package/src/components/experimental/Gallery.astro +0 -104
  285. package/src/components/experimental/Logo.astro +0 -38
  286. package/src/components/experimental/Prose.astro +0 -192
  287. package/src/components/sections.astro +0 -28
  288. package/src/content/pages/base/button.mdx +0 -60
  289. package/src/content/pages/base/checkbox.mdx +0 -42
  290. package/src/content/pages/base/icon.mdx +0 -55
  291. package/src/content/pages/base/image.mdx +0 -42
  292. package/src/content/pages/base/input.mdx +0 -56
  293. package/src/content/pages/base/rating.mdx +0 -55
  294. package/src/content/pages/base/textarea.mdx +0 -58
  295. package/src/content/pages/base/theme-select.mdx +0 -15
  296. package/src/content/pages/layouts/_layout.mdx +0 -14
  297. package/src/content/pages/layouts/docslayout.mdx +0 -14
  298. package/src/content/pages/overview/components.mdx +0 -75
  299. package/src/content/pages/overview/content-collections.mdx +0 -139
  300. package/src/content/pages/overview/frameworks.mdx +0 -198
  301. package/src/content/pages/overview/installation.mdx +0 -53
  302. package/src/content/pages/overview/introduction.mdx +0 -30
  303. package/src/content/pages/overview/theming.mdx +0 -69
  304. package/src/content/pages/schemas/page.mdx +0 -17
  305. package/src/content/pages/schemas/preset.mdx +0 -9
  306. package/src/content/pages/showcase/record.md +0 -3
  307. package/src/content/pages/typography/heading.mdx +0 -73
  308. package/src/content/pages/typography/list.mdx +0 -51
  309. package/src/content/pages/typography/text.mdx +0 -61
  310. package/src/content/presets/blocks.yml +0 -1
  311. package/src/content/presets/docs.yml +0 -6
  312. package/src/css/space.css +0 -77
  313. package/src/css/styles.css +0 -0
  314. package/src/images/avatar-1.yml +0 -1
  315. package/src/integration/generate-colors.ts +0 -639
  316. package/src/integration/tailwind-plugin.ts +0 -80
  317. package/src/integration/unocss-preset.ts +0 -84
  318. package/src/layouts/BlockLayout.astro +0 -19
  319. package/src/layouts/ContactLayout.astro +0 -21
  320. package/src/layouts/DocsLayout.astro +0 -73
  321. package/src/layouts/Layout.astro +0 -163
  322. package/src/layouts/OverviewLayout.astro +0 -42
  323. package/src/layouts/PostLayout.astro +0 -21
  324. package/src/layouts/ProductLayout.astro +0 -21
  325. package/src/loaders/imageLoader.ts +0 -26
  326. package/src/schemas/components/avatars.ts +0 -4
  327. package/src/schemas/components/buttons.ts +0 -4
  328. package/src/schemas/components/card.ts +0 -25
  329. package/src/schemas/components/cards.ts +0 -4
  330. package/src/schemas/components/channels.ts +0 -4
  331. package/src/schemas/components/images.ts +0 -4
  332. package/src/schemas/components/list.ts +0 -3
  333. package/src/schemas/components/section.ts +0 -15
  334. package/src/schemas/components/sections.ts +0 -3
  335. package/src/schemas/components/socials.ts +0 -4
  336. package/src/schemas/components/text.ts +0 -3
  337. package/src/schemas/components/toc.ts +0 -3
  338. package/src/schemas/components/writeup.ts +0 -20
  339. package/src/schemas/pageSchema.ts +0 -101
  340. package/src/schemas/presetSchema.ts +0 -3
  341. package/src/schemas/utils/navigation.ts +0 -8
  342. package/src/schemas/utils/parents.ts +0 -3
@@ -0,0 +1,76 @@
1
+ ---
2
+ import Button from './Button.astro'
3
+ import Icon from './Icon.astro'
4
+
5
+ interface Props {
6
+ if?: any
7
+ size?: any
8
+ variant?: 'primary' | 'secondary' | 'outline' | 'ghost' | undefined
9
+ }
10
+
11
+ const { variant = 'secondary', ...rest } = Astro.props
12
+ ---
13
+
14
+ <Button
15
+ class="themer"
16
+ {variant}
17
+ {...rest}
18
+ >
19
+ <Icon
20
+ class="themer-light-icon"
21
+ name="sun"
22
+ />
23
+ <Icon
24
+ class="themer-dark-icon"
25
+ name="moon"
26
+ />
27
+ <select class="themer-select">
28
+ <option value="light">Light</option>
29
+ <option value="dark">Dark</option>
30
+ <option
31
+ value="system"
32
+ selected
33
+ >
34
+ System
35
+ </option>
36
+ </select>
37
+ </Button>
38
+
39
+ <script>
40
+ import { navigate } from 'astro:transitions/client'
41
+
42
+ function init(document: Document) {
43
+ document.querySelectorAll('.themer select').forEach((select) => {
44
+ select.addEventListener('change', (event) => {
45
+ if (event.target instanceof HTMLSelectElement) {
46
+ localStorage.setItem('theme', event.target.value)
47
+ navigate(window.location.href)
48
+ }
49
+ })
50
+ })
51
+ }
52
+
53
+ init(document)
54
+
55
+ document.addEventListener('astro:before-swap', (event) => {
56
+ init(event.newDocument)
57
+ })
58
+ </script>
59
+
60
+ <style is:global>
61
+ .themer {
62
+ @apply relative px-0;
63
+
64
+ .themer-select {
65
+ @apply absolute inset-0 cursor-pointer appearance-none opacity-0;
66
+ }
67
+ }
68
+
69
+ html.dark .themer-light-icon {
70
+ display: none;
71
+ }
72
+
73
+ html:not(.dark) .themer-dark-icon {
74
+ display: none;
75
+ }
76
+ </style>
@@ -1,70 +1,63 @@
1
1
  ---
2
- import type { ComponentProps, HTMLAttributes } from 'astro/types'
3
- import type { CollectionEntry } from 'astro:content'
4
- import Button from 'fulldev-ui/components/Button.astro'
2
+ import type { MarkdownHeading } from 'astro'
3
+ import type { HTMLAttributes } from 'astro/types'
5
4
  import Element from 'fulldev-ui/components/Element.astro'
6
5
  import Heading from 'fulldev-ui/components/Heading.astro'
7
6
  import type { GlobalProps } from 'fulldev-ui/types/global-props'
7
+ import Link from './Link.astro'
8
8
 
9
9
  interface Props extends GlobalProps, HTMLAttributes<'div'> {
10
- heading?: ComponentProps<typeof Heading>['text']
11
- render?: CollectionEntry<'pages'>['render'] | undefined
10
+ headings?: MarkdownHeading[] | undefined
12
11
  }
13
12
 
14
- const { size = 'sm', heading, render, ...rest } = Astro.props
13
+ const { headings, ...rest } = Astro.props
15
14
 
16
- const headings = render ? (await render())?.headings : []
17
15
  const filteredHeadings = headings?.filter(
18
16
  (heading: any) => heading.depth >= 2 && heading.depth <= 4
19
17
  )
18
+
19
+ const h1 = headings?.find((heading: any) => heading.depth === 1)
20
+
21
+ const links = filteredHeadings?.map((button: any) => ({
22
+ text: button.text,
23
+ href: `#${button.slug}`,
24
+ class: `depth-${button.depth}`,
25
+ }))
20
26
  ---
21
27
 
22
28
  <Element
23
- if={filteredHeadings?.length > 1}
24
29
  class:list="toc"
25
- {size}
30
+ if={filteredHeadings?.length}
26
31
  {...rest}
27
32
  >
28
33
  <Heading
29
- level={6}
30
- text={heading}
34
+ as="a"
35
+ href="#"
36
+ {...h1}
31
37
  />
32
38
  {
33
- filteredHeadings?.map((button: any) => (
34
- <Button
35
- class:list={`depth-${button.depth}`}
36
- href={`#${button.slug}`}
37
- variant="link"
38
- text={button.text}
39
+ links?.map((link) => (
40
+ <Link
41
+ variant="muted"
42
+ size="sm"
43
+ {...link}
39
44
  />
40
45
  ))
41
46
  }
42
47
  </Element>
43
48
 
44
- <style lang="scss" is:global>
49
+ <style is:global>
45
50
  @layer fulldev {
46
51
  .toc {
47
- display: none;
52
+ @apply lg:top-sticky-16 sticky bottom-0 z-10 hidden w-48 shrink-0 flex-col items-start justify-start gap-3 overflow-y-auto md:flex;
53
+ @apply scrollbar scrollbar-track-transparent scrollbar-thumb-accent scrollbar-thumb-rounded-full scrollbar-w-2 hover:scrollbar-thumb-accent-hover;
48
54
 
49
- @media (min-width: 1024px) {
50
- display: flex;
51
- position: sticky;
52
- top: calc(var(--header-height, 0px) + var(--space-6));
53
- bottom: 0;
54
- flex-shrink: 0;
55
- flex-direction: column;
56
- justify-content: flex-start;
57
- gap: var(--space-4);
58
- z-index: 10;
59
- min-width: calc(var(--space-7) * 3);
60
-
61
- .depth-3 {
62
- padding-left: var(--space-4);
63
- }
55
+ .depth-3 {
56
+ @apply pl-3;
57
+ }
64
58
 
65
- .depth-4 {
66
- padding-left: var(--space-5);
67
- }
59
+ .depth-4 {
60
+ @apply relative pl-6;
68
61
  }
69
62
  }
70
63
  }
@@ -1,89 +1,58 @@
1
1
  ---
2
- import type { ComponentProps, HTMLAttributes } from 'astro/types'
3
- import Badge from 'fulldev-ui/components/Badge.astro'
2
+ import type { HTMLAttributes, HTMLTag } from 'astro/types'
4
3
  import Element from 'fulldev-ui/components/Element.astro'
5
- import Heading from 'fulldev-ui/components/Heading.astro'
6
- import List from 'fulldev-ui/components/List.astro'
7
- import Price from 'fulldev-ui/components/Price.astro'
8
- import Rating from 'fulldev-ui/components/Rating.astro'
9
- import Tagline from 'fulldev-ui/components/Tagline.astro'
10
- import Text from 'fulldev-ui/components/Text.astro'
11
- import type { GlobalProps } from 'fulldev-ui/types/global-props'
12
4
 
13
- interface Props extends GlobalProps, HTMLAttributes<'div'> {
14
- level?: ComponentProps<typeof Heading>['level']
15
- badge?: ComponentProps<typeof Badge> | undefined
16
- tagline?: ComponentProps<typeof Tagline>['text']
17
- heading?: ComponentProps<typeof Heading>['text']
18
- text?: ComponentProps<typeof Text>['text']
19
- list?: ComponentProps<typeof List>['items']
20
- align?: 'start' | 'center' | 'end' | undefined
21
- price?: ComponentProps<typeof Price>['value']
22
- rating?:
23
- | ComponentProps<typeof Rating>
24
- | ComponentProps<typeof Rating>['value']
5
+ interface Props extends HTMLAttributes<'div'> {
6
+ as?: HTMLTag
7
+ align?: 'left' | 'center' | 'right'
25
8
  }
26
9
 
27
- const {
28
- level = 2,
29
- rating,
30
- badge,
31
- tagline,
32
- heading,
33
- text,
34
- list,
35
- price,
36
- ...rest
37
- } = Astro.props
10
+ const { align = 'start', ...rest } = Astro.props
38
11
  ---
39
12
 
40
13
  <Element
41
14
  class:list="writeup"
15
+ {align}
42
16
  {...rest}
43
17
  >
44
- <slot>
45
- <Rating
46
- color="brand"
47
- {...typeof rating === 'number' ? { value: rating } : rating}
48
- />
49
- <Tagline text={tagline} />
50
- <Badge {...badge} />
51
- <Heading
52
- {level}
53
- text={heading}
54
- />
55
- <Text
56
- lead={level === 1}
57
- text={text}
58
- />
59
- <List items={list} />
60
- <Price value={price} />
61
- </slot>
18
+ <slot />
62
19
  </Element>
63
20
 
64
- <style is:global lang="scss">
21
+ <style is:global>
65
22
  @layer fulldev {
66
23
  .writeup {
67
- display: flex;
68
- position: relative;
69
- flex-direction: column;
70
- align-items: inherit;
71
- gap: var(--space-3);
72
- text-align: inherit;
24
+ @apply relative w-full;
73
25
 
74
- &.align-start {
75
- align-items: flex-start;
76
- text-align: left;
26
+ &.align-left {
27
+ @apply mr-auto flex flex-col items-start text-left;
77
28
  }
78
29
 
79
30
  &.align-center {
80
- align-items: center;
81
- text-align: center;
31
+ @apply mx-auto flex flex-col items-center text-center;
82
32
  }
83
33
 
84
- &.align-end {
85
- align-items: flex-end;
86
- text-align: right;
34
+ &.align-right {
35
+ @apply ml-auto flex flex-col items-end text-right;
36
+ }
37
+
38
+ .heading {
39
+ @apply max-w-screen-lg text-balance;
40
+ }
41
+
42
+ .paragraph {
43
+ @apply max-w-screen-md text-balance;
44
+ }
45
+
46
+ > * {
47
+ & + * {
48
+ @apply mt-4;
49
+ }
50
+
51
+ & + .group,
52
+ & + .button,
53
+ & + .buttons {
54
+ @apply mt-8;
55
+ }
87
56
  }
88
57
  }
89
58
  }
@@ -0,0 +1,90 @@
1
+ <!-- ---
2
+ import type { HTMLAttributes } from 'astro/types'
3
+ import Element from 'fulldev-ui/components/Element.astro'
4
+ import Icon from 'fulldev-ui/components/Icon.astro'
5
+ import type { RatingSchema } from 'fulldev-ui/schemas/components/rating'
6
+ import Avatar from './Avatar.astro'
7
+
8
+ interface Props extends HTMLAttributes<'div'>, RatingSchema {}
9
+
10
+ const { size = 'md', score, text, avatars, avatar, ...rest } = Astro.props
11
+
12
+ const getIcon = (count: number) => {
13
+ if (!score) return
14
+ const difference = score - count
15
+ if (difference >= -0.25) return 'star-filled'
16
+ if (difference >= -0.75) return 'star-half-filled'
17
+ return 'star'
18
+ }
19
+ ---
20
+
21
+ <Element
22
+ class:list="author"
23
+ {size}
24
+ {...rest}
25
+ >
26
+ <Avatar {...avatar} />
27
+ {avatars?.map((avatar) => <Avatar {...avatar} />)}
28
+ <Element class:list="rating-content">
29
+ <Element
30
+ class:list="rating-stars"
31
+ {...rest}
32
+ >
33
+ {
34
+ score &&
35
+ [1, 2, 3, 4, 5].map((count) => (
36
+ <Icon
37
+ name={getIcon(count)}
38
+ {size}
39
+ />
40
+ ))
41
+ }
42
+ </Element>
43
+ <Fragment set:html={text} />
44
+ <slot />
45
+ </Element>
46
+ </Element>
47
+
48
+ <style is:global>
49
+ @layer fulldev {
50
+ .rating {
51
+ @apply flex items-center gap-3;
52
+
53
+ .avatar + .avatar {
54
+ @apply -ml-3;
55
+ }
56
+
57
+ .rating-content {
58
+ @apply flex flex-col gap-1 text-muted-foreground;
59
+ }
60
+
61
+ .rating-stars {
62
+ @apply flex gap-1 text-primary;
63
+ }
64
+
65
+ &.size-sm {
66
+ @apply gap-2;
67
+
68
+ .rating-content {
69
+ @apply text-xs leading-none;
70
+ }
71
+ }
72
+
73
+ &.size-md {
74
+ @apply gap-2.5;
75
+
76
+ .rating-content {
77
+ @apply text-sm leading-none;
78
+ }
79
+ }
80
+
81
+ &.size-lg {
82
+ @apply gap-3;
83
+
84
+ .rating-content {
85
+ @apply text-base leading-none;
86
+ }
87
+ }
88
+ }
89
+ }
90
+ </style> -->
@@ -0,0 +1,129 @@
1
+ <!-- ---
2
+ import type { ComponentProps,HTMLAttributes } from 'astro/types'
3
+ import Buttons from 'fulldev-ui/components/Buttons.astro'
4
+ import Cart from 'fulldev-ui/components/Cart.astro'
5
+ import Drawer from 'fulldev-ui/components/Drawer.astro'
6
+ import Element from 'fulldev-ui/components/Element.astro'
7
+ import Links from 'fulldev-ui/components/Links.astro'
8
+ import Logo from 'fulldev-ui/components/Logo.astro'
9
+ import Menu from 'fulldev-ui/components/Menu.astro'
10
+ import Socials from 'fulldev-ui/components/Socials.astro'
11
+ import Themer from 'fulldev-ui/components/Themer.astro'
12
+ import type { GlobalProps } from 'fulldev-ui/types/global-props'
13
+ import Search from './Search.astro'
14
+
15
+ interface Props extends GlobalProps, HTMLAttributes<'header'> {
16
+ logo?: ComponentProps<typeof Logo>
17
+ company?: ComponentProps<typeof Logo>['company']
18
+ buttons?: ComponentProps<typeof Buttons>['buttons']
19
+ links?: ComponentProps<typeof Links>['links']
20
+ menu?: ComponentProps<typeof Menu>['groups']
21
+ panel?: boolean | undefined
22
+ search?: boolean | undefined
23
+ open?: boolean | undefined
24
+ cart?: string | undefined
25
+ socials?: ComponentProps<typeof Socials>['socials']
26
+ themer?: boolean | undefined
27
+ size?: 'sm' | 'md' | 'lg' | undefined
28
+ }
29
+
30
+ const {
31
+ size = 'sm',
32
+ open,
33
+ logo,
34
+ company,
35
+ buttons,
36
+ links,
37
+ search,
38
+ panel,
39
+ socials,
40
+ menu,
41
+ cart,
42
+ themer,
43
+ ...rest
44
+ } = Astro.props
45
+ ---
46
+
47
+ <Element
48
+ class:list="header"
49
+ as="header"
50
+ {size}
51
+ {open}
52
+ {...rest}
53
+ >
54
+ <Element class:list="header-container">
55
+ <Logo
56
+ {company}
57
+ {size}
58
+ {...typeof logo === 'string' ? { src: logo } : logo}
59
+ />
60
+ <Links
61
+ class:list="header-links"
62
+ {size}
63
+ {links}
64
+ />
65
+ <Socials
66
+ {size}
67
+ variant="ghost"
68
+ {socials}
69
+ />
70
+ <Buttons
71
+ class:list="header-buttons"
72
+ {size}
73
+ {buttons}
74
+ >
75
+ <Search size="sm" />
76
+ <Themer
77
+ if={themer}
78
+ {size}
79
+ />
80
+ <Cart
81
+ if={cart}
82
+ variant="secondary"
83
+ heading={cart}
84
+ {size}
85
+ />
86
+ <Drawer
87
+ class:list={['header-button']}
88
+ icon="menu-2"
89
+ id="menu"
90
+ variant="secondary"
91
+ {logo}
92
+ {company}
93
+ {buttons}
94
+ {links}
95
+ {menu}
96
+ {size}
97
+ />
98
+ </Buttons>
99
+ </Element>
100
+ </Element>
101
+
102
+ <style is:global>
103
+ @layer fulldev {
104
+ .header {
105
+ @apply sticky left-0 top-0 z-20 flex h-14 items-center overflow-hidden border-b bg-background;
106
+
107
+ .header-container {
108
+ @apply container flex w-full items-center justify-between gap-6;
109
+ }
110
+
111
+ &,
112
+ & ~ * {
113
+ --header-height: 3.5rem;
114
+ }
115
+
116
+ .header-links {
117
+ @apply mr-auto max-lg:hidden;
118
+ }
119
+
120
+ .header-socials {
121
+ @apply ml-auto max-lg:hidden;
122
+ }
123
+
124
+ .menu-button {
125
+ @apply lg:hidden;
126
+ }
127
+ }
128
+ }
129
+ </style> -->
@@ -0,0 +1,79 @@
1
+ ---
2
+ // @ts-nocheck
3
+ import type { ImageMetadata } from 'astro'
4
+ import type { HTMLAttributes } from 'astro/types'
5
+ import { Image as AstroImage } from 'astro:assets'
6
+ import { getEntry } from 'astro:content'
7
+
8
+ interface Props extends GlobalProps, HTMLAttributes<'img'> {
9
+ id?: any
10
+ size?: 'sm' | 'md' | 'lg' | undefined
11
+ position?: 'background' | 'cover' | 'inset' | undefined
12
+ }
13
+
14
+ const { id } = Astro.props
15
+ const entry = id ? (await getEntry('images', id))?.data : {}
16
+
17
+ const {
18
+ width = 1920,
19
+ height = 1920,
20
+ position,
21
+ src,
22
+ alt,
23
+ size,
24
+ ...rest
25
+ } = {
26
+ ...entry,
27
+ ...Astro.props,
28
+ }
29
+
30
+ function getAltBySrc() {
31
+ if (!src) return
32
+ const filename = src?.split('/').pop()
33
+ const slug = filename && filename.split('.')[0]
34
+ const unslugged = slug?.replace(/-/g, ' ')
35
+ return unslugged || ''
36
+ }
37
+
38
+ const images = import.meta.glob<{ default: ImageMetadata }>('/src/images/*')
39
+ const image = images[src as keyof typeof images]
40
+ ---
41
+
42
+ {
43
+ (image || src) && (
44
+ <AstroImage
45
+ class:list={[
46
+ 'image',
47
+ {
48
+ [`size-${size}`]: size,
49
+ [`position-${position}`]: position,
50
+ },
51
+ ]}
52
+ alt={alt || getAltBySrc()}
53
+ src={image ? image() : src}
54
+ width={width ? Number(width) : undefined}
55
+ height={height ? Number(height) : undefined}
56
+ {...rest}
57
+ />
58
+ )
59
+ }
60
+
61
+ <style is:global>
62
+ @layer fulldev {
63
+ .image {
64
+ @apply block;
65
+
66
+ &.position-contain {
67
+ @apply h-auto w-full object-contain;
68
+ }
69
+
70
+ &.position-cover {
71
+ @apply h-full w-full object-cover;
72
+ }
73
+
74
+ &.position-background {
75
+ @apply absolute inset-0 h-full max-h-none w-full max-w-none object-cover opacity-30;
76
+ }
77
+ }
78
+ }
79
+ </style>