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
@@ -1,56 +1,86 @@
1
1
  ---
2
- import type { ComponentProps, HTMLAttributes } from 'astro/types'
2
+ import type { ComponentProps, HTMLAttributes, HTMLTag } from 'astro/types'
3
3
  import Button from 'fulldev-ui/components/Button.astro'
4
4
  import Buttons from 'fulldev-ui/components/Buttons.astro'
5
5
  import type Card from 'fulldev-ui/components/Card.astro'
6
6
  import Cards from 'fulldev-ui/components/Cards.astro'
7
7
  import Element from 'fulldev-ui/components/Element.astro'
8
+ import Heading from 'fulldev-ui/components/Heading.astro'
8
9
  import Image from 'fulldev-ui/components/Image.astro'
9
- import Writeup from 'fulldev-ui/components/Writeup.astro'
10
- import type { GlobalProps } from 'fulldev-ui/types/global-props.js'
10
+ import Badge from './Badge.astro'
11
+ import Lead from './Lead.astro'
12
+ import List from './List.astro'
13
+ import Paragraph from './Paragraph.astro'
14
+ import Price from './Price.astro'
15
+ import Rating from './Rating.astro'
16
+ import Tagline from './Tagline.astro'
11
17
 
12
- interface Props
13
- extends GlobalProps,
14
- ComponentProps<typeof Writeup>,
15
- HTMLAttributes<'section'> {
18
+ interface Props extends HTMLAttributes<'section'> {
19
+ as?: HTMLTag
20
+ size?: 'sm' | 'md' | 'lg' | undefined
16
21
  image?: ComponentProps<typeof Image>
17
- position?: ComponentProps<typeof Image>['position']
18
22
  buttons?: ComponentProps<typeof Buttons>['buttons']
19
23
  button?: ComponentProps<typeof Button> | undefined
20
24
  variant?: ComponentProps<typeof Button>['variant']
21
25
  cards?: ComponentProps<typeof Cards>['cards']
22
26
  panel?: ComponentProps<typeof Card>['panel']
23
27
  component?: string
28
+ heading?: any
29
+ background?: any
30
+ lead?: any
31
+ rating?: any
32
+ tagline?: any
33
+ badge?: any
34
+ level?: any
35
+ paragraph?: any
36
+ dark?: boolean
37
+ list?: any
38
+ price?: any
39
+ center?: boolean
40
+ inset?: boolean
41
+ reverse?: boolean
42
+ frame?: 'fill' | 'panel' | 'viewport' | undefined
43
+ position?: 'contain' | 'inset' | 'background' | undefined
24
44
  structure?:
25
- | ComponentProps<typeof Cards>['structure']
26
- | 'column'
27
- | 'split'
45
+ | 'left'
46
+ | 'center'
28
47
  | 'spread'
48
+ | 'split'
49
+ | 'grid'
50
+ | 'masonry'
51
+ | 'carousel'
52
+ | 'stack'
53
+ | undefined
29
54
  }
30
55
 
56
+ const { component, ...props } = Astro.props
57
+
31
58
  const {
32
- cards,
33
- structure = cards ? 'grid' : 'column',
34
- align = 'start',
35
- level = 2,
59
+ as = 'section',
36
60
  size = 'md',
37
- badge,
38
- tagline,
61
+ variant = 'secondary',
62
+ structure = 'left',
63
+ inset = false,
64
+ panel = false,
65
+ reverse = false,
66
+ dark = false,
67
+ frame = 'viewport',
68
+ position = 'background',
69
+ level = 2,
39
70
  rating,
71
+ tagline,
72
+ badge,
40
73
  heading,
41
- text,
74
+ lead,
75
+ paragraph,
42
76
  list,
43
- button,
77
+ price,
44
78
  buttons,
45
- variant,
46
- panel,
47
79
  image,
48
- theme,
49
- position,
80
+ background,
81
+ cards,
50
82
  ...rest
51
- } = Astro.props
52
-
53
- const { component, ...props } = Astro.props
83
+ } = props
54
84
 
