fulldev-ui 0.5.0-beta.8 → 0.6.0-beta.0

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 (236) hide show
  1. package/.env.example +3 -0
  2. package/.prettierrc.yaml +1 -0
  3. package/astro.config.ts +6 -32
  4. package/package.json +21 -30
  5. package/pnpm-lock.yaml +696 -2176
  6. package/public/favicon/android-chrome-192x192.png +0 -0
  7. package/public/favicon/android-chrome-512x512.png +0 -0
  8. package/public/favicon/apple-touch-icon.png +0 -0
  9. package/public/favicon/manifest.webmanifest +7 -3
  10. package/public/favicon/mstile-150x150.png +0 -0
  11. package/src/blocks/Banner.astro +6 -19
  12. package/src/blocks/Colleagues.astro +0 -1
  13. package/src/blocks/Contact.astro +75 -74
  14. package/src/blocks/Content.astro +124 -6
  15. package/src/blocks/Cta.astro +0 -2
  16. package/src/blocks/Excerpt.astro +0 -2
  17. package/src/blocks/Footer.astro +107 -3
  18. package/src/blocks/Hero.astro +238 -9
  19. package/src/blocks/Intro.astro +89 -11
  20. package/src/blocks/Prices.astro +1 -1
  21. package/src/blocks/Product.astro +51 -68
  22. package/src/blocks/Products.astro +114 -5
  23. package/src/blocks/Reviews.astro +0 -1
  24. package/src/blocks/_Contact.astro +112 -0
  25. package/src/components/Avatar.astro +28 -9
  26. package/src/components/Avatars.astro +36 -0
  27. package/src/components/Badge.astro +73 -26
  28. package/src/components/Badges.astro +16 -23
  29. package/src/components/Breadcrumb.astro +58 -0
  30. package/src/components/Button.astro +56 -112
  31. package/src/components/Buttons.astro +23 -13
  32. package/src/components/Card.astro +129 -115
  33. package/src/components/Cards.astro +33 -35
  34. package/src/components/Carousel.astro +106 -0
  35. package/src/components/Cart.astro +1 -1
  36. package/src/components/CartForm.astro +9 -9
  37. package/src/components/CartList.astro +11 -28
  38. package/src/components/CartSummary.astro +11 -13
  39. package/src/components/Channel.astro +40 -22
  40. package/src/components/Channels.astro +20 -6
  41. package/src/components/Checkbox.astro +52 -27
  42. package/src/components/Code.astro +52 -0
  43. package/src/components/Dialog.astro +2 -2
  44. package/src/components/Drawer.astro +34 -64
  45. package/src/components/Element.astro +16 -8
  46. package/src/components/Form.astro +14 -13
  47. package/src/components/Gallery.astro +172 -0
  48. package/src/components/Head.astro +52 -1
  49. package/src/components/Header.astro +73 -83
  50. package/src/components/Heading.astro +74 -30
  51. package/src/components/Icon.astro +25 -30
  52. package/src/components/Image.astro +23 -38
  53. package/src/components/Input.astro +59 -53
  54. package/src/components/Label.astro +20 -15
  55. package/src/components/Lead.astro +46 -0
  56. package/src/components/Link.astro +51 -26
  57. package/src/components/Links.astro +42 -0
  58. package/src/components/List.astro +41 -16
  59. package/src/components/LocaleSwitcher.astro +2 -2
  60. package/src/components/Logo.astro +45 -0
  61. package/src/components/Menu.astro +21 -17
  62. package/src/components/Paragraph.astro +38 -0
  63. package/src/components/Price.astro +1 -1
  64. package/src/components/Prose.astro +169 -0
  65. package/src/components/Rating.astro +50 -38
  66. package/src/components/Search.astro +1 -1
  67. package/src/components/Section.astro +196 -158
  68. package/src/components/Select.astro +44 -55
  69. package/src/components/Sidebar.astro +31 -38
  70. package/src/components/Social.astro +3 -8
  71. package/src/components/Socials.astro +9 -5
  72. package/src/components/Subheader.astro +59 -0
  73. package/src/components/Switch.astro +72 -29
  74. package/src/components/Table.astro +1 -1
  75. package/src/components/Tagline.astro +40 -12
  76. package/src/components/Text.astro +4 -4
  77. package/src/components/Textarea.astro +40 -50
  78. package/src/components/Themer.astro +76 -0
  79. package/src/components/Toc.astro +24 -32
  80. package/src/components/Writeup.astro +26 -8
  81. package/src/components/docs/PropsTable.astro +38 -264
  82. package/src/components/experimental/Window.astro +5 -57
  83. package/src/components/sections.astro +1 -1
  84. package/src/content/pages/blocks/_categories.mdx +1 -1
  85. package/src/content/pages/blocks/_footer.mdx +1 -1
  86. package/src/content/pages/blocks/_header.mdx +1 -3
  87. package/src/content/pages/blocks/_jobs.mdx +1 -1
  88. package/src/content/pages/blocks/_prices.mdx +1 -1
  89. package/src/content/pages/blocks/_product.mdx +1 -1
  90. package/src/content/pages/blocks/_products.mdx +1 -1
  91. package/src/content/pages/blocks/_stats.mdx +1 -1
  92. package/src/content/pages/blocks/banner.mdx +1 -1
  93. package/src/content/pages/blocks/colleagues.mdx +1 -2
  94. package/src/content/pages/blocks/contact.mdx +1 -1
  95. package/src/content/pages/blocks/content.mdx +1 -5
  96. package/src/content/pages/blocks/cta.mdx +1 -9
  97. package/src/content/pages/blocks/features.mdx +1 -4
  98. package/src/content/pages/blocks/hero.mdx +1 -4
  99. package/src/content/pages/blocks/intro.mdx +1 -4
  100. package/src/content/pages/blocks/posts.mdx +1 -1
  101. package/src/content/pages/blocks/reviews.mdx +1 -2
  102. package/src/content/pages/docs/_internationalization.mdx +55 -0
  103. package/src/content/pages/docs/_using-blocks.mdx +33 -0
  104. package/src/content/pages/docs/_using-presets.mdx +49 -0
  105. package/src/content/pages/docs/blocks.mdx +33 -0
  106. package/src/content/pages/docs/collections/images.mdx +100 -0
  107. package/src/content/pages/docs/collections/pages.mdx +119 -0
  108. package/src/content/pages/docs/collections/presets.mdx +60 -0
  109. package/src/content/pages/docs/collections.mdx +42 -0
  110. package/src/content/pages/{base/card.mdx → docs/components/_card.mdx} +1 -3
  111. package/src/content/pages/{base → docs/components}/_switch.mdx +2 -2
  112. package/src/content/pages/{typography → docs/components}/_tagline.mdx +2 -2
  113. package/src/content/pages/docs/components/_toggle.mdx +31 -0
  114. package/src/content/pages/docs/components/avatar.mdx +35 -0
  115. package/src/content/pages/{base → docs/components}/badge.mdx +27 -8
  116. package/src/content/pages/docs/components/badges.mdx +47 -0
  117. package/src/content/pages/{base → docs/components}/button.mdx +29 -10
  118. package/src/content/pages/docs/components/buttons.mdx +52 -0
  119. package/src/content/pages/docs/components/channel.mdx +92 -0
  120. package/src/content/pages/docs/components/channels.mdx +90 -0
  121. package/src/content/pages/{base → docs/components}/checkbox.mdx +10 -17
  122. package/src/content/pages/docs/components/code.mdx +46 -0
  123. package/src/content/pages/docs/components/heading.mdx +60 -0
  124. package/src/content/pages/docs/components/icon.mdx +49 -0
  125. package/src/content/pages/docs/components/image.mdx +26 -0
  126. package/src/content/pages/docs/components/input.mdx +41 -0
  127. package/src/content/pages/{typography → docs/components}/label.mdx +8 -4
  128. package/src/content/pages/docs/components/lead.mdx +51 -0
  129. package/src/content/pages/{typography → docs/components}/link.mdx +23 -8
  130. package/src/content/pages/docs/components/links.mdx +100 -0
  131. package/src/content/pages/docs/components/list.mdx +45 -0
  132. package/src/content/pages/docs/components/logo.mdx +37 -0
  133. package/src/content/pages/docs/components/menu.mdx +90 -0
  134. package/src/content/pages/docs/components/paragraph.mdx +51 -0
  135. package/src/content/pages/docs/components/prose.mdx +37 -0
  136. package/src/content/pages/docs/components/rating.mdx +77 -0
  137. package/src/content/pages/{base → docs/components}/section.mdx +1 -1
  138. package/src/content/pages/{base → docs/components}/select.mdx +0 -9
  139. package/src/content/pages/docs/components/social.mdx +95 -0
  140. package/src/content/pages/docs/components/socials.mdx +103 -0
  141. package/src/content/pages/docs/components/switch.mdx +35 -0
  142. package/src/content/pages/{base → docs/components}/table.mdx +0 -2
  143. package/src/content/pages/docs/components/tagline.mdx +47 -0
  144. package/src/content/pages/docs/components/textarea.mdx +35 -0
  145. package/src/content/pages/docs/components/themer.mdx +50 -0
  146. package/src/content/pages/docs/components.mdx +40 -0
  147. package/src/content/pages/docs/customization.mdx +151 -0
  148. package/src/content/pages/docs/frameworks.mdx +29 -0
  149. package/src/content/pages/docs/generating-pages.mdx +129 -0
  150. package/src/content/pages/docs/index.mdx +23 -0
  151. package/src/content/pages/docs/installation.mdx +50 -0
  152. package/src/content/pages/docs/layouts.mdx +33 -0
  153. package/src/content/pages/index.mdx +11 -9
  154. package/src/content/pages/showcase.mdx +4 -2
  155. package/src/content/presets/base.yml +80 -63
  156. package/src/content/presets/docs.yml +2 -2
  157. package/src/css/color.css +0 -10
  158. package/src/css/custom.css +10 -12
  159. package/src/css/size.css +2 -11
  160. package/src/css/theme.css +93 -0
  161. package/src/images/logo-1.svg +11 -0
  162. package/src/images/logo-2.svg +13 -0
  163. package/src/images/logo-basic.svg +10 -0
  164. package/src/images/logo-simple.svg +13 -0
  165. package/src/images/logo-thin.svg +15 -0
  166. package/src/images/logo.svg +14 -0
  167. package/src/images/logofat.svg +11 -0
  168. package/src/integration/index.ts +71 -144
  169. package/src/layouts/CategoryLayout.astro +135 -0
  170. package/src/layouts/Layout.astro +62 -117
  171. package/src/layouts/PageLayout.astro +26 -0
  172. package/src/layouts/PostLayout.astro +13 -8
  173. package/src/layouts/ProductLayout.astro +94 -10
  174. package/src/pages/[...page].astro +14 -22
  175. package/src/pages/test.astro +20 -0
  176. package/src/schemas/components/button.ts +21 -13
  177. package/src/schemas/components/card.ts +36 -18
  178. package/src/schemas/components/footer.ts +2 -10
  179. package/src/schemas/components/global.ts +16 -0
  180. package/src/schemas/components/header.ts +8 -0
  181. package/src/schemas/components/image.ts +8 -3
  182. package/src/schemas/components/link.ts +16 -0
  183. package/src/schemas/components/links.ts +4 -0
  184. package/src/schemas/components/menu.ts +2 -0
  185. package/src/schemas/components/sidebar.ts +2 -2
  186. package/src/schemas/components/subheader.ts +9 -0
  187. package/src/schemas/components/themer.ts +3 -0
  188. package/src/schemas/pageSchema.ts +14 -21
  189. package/src/utils/cart.ts +1 -10
  190. package/src/utils/getDeepReferenceChildren.ts +14 -0
  191. package/src/utils/getReferenceChildren.ts +1 -1
  192. package/src/utils/setTheme.ts +18 -0
  193. package/src/utils/slugify.ts +6 -0
  194. package/tailwind.config.ts +67 -0
  195. package/src/blocks/Article.astro +0 -40
  196. package/src/components/Footer.astro +0 -193
  197. package/src/components/ThemeSelect.astro +0 -41
  198. package/src/components/experimental/Form.astro +0 -53
  199. package/src/components/experimental/Gallery.astro +0 -104
  200. package/src/components/experimental/Logo.astro +0 -38
  201. package/src/components/experimental/Prose.astro +0 -192
  202. package/src/content/pages/base/icon.mdx +0 -55
  203. package/src/content/pages/base/image.mdx +0 -42
  204. package/src/content/pages/base/input.mdx +0 -56
  205. package/src/content/pages/base/rating.mdx +0 -55
  206. package/src/content/pages/base/textarea.mdx +0 -58
  207. package/src/content/pages/base/theme-select.mdx +0 -15
  208. package/src/content/pages/layouts/_layout.mdx +0 -14
  209. package/src/content/pages/layouts/docslayout.mdx +0 -14
  210. package/src/content/pages/overview/components.mdx +0 -75
  211. package/src/content/pages/overview/content-collections.mdx +0 -139
  212. package/src/content/pages/overview/frameworks.mdx +0 -198
  213. package/src/content/pages/overview/installation.mdx +0 -53
  214. package/src/content/pages/overview/introduction.mdx +0 -30
  215. package/src/content/pages/overview/theming.mdx +0 -69
  216. package/src/content/pages/schemas/page.mdx +0 -17
  217. package/src/content/pages/schemas/preset.mdx +0 -9
  218. package/src/content/pages/showcase/record.md +0 -3
  219. package/src/content/pages/typography/heading.mdx +0 -73
  220. package/src/content/pages/typography/list.mdx +0 -51
  221. package/src/content/pages/typography/text.mdx +0 -61
  222. package/src/content/presets/blocks.yml +0 -1
  223. package/src/css/space.css +0 -77
  224. package/src/css/styles.css +0 -0
  225. package/src/images/avatar-1.yml +0 -1
  226. package/src/integration/generate-colors.ts +0 -639
  227. package/src/integration/tailwind-plugin.ts +0 -80
  228. package/src/integration/unocss-preset.ts +0 -84
  229. package/src/layouts/BlockLayout.astro +0 -19
  230. package/src/layouts/ContactLayout.astro +0 -21
  231. package/src/layouts/DocsLayout.astro +0 -73
  232. package/src/layouts/OverviewLayout.astro +0 -42
  233. /package/src/content/pages/{base → docs/components}/_dialog.mdx +0 -0
  234. /package/src/content/pages/{base → docs/components}/_drawer.mdx +0 -0
  235. /package/src/content/pages/{base → docs/components}/_localeswitcher.mdx +0 -0
  236. /package/src/schemas/utils/{parents.ts → categories.ts} +0 -0
