fulldev-ui 0.7.0-beta.3 → 0.7.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/astro.config.ts +0 -2
  2. package/package.json +26 -21
  3. package/pnpm-lock.yaml +209 -751
  4. package/src/blocks/Faqs2.astro +1 -1
  5. package/src/components/Block.astro +9 -15
  6. package/src/components/Form.vue +2 -5
  7. package/src/components/Icon.astro +18 -11
  8. package/src/components/ui/button/Button.vue +2 -2
  9. package/src/content/blocks/category-group1.md +18 -0
  10. package/src/content/blocks/category-list1.md +22 -0
  11. package/src/content/blocks/contact1.md +30 -0
  12. package/src/content/blocks/contact2.md +31 -0
  13. package/src/content/blocks/content1.md +14 -0
  14. package/src/content/blocks/cta1.md +11 -0
  15. package/src/content/blocks/faqs1.md +18 -0
  16. package/src/content/blocks/faqs2.md +18 -0
  17. package/src/content/blocks/features1.md +16 -0
  18. package/src/content/blocks/hero1.md +14 -0
  19. package/src/content/blocks/intro1.md +6 -0
  20. package/src/content/blocks/post-single1.md +18 -0
  21. package/src/content/blocks/product-group1.md +21 -0
  22. package/src/content/blocks/product-list1.md +25 -0
  23. package/src/content/blocks/product-single1.md +23 -0
  24. package/src/content/blocks/reviews1.md +16 -0
  25. package/src/content.config.ts +20 -0
  26. package/src/data/settings.json +26 -0
  27. package/src/layouts/NavigationLayout.astro +14 -0
  28. package/src/pages/blocks/[...block].astro +24 -0
  29. package/src/pages/blocks/index.astro +21 -0
  30. package/src/pages/index.astro +8 -0
  31. package/src/schemas/blocks/categoryGroup.ts +1 -1
  32. package/src/schemas/blocks/faqs.ts +4 -3
  33. package/src/schemas/blocks/features.ts +5 -4
  34. package/src/schemas/collections/block.ts +83 -0
  35. package/src/schemas/collections/category.ts +11 -0
  36. package/src/schemas/collections/page.ts +13 -0
  37. package/src/schemas/collections/post.ts +11 -0
  38. package/src/schemas/collections/product.ts +11 -0
  39. package/src/schemas/fields/section.ts +2 -2
  40. package/src/styles/global.css +123 -0
  41. package/src/components/ui/breadcrumb/Breadcrumb.vue +0 -13
  42. package/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue +0 -22
  43. package/src/components/ui/breadcrumb/BreadcrumbItem.vue +0 -14
  44. package/src/components/ui/breadcrumb/BreadcrumbLink.vue +0 -19
  45. package/src/components/ui/breadcrumb/BreadcrumbList.vue +0 -16
  46. package/src/components/ui/breadcrumb/BreadcrumbPage.vue +0 -19
  47. package/src/components/ui/breadcrumb/BreadcrumbSeparator.vue +0 -21
  48. package/src/components/ui/breadcrumb/index.ts +0 -7
  49. package/src/schemas/fields/block.ts +0 -60
@@ -14,7 +14,7 @@ const { writeup, buttons, faqs } = Astro.props
14
14
 
15
15
  <Section class="faqs faqs-2">
16
16
  <Container>
17
- <Split>
17
+ <Split align="start">
18
18
  <Writeup>
19
19
  <Fragment set:html={writeup} />
20
20
  <slot />
@@ -1,11 +1,7 @@
1
1
  ---
2
- // @ts-nocheck
3
- // FIXME
4
2
  import { getEntries } from 'astro:content'
5
3
 
6
- // interface Props extends BlockSchema {}
7
-
8
- let { block, cards, pages, categories, products, ...rest } = Astro.props
4
+ let { block, categories, products, ...rest } = Astro.props
9
5
 
