fulldev-ui 0.9.2 → 0.10.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/CHANGELOG.md +12 -0
- package/README.md +100 -16
- package/package.json +3 -2
- package/public/r/accordion.json +3 -5
- package/public/r/alert-dialog.json +1 -1
- package/public/r/alert.json +0 -5
- package/public/r/article-1.json +1 -1
- package/public/r/article-2.json +1 -1
- package/public/r/articles-1.json +1 -1
- package/public/r/articles-2.json +1 -1
- package/public/r/articles-3.json +1 -1
- package/public/r/avatar.json +1 -16
- package/public/r/badge.json +1 -1
- package/public/r/banner-1.json +5 -3
- package/public/r/banner-2.json +1 -1
- package/public/r/banner.json +5 -3
- package/public/r/blocks-1.json +6 -3
- package/public/r/breadcrumb.json +4 -4
- package/public/r/button.json +1 -1
- package/public/r/card.json +4 -4
- package/public/r/carousel.json +5 -5
- package/public/r/checkbox.json +1 -1
- package/public/r/combobox.json +8 -8
- package/public/r/command.json +6 -6
- package/public/r/components.json +1 -6
- package/public/r/contact-1.json +4 -2
- package/public/r/contact-2.json +4 -2
- package/public/r/contact-3.json +11 -3
- package/public/r/content-1.json +11 -3
- package/public/r/content-2.json +11 -3
- package/public/r/content-3.json +7 -1
- package/public/r/content-4.json +11 -3
- package/public/r/cta-2.json +7 -1
- package/public/r/cta-4.json +7 -1
- package/public/r/cta-5.json +11 -3
- package/public/r/cta-6.json +7 -1
- package/public/r/dialog.json +6 -6
- package/public/r/doc-1.json +6 -3
- package/public/r/dropdown-menu.json +9 -11
- package/public/r/features-1.json +5 -3
- package/public/r/features-2.json +5 -3
- package/public/r/features-4.json +5 -3
- package/public/r/features-5.json +4 -2
- package/public/r/field.json +2 -7
- package/public/r/footer-1.json +5 -3
- package/public/r/footer-2.json +5 -3
- package/public/r/footer-3.json +5 -3
- package/public/r/header-1.json +1 -1
- package/public/r/header.json +3 -0
- package/public/r/hero-13.json +1 -1
- package/public/r/hero-4.json +5 -3
- package/public/r/hero-5.json +5 -3
- package/public/r/hero-6.json +5 -3
- package/public/r/hero-7.json +5 -3
- package/public/r/hero-8.json +1 -1
- package/public/r/hero-9.json +5 -3
- package/public/r/hover-card.json +2 -2
- package/public/r/icon.json +1 -1
- package/public/r/input-group.json +1 -1
- package/public/r/item.json +2 -20
- package/public/r/kbd.json +2 -2
- package/public/r/layout.json +4 -7
- package/public/r/links-2.json +5 -3
- package/public/r/marquee.json +1 -1
- package/public/r/native-select.json +3 -3
- package/public/r/navigation-menu.json +6 -8
- package/public/r/page.json +17 -0
- package/public/r/popover.json +1 -1
- package/public/r/pricing-1.json +5 -3
- package/public/r/pricing-2.json +5 -3
- package/public/r/pricing-3.json +5 -3
- package/public/r/products-1.json +1 -1
- package/public/r/products-4.json +1 -1
- package/public/r/products-5.json +1 -1
- package/public/r/radio-group.json +1 -1
- package/public/r/rating.json +3 -3
- package/public/r/registry.json +186 -440
- package/public/r/reviews-1.json +5 -3
- package/public/r/reviews-2.json +5 -3
- package/public/r/reviews-3.json +5 -3
- package/public/r/reviews-4.json +1 -1
- package/public/r/reviews-5.json +5 -3
- package/public/r/select.json +6 -8
- package/public/r/services-1.json +11 -3
- package/public/r/services-2.json +7 -1
- package/public/r/services-3.json +7 -1
- package/public/r/services-4.json +11 -3
- package/public/r/services-5.json +5 -3
- package/public/r/services-6.json +11 -3
- package/public/r/services-7.json +11 -3
- package/public/r/sheet.json +6 -3
- package/public/r/sidebar-1.json +4 -2
- package/public/r/sidebar.json +10 -7
- package/public/r/slider.json +1 -1
- package/public/r/spinner.json +3 -3
- package/public/r/switch.json +1 -1
- package/public/r/theme-toggle.json +5 -3
- package/public/r/tooltip.json +1 -1
- package/public/r/typography.json +16 -16
- package/public/r/video.json +1 -1
- package/registry.json +186 -440
- package/src/components/blocks/article-1.astro +1 -1
- package/src/components/blocks/article-2.astro +1 -1
- package/src/components/blocks/articles-1.astro +1 -1
- package/src/components/blocks/articles-2.astro +2 -2
- package/src/components/blocks/articles-3.astro +1 -1
- package/src/components/blocks/banner-1.astro +3 -5
- package/src/components/blocks/banner-2.astro +1 -1
- package/src/components/blocks/blocks-1.astro +25 -37
- package/src/components/blocks/contact-3.astro +4 -3
- package/src/components/blocks/content-1.astro +5 -4
- package/src/components/blocks/content-2.astro +6 -5
- package/src/components/blocks/content-3.astro +9 -2
- package/src/components/blocks/content-4.astro +6 -5
- package/src/components/blocks/cta-2.astro +4 -3
- package/src/components/blocks/cta-4.astro +3 -2
- package/src/components/blocks/cta-5.astro +6 -5
- package/src/components/blocks/cta-6.astro +4 -3
- package/src/components/blocks/doc-1.astro +28 -56
- package/src/components/blocks/features-1.astro +3 -1
- package/src/components/blocks/features-2.astro +4 -2
- package/src/components/blocks/features-4.astro +3 -1
- package/src/components/blocks/footer-1.astro +26 -12
- package/src/components/blocks/footer-2.astro +24 -12
- package/src/components/blocks/footer-3.astro +26 -12
- package/src/components/blocks/header-1.astro +2 -3
- package/src/components/blocks/hero-13.astro +1 -1
- package/src/components/blocks/hero-4.astro +2 -2
- package/src/components/blocks/hero-5.astro +3 -3
- package/src/components/blocks/hero-6.astro +3 -3
- package/src/components/blocks/hero-7.astro +3 -3
- package/src/components/blocks/hero-8.astro +1 -1
- package/src/components/blocks/hero-9.astro +2 -2
- package/src/components/blocks/links-2.astro +3 -5
- package/src/components/blocks/pricing-1.astro +3 -2
- package/src/components/blocks/pricing-2.astro +3 -2
- package/src/components/blocks/pricing-3.astro +3 -2
- package/src/components/blocks/products-1.astro +1 -1
- package/src/components/blocks/products-4.astro +2 -2
- package/src/components/blocks/products-5.astro +4 -4
- package/src/components/blocks/reviews-1.astro +2 -2
- package/src/components/blocks/reviews-2.astro +2 -2
- package/src/components/blocks/reviews-3.astro +2 -2
- package/src/components/blocks/reviews-4.astro +4 -4
- package/src/components/blocks/reviews-5.astro +16 -25
- package/src/components/blocks/services-1.astro +7 -9
- package/src/components/blocks/services-2.astro +5 -4
- package/src/components/blocks/services-3.astro +6 -5
- package/src/components/blocks/services-4.astro +7 -9
- package/src/components/blocks/services-5.astro +3 -4
- package/src/components/blocks/services-6.astro +7 -6
- package/src/components/blocks/services-7.astro +7 -9
- package/src/components/blocks/sidebar-1.astro +42 -97
- package/src/components/ui/accordion/accordion-trigger.astro +7 -8
- package/src/components/ui/alert-dialog/alert-dialog.astro +23 -3
- package/src/components/ui/avatar/avatar.astro +1 -1
- package/src/components/ui/badge/badge.astro +1 -0
- package/src/components/ui/banner/banner-container.astro +3 -3
- package/src/components/ui/breadcrumb/breadcrumb-ellipsis.astro +2 -2
- package/src/components/ui/breadcrumb/breadcrumb-separator.astro +2 -2
- package/src/components/ui/button/button-variants.ts +8 -7
- package/src/components/ui/card/card-content.astro +1 -1
- package/src/components/ui/card/card-footer.astro +1 -1
- package/src/components/ui/card/card-header.astro +1 -1
- package/src/components/ui/card/card.astro +1 -1
- package/src/components/ui/carousel/carousel-next.astro +3 -3
- package/src/components/ui/carousel/carousel-previous.astro +3 -3
- package/src/components/ui/checkbox/checkbox.astro +1 -1
- package/src/components/ui/combobox/combobox-input.astro +2 -2
- package/src/components/ui/combobox/combobox-item.astro +4 -4
- package/src/components/ui/combobox/combobox-list.astro +1 -1
- package/src/components/ui/combobox/combobox-trigger.astro +2 -5
- package/src/components/ui/combobox/combobox.astro +3 -0
- package/src/components/ui/command/command-dialog.astro +10 -10
- package/src/components/ui/command/command-input.astro +2 -2
- package/src/components/ui/command/command-item.astro +4 -5
- package/src/components/ui/dialog/dialog-close.astro +2 -2
- package/src/components/ui/dialog/dialog-content.astro +2 -2
- package/src/components/ui/dialog/dialog.astro +26 -3
- package/src/components/ui/dropdown-menu/dropdown-menu-checkbox-item.astro +4 -5
- package/src/components/ui/dropdown-menu/dropdown-menu-content.astro +4 -4
- package/src/components/ui/dropdown-menu/dropdown-menu-item.astro +1 -1
- package/src/components/ui/dropdown-menu/dropdown-menu-label.astro +1 -1
- package/src/components/ui/dropdown-menu/dropdown-menu-radio-item.astro +4 -5
- package/src/components/ui/dropdown-menu/dropdown-menu-shortcut.astro +1 -1
- package/src/components/ui/dropdown-menu/dropdown-menu.astro +3 -0
- package/src/components/ui/field/field-label.astro +1 -1
- package/src/components/ui/field/field-title.astro +1 -1
- package/src/components/ui/hover-card/hover-card-content.astro +4 -4
- package/src/components/ui/hover-card/hover-card.astro +2 -2
- package/src/components/ui/icon/icon.astro +7 -10
- package/src/components/ui/input-group/input-group-button.astro +0 -1
- package/src/components/ui/item/item-media.astro +1 -1
- package/src/components/ui/item/item.astro +0 -18
- package/src/components/ui/kbd/kbd-group.astro +1 -1
- package/src/components/ui/kbd/kbd.astro +1 -1
- package/src/components/ui/layout/layout-body.astro +1 -1
- package/src/components/ui/layout/layout-head.astro +3 -2
- package/src/components/ui/layout/layout-main.astro +1 -1
- package/src/components/ui/layout/layout.astro +4 -0
- package/src/components/ui/marquee/marquee.astro +49 -68
- package/src/components/ui/native-select/native-select.astro +2 -3
- package/src/components/ui/navigation-menu/navigation-menu-content.astro +1 -1
- package/src/components/ui/navigation-menu/navigation-menu-list.astro +1 -1
- package/src/components/ui/navigation-menu/navigation-menu-trigger.astro +2 -3
- package/src/components/ui/navigation-menu/navigation-menu.astro +1 -1
- package/src/components/ui/popover/popover-content.astro +1 -1
- package/src/components/ui/radio-group/radio-group-item.astro +3 -3
- package/src/components/ui/rating/rating.astro +3 -3
- package/src/components/ui/select/select-content.astro +1 -1
- package/src/components/ui/select/select-item.astro +4 -4
- package/src/components/ui/select/select-trigger.astro +3 -6
- package/src/components/ui/select/select.astro +6 -0
- package/src/components/ui/sheet/sheet-content.astro +4 -5
- package/src/components/ui/sidebar/sidebar-menu-button.astro +13 -10
- package/src/components/ui/sidebar/sidebar-menu-sub-button.astro +10 -8
- package/src/components/ui/sidebar/sidebar-provider.astro +1 -13
- package/src/components/ui/sidebar/sidebar-rail.astro +1 -1
- package/src/components/ui/sidebar/sidebar-trigger.astro +3 -3
- package/src/components/ui/sidebar/sidebar.astro +1 -1
- package/src/components/ui/slider/slider.astro +6 -4
- package/src/components/ui/spinner/spinner.astro +4 -4
- package/src/components/ui/switch/switch.astro +1 -1
- package/src/components/ui/theme-toggle/theme-toggle.astro +4 -3
- package/src/components/ui/tooltip/tooltip-content.astro +1 -1
- package/src/components/ui/typography/typography-a.astro +19 -4
- package/src/components/ui/typography/typography-blockquote.astro +26 -6
- package/src/components/ui/typography/typography-h1.astro +7 -9
- package/src/components/ui/typography/typography-h2.astro +12 -9
- package/src/components/ui/typography/typography-h3.astro +7 -9
- package/src/components/ui/typography/typography-h4.astro +7 -9
- package/src/components/ui/typography/typography-inline-code.astro +28 -12
- package/src/components/ui/typography/typography-lead.astro +29 -4
- package/src/components/ui/typography/typography-list-item.astro +25 -9
- package/src/components/ui/typography/typography-list.astro +29 -11
- package/src/components/ui/typography/typography-p.astro +26 -6
- package/src/components/ui/typography/typography-table-cell.astro +32 -13
- package/src/components/ui/typography/typography-table-head.astro +27 -13
- package/src/components/ui/typography/typography-table-row.astro +23 -13
- package/src/components/ui/typography/typography-table.astro +29 -20
- package/src/components/ui/typography/typography.astro +172 -46
- package/src/components/ui/video/video.astro +11 -27
- package/src/styles/global.css +2 -15
- package/public/r/beta-repo-setup.json +0 -131
- package/public/r/blocks.json +0 -91
- package/public/r/content-5.json +0 -17
- package/public/r/content-6.json +0 -17
- package/public/r/init.json +0 -23
- package/public/r/tile.json +0 -27
- package/src/components/blocks/content-5.astro +0 -115
- package/src/components/blocks/content-6.astro +0 -91
- package/src/components/ui/tile/index.ts +0 -3
- package/src/components/ui/tile/tile-content.astro +0 -17
- package/src/components/ui/tile/tile-group.astro +0 -76
- package/src/components/ui/tile/tile.astro +0 -46
package/src/styles/global.css
CHANGED
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
--popover: oklch(0.269 0 0);
|
|
69
69
|
--popover-foreground: oklch(0.985 0 0);
|
|
70
70
|
--primary: oklch(0.686 0.2105 41.139);
|
|
71
|
-
--primary-foreground: oklch(
|
|
71
|
+
--primary-foreground: oklch(1 0 0);
|
|
72
72
|
--secondary: oklch(0.269 0 0);
|
|
73
73
|
--secondary-foreground: oklch(0.985 0 0);
|
|
74
74
|
--muted: oklch(0.269 0 0);
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
--sidebar: oklch(0.205 0 0);
|
|
89
89
|
--sidebar-foreground: oklch(0.985 0 0);
|
|
90
90
|
--sidebar-primary: oklch(0.686 0.2105 41.139);
|
|
91
|
-
--sidebar-primary-foreground: oklch(
|
|
91
|
+
--sidebar-primary-foreground: oklch(1 0 0);
|
|
92
92
|
--sidebar-accent: oklch(0.269 0 0);
|
|
93
93
|
--sidebar-accent-foreground: oklch(0.985 0 0);
|
|
94
94
|
--sidebar-border: oklch(0.275 0 0);
|
|
@@ -115,19 +115,6 @@
|
|
|
115
115
|
}
|
|
116
116
|
|
|
117
117
|
@theme inline {
|
|
118
|
-
--font-sans: var(--font-geist-sans, ui-sans-serif, system-ui, sans-serif);
|
|
119
|
-
--font-mono: var(
|
|
120
|
-
--font-geist-mono,
|
|
121
|
-
ui-monospace,
|
|
122
|
-
SFMono-Regular,
|
|
123
|
-
Menlo,
|
|
124
|
-
Monaco,
|
|
125
|
-
Consolas,
|
|
126
|
-
"Liberation Mono",
|
|
127
|
-
"Courier New",
|
|
128
|
-
monospace
|
|
129
|
-
);
|
|
130
|
-
|
|
131
118
|
--color-background: var(--background);
|
|
132
119
|
--color-foreground: var(--foreground);
|
|
133
120
|
--color-card: var(--card);
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
|
-
"name": "beta-repo-setup",
|
|
4
|
-
"registryDependencies": [
|
|
5
|
-
"@fulldev/blocks",
|
|
6
|
-
"@fulldev/components"
|
|
7
|
-
],
|
|
8
|
-
"files": [
|
|
9
|
-
{
|
|
10
|
-
"path": "src/content.config.ts",
|
|
11
|
-
"content": "import { defineCollection } from \"astro:content\"\nimport { glob } from \"astro/loaders\"\n\nimport { globalSchema } from \"@/schemas/global\"\nimport { pageSchema } from \"@/schemas/page\"\n\nexport const collections = {\n pages: defineCollection({\n loader: glob({\n pattern: \"**/[^_]*.{md,mdx}\",\n base: \"src/content/pages\",\n }),\n schema: pageSchema,\n }),\n globals: defineCollection({\n loader: glob({\n pattern: \"**/[^_]*.{yaml,yml,json}\",\n base: \"src/content/globals\",\n }),\n schema: globalSchema,\n }),\n}\n",
|
|
12
|
-
"type": "registry:file",
|
|
13
|
-
"target": "src/content.config.ts"
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"path": "src/components/layout-renderer.astro",
|
|
17
|
-
"content": "---\n// Keep this renderer generic and stable. New page types should be wired by\n// adding a matching schema and src/layouts/<type>.astro file, not by adding\n// layout-specific branches here.\nimport { getEntry, render, type CollectionEntry } from \"astro:content\"\n\ntype Props = CollectionEntry<\"pages\">\n\nconst page = Astro.props\nconst pageData = page.data\nconst { Content, headings } = await render(page)\nconst global = await getEntry(\"globals\", Astro.currentLocale || \"en\")\nif (!global) throw new Error(\"Add a global to content/globals\")\nconst globalData = global.data\n\nconst layoutImports = import.meta.glob(\"../layouts/*.astro\", { eager: true })\nconst layoutPath = `../layouts/${pageData.type}.astro`\nconst layoutImport = layoutImports[layoutPath] as { default?: any } | undefined\nconst Layout = layoutImport?.default\n\nif (!Layout) throw new Error(`Add a layout for page type \"${pageData.type}\"`)\n---\n\n<Layout global={globalData} page={pageData} headings={headings}>\n <Content />\n</Layout>\n",
|
|
18
|
-
"type": "registry:file",
|
|
19
|
-
"target": "src/components/layout-renderer.astro"
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
"path": "src/lib/pages.ts",
|
|
23
|
-
"content": "import { getCollection, type CollectionEntry } from \"astro:content\"\n\ntype Page = CollectionEntry<\"pages\">\n\nexport type PageSearchItem = {\n label: string\n href: string\n title: string\n path: string\n description: string\n group: string\n}\n\nexport type PageBreadcrumbItem = {\n label: string\n href: string\n}\n\nexport const normalizePath = (path: string) => {\n if (path === \"/\") return path\n\n return path.replace(/\\/$/, \"\")\n}\n\nexport const getPageHref = (page: Page) =>\n page.id === \"index\" ? \"/\" : `/${page.id}/`\n\nexport const formatSlug = (slug: string) =>\n slug\n .split(\"-\")\n .filter(Boolean)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \")\n\nconst getPageSearchGroup = (href: string) => {\n const [slug] = href.split(\"/\").filter(Boolean)\n\n return slug ? formatSlug(slug) : \"Overview\"\n}\n\nexport const getPageSearchItems = async (): Promise<PageSearchItem[]> => {\n const pages = await getCollection(\"pages\")\n\n return pages\n .map((page) => ({\n label: page.data.title,\n href: getPageHref(page),\n title: page.data.title,\n path: getPageHref(page),\n description: page.data.description,\n group: getPageSearchGroup(getPageHref(page)),\n }))\n .sort((a, b) => a.label.localeCompare(b.label))\n}\n\nexport const getPageBreadcrumbItems = async (\n pathname: string\n): Promise<PageBreadcrumbItem[]> => {\n const currentPath = normalizePath(pathname)\n const pages = await getCollection(\"pages\")\n const pageTitlesByHref = new Map(\n pages.map((page) => [getPageHref(page), page.data.title])\n )\n const homeLink = {\n label: pageTitlesByHref.get(\"/\") ?? \"Home\",\n href: \"/\",\n }\n\n if (currentPath === \"/\") return [homeLink]\n\n return [\n homeLink,\n ...currentPath\n .split(\"/\")\n .filter(Boolean)\n .map((slug, index, slugs) => {\n const href = `/${slugs.slice(0, index + 1).join(\"/\")}/`\n\n return {\n label: pageTitlesByHref.get(href) ?? formatSlug(slug),\n href,\n }\n }),\n ]\n}\n",
|
|
24
|
-
"type": "registry:file",
|
|
25
|
-
"target": "src/lib/pages.ts"
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
"path": "src/pages/[...page].astro",
|
|
29
|
-
"content": "---\nimport { getCollection } from \"astro:content\"\n\nimport LayoutRenderer from \"@/components/layout-renderer.astro\"\n\nexport async function getStaticPaths() {\n const pages = await getCollection(\"pages\")\n return pages.map((page) => {\n return {\n params: {\n page: page.id === \"index\" ? undefined : page.id,\n },\n props: page,\n }\n })\n}\n---\n\n<LayoutRenderer {...Astro.props} />\n",
|
|
30
|
-
"type": "registry:file",
|
|
31
|
-
"target": "src/pages/[...page].astro"
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
"path": "src/pages/[...page].md.ts",
|
|
35
|
-
"content": "import { readFile } from \"node:fs/promises\"\nimport type { APIRoute } from \"astro\"\nimport { getCollection } from \"astro:content\"\n\nexport const prerender = true\n\nconst navigationPreamble = \"Navigation: [/sitemap.md](/sitemap.md)\\n\\n\"\n\nexport async function getStaticPaths() {\n const pages = await getCollection(\"pages\")\n return Promise.all(\n pages\n .filter((page) => page.id !== \"index\")\n .map(async (page) => ({\n params: {\n page: page.id,\n },\n props: {\n source: await readPageSource(page.filePath),\n },\n }))\n )\n}\n\nasync function readPageSource(filePath: string | undefined) {\n if (!filePath) {\n throw new Error(\"Expected content page entry to include a file path.\")\n }\n\n return readFile(filePath, \"utf-8\")\n}\n\nexport const GET: APIRoute = ({ props }) => {\n return new Response(`${navigationPreamble}${props.source}`, {\n headers: {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n },\n })\n}\n",
|
|
36
|
-
"type": "registry:file",
|
|
37
|
-
"target": "src/pages/[...page].md.ts"
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
"path": "src/pages/index.md.ts",
|
|
41
|
-
"content": "import { readFile } from \"node:fs/promises\"\nimport type { APIRoute } from \"astro\"\nimport { getEntry } from \"astro:content\"\n\nexport const prerender = true\n\nconst agentPreamble = `# Fulldev UI Agent Entry Point\n\nNavigation: [/sitemap.md](/sitemap.md)\n\nIf you are an AI agent, treat this page as the entry point for Fulldev UI. Install the Fulldev skill first if your environment supports skills, then read the relevant Markdown pages before editing a project.\n\n\\`\\`\\`bash\nnpx -y skills add fulldotdev/ui --skill fulldev -y\n\\`\\`\\`\n\nStart here:\n\n- Install Fulldev UI: [/docs/installation.md](/docs/installation.md)\n- Understand the project model: [/docs/introduction.md](/docs/introduction.md)\n- Customize theme tokens: [/docs/theming.md](/docs/theming.md)\n- Browse documentation sections: [/docs.md](/docs.md)\n- Browse installable components: [/components.md](/components.md)\n- Browse installable blocks: [/blocks.md](/blocks.md)\n- Discover all pages: [/sitemap.md](/sitemap.md)\n- Read registry metadata: [/r/registry.json](/r/registry.json)\n\nEvery documentation page has a Markdown version. Add \\`.md\\` to a page URL, for example \\`/components/button.md\\` or \\`/blocks/hero.md\\`.\n\nRecommended agent flow:\n\n1. Read \\`/docs/installation.md\\`.\n2. Install the Fulldev skill if your agent supports skills.\n3. Read the component or block page that matches the user's request.\n4. Install registry items with \\`npx shadcn@latest add @fulldev/<name>\\`.\n5. Use block and component examples as source references, not as hidden sidebar context.\n\n---\n\n## Homepage source\n\n`\n\nexport const GET: APIRoute = async () => {\n const page = await getEntry(\"pages\", \"index\")\n\n if (!page?.filePath) {\n return new Response(\n `${agentPreamble}No homepage content entry exists yet. Add \\`src/content/pages/index.mdx\\` to use this Markdown entry point.`,\n {\n headers: {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n },\n }\n )\n }\n\n return new Response(\n `${agentPreamble}${await readFile(page.filePath, \"utf-8\")}`,\n {\n headers: {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n },\n }\n )\n}\n",
|
|
42
|
-
"type": "registry:file",
|
|
43
|
-
"target": "src/pages/index.md.ts"
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
"path": "src/pages/sitemap.md.ts",
|
|
47
|
-
"content": "import type { APIRoute } from \"astro\"\nimport { getCollection } from \"astro:content\"\n\nimport { getPageHref } from \"@/lib/pages\"\n\nexport const prerender = true\n\nconst getMarkdownHref = (href: string) =>\n href === \"/\" ? \"/index.md\" : `${href.replace(/\\/$/, \"\")}.md`\n\nexport const GET: APIRoute = async () => {\n const pages = await getCollection(\"pages\")\n const pageLinks = pages\n .map((page) => ({\n title: page.data.title,\n href: getPageHref(page),\n markdownHref: getMarkdownHref(getPageHref(page)),\n description: page.data.description,\n }))\n .sort((a, b) => a.href.localeCompare(b.href))\n\n const body = `# Fulldev UI Sitemap\n\nUse the Markdown URLs when reading pages as an AI agent.\n\n## Core\n\n- [Agent entry point](/index.md)\n- [Registry metadata](/r/registry.json)\n\n## Pages\n\n${pageLinks\n .map(\n (page) =>\n `- [${page.title}](${page.href}) | [Markdown](${page.markdownHref})${\n page.description ? ` - ${page.description}` : \"\"\n }`\n )\n .join(\"\\n\")}\n`\n\n return new Response(body, {\n headers: {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n },\n })\n}\n",
|
|
48
|
-
"type": "registry:file",
|
|
49
|
-
"target": "src/pages/sitemap.md.ts"
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
"path": "src/schemas/shared.ts",
|
|
53
|
-
"content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nexport const linkSchema = z.object({\n label: z.string(),\n href: z.string(),\n})\n\nexport const buttonSchema = z.object({\n label: z.string(),\n href: z.string(),\n icon: z.string().optional(),\n variant: z.enum([\"default\", \"outline\", \"secondary\", \"ghost\"]).optional(),\n})\n\nexport const imageSchema = ({ image }: SchemaContext) =>\n z.object({\n src: image(),\n alt: z.string(),\n })\n\nexport const seoSchema = (ctx: SchemaContext) =>\n z.object({\n title: z.string(),\n description: z.string(),\n image: imageSchema(ctx).optional(),\n canonical: z.string().optional(),\n noindex: z.boolean().optional(),\n nofollow: z.boolean().optional(),\n })\n",
|
|
54
|
-
"type": "registry:file",
|
|
55
|
-
"target": "src/schemas/shared.ts"
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
"path": "src/schemas/global.ts",
|
|
59
|
-
"content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nimport { buttonSchema, linkSchema } from \"@/schemas/shared\"\n\nconst nestedLinkSchema = linkSchema.extend({\n links: linkSchema.array().optional(),\n})\n\nexport const globalSchema = ({ image }: SchemaContext) =>\n z.object({\n name: z.string(),\n logo: z\n .object({\n label: z.string(),\n href: z.string(),\n src: image().optional(),\n srcLight: image().optional(),\n srcDark: image().optional(),\n alt: z.string().optional(),\n })\n .refine((logo) => logo.src || (logo.srcLight && logo.srcDark), {\n message: \"Logo must define src or both srcLight and srcDark.\",\n }),\n header: z.object({\n navigation: nestedLinkSchema.array(),\n githubRepo: z.string(),\n }),\n sidebar: z.object({\n search: z.object({\n label: z.string(),\n empty: z.string(),\n }),\n navigation: nestedLinkSchema.array(),\n }),\n docs: z\n .object({\n callout: z.object({\n description: z.string(),\n button: buttonSchema,\n }),\n })\n .optional(),\n })\n\nexport type GlobalSchema = z.infer<ReturnType<typeof globalSchema>>\n",
|
|
60
|
-
"type": "registry:file",
|
|
61
|
-
"target": "src/schemas/global.ts"
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
"path": "src/schemas/page.ts",
|
|
65
|
-
"content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nimport { blockSchema } from \"@/schemas/layouts/block\"\nimport { docSchema } from \"@/schemas/layouts/doc\"\nimport { homeSchema } from \"@/schemas/layouts/home\"\nimport { overviewSchema } from \"@/schemas/layouts/overview\"\n\nexport const pageSchema = (ctx: SchemaContext) =>\n z.discriminatedUnion(\"type\", [\n blockSchema(ctx).extend({ type: z.literal(\"block\") }),\n docSchema(ctx).extend({ type: z.literal(\"doc\") }),\n homeSchema(ctx).extend({ type: z.literal(\"home\") }),\n overviewSchema(ctx).extend({ type: z.literal(\"overview\") }),\n ])\n",
|
|
66
|
-
"type": "registry:file",
|
|
67
|
-
"target": "src/schemas/page.ts"
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
"path": "src/schemas/layouts/base.ts",
|
|
71
|
-
"content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nimport { imageSchema, seoSchema } from \"@/schemas/shared\"\n\nexport const baseSchema = (ctx: SchemaContext) =>\n z.object({\n title: z.string(),\n description: z.string(),\n image: imageSchema(ctx).optional(),\n seo: seoSchema(ctx).optional(),\n })\n\nexport type BaseSchema = z.infer<ReturnType<typeof baseSchema>>\n",
|
|
72
|
-
"type": "registry:file",
|
|
73
|
-
"target": "src/schemas/layouts/base.ts"
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
"path": "src/schemas/layouts/block.ts",
|
|
77
|
-
"content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nimport { baseSchema } from \"@/schemas/layouts/base\"\n\nexport const blockSchema = (ctx: SchemaContext) =>\n baseSchema(ctx)\n .extend({\n category: z.string().optional(),\n })\n .strict()\n\nexport type BlockSchema = z.infer<ReturnType<typeof blockSchema>>\n",
|
|
78
|
-
"type": "registry:file",
|
|
79
|
-
"target": "src/schemas/layouts/block.ts"
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
"path": "src/schemas/layouts/doc.ts",
|
|
83
|
-
"content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nimport { baseSchema } from \"@/schemas/layouts/base\"\n\nexport const docSchema = (ctx: SchemaContext) => baseSchema(ctx).loose()\n\nexport type DocSchema = z.infer<ReturnType<typeof docSchema>>\n",
|
|
84
|
-
"type": "registry:file",
|
|
85
|
-
"target": "src/schemas/layouts/doc.ts"
|
|
86
|
-
},
|
|
87
|
-
{
|
|
88
|
-
"path": "src/schemas/layouts/home.ts",
|
|
89
|
-
"content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nimport { baseSchema } from \"@/schemas/layouts/base\"\n\nexport const homeSchema = (ctx: SchemaContext) =>\n baseSchema(ctx).extend({}).strict()\n\nexport type HomeSchema = z.infer<ReturnType<typeof homeSchema>>\n",
|
|
90
|
-
"type": "registry:file",
|
|
91
|
-
"target": "src/schemas/layouts/home.ts"
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
"path": "src/schemas/layouts/overview.ts",
|
|
95
|
-
"content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nimport { baseSchema } from \"@/schemas/layouts/base\"\n\nexport const overviewSchema = (ctx: SchemaContext) => baseSchema(ctx).strict()\n\nexport type OverviewSchema = z.infer<ReturnType<typeof overviewSchema>>\n",
|
|
96
|
-
"type": "registry:file",
|
|
97
|
-
"target": "src/schemas/layouts/overview.ts"
|
|
98
|
-
},
|
|
99
|
-
{
|
|
100
|
-
"path": "src/layouts/base.astro",
|
|
101
|
-
"content": "---\nimport { Font } from \"astro:assets\"\n\nimport type { GlobalSchema } from \"@/schemas/global\"\nimport type { BaseSchema } from \"@/schemas/layouts/base\"\nimport { getPageBreadcrumbItems, getPageSearchItems } from \"@/lib/pages\"\nimport Sidebar1 from \"@/components/blocks/sidebar-1.astro\"\nimport {\n Layout,\n LayoutBody,\n LayoutHead,\n LayoutMain,\n} from \"@/components/ui/layout\"\nimport { ThemeProvider } from \"@/components/ui/theme-toggle\"\n\ntype Props = {\n global: GlobalSchema\n page: BaseSchema\n}\n\nconst { global, page }: Props = Astro.props\n\nconst [searchItems, breadcrumbItems] = await Promise.all([\n getPageSearchItems(),\n getPageBreadcrumbItems(Astro.url.pathname),\n])\n---\n\n<Layout>\n <LayoutHead {...global} {...page} {...page.seo}>\n <Fragment slot=\"head\">\n <Font\n cssVariable=\"--font-geist-sans\"\n preload={[{ subset: \"latin\", weight: \"100 900\", style: \"normal\" }]}\n />\n <Font cssVariable=\"--font-geist-mono\" />\n </Fragment>\n <ThemeProvider />\n </LayoutHead>\n <LayoutBody>\n <Sidebar1\n logo={global.logo}\n search={{\n items: searchItems,\n ...global.sidebar.search,\n }}\n breadcrumb={{\n items: breadcrumbItems,\n menu: global.header.navigation,\n }}\n navigation={global.sidebar.navigation}\n githubRepo={global.header.githubRepo}\n >\n <LayoutMain>\n <slot />\n </LayoutMain>\n </Sidebar1>\n </LayoutBody>\n</Layout>\n",
|
|
102
|
-
"type": "registry:file",
|
|
103
|
-
"target": "src/layouts/base.astro"
|
|
104
|
-
},
|
|
105
|
-
{
|
|
106
|
-
"path": "src/layouts/block.astro",
|
|
107
|
-
"content": "---\nimport type { MarkdownHeading } from \"astro\"\nimport { getCollection } from \"astro:content\"\n\nimport type { GlobalSchema } from \"@/schemas/global\"\nimport type { BlockSchema } from \"@/schemas/layouts/block\"\nimport Base from \"@/layouts/base.astro\"\nimport BlocksBlock from \"@/components/blocks/blocks-1.astro\"\n\ntype Props = {\n global: GlobalSchema\n page: BlockSchema\n headings: MarkdownHeading[]\n}\n\nconst props: Props = Astro.props\nconst currentPath = Astro.url.pathname\nconst markdownPath =\n currentPath === \"/\" ? \"/index.md\" : `${currentPath.replace(/\\/$/, \"\")}.md`\n\nconst blocks = await getCollection(\"pages\", ({ data }) => {\n return data.type === \"block\"\n})\nconst currentBlock = blocks.find((entry) => `/${entry.id}/` === currentPath)\nconst isBlockCategory = !props.page.category\nconst orderedBlockCategoryLinks = blocks\n .filter((entry) => !(\"category\" in entry.data) || !entry.data.category)\n .map((entry) => ({\n href: `/${entry.id}/`,\n title: entry.data.title,\n }))\n .sort((a, b) => a.href.localeCompare(b.href))\nconst currentPageIndex = orderedBlockCategoryLinks.findIndex(\n (item) => item.href === currentPath\n)\nconst previousPage =\n isBlockCategory && currentPageIndex > 0\n ? orderedBlockCategoryLinks[currentPageIndex - 1]\n : undefined\nconst nextPage =\n isBlockCategory && currentPageIndex >= 0\n ? orderedBlockCategoryLinks[currentPageIndex + 1]\n : undefined\nconst copySource = blocks.find((entry) => `/${entry.id}/` === currentPath)?.body\nconst copyButton = copySource\n ? {\n id: `blocks-copy-page-${crypto.randomUUID()}`,\n source: currentBlock?.body ?? copySource,\n }\n : undefined\n---\n\n<Base global={props.global} page={props.page}>\n <BlocksBlock\n title={props.page.title}\n description={props.page.description}\n copyButton={copyButton}\n markdownUrl={markdownPath}\n previousPage={previousPage}\n nextPage={nextPage}\n labels={{\n copyMarkdown: \"Copy Markdown\",\n openIn: \"Open in\",\n openInMarkdown: \"Open in Markdown\",\n openInChatGPT: \"Open in ChatGPT\",\n openInClaude: \"Open in Claude\",\n openInCursor: \"Open in Cursor\",\n pagination: {\n previous: \"Previous\",\n next: \"Next\",\n ariaLabel: \"Blocks pagination\",\n },\n }}\n >\n <slot />\n </BlocksBlock>\n</Base>\n",
|
|
108
|
-
"type": "registry:file",
|
|
109
|
-
"target": "src/layouts/block.astro"
|
|
110
|
-
},
|
|
111
|
-
{
|
|
112
|
-
"path": "src/layouts/doc.astro",
|
|
113
|
-
"content": "---\nimport type { MarkdownHeading } from \"astro\"\nimport { getCollection } from \"astro:content\"\n\nimport type { GlobalSchema } from \"@/schemas/global\"\nimport type { DocSchema } from \"@/schemas/layouts/doc\"\nimport Base from \"@/layouts/base.astro\"\nimport DocBlock from \"@/components/blocks/doc-1.astro\"\n\ntype Props = {\n global: GlobalSchema\n page: DocSchema\n headings: MarkdownHeading[]\n}\n\nconst props: Props = Astro.props\nconst currentPath = Astro.url.pathname\nconst globalCallout = props.global.docs?.callout\nconst markdownPath =\n currentPath === \"/\" ? \"/index.md\" : `${currentPath.replace(/\\/$/, \"\")}.md`\n\nconst docsPages = await getCollection(\"pages\")\nconst orderedDocLinks = [\n \"docs/introduction\",\n \"docs/installation\",\n \"docs/theming\",\n \"docs/dark-mode\",\n \"docs/cli\",\n \"docs/mcp\",\n \"docs/skills\",\n \"components\",\n \"blocks\",\n \"docs/layouts\",\n]\n .map((id) => docsPages.find((entry) => entry.id === id))\n .filter((entry): entry is (typeof docsPages)[number] => Boolean(entry))\n .map((entry) => ({\n href: `/${entry.id}/`,\n title: entry.data.title,\n }))\nconst componentLinks = docsPages\n .filter(\n (entry) => entry.data.type === \"doc\" && entry.id.startsWith(\"components/\")\n )\n .map((entry) => ({\n href: `/${entry.id}/`,\n title: entry.data.title,\n description: entry.data.description,\n }))\n .sort((a, b) => a.title.localeCompare(b.title))\nconst paginationLinks = [...orderedDocLinks, ...componentLinks]\nconst currentPageIndex = paginationLinks.findIndex(\n (item) => item.href === currentPath\n)\nconst previousPage =\n currentPageIndex > 0 ? paginationLinks[currentPageIndex - 1] : undefined\nconst nextPage =\n currentPageIndex >= 0 ? paginationLinks[currentPageIndex + 1] : undefined\nconst currentDoc = await getCollection(\"pages\", ({ data, id }) => {\n return data.type === \"doc\" && `/${id}/` === currentPath\n})\nconst copySource = currentDoc[0]?.body\nconst copyButton = copySource\n ? {\n id: `docs-copy-page-${crypto.randomUUID()}`,\n source: copySource,\n }\n : undefined\n\nconst tocItems = props.headings\n .filter((heading) => heading.depth === 2 || heading.depth === 3)\n .map((heading) => ({\n depth: heading.depth,\n href: `#${heading.slug}`,\n label: heading.text,\n }))\n---\n\n<Base global={props.global} page={props.page}>\n <DocBlock\n title={props.page.title}\n description={props.page.description}\n copyButton={copyButton}\n markdownUrl={markdownPath}\n tocItems={tocItems}\n callout={globalCallout}\n previousPage={previousPage}\n nextPage={nextPage}\n labels={{\n copyMarkdown: \"Copy Markdown\",\n openIn: \"Open in\",\n openInMarkdown: \"Open in Markdown\",\n openInChatGPT: \"Open in ChatGPT\",\n openInClaude: \"Open in Claude\",\n openInCursor: \"Open in Cursor\",\n pagination: {\n previous: \"Previous\",\n next: \"Next\",\n ariaLabel: \"Document pagination\",\n },\n toc: \"On This Page\",\n }}\n >\n <slot />\n </DocBlock>\n</Base>\n",
|
|
114
|
-
"type": "registry:file",
|
|
115
|
-
"target": "src/layouts/doc.astro"
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
"path": "src/layouts/home.astro",
|
|
119
|
-
"content": "---\nimport type { GlobalSchema } from \"@/schemas/global\"\nimport type { HomeSchema } from \"@/schemas/layouts/home\"\nimport Base from \"@/layouts/base.astro\"\nimport { Typography } from \"@/components/ui/typography\"\n\ntype Props = {\n global: GlobalSchema\n page: HomeSchema\n}\n\nconst { global, page } = Astro.props\n---\n\n<Base global={global} page={page}>\n <Typography\n as=\"article\"\n size=\"lg\"\n class=\"mx-auto w-full max-w-7xl px-4 py-16 lg:px-6 [&>:is(p,ul,ol,blockquote,h1,h2)]:max-w-4xl [&>:is(p,ul,ol,blockquote,h3,h4)]:max-w-3xl [&>[data-slot='tabs']:not(:first-child)]:mt-10\"\n >\n <slot />\n </Typography>\n</Base>\n",
|
|
120
|
-
"type": "registry:file",
|
|
121
|
-
"target": "src/layouts/home.astro"
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
"path": "src/layouts/overview.astro",
|
|
125
|
-
"content": "---\nimport { getCollection } from \"astro:content\"\n\nimport type { GlobalSchema } from \"@/schemas/global\"\nimport type { OverviewSchema } from \"@/schemas/layouts/overview\"\nimport Base from \"@/layouts/base.astro\"\nimport { SectionContainer } from \"@/components/ui/section\"\nimport { TypographyH1, TypographyLead } from \"@/components/ui/typography\"\n\ntype Props = {\n global: GlobalSchema\n page: OverviewSchema\n}\n\nconst { global, page }: Props = Astro.props\nconst currentPath = Astro.url.pathname\nconst pages = await getCollection(\"pages\")\n\nconst docsIndexOrder = [\n \"docs/introduction\",\n \"docs/installation\",\n \"docs/theming\",\n \"docs/dark-mode\",\n \"docs/cli\",\n \"docs/mcp\",\n \"docs/skills\",\n \"components\",\n \"blocks\",\n \"docs/layouts\",\n]\n\nconst entries =\n currentPath === \"/docs/\"\n ? docsIndexOrder\n .map((id) => pages.find((entry) => entry.id === id))\n .filter((entry): entry is (typeof pages)[number] => Boolean(entry))\n : pages\n .filter(({ data, id }) => {\n if (currentPath === \"/blocks/\") {\n return (\n data.type === \"block\" &&\n (!(\"category\" in data) || !data.category) &&\n id.startsWith(\"blocks/\")\n )\n }\n\n if (currentPath === \"/components/\") {\n return data.type === \"doc\" && id.startsWith(\"components/\")\n }\n\n return false\n })\n .sort((a, b) => a.data.title.localeCompare(b.data.title))\n\nconst overviewLinks = entries.map((entry) => ({\n href: `/${entry.id}/`,\n title: entry.data.title,\n description: entry.data.description,\n}))\n---\n\n<Base global={global} page={page}>\n <SectionContainer class=\"gap-10 pt-10 pb-10 sm:pt-12 sm:pb-12\">\n <div class=\"mx-auto flex w-full max-w-336 flex-col gap-10\">\n <header class=\"flex min-w-0 flex-col gap-4 border-b pb-8\">\n <TypographyH1\n class=\"text-foreground text-left text-3xl tracking-tight sm:text-4xl\"\n >\n {page.title}\n </TypographyH1>\n {\n page.description && (\n <TypographyLead class=\"max-w-2xl text-base leading-7\">\n {page.description}\n </TypographyLead>\n )\n }\n </header>\n\n <section class=\"grid gap-2 md:grid-cols-2 xl:grid-cols-3\">\n {\n overviewLinks.map((item) => (\n <a\n href={item.href}\n class=\"bg-muted/40 hover:bg-muted/60 focus-visible:ring-ring/50 rounded-lg px-4 py-4 transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n >\n <span class=\"text-sm font-medium\">{item.title}</span>\n {item.description && (\n <span class=\"text-muted-foreground mt-1 block text-sm leading-5\">\n {item.description}\n </span>\n )}\n </a>\n ))\n }\n </section>\n </div>\n </SectionContainer>\n</Base>\n",
|
|
126
|
-
"type": "registry:file",
|
|
127
|
-
"target": "src/layouts/overview.astro"
|
|
128
|
-
}
|
|
129
|
-
],
|
|
130
|
-
"type": "registry:file"
|
|
131
|
-
}
|
package/public/r/blocks.json
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
|
-
"name": "blocks",
|
|
4
|
-
"registryDependencies": [
|
|
5
|
-
"@fulldev/article-1",
|
|
6
|
-
"@fulldev/article-2",
|
|
7
|
-
"@fulldev/articles-1",
|
|
8
|
-
"@fulldev/articles-2",
|
|
9
|
-
"@fulldev/articles-3",
|
|
10
|
-
"@fulldev/articles-4",
|
|
11
|
-
"@fulldev/banner-1",
|
|
12
|
-
"@fulldev/banner-2",
|
|
13
|
-
"@fulldev/blocks-1",
|
|
14
|
-
"@fulldev/contact-1",
|
|
15
|
-
"@fulldev/contact-2",
|
|
16
|
-
"@fulldev/contact-3",
|
|
17
|
-
"@fulldev/content-1",
|
|
18
|
-
"@fulldev/content-2",
|
|
19
|
-
"@fulldev/content-3",
|
|
20
|
-
"@fulldev/content-4",
|
|
21
|
-
"@fulldev/content-5",
|
|
22
|
-
"@fulldev/content-6",
|
|
23
|
-
"@fulldev/cta-1",
|
|
24
|
-
"@fulldev/cta-2",
|
|
25
|
-
"@fulldev/cta-3",
|
|
26
|
-
"@fulldev/cta-4",
|
|
27
|
-
"@fulldev/cta-5",
|
|
28
|
-
"@fulldev/cta-6",
|
|
29
|
-
"@fulldev/cta-7",
|
|
30
|
-
"@fulldev/cta-8",
|
|
31
|
-
"@fulldev/doc-1",
|
|
32
|
-
"@fulldev/faqs-1",
|
|
33
|
-
"@fulldev/faqs-2",
|
|
34
|
-
"@fulldev/faqs-3",
|
|
35
|
-
"@fulldev/faqs-4",
|
|
36
|
-
"@fulldev/features-1",
|
|
37
|
-
"@fulldev/features-2",
|
|
38
|
-
"@fulldev/features-3",
|
|
39
|
-
"@fulldev/features-4",
|
|
40
|
-
"@fulldev/features-5",
|
|
41
|
-
"@fulldev/features-6",
|
|
42
|
-
"@fulldev/footer-1",
|
|
43
|
-
"@fulldev/footer-2",
|
|
44
|
-
"@fulldev/footer-3",
|
|
45
|
-
"@fulldev/header-1",
|
|
46
|
-
"@fulldev/header-2",
|
|
47
|
-
"@fulldev/header-3",
|
|
48
|
-
"@fulldev/header-4",
|
|
49
|
-
"@fulldev/header-5",
|
|
50
|
-
"@fulldev/hero-1",
|
|
51
|
-
"@fulldev/hero-10",
|
|
52
|
-
"@fulldev/hero-11",
|
|
53
|
-
"@fulldev/hero-12",
|
|
54
|
-
"@fulldev/hero-13",
|
|
55
|
-
"@fulldev/hero-2",
|
|
56
|
-
"@fulldev/hero-3",
|
|
57
|
-
"@fulldev/hero-4",
|
|
58
|
-
"@fulldev/hero-5",
|
|
59
|
-
"@fulldev/hero-6",
|
|
60
|
-
"@fulldev/hero-7",
|
|
61
|
-
"@fulldev/hero-8",
|
|
62
|
-
"@fulldev/hero-9",
|
|
63
|
-
"@fulldev/links-2",
|
|
64
|
-
"@fulldev/logos-1",
|
|
65
|
-
"@fulldev/logos-2",
|
|
66
|
-
"@fulldev/logos-3",
|
|
67
|
-
"@fulldev/pricing-1",
|
|
68
|
-
"@fulldev/pricing-2",
|
|
69
|
-
"@fulldev/pricing-3",
|
|
70
|
-
"@fulldev/product-1",
|
|
71
|
-
"@fulldev/products-1",
|
|
72
|
-
"@fulldev/products-2",
|
|
73
|
-
"@fulldev/products-3",
|
|
74
|
-
"@fulldev/products-4",
|
|
75
|
-
"@fulldev/products-5",
|
|
76
|
-
"@fulldev/reviews-1",
|
|
77
|
-
"@fulldev/reviews-2",
|
|
78
|
-
"@fulldev/reviews-3",
|
|
79
|
-
"@fulldev/reviews-4",
|
|
80
|
-
"@fulldev/reviews-5",
|
|
81
|
-
"@fulldev/services-1",
|
|
82
|
-
"@fulldev/services-2",
|
|
83
|
-
"@fulldev/services-3",
|
|
84
|
-
"@fulldev/services-4",
|
|
85
|
-
"@fulldev/services-5",
|
|
86
|
-
"@fulldev/services-6",
|
|
87
|
-
"@fulldev/services-7",
|
|
88
|
-
"@fulldev/sidebar-1"
|
|
89
|
-
],
|
|
90
|
-
"type": "registry:item"
|
|
91
|
-
}
|
package/public/r/content-5.json
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
|
-
"name": "content-5",
|
|
4
|
-
"registryDependencies": [
|
|
5
|
-
"@fulldev/button",
|
|
6
|
-
"@fulldev/section",
|
|
7
|
-
"@fulldev/icon"
|
|
8
|
-
],
|
|
9
|
-
"files": [
|
|
10
|
-
{
|
|
11
|
-
"path": "src/components/blocks/content-5.astro",
|
|
12
|
-
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n eyebrow?: string\n title: string\n description: string\n features?: string[]\n buttons?: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n eyebrow,\n title,\n description,\n features,\n buttons,\n image,\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n <SectionContainer>\n <div\n class=\"bg-muted/40 grid overflow-hidden rounded-xl border lg:grid-cols-[minmax(0,0.9fr)_minmax(0,1.1fr)]\"\n >\n <div class=\"flex flex-col justify-between gap-10 p-6 sm:p-8 lg:p-10\">\n <div class=\"flex flex-col gap-5\">\n {\n eyebrow && (\n <p class=\"text-primary text-sm leading-none font-medium\">\n {eyebrow}\n </p>\n )\n }\n <div class=\"flex flex-col gap-4\">\n <h2\n class=\"text-foreground text-3xl font-semibold tracking-tight text-balance sm:text-4xl\"\n >\n {title}\n </h2>\n <p\n class=\"text-muted-foreground max-w-xl text-lg leading-relaxed text-balance\"\n >\n {description}\n </p>\n </div>\n </div>\n {\n features?.length && (\n <ol class=\"grid gap-3\">\n {features.map((feature, index) => (\n <li class=\"flex items-start gap-3 text-sm leading-6\">\n <span class=\"bg-background text-foreground flex size-7 shrink-0 items-center justify-center rounded-full border text-xs font-medium\">\n {index + 1}\n </span>\n {feature}\n </li>\n ))}\n </ol>\n )\n }\n {\n buttons?.length && (\n <div class=\"flex flex-wrap gap-3\">\n {buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n size=\"lg\"\n variant={\n button.variant ?? (index === 0 ? \"default\" : \"secondary\")\n }\n {...button}\n >\n {label}\n </Button>\n ))}\n </div>\n )\n }\n </div>\n <div\n class=\"bg-background relative min-h-72 overflow-hidden border-t lg:border-t-0 lg:border-l\"\n >\n <div\n class=\"bg-primary/8 absolute inset-x-8 top-8 h-24 rounded-full blur-3xl\"\n >\n </div>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"relative h-full min-h-72 w-full object-cover lg:translate-x-6 lg:scale-105\"\n widths={[640, 960, 1280]}\n sizes=\"(min-width: 1024px) 55vw, 100vw\"\n />\n </div>\n </div>\n </SectionContainer>\n</Section>\n",
|
|
13
|
-
"type": "registry:block"
|
|
14
|
-
}
|
|
15
|
-
],
|
|
16
|
-
"type": "registry:block"
|
|
17
|
-
}
|
package/public/r/content-6.json
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
|
-
"name": "content-6",
|
|
4
|
-
"registryDependencies": [
|
|
5
|
-
"@fulldev/button",
|
|
6
|
-
"@fulldev/section",
|
|
7
|
-
"@fulldev/icon"
|
|
8
|
-
],
|
|
9
|
-
"files": [
|
|
10
|
-
{
|
|
11
|
-
"path": "src/components/blocks/content-6.astro",
|
|
12
|
-
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Icon } from \"@/components/ui/icon\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n title: string\n description: string\n features?: string[]\n buttons?: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n features,\n buttons,\n image,\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n <SectionContainer>\n <div class=\"grid gap-12 lg:grid-cols-2 lg:items-center\">\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-4/3 w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280]}\n sizes=\"(min-width: 1024px) 50vw, 100vw\"\n />\n <div class=\"flex flex-col gap-6\">\n <div class=\"flex flex-col gap-4\">\n <h2\n class=\"text-foreground text-3xl font-semibold tracking-tight text-balance sm:text-4xl\"\n >\n {title}\n </h2>\n <p class=\"text-muted-foreground text-lg leading-relaxed text-balance\">\n {description}\n </p>\n </div>\n {\n features?.length && (\n <ul class=\"flex flex-col gap-3\">\n {features.map((feature) => (\n <li class=\"flex items-center gap-3 text-sm\">\n <Icon name=\"check\" class=\"text-primary size-4 shrink-0\" />\n {feature}\n </li>\n ))}\n </ul>\n )\n }\n {\n buttons?.length && (\n <div class=\"flex flex-wrap gap-3\">\n {buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n size=\"lg\"\n variant={\n button.variant ?? (index === 0 ? \"default\" : \"secondary\")\n }\n {...button}\n >\n {label}\n </Button>\n ))}\n </div>\n )\n }\n </div>\n </div>\n </SectionContainer>\n</Section>\n",
|
|
13
|
-
"type": "registry:block"
|
|
14
|
-
}
|
|
15
|
-
],
|
|
16
|
-
"type": "registry:block"
|
|
17
|
-
}
|
package/public/r/init.json
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
|
-
"name": "init",
|
|
4
|
-
"dependencies": [
|
|
5
|
-
"class-variance-authority",
|
|
6
|
-
"clsx",
|
|
7
|
-
"tailwind-merge"
|
|
8
|
-
],
|
|
9
|
-
"files": [
|
|
10
|
-
{
|
|
11
|
-
"path": "src/lib/utils.ts",
|
|
12
|
-
"content": "import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n",
|
|
13
|
-
"type": "registry:lib"
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"path": "registry/init/global.css",
|
|
17
|
-
"content": "@import \"tailwindcss\";\n\n@custom-variant dark (&:is(.dark *));\n\n:root {\n --background: oklch(1 0 0);\n --foreground: oklch(0.145 0 0);\n --card: oklch(1 0 0);\n --card-foreground: oklch(0.145 0 0);\n --popover: oklch(1 0 0);\n --popover-foreground: oklch(0.145 0 0);\n --primary: oklch(0.5488 0.2498 261.783);\n --primary-foreground: oklch(1 0 0);\n --secondary: oklch(0.97 0 0);\n --secondary-foreground: oklch(0.205 0 0);\n --muted: oklch(0.97 0 0);\n --muted-foreground: oklch(0.556 0 0);\n --accent: oklch(0.97 0 0);\n --accent-foreground: oklch(0.205 0 0);\n --destructive: oklch(0.577 0.245 27.325);\n --destructive-foreground: oklch(1 0 0);\n --border: oklch(0.922 0 0);\n --input: oklch(0.922 0 0);\n --ring: oklch(0.708 0 0);\n --chart-1: oklch(0.81 0.1 252);\n --chart-2: oklch(0.62 0.19 260);\n --chart-3: oklch(0.55 0.22 263);\n --chart-4: oklch(0.49 0.22 264);\n --chart-5: oklch(0.42 0.18 266);\n --sidebar: oklch(0.985 0 0);\n --sidebar-foreground: oklch(0.145 0 0);\n --sidebar-primary: oklch(0.5488 0.2498 261.783);\n --sidebar-primary-foreground: oklch(1 0 0);\n --sidebar-accent: oklch(0.97 0 0);\n --sidebar-accent-foreground: oklch(0.205 0 0);\n --sidebar-border: oklch(0.922 0 0);\n --sidebar-ring: oklch(0.708 0 0);\n --radius: 0.625rem;\n --shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);\n --shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);\n --shadow-sm:\n 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);\n --shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);\n --shadow-md:\n 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1);\n --shadow-lg:\n 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1);\n --shadow-xl:\n 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1);\n --shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25);\n}\n\n.dark {\n --background: oklch(0.145 0 0);\n --foreground: oklch(0.985 0 0);\n --card: oklch(0.205 0 0);\n --card-foreground: oklch(0.985 0 0);\n --popover: oklch(0.269 0 0);\n --popover-foreground: oklch(0.985 0 0);\n --primary: oklch(0.686 0.2105 41.139);\n --primary-foreground: oklch(0.145 0 0);\n --secondary: oklch(0.269 0 0);\n --secondary-foreground: oklch(0.985 0 0);\n --muted: oklch(0.269 0 0);\n --muted-foreground: oklch(0.708 0 0);\n --accent: oklch(0.371 0 0);\n --accent-foreground: oklch(0.985 0 0);\n --destructive: oklch(0.704 0.191 22.216);\n --destructive-foreground: oklch(0.985 0 0);\n --border: oklch(0.275 0 0);\n --input: oklch(0.325 0 0);\n --ring: oklch(0.556 0 0);\n --chart-1: oklch(0.81 0.1 252);\n --chart-2: oklch(0.62 0.19 260);\n --chart-3: oklch(0.55 0.22 263);\n --chart-4: oklch(0.49 0.22 264);\n --chart-5: oklch(0.42 0.18 266);\n --sidebar: oklch(0.205 0 0);\n --sidebar-foreground: oklch(0.985 0 0);\n --sidebar-primary: oklch(0.686 0.2105 41.139);\n --sidebar-primary-foreground: oklch(0.145 0 0);\n --sidebar-accent: oklch(0.269 0 0);\n --sidebar-accent-foreground: oklch(0.985 0 0);\n --sidebar-border: oklch(0.275 0 0);\n --sidebar-ring: oklch(0.439 0 0);\n --radius: 0.625rem;\n --shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);\n --shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);\n --shadow-sm:\n 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);\n --shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);\n --shadow-md:\n 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1);\n --shadow-lg:\n 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1);\n --shadow-xl:\n 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1);\n --shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25);\n}\n\n@theme inline {\n --color-background: var(--background);\n --color-foreground: var(--foreground);\n --color-card: var(--card);\n --color-card-foreground: var(--card-foreground);\n --color-popover: var(--popover);\n --color-popover-foreground: var(--popover-foreground);\n --color-primary: var(--primary);\n --color-primary-foreground: var(--primary-foreground);\n --color-secondary: var(--secondary);\n --color-secondary-foreground: var(--secondary-foreground);\n --color-muted: var(--muted);\n --color-muted-foreground: var(--muted-foreground);\n --color-accent: var(--accent);\n --color-accent-foreground: var(--accent-foreground);\n --color-destructive: var(--destructive);\n --color-destructive-foreground: var(--destructive-foreground);\n --color-border: var(--border);\n --color-input: var(--input);\n --color-ring: var(--ring);\n --color-chart-1: var(--chart-1);\n --color-chart-2: var(--chart-2);\n --color-chart-3: var(--chart-3);\n --color-chart-4: var(--chart-4);\n --color-chart-5: var(--chart-5);\n --color-sidebar: var(--sidebar);\n --color-sidebar-foreground: var(--sidebar-foreground);\n --color-sidebar-primary: var(--sidebar-primary);\n --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);\n --color-sidebar-accent: var(--sidebar-accent);\n --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);\n --color-sidebar-border: var(--sidebar-border);\n --color-sidebar-ring: var(--sidebar-ring);\n\n --radius-sm: calc(var(--radius) - 4px);\n --radius-md: calc(var(--radius) - 2px);\n --radius-lg: var(--radius);\n --radius-xl: calc(var(--radius) + 4px);\n\n --shadow-2xs: var(--shadow-2xs);\n --shadow-xs: var(--shadow-xs);\n --shadow-sm: var(--shadow-sm);\n --shadow: var(--shadow);\n --shadow-md: var(--shadow-md);\n --shadow-lg: var(--shadow-lg);\n --shadow-xl: var(--shadow-xl);\n --shadow-2xl: var(--shadow-2xl);\n}\n\n@layer base {\n * {\n @apply border-border outline-ring/50;\n }\n\n html {\n @apply font-sans;\n }\n\n body {\n @apply bg-background text-foreground font-sans;\n }\n}\n",
|
|
18
|
-
"type": "registry:style",
|
|
19
|
-
"target": "src/styles/global.css"
|
|
20
|
-
}
|
|
21
|
-
],
|
|
22
|
-
"type": "registry:base"
|
|
23
|
-
}
|
package/public/r/tile.json
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
|
-
"name": "tile",
|
|
4
|
-
"files": [
|
|
5
|
-
{
|
|
6
|
-
"path": "src/components/ui/tile/tile.astro",
|
|
7
|
-
"content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = VariantProps<typeof variants> &\n HTMLAttributes<\"div\"> &\n HTMLAttributes<\"a\">\n\nconst variants = cva(\n \"group/tile focus-visible:border-ring focus-visible:ring-ring/50 flex min-w-0 flex-col overflow-hidden rounded-xl transition-colors outline-none group-data-[variant=masonry]/tile-group:mb-4 group-data-[variant=masonry]/tile-group:break-inside-avoid focus-visible:ring-3\",\n {\n variants: {\n variant: {\n default:\n \"text-foreground data-[link]:hover:bg-muted/40 border border-transparent\",\n inset:\n \"text-foreground data-[link]:hover:bg-muted/40 -mx-5 border border-transparent\",\n outline:\n \"border-border bg-background text-foreground data-[link]:hover:bg-muted/40 border\",\n muted:\n \"bg-muted/50 text-foreground data-[link]:hover:bg-muted/70 border-transparent\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nconst { class: className, variant = \"default\", href, ...props } = Astro.props\n\nconst Comp = href ? \"a\" : \"div\"\n---\n\n<Comp\n data-slot=\"tile\"\n data-variant={variant}\n data-link={href ? \"\" : undefined}\n class={cn(variants({ variant }), className)}\n href={href}\n {...props}\n>\n <slot />\n</Comp>\n",
|
|
8
|
-
"type": "registry:ui"
|
|
9
|
-
},
|
|
10
|
-
{
|
|
11
|
-
"path": "src/components/ui/tile/tile-content.astro",
|
|
12
|
-
"content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<div\n data-slot=\"tile-content\"\n class={cn(\"flex min-w-0 flex-1 flex-col gap-3 p-5\", className)}\n {...props}\n>\n <slot />\n</div>\n",
|
|
13
|
-
"type": "registry:ui"
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"path": "src/components/ui/tile/tile-group.astro",
|
|
17
|
-
"content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & VariantProps<typeof variants>\n\nconst variants = cva(\"group/tile-group w-full gap-4\", {\n variants: {\n variant: {\n default: \"grid\",\n masonry: \"columns-1\",\n },\n size: {\n sm: \"\",\n default: \"\",\n lg: \"\",\n },\n },\n compoundVariants: [\n {\n variant: \"default\",\n size: \"sm\",\n class: \"grid-cols-1 sm:grid-cols-[repeat(auto-fit,minmax(240px,1fr))]\",\n },\n {\n variant: \"default\",\n size: \"default\",\n class: \"grid-cols-1 sm:grid-cols-[repeat(auto-fit,minmax(300px,1fr))]\",\n },\n {\n variant: \"default\",\n size: \"lg\",\n class: \"grid-cols-1 sm:grid-cols-[repeat(auto-fit,minmax(400px,1fr))]\",\n },\n {\n variant: \"masonry\",\n size: \"sm\",\n class: \"sm:[column-count:5] sm:[column-width:240px]\",\n },\n {\n variant: \"masonry\",\n size: \"default\",\n class: \"sm:[column-count:4] sm:[column-width:300px]\",\n },\n {\n variant: \"masonry\",\n size: \"lg\",\n class: \"sm:[column-count:3] sm:[column-width:400px]\",\n },\n ],\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n})\n\nconst {\n class: className,\n variant = \"default\",\n size = \"default\",\n ...props\n} = Astro.props\n---\n\n<div\n role=\"list\"\n data-slot=\"tile-group\"\n data-variant={variant}\n data-size={size}\n class={cn(variants({ variant, size }), className)}\n {...props}\n>\n <slot />\n</div>\n",
|
|
18
|
-
"type": "registry:ui"
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
"path": "src/components/ui/tile/index.ts",
|
|
22
|
-
"content": "export { default as Tile } from \"./tile.astro\"\nexport { default as TileContent } from \"./tile-content.astro\"\nexport { default as TileGroup } from \"./tile-group.astro\"\n",
|
|
23
|
-
"type": "registry:ui"
|
|
24
|
-
}
|
|
25
|
-
],
|
|
26
|
-
"type": "registry:ui"
|
|
27
|
-
}
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
import type { ImageMetadata } from "astro"
|
|
3
|
-
import { Image } from "astro:assets"
|
|
4
|
-
|
|
5
|
-
import { cn } from "@/lib/utils"
|
|
6
|
-
import { Button } from "@/components/ui/button"
|
|
7
|
-
import { Section, SectionContainer } from "@/components/ui/section"
|
|
8
|
-
|
|
9
|
-
type Props = {
|
|
10
|
-
class?: string
|
|
11
|
-
eyebrow?: string
|
|
12
|
-
title: string
|
|
13
|
-
description: string
|
|
14
|
-
features?: string[]
|
|
15
|
-
buttons?: {
|
|
16
|
-
label: string
|
|
17
|
-
href: string
|
|
18
|
-
variant?: "default" | "outline" | "secondary" | "ghost"
|
|
19
|
-
}[]
|
|
20
|
-
image: {
|
|
21
|
-
src: ImageMetadata
|
|
22
|
-
alt: string
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const {
|
|
27
|
-
class: className,
|
|
28
|
-
eyebrow,
|
|
29
|
-
title,
|
|
30
|
-
description,
|
|
31
|
-
features,
|
|
32
|
-
buttons,
|
|
33
|
-
image,
|
|
34
|
-
} = Astro.props
|
|
35
|
-
---
|
|
36
|
-
|
|
37
|
-
<Section class={cn("", className)}>
|
|
38
|
-
<SectionContainer>
|
|
39
|
-
<div
|
|
40
|
-
class="bg-muted/40 grid overflow-hidden rounded-xl border lg:grid-cols-[minmax(0,0.9fr)_minmax(0,1.1fr)]"
|
|
41
|
-
>
|
|
42
|
-
<div class="flex flex-col justify-between gap-10 p-6 sm:p-8 lg:p-10">
|
|
43
|
-
<div class="flex flex-col gap-5">
|
|
44
|
-
{
|
|
45
|
-
eyebrow && (
|
|
46
|
-
<p class="text-primary text-sm leading-none font-medium">
|
|
47
|
-
{eyebrow}
|
|
48
|
-
</p>
|
|
49
|
-
)
|
|
50
|
-
}
|
|
51
|
-
<div class="flex flex-col gap-4">
|
|
52
|
-
<h2
|
|
53
|
-
class="text-foreground text-3xl font-semibold tracking-tight text-balance sm:text-4xl"
|
|
54
|
-
>
|
|
55
|
-
{title}
|
|
56
|
-
</h2>
|
|
57
|
-
<p
|
|
58
|
-
class="text-muted-foreground max-w-xl text-lg leading-relaxed text-balance"
|
|
59
|
-
>
|
|
60
|
-
{description}
|
|
61
|
-
</p>
|
|
62
|
-
</div>
|
|
63
|
-
</div>
|
|
64
|
-
{
|
|
65
|
-
features?.length && (
|
|
66
|
-
<ol class="grid gap-3">
|
|
67
|
-
{features.map((feature, index) => (
|
|
68
|
-
<li class="flex items-start gap-3 text-sm leading-6">
|
|
69
|
-
<span class="bg-background text-foreground flex size-7 shrink-0 items-center justify-center rounded-full border text-xs font-medium">
|
|
70
|
-
{index + 1}
|
|
71
|
-
</span>
|
|
72
|
-
{feature}
|
|
73
|
-
</li>
|
|
74
|
-
))}
|
|
75
|
-
</ol>
|
|
76
|
-
)
|
|
77
|
-
}
|
|
78
|
-
{
|
|
79
|
-
buttons?.length && (
|
|
80
|
-
<div class="flex flex-wrap gap-3">
|
|
81
|
-
{buttons.map(({ href, label, ...button }, index) => (
|
|
82
|
-
<Button
|
|
83
|
-
as="a"
|
|
84
|
-
href={href}
|
|
85
|
-
size="lg"
|
|
86
|
-
variant={
|
|
87
|
-
button.variant ?? (index === 0 ? "default" : "secondary")
|
|
88
|
-
}
|
|
89
|
-
{...button}
|
|
90
|
-
>
|
|
91
|
-
{label}
|
|
92
|
-
</Button>
|
|
93
|
-
))}
|
|
94
|
-
</div>
|
|
95
|
-
)
|
|
96
|
-
}
|
|
97
|
-
</div>
|
|
98
|
-
<div
|
|
99
|
-
class="bg-background relative min-h-72 overflow-hidden border-t lg:border-t-0 lg:border-l"
|
|
100
|
-
>
|
|
101
|
-
<div
|
|
102
|
-
class="bg-primary/8 absolute inset-x-8 top-8 h-24 rounded-full blur-3xl"
|
|
103
|
-
>
|
|
104
|
-
</div>
|
|
105
|
-
<Image
|
|
106
|
-
src={image.src}
|
|
107
|
-
alt={image.alt}
|
|
108
|
-
class="relative h-full min-h-72 w-full object-cover lg:translate-x-6 lg:scale-105"
|
|
109
|
-
widths={[640, 960, 1280]}
|
|
110
|
-
sizes="(min-width: 1024px) 55vw, 100vw"
|
|
111
|
-
/>
|
|
112
|
-
</div>
|
|
113
|
-
</div>
|
|
114
|
-
</SectionContainer>
|
|
115
|
-
</Section>
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
import type { ImageMetadata } from "astro"
|
|
3
|
-
import { Image } from "astro:assets"
|
|
4
|
-
|
|
5
|
-
import { cn } from "@/lib/utils"
|
|
6
|
-
import { Button } from "@/components/ui/button"
|
|
7
|
-
import { Icon } from "@/components/ui/icon"
|
|
8
|
-
import { Section, SectionContainer } from "@/components/ui/section"
|
|
9
|
-
|
|
10
|
-
type Props = {
|
|
11
|
-
class?: string
|
|
12
|
-
title: string
|
|
13
|
-
description: string
|
|
14
|
-
features?: string[]
|
|
15
|
-
buttons?: {
|
|
16
|
-
label: string
|
|
17
|
-
href: string
|
|
18
|
-
variant?: "default" | "outline" | "secondary" | "ghost"
|
|
19
|
-
}[]
|
|
20
|
-
image: {
|
|
21
|
-
src: ImageMetadata
|
|
22
|
-
alt: string
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const {
|
|
27
|
-
class: className,
|
|
28
|
-
title,
|
|
29
|
-
description,
|
|
30
|
-
features,
|
|
31
|
-
buttons,
|
|
32
|
-
image,
|
|
33
|
-
} = Astro.props
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
<Section class={cn("", className)}>
|
|
37
|
-
<SectionContainer>
|
|
38
|
-
<div class="grid gap-12 lg:grid-cols-2 lg:items-center">
|
|
39
|
-
<Image
|
|
40
|
-
src={image.src}
|
|
41
|
-
alt={image.alt}
|
|
42
|
-
class="aspect-4/3 w-full rounded-xl border object-cover"
|
|
43
|
-
widths={[640, 960, 1280]}
|
|
44
|
-
sizes="(min-width: 1024px) 50vw, 100vw"
|
|
45
|
-
/>
|
|
46
|
-
<div class="flex flex-col gap-6">
|
|
47
|
-
<div class="flex flex-col gap-4">
|
|
48
|
-
<h2
|
|
49
|
-
class="text-foreground text-3xl font-semibold tracking-tight text-balance sm:text-4xl"
|
|
50
|
-
>
|
|
51
|
-
{title}
|
|
52
|
-
</h2>
|
|
53
|
-
<p class="text-muted-foreground text-lg leading-relaxed text-balance">
|
|
54
|
-
{description}
|
|
55
|
-
</p>
|
|
56
|
-
</div>
|
|
57
|
-
{
|
|
58
|
-
features?.length && (
|
|
59
|
-
<ul class="flex flex-col gap-3">
|
|
60
|
-
{features.map((feature) => (
|
|
61
|
-
<li class="flex items-center gap-3 text-sm">
|
|
62
|
-
<Icon name="check" class="text-primary size-4 shrink-0" />
|
|
63
|
-
{feature}
|
|
64
|
-
</li>
|
|
65
|
-
))}
|
|
66
|
-
</ul>
|
|
67
|
-
)
|
|
68
|
-
}
|
|
69
|
-
{
|
|
70
|
-
buttons?.length && (
|
|
71
|
-
<div class="flex flex-wrap gap-3">
|
|
72
|
-
{buttons.map(({ href, label, ...button }, index) => (
|
|
73
|
-
<Button
|
|
74
|
-
as="a"
|
|
75
|
-
href={href}
|
|
76
|
-
size="lg"
|
|
77
|
-
variant={
|
|
78
|
-
button.variant ?? (index === 0 ? "default" : "secondary")
|
|
79
|
-
}
|
|
80
|
-
{...button}
|
|
81
|
-
>
|
|
82
|
-
{label}
|
|
83
|
-
</Button>
|
|
84
|
-
))}
|
|
85
|
-
</div>
|
|
86
|
-
)
|
|
87
|
-
}
|
|
88
|
-
</div>
|
|
89
|
-
</div>
|
|
90
|
-
</SectionContainer>
|
|
91
|
-
</Section>
|