@@ -0,0 +1,42 @@
1
+ ---
2
+ import type { ComponentProps, HTMLAttributes } from 'astro/types'
3
+ import Element from 'fulldev-ui/components/Element.astro'
4
+ import type { GlobalProps } from 'fulldev-ui/types/global-props'
5
+ import Link from './Link.astro'
6
+
7
+ interface Props extends GlobalProps, HTMLAttributes<'div'> {
8
+ variant?: ComponentProps<typeof Link>['variant']
9
+ links?: ComponentProps<typeof Link>[] | undefined
10
+ direction?: 'row' | 'column' | undefined
11
+ }
12
+
13
+ const { variant = 'muted', links, size, ...rest } = Astro.props
14
+ ---
15
+
16
+ <Element
17
+ class:list="links"
18
+ {...rest}
19
+ >
20
+ {
21
+ links?.map((link) => (
22
+ <Link
23
+ {variant}
24
+ {size}
25
+ {...link}
26
+ />
27
+ ))
28
+ }
29
+ <slot />
30
+ </Element>
31
+
32
+ <style is:global>
33
+ @layer fulldev {
34
+ .links {
35
+ @apply flex items-center justify-stretch gap-x-6 gap-y-2;
36
+
37
+ &.direction-column {
38
+ @apply flex-col items-start;
39
+ }
40
+ }
41
+ }
42
+ </style>
@@ -7,8 +7,8 @@ interface Props
7
7
  extends GlobalProps,