10
6
  const blocks = {
11
7
  ...import.meta.glob('/src/blocks/**/*.astro'),
@@ -16,28 +12,26 @@ const path = Object.keys(blocks).find((path) => path.split('/').pop()?.split('.'
16
12
 
17
13
  const BlockComponent = path && (await (blocks[path] as any)()).default
18
14
 
19
- const categoriesEntries =
20
- categories &&
21
- (await getEntries(categories)).map((category) => ({
15
+ if (categories && categories[0]?.id) {
16
+ categories = (await getEntries(categories)).map((category: any) => ({
22
17
  slug: category.id,
23
18
  ...category.data,
24
19
  }))
20
+ }
25
21
 
26
- const productsEntries =
27
- products &&
28
- (await getEntries(products)).map((product) => ({
22
+ if (products && products[0]?.id) {
23
+ products = (await getEntries(products)).map((product: any) => ({
29
24
  slug: product.id,
30
25
  ...product.data,
31
26
  }))
27
+ }
32
28
  ---
33
29
 
34
30
  {
35
31
  BlockComponent && (
36
32
  <BlockComponent
37
- {cards}
38
- {pages}
39
- categories={categoriesEntries}
40
- products={productsEntries}
33
+ {categories}
34
+ {products}
41
35
  {...rest}
42
36
  >
43
37
  <slot />
@@ -1,10 +1,9 @@
1
1
  <script setup lang="ts">
2
2
  import { AutoForm } from 'fulldev-ui/components/ui/auto-form'
3
3
  import { Button } from 'fulldev-ui/components/ui/button'
4
- import type { FormHTMLAttributes } from 'vue'
5
4
  import { z } from 'zod'
6
5
 
7
- interface Props extends /* @vue-ignore */ FormHTMLAttributes {
6
+ interface Props {
8
7
  fields?: {
9
8
  label: string
10
9
  type: 'text' | 'email' | 'checkbox' | 'select'
@@ -14,7 +13,7 @@ interface Props extends /* @vue-ignore */ FormHTMLAttributes {
14
13
  submit?: string
15
14
  }
16
15
 
17
- const { fields, action, method } = defineProps<Props>()
16
+ const { fields, submit } = defineProps<Props>()
18
17
 
19
18
  // Conditionally add the optional flag to the zod schema
20
19
  const withOptional = (optional: boolean | undefined, schema: z.ZodSchema) => (optional ? schema.optional() : schema)
@@ -71,8 +70,6 @@ const config = (fields || []).reduce((acc: any, field) => {
71
70
  class="w-full space-y-6 [&>div>p[role='alert']]:hidden"
72
71
  :field-config="config"
73
72
  :schema="schema"
74
- :action
75
- :method
76
73
  >
77
74
  <slot />
78
75
  <Button type="submit">
@@ -1,17 +1,24 @@
1
1
  ---
2
- import { Icon as AstroIcon } from 'astro-icon/components'
3
- import type { ComponentProps } from 'astro/types'
2
+ import tablerIcons from '@iconify-json/tabler/icons.json'
3
+ import type { HTMLAttributes } from 'astro/types'
4
+ import Box from 'fulldev-ui/components/Box.astro'
4
5
 
5
- interface Props extends ComponentProps<typeof AstroIcon> {}
6
+ interface Props extends HTMLAttributes<'svg'> {
7
+ name?: string | undefined
8
+ }
6
9
 
7
10
  const { name, ...rest } = Astro.props
11
+
12
+ const trimmedName = name?.trim()
13
+ const icon = trimmedName ? (tablerIcons as any)?.icons[trimmedName]?.body : undefined
8
14
  ---
9
15
 
10
- {
11
- name && (
12
- <AstroIcon
13
- name={'tabler:' + name}
14
- {...rest}
15
- />
16
- )
17
- }
16
+ <Box
17
+ class:list="icon size-[1em] inline-flex child:stroke-[calc(1em/12)]"
18
+ xmlns="http://www.w3.org/2000/svg"
19
+ viewBox="0 0 24 24"
20
+ as="svg"
21
+ {...rest}
22
+ >
23
+ <Fragment set:html={icon} />
24
+ </Box>
@@ -1,10 +1,10 @@
1
1
  <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
2
3
  import { cn } from 'fulldev-ui/lib/utils'
3
4
  import { Primitive, type PrimitiveProps } from 'radix-vue'
4
- import type { HTMLAttributes } from 'vue'
5
5
  import { type ButtonVariants, buttonVariants } from '.'
6
6
 
7
- interface Props extends /* @vue-ignore */ PrimitiveProps {
7
+ interface Props extends PrimitiveProps {
8
8
  variant?: ButtonVariants['variant']
9
9
  size?: ButtonVariants['size']
10
10
  class?: HTMLAttributes['class']
@@ -0,0 +1,18 @@
1
+ ---
2
+ block: CategoryGroup1
3
+ title: "Lorem ipsum dolor sit amet"
4
+ description: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos."
5
+ categories:
6
+ - title: "Lorem ipsum"
7
+ image:
8
+ src: "/images/placeholder.webp"
9
+ alt: "alt"
10
+ - title: "Lorem ipsum"
11
+ image:
12
+ src: "/images/placeholder.webp"
13
+ alt: "alt"
14
+ - title: "Lorem ipsum"
15
+ image:
16
+ src: "/images/placeholder.webp"
17
+ alt: "alt"
18
+ ---
@@ -0,0 +1,22 @@
1
+ ---
2
+ block: CategoryList1
3
+ writeup: |
4
+ <h1>Lorem ipsum dolor sit amet</h1>
5
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.</p>
6
+ button:
7
+ text: "Lorem ipsum"
8
+ href: "#"
9
+ categories:
10
+ - title: "Lorem ipsum"
11
+ image:
12
+ src: "/images/placeholder.webp"
13
+ alt: "alt"
14
+ - title: "Lorem ipsum"
15
+ image:
16
+ src: "/images/placeholder.webp"
17
+ alt: "alt"
18
+ - title: "Lorem ipsum"
19
+ image:
20
+ src: "/images/placeholder.webp"
21
+ alt: "alt"
22
+ ---
@@ -0,0 +1,30 @@
1
+ ---
2
+ block: Contact1
3
+ writeup: |
4
+ <h1>Neem contact op</h1>
5
+ <p>
6
+ Neem contact op voor reparaties en vragen. Bezoek onze winkel op Hogeweg 26, Amsterdam.
7
+ </p>
8
+ channels:
9
+ - text: '1234566'
10
+ href: '#'
11
+ icon: phone
12
+ - text: 'lorem@ipsum.com'
13
+ href: '#'
14
+ icon: mail
15
+ - text: Lorem ipsum, dolor sit, amet
16
+ href: '#'
17
+ icon: map-pin
18
+ form:
19
+ fields:
20
+ - type: text
21
+ label: Name
22
+ - type: email
23
+ label: Email
24
+ - type: text
25
+ label: Phone
26
+ - type: textarea
27
+ label: Message
28
+ optional: true
29
+ submit: Send message
30
+ ---
@@ -0,0 +1,31 @@
1
+ ---
2
+ block: Contact2
3
+ writeup: |
4
+ <h1>Neem contact op</h1>
5
+ <p>
6
+ Neem contact op voor reparaties en vragen. Bezoek onze winkel op Hogeweg 26, Amsterdam.
7
+ </p>
8
+ channels:
9
+ - text: '1234566'
10
+ href: '#'
11
+ icon: phone
12
+ - text: 'lorem@ipsum.com'
13
+ href: '#'
14
+ icon: mail
15
+ - text: Lorem ipsum, dolor sit, amet
16
+ href: '#'
17
+ icon: map-pin
18
+ form:
19
+ action: '#'
20
+ fields:
21
+ - type: text
22
+ label: Name
23
+ - type: email
24
+ label: Email
25
+ - type: text
26
+ label: Phone
27
+ - type: textarea
28
+ label: Message
29
+ optional: true
30
+ submit: Send message
31
+ ---
@@ -0,0 +1,14 @@
1
+ ---
2
+ block: Content1
3
+ writeup: |
4
+ <h1>Lorem ipsum dolor sit amet</h1>
5
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.</p>
6
+ buttons:
7
+ - text: "Lorem ipsum"
8
+ href: "#"
9
+ - text: "Lorem ipsum"
10
+ href: "#"
11
+ image:
12
+ src: "/images/placeholder.webp"
13
+ alt: "alt"
14
+ ---
@@ -0,0 +1,11 @@
1
+ ---
2
+ block: Cta1
3
+ writeup: |
4
+ <h1>Lorem ipsum dolor sit amet</h1>
5
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.</p>
6
+ buttons:
7
+ - text: "Lorem ipsum"
8
+ href: "#"
9
+ - text: "Lorem ipsum"
10
+ href: "#"
11
+ ---
@@ -0,0 +1,18 @@
1
+ ---
2
+ block: Faqs1
3
+ writeup: |
4
+ <h1>Lorem ipsum dolor sit amet</h1>
5
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.</p>
6
+ buttons:
7
+ - text: "Lorem ipsum"
8
+ href: "#"
9
+ - text: "Lorem ipsum"
10
+ href: "#"
11
+ faqs:
12
+ - title: "Lorem ipsum 1"
13
+ description: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos."
14
+ - title: "Lorem ipsum 2"
15
+ description: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos."
16
+ - title: "Lorem ipsum 3"
17
+ description: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos."
18
+ ---
@@ -0,0 +1,18 @@
1
+ ---
2
+ block: Faqs2
3
+ writeup: |
4
+ <h1>Lorem ipsum dolor sit amet</h1>
5
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.</p>
6
+ buttons:
7
+ - text: "Lorem ipsum"
8
+ href: "#"
9
+ - text: "Lorem ipsum"
10
+ href: "#"
11
+ faqs:
12
+ - title: "Lorem ipsum 1"
13
+ description: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos."
14
+ - title: "Lorem ipsum 2"
15
+ description: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos."
16
+ - title: "Lorem ipsum 3"
17
+ description: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos."
18
+ ---
@@ -0,0 +1,16 @@
1
+ ---
2
+ block: Features1
3
+ writeup: |
4
+ <h1>Lorem ipsum dolor sit amet</h1>
5
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.</p>
6
+ features:
7
+ - icon: check
8
+ title: "Lorem ipsum"
9
+ description: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos."
10
+ - icon: check
11
+ title: "Lorem ipsum"
12
+ description: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos."
13
+ - icon: check
14
+ title: "Lorem ipsum"
15
+ description: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos."
16
+ ---
@@ -0,0 +1,14 @@
1
+ ---
2
+ block: Hero1
3
+ writeup: |
4
+ <h1>Lorem ipsum dolor sit amet</h1>
5
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.</p>
6
+ buttons:
7
+ - text: "Lorem ipsum"
8
+ href: "#"
9
+ - text: "Lorem ipsum"
10
+ href: "#"
11
+ image:
12
+ src: "/images/placeholder.webp"
13
+ alt: "alt"
14
+ ---
@@ -0,0 +1,6 @@
1
+ ---
2
+ block: Intro1
3
+ writeup: |
4
+ <h1>Lorem ipsum dolor sit amet</h1>
5
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.</p>
6
+ ---
@@ -0,0 +1,18 @@
1
+ ---
2
+ block: PostSingle1
3
+ title: "Lorem ipsum dolor sit amet"
4
+ description: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos."
5
+ image:
6
+ src: "/images/placeholder.webp"
7
+ alt: "alt"
8
+ ---
9
+
10
+ <h2>Lorem ipsum dolor sit amet</h2>
11
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.</p>
12
+
13
+ <h2>Lorem ipsum dolor sit amet</h2>
14
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.</p>
15
+
16
+ <h2>Lorem ipsum dolor sit amet</h2>
17
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.</p>
18
+
@@ -0,0 +1,21 @@
1
+ ---
2
+ block: ProductGroup1
3
+ title: "Lorem ipsum dolor sit amet"
4
+ description: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos."
5
+ products:
6
+ - title: "Lorem ipsum"
7
+ price: 100
8
+ images:
9
+ - src: "/images/placeholder.webp"
10
+ alt: "alt"
11
+ - title: "Lorem ipsum"
12
+ price: 100
13
+ images:
14
+ - src: "/images/placeholder.webp"
15
+ alt: "alt"
16
+ - title: "Lorem ipsum"
17
+ price: 100
18
+ images:
19
+ - src: "/images/placeholder.webp"
20
+ alt: "alt"
21
+ ---
@@ -0,0 +1,25 @@
1
+ ---
2
+ block: ProductList1
3
+ writeup: |
4
+ <h1>Lorem ipsum dolor sit amet</h1>
5
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.</p>
6
+ button:
7
+ text: "Lorem ipsum"
8
+ href: "#"
9
+ products:
10
+ - title: "Lorem ipsum"
11
+ price: 100
12
+ images:
13
+ - src: "/images/placeholder.webp"
14
+ alt: "alt"
15
+ - title: "Lorem ipsum"
16
+ price: 100
17
+ images:
18
+ - src: "/images/placeholder.webp"
19
+ alt: "alt"
20
+ - title: "Lorem ipsum"
21
+ price: 100
22
+ images:
23
+ - src: "/images/placeholder.webp"
24
+ alt: "alt"
25
+ ---
@@ -0,0 +1,23 @@
1
+ ---
2
+ block: ProductSingle1
3
+ title: "Lorem ipsum dolor sit amet"
4
+ description: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos."
5
+ price: 100
6
+ images:
7
+ - src: "/images/placeholder.webp"
8
+ alt: "alt"
9
+ - src: "/images/placeholder.webp"
10
+ alt: "alt"
11
+ - src: "/images/placeholder.webp"
12
+ alt: "alt"
13
+ ---
14
+
15
+ <h2>Lorem ipsum dolor sit amet</h2>
16
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.</p>
17
+
18
+ <h2>Lorem ipsum dolor sit amet</h2>
19
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.</p>
20
+
21
+ <h2>Lorem ipsum dolor sit amet</h2>
22
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.</p>
23
+
@@ -0,0 +1,16 @@
1
+ ---
2
+ block: Reviews1
3
+ writeup: |
4
+ <h1>Lorem ipsum dolor sit amet</h1>
5
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.</p>
6
+ reviews:
7
+ - rating: 5
8
+ title: "Lorem ipsum"
9
+ description: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos."
10
+ - rating: 5
11
+ title: "Lorem ipsum"
12
+ description: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos."
13
+ - rating: 5
14
+ title: "Lorem ipsum"
15
+ description: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos."
16
+ ---
@@ -0,0 +1,20 @@
1
+ import { glob } from 'astro/loaders'
2
+ import { defineCollection, z } from 'astro:content'
3
+ import { pageSchema } from 'fulldev-ui/schemas/collections/page'
4
+
5
+ export const collections = {
6
+ pages: defineCollection({
7
+ loader: glob({
8
+ pattern: '**/[^_]*.{md,mdx}',
9
+ base: './src/content/pages',
10
+ }),
11
+ schema: pageSchema,
12
+ }),
13
+ blocks: defineCollection({
14
+ loader: glob({
15
+ pattern: '**/[^_]*.{md,mdx}',
16
+ base: './src/content/blocks',
17
+ }),
18
+ schema: z.any(),
19
+ }),
20
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "company": "Fulldev UI",
3
+ "title": "Fulldev UI",
4
+ "description": "The Astro UI library for building content sites. Components and blocks to build content-driven websites.",
5
+ "logo": {
6
+ "src": "/images/logo.svg",
7
+ "alt": "Fulldev UI",
8
+ "text": "Fulldev UI"
9
+ },
10
+ "header": {
11
+ "menus": [
12
+ {
13
+ "text": "Docs",
14
+ "href": "/docs/"
15
+ },
16
+ {
17
+ "text": "Components",
18
+ "href": "/docs/components/"
19
+ },
20
+ {
21
+ "text": "Blocks",
22
+ "href": "/blocks/"
23
+ }
24
+ ]
25
+ }
26
+ }
@@ -0,0 +1,14 @@
1
+ ---
2
+ import type { ComponentProps } from 'astro/types'
3
+ import Box from 'fulldev-ui/components/Box.astro'
4
+ import Layout from 'fulldev-ui/components/Layout.astro'
5
+ import 'fulldev-ui/styles/global.css'
6
+
7
+ interface Props extends ComponentProps<typeof Layout> {}
8
+ ---
9
+
10
+ <Layout>
11
+ <Box as="main">
12
+ <slot />
13
+ </Box>
14
+ </Layout>
@@ -0,0 +1,24 @@
1
+ ---
2
+ import { getCollection, render } from 'astro:content'
3
+ import Block from 'fulldev-ui/components/Block.astro'
4
+ import NavigationLayout from 'fulldev-ui/layouts/NavigationLayout.astro'
5
+
6
+ export async function getStaticPaths() {
7
+ const collection = await getCollection('blocks')
8
+ return collection.map((entry) => ({
9
+ params: {
10
+ block: entry.id,
11
+ },
12
+ props: entry,
13
+ }))
14
+ }
15
+
16
+ const { Content } = await render(Astro.props)
17
+ const { data } = Astro.props
18
+ ---
19
+
20
+ <NavigationLayout>
21
+ <Block {...data}>
22
+ <Content />
23
+ </Block>
24
+ </NavigationLayout>
@@ -0,0 +1,21 @@
1
+ ---
2
+ import { getCollection } from 'astro:content'
3
+ import NavigationLayout from 'fulldev-ui/layouts/NavigationLayout.astro'
4
+
5
+ const collection = await getCollection('blocks')
6
+ ---
7
+
8
+ <NavigationLayout>
9
+ <h1 class="p4 text-2xl font-bold">Blocks</h1>
10
+ <ul class="list-dist my-6 ml-4 list-disc p-4 li:mt-2">
11
+ {
12
+ collection
13
+ .sort((a, b) => a.id.localeCompare(b.id))
14
+ .map((block) => (
15
+ <li>
16
+ <a href={`/blocks/${block.id}/`}>{block.id}</a>
17
+ </li>
18
+ ))
19
+ }
20
+ </ul>
21
+ </NavigationLayout>
@@ -0,0 +1,8 @@
1
+ ---
2
+ import NavigationLayout from 'fulldev-ui/layouts/NavigationLayout.astro'
3
+ ---
4
+
5
+ <NavigationLayout>
6
+ <h1>Blocks</h1>
7
+ <a href="/blocks/">Blocks</a>
8
+ </NavigationLayout>
@@ -7,7 +7,7 @@ export const categoryGroupSchema = z
7
7
  description: z.string().optional(),
8
8
  categories: categorySingleSchema
9
9
  .extend({
10
- href: z.string(),
10
+ href: z.string().optional(),
11
11
  })
12
12
  .array()
13
13
  .optional(),
@@ -7,10 +7,11 @@ export const faqsSchema = z
7
7
  buttons: buttonSchema.array().optional(),
8
8
  faqs: z
9
9
  .object({
10
- title: z.string(),
11
- description: z.string(),
10
+ title: z.string().optional(),
11
+ description: z.string().optional(),
12
12
  })
13
- .array(),
13
+ .array()
14
+ .optional(),
14
15
  })
15
16
  .strict()
16
17
 
@@ -5,11 +5,12 @@ export const featuresSchema = z
5
5
  writeup: z.string().optional(),
6
6
  features: z
7
7
  .object({
8
- icon: z.string(),
9
- title: z.string(),
10
- description: z.string(),
8
+ icon: z.string().optional(),
9
+ title: z.string().optional(),
10
+ description: z.string().optional(),
11
11
  })
12
- .array(),
12
+ .array()
13
+ .optional(),
13
14
  })
14
15
  .strict()
15
16