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,172 @@
1
+ ---
2
+ import type { ComponentProps, HTMLAttributes, HTMLTag } from 'astro/types'
3
+ import type { CollectionEntry } from 'astro:content'
4
+ import Button from 'fulldev-ui/components/Button.astro'
5
+ import Element from 'fulldev-ui/components/Element.astro'
6
+ import Heading from 'fulldev-ui/components/Heading.astro'
7
+ import Image from 'fulldev-ui/components/Image.astro'
8
+ import {
9
+ default as Lead,
10
+ default as Paragraph,
11
+ } from 'fulldev-ui/components/Paragraph.astro'
12
+ import Tagline from 'fulldev-ui/components/Tagline.astro'
13
+ import Toc from 'fulldev-ui/components/Toc.astro'
14
+ import { crush } from 'radash'
15
+ import type Sidebar from './Sidebar.astro'
16
+
17
+ interface Props extends HTMLAttributes<'div'> {
18
+ as?: HTMLTag | undefined
19
+ render?: any
20
+ sidebar?: ComponentProps<typeof Sidebar> | undefined
21
+ slug?: CollectionEntry<'pages'>['slug'] | undefined
22
+ toc?: boolean | ComponentProps<typeof Toc>['heading'] | undefined
23
+ tagline?: ComponentProps<typeof Tagline>['text'] | undefined
24
+ heading?: ComponentProps<typeof Heading>['text'] | undefined
25
+ image?: ComponentProps<typeof Image> | undefined
26
+ lead?: ComponentProps<typeof Lead>['text'] | undefined
27
+ }
28
+
29
+ const {
30
+ toc = false,
31
+ slug,
32
+ sidebar,
33
+ render,
34
+ tagline,
35
+ heading,
36
+ lead,
37
+ image,
38
+ ...rest
39
+ } = Astro.props
40
+
41
+ const Content = render && (await render())?.Content
42
+
43
+ const flatMenu = crush(sidebar?.menu ?? {})
44
+ const slugs = Object.entries(flatMenu)
45
+ .map(([key, value]) => (key.endsWith('.slug') ? value : null))
46
+ .filter(Boolean)
47
+ const slugIndex = slugs.findIndex((val) => val === slug)
48
+
49
+ const prevSlug = slugs[slugIndex - 1]
50
+ const nextSlug = slugs[slugIndex + 1]
51
+ ---
52
+
53
+ <Element
54
+ class:list="prose"
55
+ {...rest}
56
+ >
57
+ <Element class:list="prose-container">
58
+ <Element class:list="prose-content">
59
+ <Tagline text={tagline} />
60
+ <Heading
61
+ as="h1"
62
+ level={2}
63
+ text={heading}
64
+ />
65
+ <Paragraph text={lead} />
66
+ <Image {...image} />
67
+ {Content && <Content />}
68
+ <slot />
69
+ <Element class:list="prose-footer">
70
+ <Button
71
+ class:list="prose-prev"
72
+ icon={prevSlug && 'arrow-left'}
73
+ slug={prevSlug}
74
+ variant="secondary"
75
+ />
76
+ <Button
77
+ class:list="prose-next"
78
+ icon={nextSlug && 'arrow-right'}
79
+ slug={nextSlug}
80
+ variant="secondary"
81
+ reverse
82
+ />
83
+ </Element>
84
+ </Element>
85
+ <Toc
86
+ if={toc}
87
+ heading={typeof toc === 'string' ? toc : undefined}
88
+ {render}
89
+ />
90
+ </Element>
91
+ </Element>
92
+
93
+ <style is:global>
94
+ @layer fulldev {
95
+ .prose {
96
+ @apply relative items-start py-28 first:pt-14;
97
+
98
+ .prose-container {
99
+ @apply container flex h-full w-full flex-grow items-start justify-evenly gap-14 gap-x-gutter;
100
+ }
101
+
102
+ .prose-content {
103
+ @apply w-full max-w-screen-md;
104
+
105
+ > * {
106
+ @apply mt-6 first:mt-0;
107
+ }
108
+
109
+ p {
110
+ @apply mt-4 first:mt-0;
111
+ }
112
+
113
+ code:not(.astro-code code) {
114
+ @apply rounded bg-muted px-1.5 py-0.5 font-mono text-sm font-medium;
115
+ }
116
+
117
+ h1,
118
+ h2,
119
+ h3,
120
+ h4,
121
+ h5,
122
+ h6 {
123
+ @apply mt-8 scroll-m-20 font-semibold first:mt-0;
124
+
125
+ code {
126
+ font-size: inherit !important;
127
+ }
128
+ }
129
+
130
+ > h1 {
131
+ @apply text-4xl font-extrabold;
132
+ }
133
+
134
+ > h2 {
135
+ @apply text-2xl;
136
+ }
137
+
138
+ > h3 {
139
+ @apply text-xl;
140
+ }
141
+
142
+ > h4 {
143
+ @apply text-lg;
144
+ }
145
+
146
+ > h5 {
147
+ @apply text-base;
148
+ }
149
+
150
+ > h6 {
151
+ @apply text-sm;
152
+ }
153
+
154
+ > aside {
155
+ @apply mt-6 rounded-md border border-destructive p-4 text-destructive first:mt-0;
156
+ }
157
+ }
158
+
159
+ .prose-footer {
160
+ @apply mt-14 flex items-center;
161
+
162
+ .prose-next {
163
+ @apply ml-auto;
164
+ }
165
+ }
166
+
167
+ .toc {
168
+ @apply order-last;
169
+ }
170
+ }
171
+ }
172
+ </style>
@@ -0,0 +1,87 @@
1
+ <!-- ---
2
+ import type { HTMLAttributes } from 'astro/types'
3
+ import Element from 'fulldev-ui/components/Element.astro'
4
+ import Links from 'fulldev-ui/components/Links.astro'
5
+ import Logo from 'fulldev-ui/components/Logo.astro'
6
+ import Themer from 'fulldev-ui/components/Themer.astro'
7
+ import type { SidebarSchema } from 'fulldev-ui/schemas/components/sidebar'
8
+ import Heading from './Heading.astro'
9
+
10
+ interface Props extends HTMLAttributes<'aside'>, SidebarSchema {}
11
+
12
+ const { company, logo, menus, heading, themer, ...rest } = Astro.props
13
+ ---
14
+
15
+ <Element
16
+ class:list="sidebar"
17
+ as="aside"
18
+ {...rest}
19
+ >
20
+ <Element
21
+ class:list="sidebar-header"
22
+ as="header"
23
+ >
24
+ <Logo
25
+ {company}
26
+ {...logo}
27
+ size="sm"
28
+ />
29
+ <Heading
30
+ as="h5"
31
+ size="md"
32
+ text={heading}
33
+ />
34
+ </Element>
35
+ <Element class:list="sidebar-content">
36
+ <Element
37
+ class:list="sidebar-nav"
38
+ as="nav"
39
+ >
40
+ {
41
+ menus?.map(({ heading, links }) => (
42
+ <Element class:list="sidebar-menu">
43
+ <Heading
44
+ text={heading}
45
+ size="sm"
46
+ as="h6"
47
+ />
48
+ <Links
49
+ direction="column"
50
+ size="sm"
51
+ {links}
52
+ />
53
+ </Element>
54
+ ))
55
+ }
56
+ </Element>
57
+ <Themer if={themer} />
58
+ <slot />
59
+ </Element>
60
+ </Element>
61
+
62
+ <style is:global>
63
+ @layer fulldev {
64
+ .sidebar {
65
+ @apply sticky bottom-0 z-10 hidden h-full flex-col items-start justify-start border-r bg-background lg:flex;
66
+
67
+ --height: calc(var(--header-height, 0px) + var(--subheader-height, 0px));
68
+ top: var(--height);
69
+ width: var(--sidebar-width);
70
+ max-height: calc(100vh - var(--height));
71
+
72
+ &,
73
+ & ~ * {
74
+ --sidebar-width: 13rem;
75
+ }
76
+
77
+ .sidebar-header {
78
+ @apply sticky flex h-14 w-full items-center px-gutter py-6;
79
+ }
80
+
81
+ .sidebar-content {
82
+ @apply flex w-full flex-1 flex-col items-start gap-7 overflow-y-auto px-gutter pb-14 pt-6 first:pt-14;
83
+ @apply scrollbar scrollbar-track-transparent scrollbar-thumb-accent scrollbar-thumb-rounded-full scrollbar-w-2 hover:scrollbar-thumb-accent-hover;
84
+ }
85
+ }
86
+ }
87
+ </style> -->
@@ -1,275 +1,49 @@
1
1
  ---