8
8
  HTMLAttributes<'ul'>,
9
9
  HTMLAttributes<'ol'> {
10
+ as?: 'ul' | 'ol' | undefined
10
11
  items?: string[] | undefined
11
- as?: 'ul' | 'ol'
12
12
  }
13
13
 
14
14
  const { as = 'ul', items, ...rest } = Astro.props
@@ -19,26 +19,51 @@ const { as = 'ul', items, ...rest } = Astro.props
19
19
  {as}
20
20
  {...rest}
21
21
  >
22
- {items?.map((item) => <li set:html={item} />)}
22
+ {
23
+ items?.map((item) => (
24
+ <Element
25
+ as="li"
26
+ set:html={item}
27
+ />
28
+ ))
29
+ }
30
+ <slot />
23
31
  </Element>
24
32
 
25
- <style is:global lang="scss">
33
+ <style is:global>
26
34
  @layer fulldev {
27
- .list {
28
- display: flex;
29
- flex-direction: column;
30
- padding-left: var(--space-5);
31
- color: var(--color-11);
32
- font-size: var(--text-2);
33
- line-height: 1.625;
34
- list-style-type: disc;
35
+ .list,
36
+ .prose :is(ul, ol) {
37
+ @apply ml-6;
38
+
39
+ &:is(ul) {
40
+ @apply list-disc;
41
+ }
42
+
43
+ ul {
44
+ @apply ml-6 mt-2 list-disc;
45
+ }
46
+
47
+ &:is(ol) {
48
+ @apply list-decimal;
49
+ }
50
+
51
+ ol {
52
+ @apply ml-6 mt-2 list-decimal;
53
+ }
35
54
 
36
55
  li {
37
- align-items: center;
38
- max-width: calc(var(--space-4) * 44);
39
- color: var(--color-11);
40
- font-size: var(--text-2);
41
- line-height: 1.625;
56
+ @apply mt-2 first:mt-0;
57
+ }
58
+
59
+ &.size-sm,
60
+ &:where(.size-sm &) {
61
+ @apply text-sm;
62
+ }
63
+
64
+ &.size-lg,
65
+ &:where(.size-lg &) {
66
+ @apply text-lg;
42
67
  }
43
68
  }
44
69
  }
@@ -13,7 +13,7 @@ import Select from 'fulldev-ui/components/Select.astro'
13
13
  )
