fulldev-ui 0.5.0-beta.9 → 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 +49 -70
  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 +10 -10
  37. package/src/components/CartList.astro +11 -28
  38. package/src/components/CartSummary.astro +11 -14
  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
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  import type { ComponentProps, HTMLAttributes } from 'astro/types'
3
3
  import Element from 'fulldev-ui/components/Element.astro'
4
- import Logo from 'fulldev-ui/components/experimental/Logo.astro'
4
+ import Logo from 'fulldev-ui/components/Logo.astro'
5
5
  import Menu from 'fulldev-ui/components/Menu.astro'
6
- import ThemeSelect from 'fulldev-ui/components/ThemeSelect.astro'
6
+ import Themer from 'fulldev-ui/components/Themer.astro'
7
7
  import type { GlobalProps } from 'fulldev-ui/types/global-props'
8
8
  import Heading from './Heading.astro'
9
9
  import Toc from './Toc.astro'
@@ -15,7 +15,8 @@ interface Props extends GlobalProps, HTMLAttributes<'aside'> {
15
15
  logo?: ComponentProps<typeof Logo>
16
16
  toc?: ComponentProps<typeof Toc>['heading']
17
17
  company?: ComponentProps<typeof Logo>['company']
18
- themeselect?: boolean | undefined
18
+ themer?: boolean | undefined
19
+ size?: 'sm' | 'md' | 'lg' | undefined
19
20
  }
20
21
 
