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.
- package/.env.example +3 -0
- package/.prettierrc.yaml +1 -0
- package/astro.config.ts +6 -32
- package/package.json +21 -30
- package/pnpm-lock.yaml +696 -2176
- package/public/favicon/android-chrome-192x192.png +0 -0
- package/public/favicon/android-chrome-512x512.png +0 -0
- package/public/favicon/apple-touch-icon.png +0 -0
- package/public/favicon/manifest.webmanifest +7 -3
- package/public/favicon/mstile-150x150.png +0 -0
- package/src/blocks/Banner.astro +6 -19
- package/src/blocks/Colleagues.astro +0 -1
- package/src/blocks/Contact.astro +75 -74
- package/src/blocks/Content.astro +124 -6
- package/src/blocks/Cta.astro +0 -2
- package/src/blocks/Excerpt.astro +0 -2
- package/src/blocks/Footer.astro +107 -3
- package/src/blocks/Hero.astro +238 -9
- package/src/blocks/Intro.astro +89 -11
- package/src/blocks/Prices.astro +1 -1
- package/src/blocks/Product.astro +51 -68
- package/src/blocks/Products.astro +114 -5
- package/src/blocks/Reviews.astro +0 -1
- package/src/blocks/_Contact.astro +112 -0
- package/src/components/Avatar.astro +28 -9
- package/src/components/Avatars.astro +36 -0
- package/src/components/Badge.astro +73 -26
- package/src/components/Badges.astro +16 -23
- package/src/components/Breadcrumb.astro +58 -0
- package/src/components/Button.astro +56 -112
- package/src/components/Buttons.astro +23 -13
- package/src/components/Card.astro +129 -115
- package/src/components/Cards.astro +33 -35
- package/src/components/Carousel.astro +106 -0
- package/src/components/Cart.astro +1 -1
- package/src/components/CartForm.astro +9 -9
- package/src/components/CartList.astro +11 -28
- package/src/components/CartSummary.astro +11 -13
- package/src/components/Channel.astro +40 -22
- package/src/components/Channels.astro +20 -6
- package/src/components/Checkbox.astro +52 -27
- package/src/components/Code.astro +52 -0
- package/src/components/Dialog.astro +2 -2
- package/src/components/Drawer.astro +34 -64
- package/src/components/Element.astro +16 -8
- package/src/components/Form.astro +14 -13
- package/src/components/Gallery.astro +172 -0
- package/src/components/Head.astro +52 -1
- package/src/components/Header.astro +73 -83
- package/src/components/Heading.astro +74 -30
- package/src/components/Icon.astro +25 -30
- package/src/components/Image.astro +23 -38
- package/src/components/Input.astro +59 -53
- package/src/components/Label.astro +20 -15
- package/src/components/Lead.astro +46 -0
- package/src/components/Link.astro +51 -26
- package/src/components/Links.astro +42 -0
- package/src/components/List.astro +41 -16
- package/src/components/LocaleSwitcher.astro +2 -2
- package/src/components/Logo.astro +45 -0
- package/src/components/Menu.astro +21 -17
- package/src/components/Paragraph.astro +38 -0
- package/src/components/Price.astro +1 -1
- package/src/components/Prose.astro +169 -0
- package/src/components/Rating.astro +50 -38
- package/src/components/Search.astro +1 -1
- package/src/components/Section.astro +196 -158
- package/src/components/Select.astro +44 -55
- package/src/components/Sidebar.astro +31 -38
- package/src/components/Social.astro +3 -8
- package/src/components/Socials.astro +9 -5
- package/src/components/Subheader.astro +59 -0
- package/src/components/Switch.astro +72 -29
- package/src/components/Table.astro +1 -1
- package/src/components/Tagline.astro +40 -12
- package/src/components/Text.astro +4 -4
- package/src/components/Textarea.astro +40 -50
- package/src/components/Themer.astro +76 -0
- package/src/components/Toc.astro +24 -32
- package/src/components/Writeup.astro +26 -8
- package/src/components/docs/PropsTable.astro +38 -264
- package/src/components/experimental/Window.astro +5 -57
- package/src/components/sections.astro +1 -1
- package/src/content/pages/blocks/_categories.mdx +1 -1
- package/src/content/pages/blocks/_footer.mdx +1 -1
- package/src/content/pages/blocks/_header.mdx +1 -3
- package/src/content/pages/blocks/_jobs.mdx +1 -1
- package/src/content/pages/blocks/_prices.mdx +1 -1
- package/src/content/pages/blocks/_product.mdx +1 -1
- package/src/content/pages/blocks/_products.mdx +1 -1
- package/src/content/pages/blocks/_stats.mdx +1 -1
- package/src/content/pages/blocks/banner.mdx +1 -1
- package/src/content/pages/blocks/colleagues.mdx +1 -2
- package/src/content/pages/blocks/contact.mdx +1 -1
- package/src/content/pages/blocks/content.mdx +1 -5
- package/src/content/pages/blocks/cta.mdx +1 -9
- package/src/content/pages/blocks/features.mdx +1 -4
- package/src/content/pages/blocks/hero.mdx +1 -4
- package/src/content/pages/blocks/intro.mdx +1 -4
- package/src/content/pages/blocks/posts.mdx +1 -1
- package/src/content/pages/blocks/reviews.mdx +1 -2
- package/src/content/pages/docs/_internationalization.mdx +55 -0
- package/src/content/pages/docs/_using-blocks.mdx +33 -0
- package/src/content/pages/docs/_using-presets.mdx +49 -0
- package/src/content/pages/docs/blocks.mdx +33 -0
- package/src/content/pages/docs/collections/images.mdx +100 -0
- package/src/content/pages/docs/collections/pages.mdx +119 -0
- package/src/content/pages/docs/collections/presets.mdx +60 -0
- package/src/content/pages/docs/collections.mdx +42 -0
- package/src/content/pages/{base/card.mdx → docs/components/_card.mdx} +1 -3
- package/src/content/pages/{base → docs/components}/_switch.mdx +2 -2
- package/src/content/pages/{typography → docs/components}/_tagline.mdx +2 -2
- package/src/content/pages/docs/components/_toggle.mdx +31 -0
- package/src/content/pages/docs/components/avatar.mdx +35 -0
- package/src/content/pages/{base → docs/components}/badge.mdx +27 -8
- package/src/content/pages/docs/components/badges.mdx +47 -0
- package/src/content/pages/{base → docs/components}/button.mdx +29 -10
- package/src/content/pages/docs/components/buttons.mdx +52 -0
- package/src/content/pages/docs/components/channel.mdx +92 -0
- package/src/content/pages/docs/components/channels.mdx +90 -0
- package/src/content/pages/{base → docs/components}/checkbox.mdx +10 -17
- package/src/content/pages/docs/components/code.mdx +46 -0
- package/src/content/pages/docs/components/heading.mdx +60 -0
- package/src/content/pages/docs/components/icon.mdx +49 -0
- package/src/content/pages/docs/components/image.mdx +26 -0
- package/src/content/pages/docs/components/input.mdx +41 -0
- package/src/content/pages/{typography → docs/components}/label.mdx +8 -4
- package/src/content/pages/docs/components/lead.mdx +51 -0
- package/src/content/pages/{typography → docs/components}/link.mdx +23 -8
- package/src/content/pages/docs/components/links.mdx +100 -0
- package/src/content/pages/docs/components/list.mdx +45 -0
- package/src/content/pages/docs/components/logo.mdx +37 -0
- package/src/content/pages/docs/components/menu.mdx +90 -0
- package/src/content/pages/docs/components/paragraph.mdx +51 -0
- package/src/content/pages/docs/components/prose.mdx +37 -0
- package/src/content/pages/docs/components/rating.mdx +77 -0
- package/src/content/pages/{base → docs/components}/section.mdx +1 -1
- package/src/content/pages/{base → docs/components}/select.mdx +0 -9
- package/src/content/pages/docs/components/social.mdx +95 -0
- package/src/content/pages/docs/components/socials.mdx +103 -0
- package/src/content/pages/docs/components/switch.mdx +35 -0
- package/src/content/pages/{base → docs/components}/table.mdx +0 -2
- package/src/content/pages/docs/components/tagline.mdx +47 -0
- package/src/content/pages/docs/components/textarea.mdx +35 -0
- package/src/content/pages/docs/components/themer.mdx +50 -0
- package/src/content/pages/docs/components.mdx +40 -0
- package/src/content/pages/docs/customization.mdx +151 -0
- package/src/content/pages/docs/frameworks.mdx +29 -0
- package/src/content/pages/docs/generating-pages.mdx +129 -0
- package/src/content/pages/docs/index.mdx +23 -0
- package/src/content/pages/docs/installation.mdx +50 -0
- package/src/content/pages/docs/layouts.mdx +33 -0
- package/src/content/pages/index.mdx +11 -9
- package/src/content/pages/showcase.mdx +4 -2
- package/src/content/presets/base.yml +80 -63
- package/src/content/presets/docs.yml +2 -2
- package/src/css/color.css +0 -10
- package/src/css/custom.css +10 -12
- package/src/css/size.css +2 -11
- package/src/css/theme.css +93 -0
- package/src/images/logo-1.svg +11 -0
- package/src/images/logo-2.svg +13 -0
- package/src/images/logo-basic.svg +10 -0
- package/src/images/logo-simple.svg +13 -0
- package/src/images/logo-thin.svg +15 -0
- package/src/images/logo.svg +14 -0
- package/src/images/logofat.svg +11 -0
- package/src/integration/index.ts +71 -144
- package/src/layouts/CategoryLayout.astro +135 -0
- package/src/layouts/Layout.astro +62 -117
- package/src/layouts/PageLayout.astro +26 -0
- package/src/layouts/PostLayout.astro +13 -8
- package/src/layouts/ProductLayout.astro +94 -10
- package/src/pages/[...page].astro +14 -22
- package/src/pages/test.astro +20 -0
- package/src/schemas/components/button.ts +21 -13
- package/src/schemas/components/card.ts +36 -18
- package/src/schemas/components/footer.ts +2 -10
- package/src/schemas/components/global.ts +16 -0
- package/src/schemas/components/header.ts +8 -0
- package/src/schemas/components/image.ts +8 -3
- package/src/schemas/components/link.ts +16 -0
- package/src/schemas/components/links.ts +4 -0
- package/src/schemas/components/menu.ts +2 -0
- package/src/schemas/components/sidebar.ts +2 -2
- package/src/schemas/components/subheader.ts +9 -0
- package/src/schemas/components/themer.ts +3 -0
- package/src/schemas/pageSchema.ts +14 -21
- package/src/utils/cart.ts +1 -10
- package/src/utils/getDeepReferenceChildren.ts +14 -0
- package/src/utils/getReferenceChildren.ts +1 -1
- package/src/utils/setTheme.ts +18 -0
- package/src/utils/slugify.ts +6 -0
- package/tailwind.config.ts +67 -0
- package/src/blocks/Article.astro +0 -40
- package/src/components/Footer.astro +0 -193
- package/src/components/ThemeSelect.astro +0 -41
- package/src/components/experimental/Form.astro +0 -53
- package/src/components/experimental/Gallery.astro +0 -104
- package/src/components/experimental/Logo.astro +0 -38
- package/src/components/experimental/Prose.astro +0 -192
- package/src/content/pages/base/icon.mdx +0 -55
- package/src/content/pages/base/image.mdx +0 -42
- package/src/content/pages/base/input.mdx +0 -56
- package/src/content/pages/base/rating.mdx +0 -55
- package/src/content/pages/base/textarea.mdx +0 -58
- package/src/content/pages/base/theme-select.mdx +0 -15
- package/src/content/pages/layouts/_layout.mdx +0 -14
- package/src/content/pages/layouts/docslayout.mdx +0 -14
- package/src/content/pages/overview/components.mdx +0 -75
- package/src/content/pages/overview/content-collections.mdx +0 -139
- package/src/content/pages/overview/frameworks.mdx +0 -198
- package/src/content/pages/overview/installation.mdx +0 -53
- package/src/content/pages/overview/introduction.mdx +0 -30
- package/src/content/pages/overview/theming.mdx +0 -69
- package/src/content/pages/schemas/page.mdx +0 -17
- package/src/content/pages/schemas/preset.mdx +0 -9
- package/src/content/pages/showcase/record.md +0 -3
- package/src/content/pages/typography/heading.mdx +0 -73
- package/src/content/pages/typography/list.mdx +0 -51
- package/src/content/pages/typography/text.mdx +0 -61
- package/src/content/presets/blocks.yml +0 -1
- package/src/css/space.css +0 -77
- package/src/css/styles.css +0 -0
- package/src/images/avatar-1.yml +0 -1
- package/src/integration/generate-colors.ts +0 -639
- package/src/integration/tailwind-plugin.ts +0 -80
- package/src/integration/unocss-preset.ts +0 -84
- package/src/layouts/BlockLayout.astro +0 -19
- package/src/layouts/ContactLayout.astro +0 -21
- package/src/layouts/DocsLayout.astro +0 -73
- package/src/layouts/OverviewLayout.astro +0 -42
- /package/src/content/pages/{base → docs/components}/_dialog.mdx +0 -0
- /package/src/content/pages/{base → docs/components}/_drawer.mdx +0 -0
- /package/src/content/pages/{base → docs/components}/_localeswitcher.mdx +0 -0
- /package/src/schemas/utils/{parents.ts → categories.ts} +0 -0
package/src/layouts/Layout.astro
CHANGED
|
@@ -1,163 +1,108 @@
|
|
|
1
1
|
---
|
|
2
2
|
import type { ComponentProps, HTMLAttributes } from 'astro/types'
|
|
3
|
-
import type { CollectionEntry } from 'astro:content'
|
|
4
|
-
import Article from 'fulldev-ui/blocks/Article.astro'
|
|
5
3
|
import Banner from 'fulldev-ui/blocks/Banner.astro'
|
|
6
4
|
import Footer from 'fulldev-ui/blocks/Footer.astro'
|
|
7
5
|
import Element from 'fulldev-ui/components/Element.astro'
|
|
8
6
|
import Head from 'fulldev-ui/components/Head.astro'
|
|
9
7
|
import Header from 'fulldev-ui/components/Header.astro'
|
|
10
|
-
import Section from 'fulldev-ui/components/Section.astro'
|
|
11
|
-
import Sections from 'fulldev-ui/components/sections.astro'
|
|
12
8
|
import Sidebar from 'fulldev-ui/components/Sidebar.astro'
|
|
13
|
-
import
|
|
9
|
+
import Subheader from 'fulldev-ui/components/Subheader.astro'
|
|
14
10
|
|
|
15
|
-
type Props =
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
body?: string
|
|
31
|
-
}
|
|
11
|
+
type Props = HTMLAttributes<'html'> & {
|
|
12
|
+
banner?: ComponentProps<typeof Banner>['text'] | undefined
|
|
13
|
+
header?: ComponentProps<typeof Header> | undefined
|
|
14
|
+
subheader?: ComponentProps<typeof Subheader> | undefined
|
|
15
|
+
sidebar?: ComponentProps<typeof Sidebar> | undefined
|
|
16
|
+
footer?: ComponentProps<typeof Footer> | undefined
|
|
17
|
+
theme?: 'light' | 'dark' | 'system' | undefined
|
|
18
|
+
title?: string
|
|
19
|
+
code?: {
|
|
20
|
+
head?: string
|
|
21
|
+
body?: string
|
|
22
|
+
}
|
|
23
|
+
description?: string
|
|
24
|
+
image?: any
|
|
25
|
+
seo?: {
|
|
32
26
|
title?: string
|
|
33
27
|
description?: string
|
|
34
28
|
image?: string
|
|
35
|
-
seo?: {
|
|
36
|
-
title?: string
|
|
37
|
-
description?: string
|
|
38
|
-
image?: string
|
|
39
|
-
}
|
|
40
29
|
}
|
|
30
|
+
next?: string
|
|
31
|
+
prev?: string
|
|
32
|
+
}
|
|
41
33
|
|
|
42
34
|
const {
|
|
43
|
-
|
|
35
|
+
banner,
|
|
44
36
|
header,
|
|
45
|
-
|
|
46
|
-
footer,
|
|
37
|
+
subheader,
|
|
47
38
|
sidebar,
|
|
48
|
-
|
|
49
|
-
sections,
|
|
39
|
+
footer,
|
|
50
40
|
theme,
|
|
51
|
-
section,
|
|
52
|
-
banner,
|
|
53
41
|
code,
|
|
54
|
-
|
|
42
|
+
next,
|
|
43
|
+
prev,
|
|
55
44
|
...rest
|
|
56
45
|
} = Astro.props
|
|
57
46
|
---
|
|
58
47
|
|
|
59
48
|
<!doctype html>
|
|
60
|
-
<html
|
|
49
|
+
<html
|
|
50
|
+
class="layout"
|
|
51
|
+
{...rest}
|
|
52
|
+
>
|
|
61
53
|
<Head {...Astro.props} />
|
|
62
54
|
<Element
|
|
55
|
+
class:list="layout-body"
|
|
63
56
|
as="body"
|
|
64
57
|
{theme}
|
|
65
58
|
>
|
|
66
|
-
<
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
<slot name="
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
<div class="core">
|
|
76
|
-
<slot name="sidebar">
|
|
77
|
-
<Sidebar
|
|
78
|
-
{...navigation?.sidebar === true ? navigation : {}}
|
|
79
|
-
logo={navigation?.sidebar?.header
|
|
80
|
-
? undefined
|
|
81
|
-
: navigation?.sidebar?.logo}
|
|
82
|
-
company={navigation?.sidebar?.header
|
|
83
|
-
? undefined
|
|
84
|
-
: navigation?.sidebar?.company}
|
|
85
|
-
{...sidebar}
|
|
86
|
-
/>
|
|
87
|
-
</slot>
|
|
88
|
-
<main data-pagefind-body>
|
|
89
|
-
<slot>
|
|
90
|
-
<Section {...section} />
|
|
91
|
-
<Article />
|
|
92
|
-
<Sections {sections} />
|
|
93
|
-
</slot>
|
|
59
|
+
<Banner text={banner} />
|
|
60
|
+
<Header {...header} />
|
|
61
|
+
<Subheader {...subheader} />
|
|
62
|
+
<slot name="before" />
|
|
63
|
+
|
|
64
|
+
<Element class:list={['layout-container', { 'has-sidebar': sidebar }]}>
|
|
65
|
+
<Sidebar {...sidebar} />
|
|
66
|
+
<main class="layout-main">
|
|
67
|
+
<slot />
|
|
94
68
|
</main>
|
|
95
|
-
</
|
|
96
|
-
<
|
|
97
|
-
|
|
98
|
-
</slot>
|
|
69
|
+
</Element>
|
|
70
|
+
<Footer {...footer} />
|
|
71
|
+
<slot name="after" />
|
|
99
72
|
<Fragment set:html={code?.body} />
|
|
100
73
|
|
|
101
|
-
<style
|
|
74
|
+
<style is:global>
|
|
102
75
|
@layer fulldev {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
76
|
+
.layout {
|
|
77
|
+
@apply w-full font-sans text-base leading-relaxed text-foreground;
|
|
78
|
+
color-scheme: light;
|
|
79
|
+
|
|
80
|
+
&.dark {
|
|
81
|
+
color-scheme: dark;
|
|
82
|
+
}
|
|
110
83
|
}
|
|
111
84
|
|
|
112
|
-
body {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
background-color: var(--base-background);
|
|
116
|
-
width: 100%;
|
|
117
|
-
min-height: 100vh;
|
|
118
|
-
color: var(--base-11);
|
|
85
|
+
.layout-body {
|
|
86
|
+
@apply flex min-h-screen w-full flex-col bg-background font-sans text-foreground;
|
|
87
|
+
}
|
|
119
88
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
display: none;
|
|
89
|
+
.layout-container {
|
|
90
|
+
@apply relative flex h-full w-full flex-grow;
|
|
123
91
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
}
|
|
127
|
-
}
|
|
92
|
+
&.has-sidebar {
|
|
93
|
+
@apply container px-0;
|
|
128
94
|
}
|
|
95
|
+
}
|
|
129
96
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
position: relative;
|
|
133
|
-
flex-grow: 1;
|
|
134
|
-
height: 100%;
|
|
97
|
+
.layout-main {
|
|
98
|
+
@apply flex w-full max-w-full flex-1 shrink flex-col;
|
|
135
99
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
flex: 1;
|
|
140
|
-
flex-direction: column;
|
|
141
|
-
background-color: var(--color-background);
|
|
142
|
-
width: 100%;
|
|
143
|
-
max-width: 100vw;
|
|
144
|
-
}
|
|
100
|
+
/* full width minus sidebar width */
|
|
101
|
+
@media (min-width: 1024px) {
|
|
102
|
+
max-width: calc(100% - var(--sidebar-width, 0px));
|
|
145
103
|
}
|
|
146
104
|
}
|
|
147
105
|
}
|
|
148
106
|
</style>
|
|
149
107
|
</Element>
|
|
150
108
|
</html>
|
|
151
|
-
|
|
152
|
-
<script>
|
|
153
|
-
const setTheme = (document: Document) => {
|
|
154
|
-
const theme = localStorage.getItem('theme') || ''
|
|
155
|
-
document.body.classList.add(`theme-${theme}`)
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
setTheme(document)
|
|
159
|
-
|
|
160
|
-
document.addEventListener('astro:before-swap', (event) => {
|
|
161
|
-
setTheme(event.newDocument)
|
|
162
|
-
})
|
|
163
|
-
</script>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
import type { ComponentProps } from 'astro/types'
|
|
3
|
+
import Hero from 'fulldev-ui/blocks/Hero.astro'
|
|
4
|
+
import Prose from 'fulldev-ui/components/Prose.astro'
|
|
5
|
+
import Sections from 'fulldev-ui/components/sections.astro'
|
|
6
|
+
import Layout from 'fulldev-ui/layouts/Layout.astro'
|
|
7
|
+
|
|
8
|
+
interface Props
|
|
9
|
+
extends ComponentProps<typeof Layout>,
|
|
10
|
+
ComponentProps<typeof Prose> {
|
|
11
|
+
hero?: ComponentProps<typeof Hero>
|
|
12
|
+
sections?: ComponentProps<typeof Sections>['sections']
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const { hero, render, toc, sections, ...rest } = Astro.props
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
<Layout {...rest}>
|
|
19
|
+
<Hero {...hero} />
|
|
20
|
+
<Prose
|
|
21
|
+
{render}
|
|
22
|
+
{toc}
|
|
23
|
+
/>
|
|
24
|
+
<Sections {sections} />
|
|
25
|
+
<slot />
|
|
26
|
+
</Layout>
|
|
@@ -1,21 +1,26 @@
|
|
|
1
1
|
---
|
|
2
2
|
import type { ComponentProps } from 'astro/types'
|
|
3
|
-
import
|
|
3
|
+
import Hero from 'fulldev-ui/blocks/Hero.astro'
|
|
4
|
+
import Prose from 'fulldev-ui/components/Prose.astro'
|
|
4
5
|
import Sections from 'fulldev-ui/components/sections.astro'
|
|
5
6
|
import Layout from 'fulldev-ui/layouts/Layout.astro'
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
interface Props
|
|
9
|
+
extends ComponentProps<typeof Layout>,
|
|
10
|
+
ComponentProps<typeof Prose> {
|
|
11
|
+
hero?: ComponentProps<typeof Hero>
|
|
12
|
+
sections?: ComponentProps<typeof Sections>['sections']
|
|
13
|
+
}
|
|
8
14
|
|
|
9
|
-
const {
|
|
15
|
+
const { hero, render, toc, sections, ...rest } = Astro.props
|
|
10
16
|
---
|
|
11
17
|
|
|
12
|
-
<Layout {...
|
|
13
|
-
<
|
|
18
|
+
<Layout {...rest}>
|
|
19
|
+
<Hero {...hero} />
|
|
20
|
+
<Prose
|
|
14
21
|
{render}
|
|
15
22
|
{toc}
|
|
16
|
-
|
|
17
|
-
<slot name="prose" />
|
|
18
|
-
</Article>
|
|
23
|
+
/>
|
|
19
24
|
<Sections {sections} />
|
|
20
25
|
<slot />
|
|
21
26
|
</Layout>
|
|
@@ -1,21 +1,105 @@
|
|
|
1
1
|
---
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
2
|
+
import { getImage } from 'astro:assets'
|
|
3
|
+
import CartForm from 'fulldev-ui/components/CartForm.astro'
|
|
4
|
+
import Element from 'fulldev-ui/components/Element.astro'
|
|
5
|
+
import Gallery from 'fulldev-ui/components/Gallery.astro'
|
|
6
|
+
import Heading from 'fulldev-ui/components/Heading.astro'
|
|
7
|
+
import List from 'fulldev-ui/components/List.astro'
|
|
8
|
+
import Paragraph from 'fulldev-ui/components/Paragraph.astro'
|
|
9
|
+
import Prose from 'fulldev-ui/components/Prose.astro'
|
|
5
10
|
import Sections from 'fulldev-ui/components/sections.astro'
|
|
6
11
|
import Layout from 'fulldev-ui/layouts/Layout.astro'
|
|
7
12
|
|
|
8
|
-
|
|
13
|
+
const {
|
|
14
|
+
variant = 1,
|
|
15
|
+
level = 1,
|
|
16
|
+
heading,
|
|
17
|
+
paragraph,
|
|
18
|
+
title,
|
|
19
|
+
list,
|
|
20
|
+
price,
|
|
21
|
+
images,
|
|
22
|
+
text,
|
|
23
|
+
subheading,
|
|
24
|
+
variants,
|
|
25
|
+
button,
|
|
26
|
+
description,
|
|
27
|
+
form,
|
|
28
|
+
uitverkocht,
|
|
29
|
+
render,
|
|
30
|
+
sections,
|
|
31
|
+
banner,
|
|
32
|
+
} = Astro.props
|
|
9
33
|
|
|
10
|
-
const
|
|
34
|
+
const slug = Astro.url.pathname.replace(/^\/|\/$/g, '') || 'index'
|
|
35
|
+
const imageId = images?.[0]?.id
|
|
36
|
+
const src = `/src/images/${imageId}`
|
|
37
|
+
const allImages = import.meta.glob<{ default: ImageMetadata }>('/src/images/*')
|
|
38
|
+
const foundImage = allImages[src]
|
|
39
|
+
const gotImage =
|
|
40
|
+
imageId && (await getImage({ src: foundImage ? foundImage() : src }))
|
|
11
41
|
---
|
|
12
42
|
|
|
13
43
|
<Layout {...Astro.props}>
|
|
14
|
-
<
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
44
|
+
<Element
|
|
45
|
+
class:list="product"
|
|
46
|
+
as="section"
|
|
47
|
+
>
|
|
48
|
+
<Element class:list="product-container">
|
|
49
|
+
<Element class:list="product-main">
|
|
50
|
+
<Gallery {images} />
|
|
51
|
+
<!-- <Prose {render} /> -->
|
|
52
|
+
</Element>
|
|
53
|
+
<Element class:list="product-segment">
|
|
54
|
+
<Element class:list="product-content">
|
|
55
|
+
<Heading
|
|
56
|
+
{level}
|
|
57
|
+
text={heading || title}
|
|
58
|
+
/>
|
|
59
|
+
<Paragraph text={paragraph || description} />
|
|
60
|
+
</Element>
|
|
61
|
+
<CartForm
|
|
62
|
+
soldout={uitverkocht}
|
|
63
|
+
image={gotImage?.src}
|
|
64
|
+
{title}
|
|
65
|
+
{price}
|
|
66
|
+
{slug}
|
|
67
|
+
{variants}
|
|
68
|
+
/>
|
|
69
|
+
<List
|
|
70
|
+
size="sm"
|
|
71
|
+
items={banner.split('|')}
|
|
72
|
+
/>
|
|
73
|
+
</Element>
|
|
74
|
+
</Element>
|
|
75
|
+
</Element>
|
|
19
76
|
<Sections {sections} />
|
|
20
77
|
<slot />
|
|
21
78
|
</Layout>
|
|
79
|
+
|
|
80
|
+
<style is:global>
|
|
81
|
+
.product {
|
|
82
|
+
@apply relative w-full;
|
|
83
|
+
|
|
84
|
+
.product-container {
|
|
85
|
+
@apply flex h-full w-full flex-col items-start gap-32 lg:container lg:grid lg:grid-cols-2 lg:py-8;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.product-segment {
|
|
89
|
+
@apply z-10 flex flex-col items-start gap-8 max-lg:container lg:sticky lg:top-0;
|
|
90
|
+
|
|
91
|
+
--height: calc(
|
|
92
|
+
var(--header-height, 0px) + var(--subheader-height, 0px) + 2rem
|
|
93
|
+
);
|
|
94
|
+
top: var(--height);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.product-content {
|
|
98
|
+
@apply flex max-w-screen-md flex-col gap-6;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
&.dark {
|
|
102
|
+
@apply bg-background;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
</style>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
import { getCollection } from 'astro:content'
|
|
3
|
-
import
|
|
3
|
+
import PageLayout from 'fulldev-ui/layouts/PageLayout.astro'
|
|
4
4
|
|
|
5
5
|
export async function getStaticPaths() {
|
|
6
6
|
const pages = await getCollection('pages')
|
|
@@ -13,32 +13,24 @@ export async function getStaticPaths() {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
const { data, ...rest } = Astro.props
|
|
16
|
-
|
|
17
16
|
const { component, ...restData } = data
|
|
18
17
|
|
|
19
|
-
const
|
|
20
|
-
...import.meta.glob('/src/**/*.astro'),
|
|
21
|
-
...import.meta.glob('
|
|
18
|
+
const layouts = {
|
|
19
|
+
...import.meta.glob('/src/layouts/**/*.astro'),
|
|
20
|
+
...import.meta.glob('../layouts/**/*.astro'),
|
|
22
21
|
}
|
|
23
22
|
|
|
24
|
-
const componentPath = Object.keys(
|
|
25
|
-
(
|
|
26
|
-
)
|
|
23
|
+
const componentPath = Object.keys(layouts).find((path) => {
|
|
24
|
+
const strip = (str?: string) => str?.split('/').pop()?.split('.')[0]
|
|
25
|
+
return strip(path) === strip(component)
|
|
26
|
+
})
|
|
27
27
|
|
|
28
28
|
const Component =
|
|
29
|
-
componentPath && (await (
|
|
29
|
+
(componentPath && (await (layouts[componentPath] as any)()).default) ??
|
|
30
|
+
PageLayout
|
|
30
31
|
---
|
|
31
32
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
{...rest}
|
|
37
|
-
/>
|
|
38
|
-
) : (
|
|
39
|
-
<Layout
|
|
40
|
-
{...(data as any)}
|
|
41
|
-
{...rest}
|
|
42
|
-
/>
|
|
43
|
-
)
|
|
44
|
-
}
|
|
33
|
+
<Component
|
|
34
|
+
{...restData}
|
|
35
|
+
{...rest}
|
|
36
|
+
/>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
import Product from 'fulldev-ui/blocks/Product.astro'
|
|
3
|
+
import Layout from 'fulldev-ui/layouts/Layout.astro'
|
|
4
|
+
|
|
5
|
+
const product = {
|
|
6
|
+
images: [
|
|
7
|
+
'/src/images/placeholder-right.webp',
|
|
8
|
+
'/src/images/placeholder-right.webp',
|
|
9
|
+
'/src/images/placeholder-right.webp',
|
|
10
|
+
'/src/images/placeholder-right.webp',
|
|
11
|
+
'/src/images/placeholder-right.webp',
|
|
12
|
+
],
|
|
13
|
+
title: 'Hello world',
|
|
14
|
+
description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
|
|
15
|
+
}
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
<Layout>
|
|
19
|
+
<Product {...product} />
|
|
20
|
+
</Layout>
|
|
@@ -1,16 +1,24 @@
|
|
|
1
1
|
import { z } from 'astro:content'
|
|
2
2
|
import pathSchema from '../utils/pathSchema'
|
|
3
|
+
import globalSchema from './global'
|
|
3
4
|
|
|
4
|
-
export
|
|
5
|
-
z
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
)
|
|
5
|
+
export const buttonSchema = z
|
|
6
|
+
.union([pathSchema('pages'), z.object({}).passthrough()])
|
|
7
|
+
.pipe(
|
|
8
|
+
globalSchema
|
|
9
|
+
.extend({
|
|
10
|
+
slug: z
|
|
11
|
+
.string()
|
|
12
|
+
.refine(async (data) => await pathSchema('pages').parseAsync(data)),
|
|
13
|
+
text: z.string(),
|
|
14
|
+
href: z.string(),
|
|
15
|
+
icon: z.string(),
|
|
16
|
+
})
|
|
17
|
+
.partial()
|
|
18
|
+
.passthrough()
|
|
19
|
+
.merge(globalSchema)
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
export type ButtonSchema = z.infer<typeof buttonSchema>
|
|
23
|
+
|
|
24
|
+
export default buttonSchema
|
|
@@ -1,25 +1,43 @@
|
|
|
1
|
+
import { z } from 'astro:content'
|
|
2
|
+
import pathSchema from '../utils/pathSchema'
|
|
1
3
|
import button from './button'
|
|
2
4
|
import buttons from './buttons'
|
|
5
|
+
import globalSchema from './global'
|
|
3
6
|
import icon from './icon'
|
|
4
7
|
import image from './image'
|
|
5
8
|
import images from './images'
|
|
6
9
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
+
export const cardSchema = z
|
|
11
|
+
.union([pathSchema('pages'), z.object({}).passthrough()])
|
|
12
|
+
.pipe(
|
|
13
|
+
globalSchema
|
|
14
|
+
.extend({
|
|
15
|
+
slug: z
|
|
16
|
+
.string()
|
|
17
|
+
.refine(async (data) => await pathSchema('pages').parseAsync(data)),
|
|
18
|
+
image: image,
|
|
19
|
+
images: images,
|
|
20
|
+
position: z.enum(['background', 'cover', 'inset']),
|
|
21
|
+
buttons: buttons,
|
|
22
|
+
button: button,
|
|
23
|
+
variant: z.string(),
|
|
24
|
+
align: z.string().default('start'),
|
|
25
|
+
icon: icon,
|
|
26
|
+
price: z.number(),
|
|
27
|
+
panel: z.boolean().default(true),
|
|
28
|
+
title: z.string(),
|
|
29
|
+
heading: z.string(),
|
|
30
|
+
level: z.number().min(1).max(6).default(4),
|
|
31
|
+
badge: z.any(),
|
|
32
|
+
tagline: z.string(),
|
|
33
|
+
rating: z.number(),
|
|
34
|
+
text: z.string(),
|
|
35
|
+
list: z.array(z.any()),
|
|
36
|
+
})
|
|
37
|
+
.partial()
|
|
38
|
+
.passthrough()
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
export type CardSchema = z.infer<typeof cardSchema>
|
|
10
42
|
|
|
11
|
-
export default
|
|
12
|
-
writeup
|
|
13
|
-
.extend({
|
|
14
|
-
slug: z
|
|
15
|
-
.string()
|
|
16
|
-
.refine(async (data) => await pathSchema('pages').parseAsync(data)),
|
|
17
|
-
image,
|
|
18
|
-
images,
|
|
19
|
-
buttons,
|
|
20
|
-
button,
|
|
21
|
-
icon,
|
|
22
|
-
})
|
|
23
|
-
.partial()
|
|
24
|
-
.passthrough()
|
|
25
|
-
)
|
|
43
|
+
export default cardSchema
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { z } from 'astro:content'
|
|
2
|
-
import buttons from './buttons'
|
|
3
2
|
import channels from './channels'
|
|
4
|
-
import heading from './heading'
|
|
5
3
|
import logo from './logo'
|
|
4
|
+
import menu from './menu'
|
|
6
5
|
import socials from './socials'
|
|
7
6
|
import text from './text'
|
|
8
7
|
|
|
@@ -12,14 +11,7 @@ export default z
|
|
|
12
11
|
text,
|
|
13
12
|
socials,
|
|
14
13
|
channels,
|
|
15
|
-
|
|
16
|
-
z
|
|
17
|
-
.object({
|
|
18
|
-
heading,
|
|
19
|
-
buttons,
|
|
20
|
-
})
|
|
21
|
-
.partial()
|
|
22
|
-
),
|
|
14
|
+
menu,
|
|
23
15
|
})
|
|
24
16
|
.partial()
|
|
25
17
|
.passthrough()
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from 'astro:content'
|
|
2
|
+
|
|
3
|
+
export const globalSchema = z
|
|
4
|
+
.object({
|
|
5
|
+
if: z.any(),
|
|
6
|
+
theme: z.enum(['light', 'dark']),
|
|
7
|
+
color: z.enum(['base', 'brand']),
|
|
8
|
+
size: z.enum(['sm', 'md', 'lg']),
|
|
9
|
+
contrast: z.boolean(),
|
|
10
|
+
})
|
|
11
|
+
.partial()
|
|
12
|
+
.passthrough()
|
|
13
|
+
|
|
14
|
+
export type GlobalSchema = z.infer<typeof globalSchema>
|
|
15
|
+
|
|
16
|
+
export default globalSchema
|
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import { z } from 'astro:content'
|
|
2
2
|
import buttons from './buttons'
|
|
3
|
+
import links from './links'
|
|
3
4
|
import logo from './logo'
|
|
5
|
+
import menu from './menu'
|
|
6
|
+
import subheader from './subheader'
|
|
7
|
+
import themer from './themer'
|
|
4
8
|
|
|
5
9
|
export default z
|
|
6
10
|
.object({
|
|
11
|
+
themer,
|
|
12
|
+
subheader,
|
|
7
13
|
logo,
|
|
8
14
|
buttons,
|
|
15
|
+
links,
|
|
16
|
+
menu,
|
|
9
17
|
})
|
|
10
18
|
.partial()
|
|
11
19
|
.passthrough()
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { reference, z } from 'astro:content'
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
const imagePath = z.preprocess((data: unknown) => {
|
|
4
|
+
if (typeof data === 'string') {
|
|
5
|
+
return data.split('/').pop()
|
|
6
|
+
}
|
|
7
|
+
return data
|
|
8
|
+
}, reference('images'))
|
|
9
|
+
|
|
10
|
+
export default z.union([imagePath, z.object({}).passthrough()]).pipe(
|
|
4
11
|
z
|
|
5
12
|
.object({
|
|
6
13
|
id: z
|
|
@@ -14,5 +21,3 @@ export default z.union([reference('images'), z.object({}).passthrough()]).pipe(
|
|
|
14
21
|
.partial()
|
|
15
22
|
.passthrough()
|
|
16
23
|
)
|
|
17
|
-
|
|
18
|
-
// export default z.any()
|