2
- import Table from 'fulldev-ui/components/Table.astro'
3
- import { readFileSync } from 'node:fs'
4
- import { pascal } from 'radash'
5
-
6
- const slug = Astro.params.page || 'index'
7
- const componentName = pascal(slug)
8
-
9
- const allComponents = import.meta.glob('/src/**/*.astro', { eager: true })
10
- const foundComponent = Object.entries(allComponents).find(
11
- ([key]) => key.split('/').pop() === `${componentName}.astro`
12
- )?.[1] as any
13
- const componentFileContent =
14
- (foundComponent && readFileSync(foundComponent.file, 'utf-8')) || ''
15
-
16
- interface Prop {
17
- name: string
18
- type: string
19
- }
20
-
21
- // Regular expression to match the Props interface or type
22
- const staticProps = /(?:interface|type)\s+Props[\s\S]*?{([\s\S]*?)}/
23
-
24
- // Function to extract props from the component file
25
- const extractProps = (content: string): Prop[] => {
26
- const props: Prop[] = []
27
-
28
- // Extract static props from Props interface or type
29
- const staticPropsMatch = content.match(staticProps)
30
- if (staticPropsMatch && staticPropsMatch[1]) {
31
- const propsContent = staticPropsMatch[1]
32
- const propLines = propsContent.split('\n')
33
-
34
- let currentProp: Prop | null = null
35
-
36
- propLines.forEach((line) => {
37
- const trimmedLine = line.trim()
38
- if (trimmedLine === '') return
39
-
40
- // Match prop name and type
41
- const match = trimmedLine.match(/^(\w+)(\??):(.*)/)
42
- if (match && match[1] && match[3]) {
43
- if (currentProp) props.push(currentProp)
44
- currentProp = {
45
- name: match[1],
46
- type: match[3].trim(),
47
- }
48
- } else if (currentProp) {
49
- // Continue adding to type if it spans multiple lines
50
- currentProp.type += ' ' + trimmedLine
51
- }
52
- })
53
-
54
- if (currentProp) props.push(currentProp)
55
- }
56
-
57
- // Extract props from type intersections
58
- const intersectionProps = content.match(
59
- /Props(?:<[^>]+>)?\s*=\s*([\s\S]*?)(?:$|\n\n)/
60
- )
61
- if (intersectionProps && intersectionProps[1]) {
62
- const intersectionContent = intersectionProps[1]
63
- let currentProp: Prop | null = null
64
- const lines = intersectionContent.split('\n')
65
-
66
- lines.forEach((line) => {
67
- const trimmedLine = line.trim()
68
- if (trimmedLine === '') return
69
-
70
- // Match prop name and type
71
- const match = trimmedLine.match(/(\w+)(\??):(.*)/)
72
- if (match && match[1] && match[3]) {
73
- if (currentProp) props.push(currentProp)
74
- currentProp = {
75
- name: match[1],
76
- type: match[3].trim(),
77
- }
78
- } else if (currentProp) {
79
- // Continue adding to type if it spans multiple lines
80
- currentProp.type += ' ' + trimmedLine
81
- }
82
- })
83
-
84
- if (currentProp) props.push(currentProp)
85
- }
86
-
87
- // Clean up the type of the last prop
88
- if (props.length > 0) {
89
- const lastProp = props[props.length - 1]
90
- if (lastProp) {
91
- lastProp.type = lastProp.type.replace(/\s*}\s*$/, '')
92
- }
93
- }
94
-
95
- // Filter out 'as' prop and props starting with underscore
96
- return props.filter(
97
- (prop) => prop.name !== 'as' && !prop.name.startsWith('_')
98
- )
99
- }
100
-
101
- // Function to extract default prop values from Astro.props
102
- const extractDefaultProps = (content: string): Record<string, string> => {
103
- const defaultPropsMatch = content.match(
104
- /const\s*{[\s\S]*?}\s*=\s*Astro\.props/
105
- )
106
- return defaultPropsMatch
107
- ? [
108
- ...defaultPropsMatch[0].matchAll(
109
- /(\w+)\s*=\s*('[^']*'|"[^"]*"|[^,\n]+)/g
110
- ),
111
- ].reduce(
112
- (acc, match) => {
113
- const [, name, value] = match
114
- if (name && name !== 'as' && value !== undefined) {
115
- acc[name] =
116
- value.startsWith("'") || value.startsWith('"')
117
- ? value.slice(1, -1)
118
- : value
119
- }
120
- return acc
121
- },
122
- {} as Record<string, string>
123
- )
124
- : {}
125
- }
126
-
127
- // Function to extract the default 'As' prop value from the interface or type
128
- const extractAsDefault = (content: string): string => {
129
- const asTypeMatch = content.match(/type Props<As extends ([^>]+)>/)
130
- if (asTypeMatch && asTypeMatch[1]) {
131
- return asTypeMatch[1].trim().replace(/['"]/g, '')
132
- }
133
-
134
- const asInterfaceMatch = content.match(/interface Props<As extends ([^>]+)>/)
135
- if (asInterfaceMatch && asInterfaceMatch[1]) {
136
- return asInterfaceMatch[1].trim().replace(/['"]/g, '')
137
- }
138
-
139
- return ''
140
- }
141
-
142
- const parsedProps = extractProps(componentFileContent)
143
- const parsedAstroProps = extractDefaultProps(componentFileContent)
144
- const asDefault = extractAsDefault(componentFileContent)
145
-
146
- // Function to get the default value for a prop
147
- const getDefaultValue = (name: string): string => {
148
- if (name in parsedAstroProps) {
149
- return parsedAstroProps[name] || '-'
150
- }
151
-
152
- return '-'
153
- }
154
-
155
- // Check if the component extends Element.astro
156
- const extendsElement = componentFileContent.includes('GlobalProps')
157
-
158
- // Check if the component extends Writeup.astro
159
- const extendsWriteup = componentFileContent.includes(
160
- 'ComponentProps<typeof Writeup>'
161
- )
162
-
163
- // Prepare the table body data
164
- const tableBody = new Map()
165
-
166
- // Add component-specific props
167
- parsedProps.forEach((item) => {
168
- tableBody.set(item.name, [
169
- item.name,
170
- item.type.replace(/\s*\|?\s*(undefined|null)/, '').trim(),
171
- getDefaultValue(item.name),
172
- ])
173
- })
174
-
175
- // Add Element props if the component extends Element.astro
176
- if (extendsElement) {
177
- const elementProps = extractProps(
178
- readFileSync('src/components/Element.astro', 'utf-8')
179
- )
180
- elementProps
181
- .filter((item) => item.name !== '[key: string | number | symbol]')
182
- .forEach((item) => {
183
- if (!tableBody.has(item.name)) {
184
- let type = item.type
185
- .replace(/\s*\|?\s*(undefined|null)/, '')
186
- .trim()
187
- .replace(/\s*\|\s*any/, '')
188
- .replace(/\s*\[key: string \| number \| symbol\]: any/, '')
189
-
190
- // Remove [key: string | number | symbol]: any from the last prop
191
- if (item === elementProps[elementProps.length - 1]) {
192
- type = type.replace(/\s*\[key: string \| number \| symbol\]: any/, '')
193
- }
194
-
195
- if (item.name === 'size') {
196
- type = "'sm' | 'md' | 'lg'"
197
- } else if (item.name === 'color') {
198
- type = "'base' | 'brand'"
199
- }
200
-
201
- tableBody.set(item.name, [item.name, type, getDefaultValue(item.name)])
202
- }
203
- })
204
- }
205
-
206
- // Add Writeup props if the component extends Writeup.astro
207
- if (extendsWriteup) {
208
- const writeupProps = extractProps(
209
- readFileSync('src/components/Writeup.astro', 'utf-8')
210
- )
211
- writeupProps
212
- .filter((item) => item.name !== '[key: string | number | symbol]')
213
- .forEach((item) => {
214
- if (!tableBody.has(item.name)) {
215
- let type = item.type
216
- .replace(/\s*\|?\s*(undefined|null)/, '')
217
- .trim()
218
- .replace(/\s*\|\s*any/, '')
219
- .replace(/\s*\[key: string \| number \| symbol\]: any/, '')
220
-
221
- // Remove [key: string | number | symbol]: any from the last prop
222
- if (item === writeupProps[writeupProps.length - 1]) {
223
- type = type.replace(/\s*\[key: string \| number \| symbol\]: any/, '')
224
- }
225
-
226
- tableBody.set(item.name, [item.name, type, getDefaultValue(item.name)])
227
- }
228
- })
229
- }
230
-
231
- // Add 'as' prop only if asDefault is not empty
232
- if (asDefault) {
233
- tableBody.set('as', ['as', 'HTMLTag', asDefault])
234
- }
235
-
236
- // Check if the component is polymorphic
237
- const isPolymorphic = componentFileContent.includes('Polymorphic<')
238
-
239
- // Extract HTMLAttributes from the component
240
- const htmlAttributesMatch = componentFileContent.match(
241
- /HTMLAttributes<'(\w+)'>/
242
- )
243
- let htmlElement = htmlAttributesMatch ? htmlAttributesMatch[1] : ''
244
-
245
- // Special handling for List and Button components
246
- if (componentName === 'List') {
247
- htmlElement = "'ul' | 'ol'"
248
- } else if (componentName === 'Button') {
249
- htmlElement = "'button' | 'a' | 'label'"
250
- }
251
-
252
- // Add HTML Attributes row
253
- if (isPolymorphic && asDefault) {
254
- tableBody.set('HTML Attributes', [
255
- 'HTML Attributes',
256
- `Polymorphic<${asDefault}>`,
257
- '-',
258
- ])
259
- } else if (htmlElement) {
260
- tableBody.set('HTML Attributes', ['HTML Attributes', `${htmlElement}`, '-'])
261
- }
2
+ // const { schema } = Astro.props
3
+
4
+ // import Table from 'fulldev-ui/components/Table.astro'
5
+ // import { zodToJsonSchema } from 'zod-to-json-schema'
6
+
7
+ // const slug = Astro.params.page?.split('/').pop() || ''
8
+
9
+ // const allSchemas = import.meta.glob('/src/schemas/**/*.ts', {
10
+ // eager: true,
11
+ // })
12
+
13
+ // const schemaName = schema ?? slug
14
+ // const foundSchema = Object.entries(allSchemas).find(([key]) =>
15
+ // key.toLowerCase().includes(`/${schemaName.toLowerCase()}.ts`)
16
+ // )?.[1] as any
17
+
18
+ // const jsonSchema = zodToJsonSchema(foundSchema?.default, {
19
+ // pipeStrategy: 'output',
20
+ // }) as { properties?: Record<string, any> }
21
+
22
+ // const properties = jsonSchema.properties || {}
23
+
24
+ // const tableBody = Object.entries(properties).map(([key, value]: any) => {
25
+ // let type = 'any'
26
+ // if (value.enum) {
27
+ // type = value.enum.join(' | ')
28
+ // } else if (value.type) {
29
+ // type = value.type
30
+ // } else if (value.$ref) {
31
+ // type = `typeof ${key}`
32
+ // }
33
+ // const defaultValue = value.default?.toString() ?? '-'
34
+ // return [key, type, defaultValue]
35
+ // })
262
36
  ---
263
37
 
264
- <Table
38
+ <!-- <Table
265
39
  size="md"
266
40
  class:list={['props-table']}
267
41
  header={['Prop', 'Type', 'Default']}
268
- body={Array.from(tableBody.values())}
42
+ body={tableBody}
269
43
  />
270
44
 
271
- <style is:global lang="scss">
45
+ <style is:global>
272
46
  .props-table {
273
47
  overflow: auto;
274
48
  }
275
- </style>
49
+ </style> -->
@@ -1,4 +1,4 @@
1
- ---
1
+ <!-- ---
2
2
  import Button from 'fulldev-ui/components/Button.astro'
3
3
 
4
4
  const { componentProps } = Astro.props
@@ -25,7 +25,7 @@ const isComponent =
25
25
  </div>
26
26
  </div>
27
27
  ) : (
28
- <div class="block window">
28
+ <div class="window block">
29
29
  <div class="button-header">
30
30
  <Button
31
31
  for={id}
@@ -50,22 +50,11 @@ const isComponent =
50
50
  )
51
51
  }
52
52
 
53
- <style lang="scss" is:global>
53
+ <style is:global>
54
54
  @layer fulldev {
55
55
  .window {
56
- display: flex;
57
- flex-direction: column;
58
- align-items: flex-start;
59
- width: 100%;
60
-
61
56
  .code-container {
62
- width: 100%;
63
-
64
- .astro-code {
65
- margin: 0;
66
- background-color: #191919 !important;
67
- padding: var(--space-5);
68
- }
57
+ @apply w-full;
69
58
  }
70
59
 
71
60
  &.component {
@@ -130,45 +119,4 @@ const isComponent =
130
119
  }
131
120
  }
132
121
  }
133
-
134
- // .window {
135
- // width: 100%;
136
-
137
- // &.component {
138
- // border: 1px solid var(--base-6);
139
- // border-radius: var(--radius-2);
140
- // overflow: hidden;
141
-
142
- // .example-container {
143
- // display: flex;
144
- // flex-direction: column;
145
- // align-items: start;
146
- // gap: var(--space-4);
147
- // padding: var(--space-5);
148
- // }
149
-
150
- // .astro-code {
151
- // border: none;
152
- // border-top: 1px solid var(--base-6);
153
- // border-radius: 0px;
154
- // }
155
- // }
156
-
157
- // &:not(.component) {
158
- // padding-top: var(--space-7);
159
- // padding-bottom: var(--space-7);
160
-
161
- // .live-code-layout {
162
- // display: flex;
163
- // flex-direction: column;
164
- // margin-top: var(--space-4);
165
- // width: 100%;
166
- // overflow: hidden;
167
-
168
- // .example-container {
169
- // border-top: 1px solid var(--base-6);
170
- // }
171
- // }
172
- // }
173
- // }
174
- </style>
122
+ </style> -->
@@ -1,20 +1,13 @@
1
1
  import { defineCollection } from 'astro:content'
2
- import imageLoader from 'fulldev-ui/loaders/imageLoader.ts'
3
- import imageSchema from 'fulldev-ui/schemas/imageSchema.ts'
4
- import pageSchema from 'fulldev-ui/schemas/pageSchema.ts'
5
- import presetSchema from 'fulldev-ui/schemas/presetSchema.ts'
2
+ import { pageSchema } from 'fulldev-ui/schemas/page.ts'
6
3
 
7
4
  export const collections = {
8
5
  pages: defineCollection({
9
6
  type: 'content',
10
7
  schema: pageSchema,
11
8
  }),
12
- presets: defineCollection({
9
+ layouts: defineCollection({
13
10
  type: 'data',
14
- schema: presetSchema,
15
- }),
16
- images: defineCollection({
17
- loader: imageLoader,
18
- schema: imageSchema,
11
+ schema: pageSchema,
19
12
  }),
20
13
  }