21
22
  const {
@@ -23,10 +24,10 @@ const {
23
24
  logo,
24
25
  company,
25
26
  render,
26
- themeselect,
27
27
  menu,
28
28
  toc,
29
29
  heading,
30
+ themer,
30
31
  ...rest
31
32
  } = Astro.props
32
33
  ---
@@ -43,6 +44,7 @@ const {
43
44
  >
44
45
  <Logo
45
46
  {company}
47
+ {size}
46
48
  {...logo}
47
49
  />
48
50
  <Heading
@@ -52,49 +54,40 @@ const {
52
54
  <slot name="header" />
53
55
  </Element>
54
56
  <Element class:list="sidebar-content">
55
- <Menu groups={menu} />
56
- <ThemeSelect if={themeselect} />
57
+ <Menu
58
+ groups={menu}
59
+ {size}
60
+ />
61
+ <Themer
62
+ if={themer}
63
+ {size}
64
+ />
57
65
  <slot />
58
66
  </Element>
59
67
  </Element>
60
68
 
61
- <style lang="scss" is:global>
69
+ <style is:global>
62
70
  @layer fulldev {
63
71
  .sidebar {
64
- display: none;
72
+ @apply sticky bottom-0 z-10 hidden h-full flex-col items-start justify-start bg-background lg:flex;
65
73
 
66
- @media (min-width: 1024px) {
67
- display: flex;
68
- position: sticky;
69
- top: var(--header-height, 0px);
70
- bottom: 0;
71
- flex-shrink: 0;
72
- flex-direction: column;
73
- justify-content: flex-start;
74
- z-index: 10;
75
- border-right: 1px solid var(--color-a6);
76
- width: calc(var(--space-7) * 4);
77
- height: calc(100vh - var(--header-height, 0px));
74
+ --height: calc(var(--header-height, 0px) + var(--subheader-height, 0px));
75
+ top: var(--height);
76
+ width: var(--sidebar-width);
77
+ max-height: calc(100vh - var(--height));
78
78
 
79
- .sidebar-header {
80
- display: flex;
81
- position: sticky;
82
- align-items: center;
83
- border-bottom: 1px solid var(--color-a6);
84
- padding: 0 var(--gutter);
85
- width: 100%;
86
- height: 56px;
87
- }
79
+ &,
80
+ & ~ * {
81
+ --sidebar-width: 13rem;
82
+ }
83
+
84
+ .sidebar-header {
85
+ @apply sticky flex h-14 w-full items-center px-gutter py-6;
86
+ }
88
87
 
89
- .sidebar-content {
90
- display: flex;
91
- top: 0;
92
- flex: 1;
93
- flex-direction: column;
94
- padding: var(--space-md-6) var(--gutter);
95
- width: 100%;
96
- overflow-y: auto;
97
- }
88
+ .sidebar-content {
89
+ @apply flex w-full flex-1 flex-col items-start gap-7 overflow-y-auto px-gutter pb-14 pt-6 first:pt-14;
90
+ @apply scrollbar scrollbar-track-transparent scrollbar-thumb-accent scrollbar-thumb-rounded-full scrollbar-w-2 hover:scrollbar-thumb-accent-hover;
98
91
  }
99
92
  }
100
93
  }
@@ -4,7 +4,7 @@ import Button from 'fulldev-ui/components/Button.astro'
4
4
 
5
5
  interface Props extends ComponentProps<typeof Button> {}
6
6
 
7
- const { variant = 'secondary', icon, href } = Astro.props
7
+ const { variant = 'secondary', icon, href, ...rest } = Astro.props
8
8
 
9
9
  const platform = () => {
10
10
  if (typeof href !== 'string') return
@@ -16,6 +16,7 @@ const platform = () => {
16
16
  if (href.includes('tiktok')) return 'brand-tiktok'
17
17
  if (href.includes('twitch')) return 'brand-twitch'
18
18
  if (href.includes('github')) return 'brand-github'
19
+ if (href.includes('discord')) return 'brand-discord'
19
20
  return undefined
20
21
  }
21
22
  ---
@@ -25,11 +26,5 @@ const platform = () => {
25
26
  icon={icon ?? platform()}
26
27
  {variant}
27
28
  {href}
29
+ {...rest}
28
30
  />
29
-
30
- <style is:global lang="scss">
31
- .social {
32
- padding: 0 var(--space-3);
33
- height: calc(var(--text-2) + 2 * var(--space-3));
34
- }
35
- </style>
@@ -9,29 +9,33 @@ interface Props extends GlobalProps, HTMLAttributes<'div'> {
9
9
  socials?: ComponentProps<typeof Social>['href'][] | undefined
10
10
  }
11
11
 
12
- const { socials, variant, ...rest } = Astro.props
12
+ const { variant = 'ghost', socials, size, ...rest } = Astro.props
13
13
  ---
14
14
 
15
15
  <Element
16
16
  class:list="socials"
17
+ {variant}
17
18
  {...rest}
18
19
  >
19
20
  {
20
21
  socials?.map((social) => (
21
22
  <Social
22
23
  {variant}
24
+ {size}
23
25
  href={social}
24
26
  />
25
27
  ))
26
28
  }
27
29
  </Element>
28
30
 
29
- <style is:global lang="scss">
31
+ <style is:global>
30
32
  @layer fulldev {
31
33
  .socials {
32
- display: flex;
33
- flex-wrap: wrap;
34
- gap: var(--space-2);
34
+ @apply flex gap-2;
35
+
36
+ &.variant-ghost {
37
+ @apply gap-0;
38
+ }
35
39
  }
36
40
  }
37
41
  </style>
@@ -0,0 +1,59 @@
1
+ ---
2
+ import type { ComponentProps, HTMLAttributes } from 'astro/types'
3
+ import Element from 'fulldev-ui/components/Element.astro'
4
+ import Links from 'fulldev-ui/components/Links.astro'
5
+ import type { GlobalProps } from 'fulldev-ui/types/global-props'
6
+
7
+ interface Props extends GlobalProps, HTMLAttributes<'header'> {
8
+ dark?: boolean | undefined
9
+ size?: 'sm' | 'md' | 'lg' | undefined
10
+ links?: ComponentProps<typeof Links>['links']
11
+ }
12
+
13
+ const { size = 'sm', links, ...rest } = Astro.props
14
+ ---
15
+
16
+ <Element
17
+ class:list={['subheader']}
18
+ as="subheader"
19
+ {size}
20
+ {...rest}
21
+ >
22
+ <Element class:list="subheader-container">
23
+ <Links
24
+ class:list="subheader-links"
25
+ {size}
26
+ {links}
27
+ />
28
+ </Element>
29
+ </Element>
30
+
31
+ <style is:global>
32
+ @layer fulldev {
33
+ .subheader {
34
+ @apply sticky left-0 top-0 z-20 flex h-11 items-center overflow-hidden bg-card max-lg:hidden;
35
+
36
+ top: var(--header-height);
37
+
38
+ .subheader-container {
39
+ @apply container flex w-full items-center gap-6;
40
+ }
41
+
42
+ .subheader-links {
43
+ @apply w-full justify-between;
44
+ }
45
+
46
+ &,
47
+ & ~ * {
48
+ --subheader-height: 2.75rem;
49
+ }
50
+
51
+ @media (max-width: 1023.999px) {
52
+ &,
53
+ & ~ * {
54
+ --subheader-height: 0px;
55
+ }
56
+ }
57
+ }
58
+ }
59
+ </style>
@@ -1,48 +1,91 @@
1
1
  ---
2
- import type { HTMLAttributes } from 'astro/types'
2
+ import type { ComponentProps, HTMLAttributes } from 'astro/types'
3
3
  import Element from 'fulldev-ui/components/Element.astro'
4
4
  import Label from 'fulldev-ui/components/Label.astro'
5
5
  import type { GlobalProps } from 'fulldev-ui/types/global-props'
6
6
 
7
- interface Props extends GlobalProps, HTMLAttributes<'div'> {
8
- true?: string | undefined
9
- false?: string | undefined
10
- trueLabel?: string | undefined
11
- falseLabel?: string | undefined
12
- name: string
13
- checked: boolean
7
+ interface Props extends GlobalProps, Omit<HTMLAttributes<'input'>, 'type'> {
8
+ label?: ComponentProps<typeof Label>['text']
14
9
  }
15
10
 
16
- const { name, checked, trueLabel, falseLabel, ...rest } = Astro.props
11
+ const { label, name = label, id = name, size = 'md', ...rest } = Astro.props
17
12
  ---
18
13
 
19
14
  <Element
20
15
  class:list="switch"
21
- {...rest}
16
+ as="label"
17
+ for={id}
18
+ {size}
22
19
  >
23
- <Label
24
- for={name}
25
- set:html={falseLabel}
20
+ <Element
21
+ class:list="switch-input"
22
+ as="input"
23
+ type="checkbox"
24
+ if={id}
25
+ {id}
26
+ {name}
27
+ {...rest}
28
+ />
29
+ <Element
30
+ as="label"
31
+ for={id}
32
+ if={id}
33
+ class="switch-mark"
26
34
  />
27
- <label
28
- for={name}
29
- class="switch-element"
30
- >
31
- <input
32
- {checked}
33
- name={name}
34
- type="checkbox"
35
- class="checkbox"
36
- />
37
- <div class="checkmark"></div>
38
- </label>
39
35
  <Label
40
- for={name}
41
- set:html={trueLabel}
36
+ for={id}
37
+ text={label}
38
+ {size}
42
39
  />
43
40
  </Element>
44
41
 
45
- <style is:global lang="scss">
42
+ <style is:global>
43
+ @layer fulldev {
44
+ .switch {
45
+ @apply flex items-center gap-2;
46
+
47
+ .switch-input {
48
+ @apply hidden opacity-0;
49
+ }
50
+
51
+ .switch-mark {
52
+ @apply relative block cursor-pointer rounded-full bg-input transition;
53
+
54
+ &::before {
55
+ @apply block h-full w-1/2 rounded-full border-2 border-input bg-background transition content-[''];
56
+ }
57
+ }
58
+
59
+ .switch-input:checked ~ .switch-mark {
60
+ @apply bg-primary;
61
+
62
+ &::before {
63
+ @apply translate-x-full border-primary;
64
+ }
65
+ }
66
+
67
+ &.size-sm {
68
+ .switch-mark {
69
+ @apply h-5 w-10;
70
+ }
71
+ }
72
+
73
+ &.size-md {
74
+ .switch-mark {
75
+ @apply h-6 w-12;
76
+ }
77
+ }
78
+
79
+ &.size-lg {
80
+ .switch-mark {
81
+ @apply h-7 w-14;
82
+ }
83
+ }
84
+ }
85
+ }
86
+ </style>
87
+
88
+ <!-- <style is:global>
46
89
  @layer fulldev {
47
90
  .switch {
48
91
  display: flex;
@@ -105,4 +148,4 @@ const { name, checked, trueLabel, falseLabel, ...rest } = Astro.props
105
148
  }
106
149
  }
107
150
  }
108
- </style>
151
+ </style> -->
@@ -41,7 +41,7 @@ const { header, body, footer, ...rest } = Astro.props
41
41
  </Element>
42
42
  </Element>
43
43
 
44
- <style is:global lang="scss">
44
+ <style is:global >
45
45
  @layer fulldev {
46
46
  .table {
47
47
  box-shadow: 0 0 0 1px var(--color-6);
@@ -1,32 +1,60 @@
1
1
  ---
2
- import type { HTMLAttributes } from 'astro/types'
2
+ import type { ComponentProps, HTMLAttributes, HTMLTag } from 'astro/types'
3
+ import type { CollectionEntry } from 'astro:content'
4
+ import { getEntry } from 'astro:content'
5
+ import Avatar from 'fulldev-ui/components/Avatar.astro'
3
6
  import Element from 'fulldev-ui/components/Element.astro'
7
+ import Icon from 'fulldev-ui/components/Icon.astro'
4
8
  import type { GlobalProps } from 'fulldev-ui/types/global-props'
5
9
 
6
- interface Props extends GlobalProps, HTMLAttributes<'span'> {
10
+ interface Props
11
+ extends GlobalProps,
12
+ HTMLAttributes<'span'>,
13
+ HTMLAttributes<'a'> {
14
+ as?: HTMLTag
15
+ icon?: ComponentProps<typeof Icon>['name']
16
+ avatar?: ComponentProps<typeof Avatar>['src']
17
+ slug?: CollectionEntry<'pages'>['slug'] | undefined
18
+ size?: 'sm' | 'md' | 'lg' | undefined
7
19
  text?: string | undefined
20
+ variant?: 'secondary' | 'outline' | 'link' | undefined
8
21
  }
9
22
 
10
- const { text, ...rest } = Astro.props
23
+ const {
24
+ slug,
25
+ href = slug === 'index' ? '/' : slug ? `/${slug}/` : undefined,
26
+ text = slug ? (await getEntry('pages', slug)).data.title : undefined,
27
+ as = href ? 'a' : 'a',
28
+ target = href?.toString().startsWith('http') ? '_blank' : undefined,
29
+ icon,
30
+ ...rest
31
+ } = Astro.props
11
32
  ---
12
33
 
13
34
  <Element
14
- class:list="tagline"
15
- as="span"
35
+ class:list={'tagline'}
36
+ {href}
37
+ {as}
38
+ {target}
16
39
  {...rest}
17
40
  >
18
41
  <slot />
19
- <Fragment set:text={text} />
42
+ <Icon name={icon} />
43
+ <Fragment set:html={text} />
20
44
  </Element>
21
45
 
22
- <style is:global lang="scss">
46
+ <style is:global>
23
47
  @layer fulldev {
24
48
  .tagline {
25
- color: var(--color-11);
26
- font-size: var(--text-2);
27
- line-height: 1;
28
- text-align: left;
29
- white-space: nowrap;
49
+ @apply text-primary font-semibold;
50
+
51
+ &.size-sm {
52
+ @apply text-sm;
53
+ }
54
+
55
+ &.size-lg {
56
+ @apply text-lg;
57
+ }
30
58
  }
31
59
  }
32
60
  </style>
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  import type { HTMLAttributes } from 'astro/types'
3
3
  import Element from 'fulldev-ui/components/Element.astro'
4
- import type { GlobalProps } from 'fulldev-ui/types/global-props'
5
4
 
6
- interface Props extends GlobalProps, HTMLAttributes<'p'> {
5
+ interface Props extends HTMLAttributes<'p'> {
7
6
  size?: 'sm' | 'md' | 'lg' | undefined
8
7
  color?: 'base' | 'brand' | undefined
9
8
  theme?: 'light' | 'dark' | undefined
10
9
  contrast?: boolean | undefined
11
10
  lead?: boolean | undefined
12
11
  text?: string | undefined
12
+ if?: any
13
13
  }
14
14
 
15
15
  const { color = 'base', text, ...rest } = Astro.props
@@ -22,10 +22,10 @@ const { color = 'base', text, ...rest } = Astro.props
22
22
  {...rest}
23
23
  >
24
24
  <slot />
25
- <Fragment set:text={text} />
25
+ <Fragment set:html={text} />
26
26
  </Element>
27
27
 
28
- <style is:global lang="scss">
28
+ <style is:global>
29
29
  @layer fulldev {
30
30
  .text {
31
31
  margin: 0;
@@ -9,83 +9,73 @@ interface Props extends GlobalProps, HTMLAttributes<'textarea'> {
9
9
  }
10
10
 
11
11
  const {
12
- placeholder,
13
- name = placeholder,
14
12
  label,
15
- rows,
16
- value,
17
- disabled,
18
- required,
13
+ placeholder,
14
+ name = label || placeholder,
15
+ id = name,
16
+ size = 'md',
17
+ rows = 3,
19
18
  ...rest
20
19
  } = Astro.props
21
20
  ---
22
21
 
23
22
  <Element
24
23
  class:list="textarea"
25
- {...rest}
24
+ as="label"
25
+ for={id}
26
+ {size}
26
27
  >
27
28
  <Label
28
29
  for={name}
29
- set:html={label}
30
+ text={label}
31
+ {size}
30
32
  />
31
33
  <Element
34
+ class:list="textarea-textarea"
32
35
  as="textarea"
33
- if={name}
34
- id={name}
36
+ if={id}
37
+ {id}
35
38
  {name}
36
39
  {placeholder}
37
- {value}
38
- {disabled}
39
- {required}
40
40
  {rows}
41
+ {...rest}
41
42
  />
42
43
  </Element>
43
44
 
44
- <style is:global lang="scss">
45
- @layer fulldev {
45
+ <style is:global>
46
+ @layer textarea {
46
47
  .textarea {
47
- display: flex;
48
- position: relative;
49
- flex-direction: column;
50
- gap: var(--space-1);
51
- width: 100%;
48
+ @apply relative flex flex-col gap-1.5;
52
49
 
53
- textarea {
54
- display: flex;
55
- position: relative;
56
- align-items: center;
57
- outline: none;
58
- border: 1px solid var(--color-6);
59
- border-radius: var(--radius-1);
60
- background-color: transparent;
61
- padding: var(--space-4);
62
- width: 100%;
63
- height: calc((var(--text-2) + 2 * var(--space-4)) * 2);
64
- min-height: calc((var(--text-2) + 2 * var(--space-4)) * 2);
65
- resize: vertical;
66
- color: var(--color-11);
67
- font-weight: 400;
68
- font-size: var(--text-2);
69
- line-height: 1.25;
50
+ .textarea-textarea {
51
+ @apply flex w-full resize-y rounded-md border border-input bg-background text-sm ring-offset-background;
52
+ @apply file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground;
53
+ @apply focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2;
54
+ @apply disabled:pointer-events-none disabled:opacity-50;
55
+ @apply [&[readonly]]:pointer-events-none;
56
+ }
70
57
 
71
- &::placeholder {
72
- color: var(--color-11);
73
- }
58
+ &.size-sm {
59
+ @apply gap-1;
74
60
 
75
- &:hover {
76
- outline: none;
61
+ .textarea-textarea {
62
+ @apply min-h-9 px-2.5 py-1.5 text-xs;
77
63
  }
64
+ }
65
+
66
+ &.size-md {
67
+ @apply gap-1.5;
78
68
 
79
- &:focus {
80
- outline: none;
81
- box-shadow: inset 0 0 0 2px var(--color-7);
82
- border-color: var(--color-7);
69
+ .textarea-textarea {
70
+ @apply min-h-10 px-3 py-2 text-sm;
83
71
  }
72
+ }
73
+
74
+ &.size-lg {
75
+ @apply gap-2;
84
76
 
85
- &:disabled {
86
- opacity: 50%;
87
- cursor: not-allowed;
88
- pointer-events: none;
77
+ .textarea-textarea {
78
+ @apply min-h-12 px-3.5 py-2.5 text-base;
89
79
  }
90
80
  }
91
81
  }
@@ -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>