14
14
  }
15
15
 
16
- <script>
16
+ <!-- <script>
17
17
  const select = document.querySelector('.theme-switcher select')
18
18
  select?.addEventListener('change', (event) => {
19
19
  const target = event.target as HTMLSelectElement
@@ -22,4 +22,4 @@ import Select from 'fulldev-ui/components/Select.astro'
22
22
  currentUrl.pathname = '/' + selectedLocale + currentUrl.pathname
23
23
  window.location.href = currentUrl.toString()
24
24
  })
25
- </script>
25
+ </script> -->
@@ -0,0 +1,45 @@
1
+ ---
2
+ import type { ComponentProps } from 'astro/types'
3
+ import Element from 'fulldev-ui/components/Element.astro'
4
+ import Image from 'fulldev-ui/components/Image.astro'
5
+
6
+ interface Props extends ComponentProps<typeof Image> {
7
+ company?: string | undefined
8
+ }
9
+
10
+ const { size = 'md', company, ...rest } = Astro.props as Props
11
+ ---
12
+
13
+ <Element
14
+ class:list="logo"
15
+ as="a"
16
+ href="/"
17
+ {size}
18
+ >
19
+ <Image {...rest} />
20
+ <Fragment set:html={company} />
21
+ </Element>
22
+
23
+ <style is:global>
24
+ @layer fulldev {
25
+ .logo {
26
+ @apply inline-flex grow-0 items-center justify-start font-semibold;
27
+
28
+ .image {
29
+ @apply block h-full w-auto object-contain;
30
+ }
31
+
32
+ &.size-sm {
33
+ @apply h-6 gap-2 text-base;
34
+ }
35
+
36
+ &.size-md {
37
+ @apply h-7 gap-2.5 text-lg;
38
+ }
39
+
40
+ &.size-lg {
41
+ @apply h-8 gap-3 text-xl;
42
+ }
43
+ }
44
+ }
45
+ </style>
@@ -1,55 +1,59 @@
1
1
  ---