55
85
  const allComponents = {
56
86
  ...import.meta.glob('/src/**/*.astro'),
@@ -63,6 +93,8 @@ const componentPath = Object.keys(allComponents).find(
63
93
 
64
94
  const Component =
65
95
  componentPath && (await (allComponents[componentPath] as any)()).default
96
+
97
+ const hasCards = cards && cards.length > 0
66
98
  ---
67
99
 
68
100
  {
@@ -71,182 +103,188 @@ const Component =
71
103
  ) : (
72
104
  <Element
73
105
  class:list="section"
74
- as="section"
75
- panel={!cards && panel}
76
- theme={cards ? undefined : theme}
77
- structure={
78
- structure === 'grid' ||
79
- structure === 'carousel' ||
80
- structure === 'stack'
81
- ? text
82
- ? 'column'
83
- : 'spread'
84
- : structure
85
- }
86
- {align}
106
+ panel={hasCards ? undefined : panel}
107
+ {as}
87
108
  {size}
109
+ {structure}
110
+ {inset}
111
+ {reverse}
112
+ {dark}
113
+ {position}
114
+ {frame}
88
115
  {...rest}
89
116
  >
90
- <Element class:list="segment">
91
- <slot name="segment">
92
- <slot name="writeup">
93
- <Writeup
117
+ <Element class:list="section-container">
118
+ <Element class:list="section-segment">
119
+ <Element class:list="section-content">
120
+ <Rating
121
+ {size}
122
+ {...rating}
123
+ />
124
+ <Tagline
125
+ text={tagline}
126
+ {size}
127
+ />
128
+ <Badge
129
+ {size}
130
+ {...badge}
131
+ />
132
+ <Heading
133
+ text={heading}
134
+ {size}
94
135
  {level}
95
- {rating}
96
- {badge}
97
- {tagline}
98
- {heading}
99
- {text}
100
- {list}
101
136
  />
102
- </slot>
103
- <slot name="buttons">
104
- <Button
105
- {variant}
106
- {...button}
137
+ <Lead
138
+ text={lead}
139
+ {size}
107
140
  />
108
- <Buttons
109
- {variant}
110
- {buttons}
141
+ <Paragraph
142
+ text={paragraph}
143
+ {size}
111
144
  />
112
- </slot>
113
- </slot>
114
- </Element>
115
- <slot>
145
+ <List
146
+ items={list}
147
+ {size}
148
+ />
149
+ <Price
150
+ value={price}
151
+ {size}
152
+ />
153
+ <slot name="content" />
154
+ </Element>
155
+ <Buttons
156
+ {size}
157
+ {variant}
158
+ {buttons}
159
+ />
160
+ <slot name="segment" />
161
+ </Element>
162
+ <Image {...image} />
116
163
  <Cards
117
- level={(level + 2) as any}
118
- size={size === 'lg' ? 'md' : 'sm'}
119
- structure={
120
- structure === 'grid' ||
121
- structure === 'masonry' ||
122
- structure === 'stack' ||
123
- structure === 'carousel' ||
124
- structure === 'bento'
125
- ? structure
126
- : undefined
127
- }
128
- position={cards ? position : undefined}
129
- {theme}
164
+ {size}
165
+ {level}
130
166
  {cards}
131
- {panel}
132
- {position}
133
- />
134
- <Image
135
- position={cards ? undefined : position}
136
- {...image}
137
167
  />
138
- </slot>
168
+ <slot />
169
+ </Element>
139
170
  </Element>
140
171
  )
141
172
  }
142
173
 
143
- <style is:global lang="scss">
174
+ <style is:global>
144
175
  @layer fulldev {
145
176
  .section {
146
- --inset-top: 0px;
147
- --inset-left: var(--gutter);
148
- --inset-right: var(--gutter);
149
- --inset-bottom: var(--spacer);
150
-
151
- display: flex;
152
- position: relative;
153
- flex-direction: column;
154
- align-items: flex-start;
155
- gap: var(--space-6) var(--space-7);
156
- padding: var(--spacer) var(--gutter);
157
-
158
- .segment {
159
- display: flex;
160
- flex-direction: column;
161
- align-items: flex-start;
162
- gap: var(--space-5);
163
- z-index: 1;
177
+ @apply relative flex w-full items-center pb-28 pt-14 first:pt-0;
178
+
179
+ .section-container {
180
+ @apply container z-10 w-full;
164
181
  }
165
182
 
166
- &.panel {
167
- margin: var(--spacer) var(--gutter);
168
- border: 1px solid var(--base-a6);
169
- border-radius: var(--radius-2);
170
- background-color: var(--base-2);
171
- padding: min(var(--gutter), var(--spacer));
172
- overflow: hidden;
183
+ .section-segment {
184
+ @apply z-10 gap-8 py-16;
173
185
  }
174
186
 
175
- &.reverse {
176
- --inset-top: var(--spacer);
177
- --inset-left: var(--gutter);
178
- --inset-right: var(--gutter);
179
- --inset-bottom: 0px;
187
+ .section-content {
188
+ @apply max-w-screen-md gap-6;
189
+ }
180
190
 
181
- &:not(.structure-split) {
182
- .segment {
183
- order: 999;
184
- }
191
+ &.frame-fill {
192
+ @apply pb-28 pt-14 first:pt-0;
193
+ }
194
+
195
+ &.frame-viewport {
196
+ @apply min-h-screen pb-28 pt-14;
197
+
198
+ .section-container {
199
+ @apply justify-center;
185
200
  }
201
+ }
186
202
 
187
- @media (min-width: 1024px) {
188
- .segment {
189
- order: 999;
190
- }
203
+ &.frame-panel {
204
+ @apply px-gutter first:pt-gutter;
205
+
206
+ .section-container {
207
+ @apply relative overflow-hidden rounded-lg border bg-card;
208
+ }
209
+ }
210
+
211
+ &.position-contain {
212
+ .image {
213
+ @apply h-auto w-full object-contain;
214
+ }
215
+ }
216
+
217
+ &.position-background {
218
+ .image {
219
+ @apply absolute inset-0 h-full max-h-none w-full max-w-none object-cover opacity-30;
191
220
  }
192
221
  }
193
222
 
194
- &.structure-column {
195
- display: flex;
196
- flex-direction: column;
223
+ &.position-inset {
224
+ .section-container {
225
+ @apply px-0;
226
+ }
197
227
 
198
- &.align-center {
199
- align-items: center;
228
+ .section-segment {
229
+ @apply px-gutter;
230
+ }
200
231
 
201
- .segment {
202
- align-items: center;
203
- text-align: center;
204
- }
232
+ .image {
233
+ @apply h-auto w-full object-cover;
205
234
  }
206
235
  }
207
236
 
208
- &.structure-split {
209
- display: grid;
210
- grid-template-columns: 1fr;
211
- width: 100%;
237
+ &.dark {
238
+ @apply bg-background;
239
+ }
212
240
 
213
- @media (min-width: 1024px) {
214
- --inset-top: var(--spacer);
215
- --inset-left: 0px;
216
- --inset-right: var(--gutter);
217
- --inset-bottom: var(--spacer);
241
+ &.structure-left {
242
+ .section-container,
243
+ .section-segment,
244
+ .section-content {
245
+ @apply flex flex-col items-start;
246
+ }
247
+ }
218
248
 
219
- grid-auto-columns: 1fr;
220
- grid-auto-flow: column;
249
+ &.structure-center {
250
+ .section-container,
251
+ .section-segment,
252
+ .section-content {
253
+ @apply flex flex-col items-center text-center;
254
+ }
255
+ }
221
256
 
222
- &.reverse {
223
- --inset-right: 0px;
224
- --inset-left: var(--gutter);
225
- }
257
+ &.structure-split {
258
+ .section-container {
259
+ @apply grid auto-cols-fr gap-x-14 lg:grid-flow-col lg:items-center;
226
260
  }
227
261
 
228
- &.align-center {
229
- align-items: center;
262
+ .section-segment,
263
+ .section-content {
264
+ @apply flex flex-col items-start;
230
265
  }
231
266
  }
232
267
 
233
268
  &.structure-spread {
234
- display: flex;
235
- flex-direction: column;
269
+ .section-container {
270
+ @apply flex flex-col;
271
+ }
236
272
 
237
- .segment {
238
- flex-direction: row;
239
- justify-content: space-between;
240
- width: 100%;
273
+ .section-segment {
274
+ @apply flex w-full flex-row flex-wrap items-end justify-between;
241
275
  }
276
+ }
242
277
 
243
- &.align-center {
244
- .segment {
245
- align-items: center;
278
+ &.reverse {
279
+ &:not(.structure-split) {
280
+ .section-segment {
281
+ @apply order-last;
282
+ }
283
+ }
246
284
 
247
- .writeup {
248
- align-items: flex-start;
249
- }
285
+ @media (min-width: 1024px) {
286
+ .section-segment {
287
+ @apply order-last;
250
288
  }
251
289
  }
252
290
  }
@@ -15,34 +15,36 @@ interface Props extends GlobalProps, HTMLAttributes<'select'> {
15
15
  const {
16
16
  label,
17
17
  placeholder,
18
+ name = label || placeholder,
19
+ id = name,
20
+ size = 'md',
18
21
  options,
19
22
  value,
20
- name,
21
- required,
22
- disabled,
23
- onchange,
24
23
  ...rest
25
24
  } = Astro.props
26
25
  ---
27
26
 
28
27
  <Element
29
28
  class:list="select"
30
- {...rest}
29
+ as="label"
30
+ for={id}
31
+ {size}
31
32
  >
32
33
  <Label
33
34
  for={name}
34
35
  text={label}
35
36
  />
37
+ <Icon name="chevron-down" />
36
38
  <Element
39
+ class:list="select-select"
37
40
  as="select"
38
- if={name || options}
39
- id={name}
41
+ if={id}
42
+ {id}
40
43
  {name}
41
- {required}
42
- {disabled}
43
- {onchange}
44
+ {...rest}
44
45
  >
45
46
  <Element
47
+ class:list="select-option"
46
48
  as="option"
47
49
  value={placeholder}
48
50
  set:html={placeholder}
@@ -52,6 +54,7 @@ const {
52
54
  {
53
55
  options?.map((option: any) => (
54
56
  <Element
57
+ class:list="select-option"
55
58
  as="option"
56
59
  selected={value === option}
57
60
  set:html={option}
@@ -61,67 +64,53 @@ const {
61
64
  }
62
65
  <slot />
63
66
  </Element>
64
- <Icon name="chevron-down" />
65
67
  </Element>
66
68
 
67
- <style is:global lang="scss">
69
+ <style is:global>
68
70
  @layer fulldev {
69
71
  .select {
70
- display: flex;
71
- position: relative;
72
- flex-direction: column;
73
- gap: var(--space-1);
74
- width: 100%;
72
+ @apply relative flex flex-col gap-1.5;
75
73
 
76
74
  .icon {
77
- position: absolute;
78
- right: var(--space-4);
79
- bottom: var(--space-4);
80
- width: var(--text-2);
81
- height: var(--text-2);
82
- pointer-events: none;
75
+ @apply pointer-events-none absolute;
83
76
  }
84
77
 
85
- select {
86
- display: flex;
87
- position: relative;
88
- align-items: center;
89
- appearance: none;
90
- appearance: none;
91
- outline: none;
92
- border: 1px solid var(--color-6);
93
- border-radius: var(--radius-1);
94
- background-color: transparent;
95
- padding-right: calc(var(--text-2) + 2 * var(--space-4));
96
- padding-left: var(--space-4);
97
- width: 100%;
98
- min-width: var(--space-4);
99
- height: calc(var(--text-2) + 2 * var(--space-4));
100
- color: var(--color-11);
101
- font-size: var(--text-2);
102
- line-height: 1.25;
78
+ .select-select {
79
+ @apply flex w-full appearance-none rounded-md border border-input bg-background pr-10 text-sm ring-offset-background;
80
+ @apply file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground;
81
+ @apply focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2;
82
+ @apply disabled:pointer-events-none disabled:opacity-50;
83
+ @apply [&[readonly]]:pointer-events-none;
84
+ }
103
85
 
104
- &:hover {
105
- outline: none;
86
+ &.size-sm {
87
+ .select-select {
88
+ @apply h-9 px-2.5 py-1.5 pr-9 text-xs;
106
89
  }
107
90
 
108
- &:focus {
109
- outline: none;
110
- box-shadow: inset 0 0 0 2px var(--color-7);
111
- border-color: var(--color-7);
91
+ .icon {
92
+ @apply bottom-2 right-2;
112
93
  }
94
+ }
113
95
 
114
- &:disabled {
115
- opacity: 50%;
116
- cursor: not-allowed;
117
- pointer-events: none;
96
+ &.size-md {
97
+ .select-select {
98
+ @apply h-10 px-3 py-2 pr-10 text-sm;
99
+ }
100
+
101
+ .icon {
102
+ @apply bottom-2.5 right-2.5;
118
103
  }
119
104
  }
120
105
 
121
- option {
122
- color: var(--text);
123
- font-size: var(--text-2);
124
- line-height: 1;
106
+ &.size-lg {
107
+ .select-select {
108
+ @apply h-12 px-3.5 py-2.5 pr-11 text-base;
109
+ }
110
+
111
+ .icon {
112
+ @apply bottom-3.5 right-3.5;
113
+ }
125
114
  }
126
115
  }
127
116
  }