2
2
  import type { ComponentProps, HTMLAttributes } from 'astro/types'
3
- import Button from 'fulldev-ui/components/Button.astro'
4
3
  import Element from 'fulldev-ui/components/Element.astro'
5
4
  import Heading from 'fulldev-ui/components/Heading.astro'
6
5
  import type { GlobalProps } from 'fulldev-ui/types/global-props'
6
+ import type Link from './Link.astro'
7
+ import Links from './Links.astro'
7
8
 
8
9
  interface Props extends GlobalProps, HTMLAttributes<'div'> {
10
+ direction?: 'row' | 'column'
9
11
  groups?:
10
12
  | {
11
13
  heading?: ComponentProps<typeof Heading>['text']
12
- buttons?: ComponentProps<typeof Button>[]
14
+ links?: ComponentProps<typeof Link>[]
13
15
  }[]
14
16
  | undefined
15
17
  }
16
18
 
17
- const { groups, ...rest } = Astro.props
19
+ const { direction = 'column', groups, size = 'md', ...rest } = Astro.props
18
20
  ---
19
21
 
20
22
  <Element
21
23
  class:list="menu"
24
+ {direction}
25
+ {size}
22
26
  {...rest}
23
27
  >
24
28
  {
25
- groups?.map(({ heading, buttons }) => (
29
+ groups?.map(({ heading, links }) => (
26
30
  <Element class:list="menu-group">
27
31
  <Heading
28
32
  level={6}
29
33
  text={heading}
34
+ {size}
35
+ />
36
+ <Links
37
+ direction="column"
38
+ {links}
39
+ {size}
30
40
  />
31
- {buttons?.map((button) => (
32
- <Button
33
- variant="link"
34
- {...button}
35
- />
36
- ))}
37
41
  </Element>
38
42
  ))
39
43
  }
40
44
  </Element>
41
45
 
42
- <style lang="scss" is:global>
46
+ <style is:global>
43
47
  @layer fulldev {
44
48
  .menu {
45
- display: flex;
46
- flex-direction: column;
47
- gap: var(--space-5);
49
+ @apply flex flex-col gap-6;
48
50
 
49
51
  .menu-group {
50
- display: flex;
51
- flex-direction: column;
52
- gap: var(--space-4);
52
+ @apply flex flex-col gap-3;
53
+ }
54
+
55
+ &.direction-row {
56
+ @apply flex-row flex-wrap gap-12;
53
57
  }
54
58
  }
55
59
  }
@@ -0,0 +1,38 @@
1
+ ---
2
+ import type { HTMLAttributes, HTMLTag } from 'astro/types'
3
+ import Element from 'fulldev-ui/components/Element.astro'
4
+ import type { GlobalProps } from 'fulldev-ui/types/global-props'
5
+
6
+ interface Props extends GlobalProps, HTMLAttributes<'p'> {
7
+ as?: HTMLTag
8
+ text?: string | undefined
9
+ }
10
+
11
+ const { as = 'p', text, ...rest } = Astro.props
12
+ ---
13
+
14
+ <Element
15
+ class:list="paragraph"
16
+ {as}
17
+ {...rest}
18
+ >
19
+ <slot />
20
+ <Fragment set:html={text} />
21
+ </Element>
22
+
23
+ <style is:global>
24
+ @layer fulldev {
25
+ .paragraph,
26
+ .prose-content p {
27
+ @apply leading-7 text-foreground;
28
+
29
+ &.size-sm {
30
+ @apply text-sm;
31
+ }
32
+
33
+ &.size-lg {
34
+ @apply text-lg;
35
+ }
36
+ }
37
+ }
38
+ </style>
@@ -21,7 +21,7 @@ const { value, ...rest } = Astro.props
21
21
  {value && <Fragment set:html={formatPrice(value)} />}
22
22
  </Element>
23
23
 
24
- <style is:global lang="scss">
24
+ <style is:global >
25
25
  @layer fulldev {
26
26
  .price {
27
27
  margin: 0;
@@ -0,0 +1,169 @@
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 Lead from 'fulldev-ui/components/Lead.astro'
9
+ import Tagline from 'fulldev-ui/components/Tagline.astro'
10
+ import Toc from 'fulldev-ui/components/Toc.astro'
11
+ import { crush } from 'radash'
12
+ import type Sidebar from './Sidebar.astro'
13
+
14
+ interface Props extends HTMLAttributes<'div'> {
15
+ as?: HTMLTag | undefined
16
+ render: CollectionEntry<'pages'>['render']
17
+ sidebar?: ComponentProps<typeof Sidebar> | undefined
18
+ slug?: CollectionEntry<'pages'>['slug'] | undefined
19
+ toc?: boolean | ComponentProps<typeof Toc>['heading'] | undefined
20
+ tagline?: ComponentProps<typeof Tagline>['text'] | undefined
21
+ heading?: ComponentProps<typeof Heading>['text'] | undefined
22
+ image?: ComponentProps<typeof Image> | undefined
23
+ lead?: ComponentProps<typeof Lead>['text'] | undefined
24
+ }
25
+
26
+ const {
27
+ toc = false,
28
+ slug,
29
+ sidebar,
30
+ render,
31
+ tagline,
32
+ heading,
33
+ lead,
34
+ image,
35
+ ...rest
36
+ } = Astro.props
37
+
38
+ const Content = render && (await render())?.Content
39
+
40
+ const flatMenu = crush(sidebar?.menu ?? {})
41
+ const slugs = Object.entries(flatMenu)
42
+ .map(([key, value]) => (key.endsWith('.slug') ? value : null))
43
+ .filter(Boolean)
44
+ const slugIndex = slugs.findIndex((val) => val === slug)
45
+
46
+ const prevSlug = slugs[slugIndex - 1]
47
+ const nextSlug = slugs[slugIndex + 1]
48
+ ---
49
+
50
+ <Element
51
+ class:list="prose"
52
+ {...rest}
53
+ >
54
+ <Element class:list="prose-container">
55
+ <Element class:list="prose-content">
56
+ <Tagline text={tagline} />
57
+ <Heading
58
+ as="h1"
59
+ level={2}
60
+ text={heading}
61
+ />
62
+ <Lead text={lead} />
63
+ <Image {...image} />
64
+ {Content && <Content />}
65
+ <slot />
66
+ <Element class:list="prose-footer">
67
+ <Button
68
+ class:list="prose-prev"
69
+ icon={prevSlug && 'arrow-left'}
70
+ slug={prevSlug}
71
+ variant="secondary"
72
+ />
73
+ <Button
74
+ class:list="prose-next"
75
+ icon={nextSlug && 'arrow-right'}
76
+ slug={nextSlug}
77
+ variant="secondary"
78
+ reverse
79
+ />
80
+ </Element>
81
+ </Element>
82
+ <Toc
83
+ if={toc}
84
+ heading={typeof toc === 'string' ? toc : undefined}
85
+ {render}
86
+ />
87
+ </Element>
88
+ </Element>
89
+
90
+ <style is:global>
91
+ @layer fulldev {
92
+ .prose {
93
+ @apply relative items-start py-28 first:pt-14;
94
+
95
+ .prose-container {
96
+ @apply container flex h-full w-full flex-grow items-start justify-evenly gap-14 gap-x-gutter;
97
+ }
98
+
99
+ .prose-content {
100
+ @apply w-full max-w-screen-md;
101
+
102
+ > * {
103
+ @apply mt-6 first:mt-0;
104
+ }
105
+
106
+ p {
107
+ @apply mt-4 first:mt-0;
108
+ }
109
+
110
+ code:not(.astro-code code) {
111
+ @apply rounded bg-muted px-1.5 py-0.5 font-mono text-sm font-medium;
112
+ }
113
+
114
+ h1,
115
+ h2,
116
+ h3,
117
+ h4,
118
+ h5,
119
+ h6 {
120
+ @apply mt-8 scroll-m-20 font-semibold first:mt-0;
121
+
122
+ code {
123
+ font-size: inherit !important;
124
+ }
125
+ }
126
+
127
+ > h1 {
128
+ @apply text-4xl font-extrabold;
129
+ }
130
+
131
+ > h2 {
132
+ @apply text-2xl;
133
+ }
134
+
135
+ > h3 {
136
+ @apply text-xl;
137
+ }
138
+
139
+ > h4 {
140
+ @apply text-lg;
141
+ }
142
+
143
+ > h5 {
144
+ @apply text-base;
145
+ }
146
+
147
+ > h6 {
148
+ @apply text-sm;
149
+ }
150
+
151
+ > aside {
152
+ @apply mt-6 rounded-md border border-destructive p-4 text-destructive first:mt-0;
153
+ }
154
+ }
155
+
156
+ .prose-footer {
157
+ @apply mt-14 flex items-center;
158
+
159
+ .prose-next {
160
+ @apply ml-auto;
161
+ }
162
+ }
163
+
164
+ .toc {
165
+ @apply order-last;
166
+ }
167
+ }
168
+ }
169
+ </style>
@@ -1,20 +1,27 @@
1
1
  ---
2
2
  import type { HTMLAttributes } from 'astro/types'
3
- import Avatar from 'fulldev-ui/components/Avatar.astro'
4
3
  import Element from 'fulldev-ui/components/Element.astro'
5
4
  import Icon from 'fulldev-ui/components/Icon.astro'
6
- import Label from 'fulldev-ui/components/Label.astro'
7
5
  import type { GlobalProps } from 'fulldev-ui/types/global-props'
6
+ import Avatars from './Avatars.astro'
8
7
 
9
8
  interface Props extends GlobalProps, HTMLAttributes<'div'> {
10
9
  align?: 'start' | 'center' | 'end' | undefined
11
10
  value?: number | undefined
12
- label?: string | undefined
13
- avatars?: string[] | undefined
14
- avatar?: string | undefined
11
+ text?: string | undefined
12
+ avatars?: any
13
+ avatar?: any
15
14
  }
16
15
 
17
- const { value, label, avatars, avatar, align, ...rest } = Astro.props
16
+ const {
17
+ size = 'md',
18
+ value,
19
+ text,
20
+ avatars,
21
+ avatar,
22
+ align,
23
+ ...rest
24
+ } = Astro.props
18
25
 
19
26
  const getIcon = (count: number) => {
20
27
  if (!value) return
@@ -23,69 +30,74 @@ const getIcon = (count: number) => {
23
30
  if (difference >= -0.75) return 'star-half-filled'
24
31
  return 'star'
25
32
  }
26
-
27
- const hasAvatars = avatars && avatars?.length > 0
28
33
  ---
29
34
 
30
35
  <Element
31
36
  class:list="rating"
37
+ {size}
32
38
  {...rest}
33
39
  >
34
- {
35
- [avatar, ...(avatars ?? [])]
36
- ?.filter(Boolean)
37
- ?.map((avatar) => <Avatar src={avatar} />)
38
- }
39
- <Element
40
- class:list="column"
41
- align={!hasAvatars ? align : undefined}
42
- >
40
+ <Avatars
41
+ {size}
42
+ {avatars}
43
+ {avatar}
44
+ />
45
+ <Element class:list="rating-content">
43
46
  <Element
44
- class:list={'stars'}
47
+ class:list="rating-stars"
45
48
  {...rest}
46
49
  >
47
50
  {
48
51
  value &&
49
52
  [1, 2, 3, 4, 5].map((_, i) => (
50
53
  <Icon
54
+ {size}
51
55
  name={getIcon(i + 1)}
52
56
  class:list={'rating-icon-solid'}
53
57
  />
54
58
  ))
55
59
  }
56
60
  </Element>
57
- <Label
58
- color="base"
59
- text={label}
60
- />
61
+ <Fragment set:html={text} />
62
+ <slot />
61
63
  </Element>
62
64
  </Element>
63
65
 
64
- <style is:global lang="scss">
66
+ <style is:global>
65
67
  @layer fulldev {
66
68
  .rating {
67
- display: flex;
68
- align-items: center;
69
- gap: var(--space-4);
69
+ @apply flex items-center gap-3;
70
70
 
71
- .column {
72
- display: flex;
73
- flex-direction: column;
74
- align-items: flex-start;
71
+ .rating-content {
72
+ @apply flex flex-col gap-1 text-muted-foreground;
75
73
  }
76
74
 
77
- .avatar + .avatar {
78
- margin-left: calc(var(--space-4) * -2.5);
75
+ .rating-stars {
76
+ @apply flex gap-1 text-primary;
79
77
  }
80
78
 
81
- .label {
82
- margin-top: var(--space-2) !important;
79
+ &.size-sm {
80
+ @apply gap-2;
81
+
82
+ .rating-content {
83
+ @apply text-xs leading-none;
84
+ }
83
85
  }
84
86
 
85
- .stars {
86
- display: flex;
87
- align-items: center;
88
- gap: var(--space-2);
87
+ &.size-md {
88
+ @apply gap-2.5;
89
+
90
+ .rating-content {
91
+ @apply text-sm leading-none;
92
+ }
93
+ }
94
+
95
+ &.size-lg {
96
+ @apply gap-3;
97
+
98
+ .rating-content {
99
+ @apply text-base leading-none;
100
+ }
89
101
  }
90
102
  }
91
103
  }
@@ -12,7 +12,7 @@ const { variant = 'secondary', ...rest } = Astro.props
12
12
  {...rest}
13
13
  />
14
14
 
15
- <style is:global lang="scss">
15
+ <style is:global >
16
16
  :root {
17
17
  --pagefind-ui-primary: var(--brand-11);
18
18
  --pagefind-ui-text: var(--base-12);