@hanzo/ui 8.0.8 → 8.0.12
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/LICENSE.md +21 -0
- package/dist/backends/gui/index.d.ts +2 -0
- package/dist/backends/shadcn/aspect-ratio.d.ts +4 -0
- package/dist/backends/shadcn/avatar.d.ts +6 -0
- package/dist/backends/shadcn/badge.d.ts +9 -0
- package/dist/backends/shadcn/button.d.ts +19 -0
- package/dist/backends/shadcn/card.d.ts +9 -0
- package/dist/backends/shadcn/checkbox.d.ts +9 -0
- package/dist/backends/shadcn/collapsible.d.ts +5 -0
- package/dist/backends/shadcn/command.d.ts +80 -0
- package/dist/backends/shadcn/dialog.d.ts +15 -0
- package/dist/backends/shadcn/dropdown-menu.d.ts +34 -0
- package/dist/backends/shadcn/index.d.ts +23 -0
- package/dist/backends/shadcn/input.d.ts +11 -0
- package/dist/backends/shadcn/label.d.ts +4 -0
- package/dist/backends/shadcn/popover.d.ts +7 -0
- package/dist/backends/shadcn/progress.d.ts +4 -0
- package/dist/backends/shadcn/scroll-area.d.ts +5 -0
- package/dist/backends/shadcn/select.d.ts +13 -0
- package/dist/backends/shadcn/separator.d.ts +4 -0
- package/dist/backends/shadcn/slider.d.ts +4 -0
- package/dist/backends/shadcn/switch.d.ts +4 -0
- package/dist/backends/shadcn/tabs.d.ts +7 -0
- package/dist/backends/shadcn/textarea.d.ts +4 -0
- package/dist/backends/shadcn/toaster.d.ts +10 -0
- package/dist/backends/shadcn/tooltip.d.ts +7 -0
- package/dist/backends/shadcn/utils.d.ts +8 -0
- package/dist/components.d.ts +1 -0
- package/dist/core/cn.d.ts +11 -0
- package/dist/core/fonts.d.ts +26 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/tokens.d.ts +16 -0
- package/dist/index.cjs +1138 -283
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1017 -3
- package/dist/index.js.map +1 -1
- package/dist/models/ModelSelector.d.ts +23 -0
- package/dist/models/catalog.d.ts +53 -0
- package/dist/models/index.d.ts +5 -0
- package/dist/models/types.d.ts +39 -0
- package/dist/oss/blueprint.d.ts +37 -0
- package/dist/oss/catalog.d.ts +67 -0
- package/dist/oss.cjs +190 -0
- package/dist/oss.cjs.map +1 -0
- package/dist/oss.d.ts +2 -0
- package/dist/oss.js +180 -0
- package/dist/oss.js.map +1 -0
- package/dist/primitives/AspectRatio.d.ts +1 -0
- package/dist/primitives/Avatar.d.ts +1 -0
- package/dist/primitives/AvatarFallback.d.ts +1 -0
- package/dist/primitives/AvatarImage.d.ts +1 -0
- package/dist/primitives/Badge.d.ts +1 -0
- package/dist/primitives/Button.d.ts +1 -0
- package/dist/primitives/Card.d.ts +1 -0
- package/dist/primitives/CardAction.d.ts +1 -0
- package/dist/primitives/CardContent.d.ts +1 -0
- package/dist/primitives/CardDescription.d.ts +1 -0
- package/dist/primitives/CardFooter.d.ts +1 -0
- package/dist/primitives/CardHeader.d.ts +1 -0
- package/dist/primitives/CardTitle.d.ts +1 -0
- package/dist/primitives/Checkbox.d.ts +1 -0
- package/dist/primitives/Collapsible.d.ts +1 -0
- package/dist/primitives/CollapsibleContent.d.ts +1 -0
- package/dist/primitives/CollapsibleTrigger.d.ts +1 -0
- package/dist/primitives/Command.d.ts +1 -0
- package/dist/primitives/CommandDialog.d.ts +1 -0
- package/dist/primitives/CommandEmpty.d.ts +1 -0
- package/dist/primitives/CommandGroup.d.ts +1 -0
- package/dist/primitives/CommandInput.d.ts +1 -0
- package/dist/primitives/CommandItem.d.ts +1 -0
- package/dist/primitives/CommandList.d.ts +1 -0
- package/dist/primitives/CommandSeparator.d.ts +1 -0
- package/dist/primitives/CommandShortcut.d.ts +1 -0
- package/dist/primitives/Dialog.d.ts +1 -0
- package/dist/primitives/DialogClose.d.ts +1 -0
- package/dist/primitives/DialogContent.d.ts +1 -0
- package/dist/primitives/DialogDescription.d.ts +1 -0
- package/dist/primitives/DialogFooter.d.ts +1 -0
- package/dist/primitives/DialogHeader.d.ts +1 -0
- package/dist/primitives/DialogOverlay.d.ts +1 -0
- package/dist/primitives/DialogPortal.d.ts +1 -0
- package/dist/primitives/DialogTitle.d.ts +1 -0
- package/dist/primitives/DialogTrigger.d.ts +1 -0
- package/dist/primitives/DropdownMenu.d.ts +1 -0
- package/dist/primitives/DropdownMenuCheckboxItem.d.ts +1 -0
- package/dist/primitives/DropdownMenuContent.d.ts +1 -0
- package/dist/primitives/DropdownMenuGroup.d.ts +1 -0
- package/dist/primitives/DropdownMenuItem.d.ts +1 -0
- package/dist/primitives/DropdownMenuLabel.d.ts +1 -0
- package/dist/primitives/DropdownMenuPortal.d.ts +1 -0
- package/dist/primitives/DropdownMenuRadioGroup.d.ts +1 -0
- package/dist/primitives/DropdownMenuRadioItem.d.ts +1 -0
- package/dist/primitives/DropdownMenuSeparator.d.ts +1 -0
- package/dist/primitives/DropdownMenuShortcut.d.ts +1 -0
- package/dist/primitives/DropdownMenuSub.d.ts +1 -0
- package/dist/primitives/DropdownMenuSubContent.d.ts +1 -0
- package/dist/primitives/DropdownMenuSubTrigger.d.ts +1 -0
- package/dist/primitives/DropdownMenuTrigger.d.ts +1 -0
- package/dist/primitives/Input.d.ts +1 -0
- package/dist/primitives/Label.d.ts +1 -0
- package/dist/primitives/Popover.d.ts +1 -0
- package/dist/primitives/PopoverAnchor.d.ts +1 -0
- package/dist/primitives/PopoverContent.d.ts +1 -0
- package/dist/primitives/PopoverTrigger.d.ts +1 -0
- package/dist/primitives/Progress.d.ts +1 -0
- package/dist/primitives/ScrollArea.d.ts +1 -0
- package/dist/primitives/ScrollBar.d.ts +1 -0
- package/dist/primitives/Select.d.ts +1 -0
- package/dist/primitives/SelectContent.d.ts +1 -0
- package/dist/primitives/SelectGroup.d.ts +1 -0
- package/dist/primitives/SelectItem.d.ts +1 -0
- package/dist/primitives/SelectLabel.d.ts +1 -0
- package/dist/primitives/SelectScrollDownButton.d.ts +1 -0
- package/dist/primitives/SelectScrollUpButton.d.ts +1 -0
- package/dist/primitives/SelectSeparator.d.ts +1 -0
- package/dist/primitives/SelectTrigger.d.ts +1 -0
- package/dist/primitives/SelectValue.d.ts +1 -0
- package/dist/primitives/Separator.d.ts +1 -0
- package/dist/primitives/Slider.d.ts +1 -0
- package/dist/primitives/Switch.d.ts +1 -0
- package/dist/primitives/Tabs.d.ts +1 -0
- package/dist/primitives/TabsContent.d.ts +1 -0
- package/dist/primitives/TabsList.d.ts +1 -0
- package/dist/primitives/TabsTrigger.d.ts +1 -0
- package/dist/primitives/Textarea.d.ts +1 -0
- package/dist/primitives/Toaster.d.ts +1 -0
- package/dist/primitives/Tooltip.d.ts +1 -0
- package/dist/primitives/TooltipContent.d.ts +1 -0
- package/dist/primitives/TooltipProvider.d.ts +1 -0
- package/dist/primitives/TooltipTrigger.d.ts +1 -0
- package/dist/primitives/badgeVariants.d.ts +1 -0
- package/dist/primitives/buttonVariants.d.ts +1 -0
- package/dist/primitives/index.d.ts +1 -0
- package/dist/primitives/toast.d.ts +1 -0
- package/dist/product/AnimatedLogo.d.ts +47 -0
- package/dist/product/BackendState.d.ts +42 -0
- package/dist/product/Charts.d.ts +4 -0
- package/dist/product/CommerceResource.d.ts +32 -0
- package/dist/product/ConfirmDelete.d.ts +8 -0
- package/dist/product/DataTable.d.ts +30 -2
- package/dist/product/Field.d.ts +7 -2
- package/dist/product/Filters.d.ts +29 -0
- package/dist/product/OrgMark.d.ts +21 -0
- package/dist/product/OrgSwitcher.d.ts +8 -1
- package/dist/product/PrimaryButton.d.ts +5 -0
- package/dist/product/SiteFooter.d.ts +28 -0
- package/dist/product/SiteNav.d.ts +60 -0
- package/dist/product/accent.d.ts +33 -0
- package/dist/product/animatedLogo.logic.d.ts +52 -0
- package/dist/product/brand.d.ts +45 -0
- package/dist/product/host.d.ts +21 -0
- package/dist/product/index.cjs +3205 -257
- package/dist/product/index.cjs.map +1 -1
- package/dist/product/index.d.ts +12 -0
- package/dist/product/index.js +3103 -1
- package/dist/product/index.js.map +1 -1
- package/dist/product/social/CampaignCard.d.ts +13 -0
- package/dist/product/social/ChannelBadge.d.ts +12 -0
- package/dist/product/social/PostAgenda.d.ts +5 -0
- package/dist/product/social/PostCard.d.ts +15 -0
- package/dist/product/social/PostComposer.d.ts +24 -0
- package/dist/product/social/ProviderReadinessList.d.ts +10 -0
- package/dist/product/social/SocialSummaryBar.d.ts +9 -0
- package/dist/product/social/ViewToggle.d.ts +5 -0
- package/dist/product/social/format.d.ts +16 -0
- package/dist/product/social/index.d.ts +9 -0
- package/dist/product/surfaces.data.d.ts +1 -0
- package/dist/styles/hanzo-motion.css +52 -0
- package/dist/telemetry.cjs +15 -0
- package/dist/telemetry.cjs.map +1 -0
- package/dist/telemetry.d.ts +1 -0
- package/dist/telemetry.js +4 -0
- package/dist/telemetry.js.map +1 -0
- package/package.json +106 -19
- package/dist/chunk-GDGVXU7W.js +0 -1999
- package/dist/chunk-GDGVXU7W.js.map +0 -1
- package/dist/chunk-HSPMQQVJ.cjs +0 -2066
- package/dist/chunk-HSPMQQVJ.cjs.map +0 -1
package/dist/oss.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/oss/catalog.ts","../src/oss/blueprint.ts"],"names":[],"mappings":"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","file":"oss.cjs","sourcesContent":["/**\n * The OSS App Store catalog — the shared client for the 1000+-app one-click\n * open-source catalog served as a flat JSON array at `<base>/meta.json`, with per-app\n * blueprint assets under `<base>/blueprints/<id>/`.\n *\n * One catalog, several surfaces: the console App Store, platform.hanzo.ai, and the\n * public gallery at oss.hanzo.ai. They previously each carried their own copy of the\n * shape, the normalizer and the URL builders, which is how three surfaces come to\n * disagree about the same catalog row. This is the one implementation.\n *\n * The catalog is a PUBLIC CDN with open CORS, so a browser fetches it DIRECTLY — no\n * BFF, no `/v1` proxy — which is why this works in the go:embed console where the\n * Next reverse-proxies are pruned. The base URL is INJECTED by the caller, so this\n * module holds no config import and its normalizers + URL builders stay pure.\n */\n\n/** One open-source app in the catalog (the meta.json entry, load-bearing fields only). */\nexport type OssApp = {\n /** Stable catalog id + blueprint path segment, e.g. `2fauth`, `n8n`, `postgres`. */\n id: string\n /** Display name, e.g. \"2FAuth\". */\n name: string\n /** One-line description. */\n description: string\n /** Version label — often the literal string `\"latest\"`, rendered raw. */\n version: string\n /** Bare logo filename (e.g. `logo.svg`), resolved against the blueprint path. */\n logo: string\n /** Category/provenance tags (e.g. `productivity`, `self-hosted`, `caprover`). */\n tags: string[]\n /** External links; only github/website/docs are surfaced. */\n links: { github?: string; website?: string; docs?: string }\n}\n\nconst str = (v: unknown): string => (typeof v === 'string' ? v : '')\nconst strTrim = (v: unknown): string | undefined => {\n const s = str(v).trim()\n return s ? s : undefined\n}\nconst strList = (v: unknown): string[] =>\n Array.isArray(v) ? v.map((x) => (typeof x === 'string' ? x.trim() : '')).filter((x) => x !== '') : []\nconst asRecord = (v: unknown): Record<string, unknown> =>\n v && typeof v === 'object' && !Array.isArray(v) ? (v as Record<string, unknown>) : {}\n\n/** Normalize one catalog record to an `OssApp` (drops a record with no id + name). */\nexport function normalizeOssApp(raw: unknown): OssApp | null {\n const r = asRecord(raw)\n const id = str(r.id).trim()\n const name = str(r.name).trim() || id\n if (!id || !name) return null\n const links = asRecord(r.links)\n return {\n id,\n name,\n description: str(r.description).trim(),\n version: str(r.version).trim() || 'latest',\n logo: str(r.logo).trim(),\n tags: strList(r.tags),\n links: {\n github: strTrim(links.github),\n website: strTrim(links.website),\n docs: strTrim(links.docs),\n },\n }\n}\n\n/** Normalize the catalog payload to the app list (bare array OR a `{data|apps|…}` wrap). */\nexport function normalizeOssApps(payload: unknown): OssApp[] {\n let arr: unknown[] = []\n if (Array.isArray(payload)) arr = payload\n else if (payload && typeof payload === 'object') {\n for (const k of ['data', 'apps', 'templates', 'items', 'rows']) {\n const v = (payload as Record<string, unknown>)[k]\n if (Array.isArray(v)) {\n arr = v\n break\n }\n }\n }\n const out: OssApp[] = []\n const seen = new Set<string>()\n for (const raw of arr) {\n const app = normalizeOssApp(raw)\n if (app && !seen.has(app.id)) {\n seen.add(app.id)\n out.push(app)\n }\n }\n return out\n}\n\n/** The per-app blueprint asset base: `<base>/blueprints/<id>`. */\nexport function blueprintBase(base: string, id: string): string {\n return `${base.replace(/\\/+$/, '')}/blueprints/${encodeURIComponent(id)}`\n}\n\n/**\n * The app's logo URL, or null when the entry carries no logo filename — a surface then\n * renders its monogram fallback rather than a broken image.\n */\nexport function logoUrl(base: string, app: OssApp): string | null {\n if (!app.logo) return null\n return `${blueprintBase(base, app.id)}/${app.logo}`\n}\n\n/**\n * Derive `owner/repo` from a GitHub URL — the maker identity, since the catalog\n * carries no author field. Returns null for a non-GitHub / malformed URL.\n */\nexport function ownerRepo(githubUrl?: string): string | null {\n if (!githubUrl) return null\n const m = githubUrl.match(/github\\.com\\/([^/\\s]+)\\/([^/\\s#?]+)/i)\n if (!m) return null\n const owner = m[1]\n const repo = m[2].replace(/\\.git$/i, '')\n if (!owner || !repo) return null\n return `${owner}/${repo}`\n}\n\n/** An app is one-click deployable when it carries a buildable source (its repo). */\nexport function hasDeploySource(app: OssApp): boolean {\n return Boolean(app.links.github)\n}\n\n// ── Live fetch (the one impure surface) ──────────────────────────────────────\n//\n// Cached per base URL so several mounts share ONE ~500 KB fetch. An in-flight fetch is\n// de-duped (concurrent callers await the same promise); a failure is not cached.\nconst cache = new Map<string, OssApp[]>()\nconst inflight = new Map<string, Promise<OssApp[]>>()\n\n/**\n * Fetch + normalize the catalog from `<base>/meta.json`. Cross-origin and\n * unauthenticated (public CDN); throws on a non-2xx or parse failure so the caller can\n * show an honest error state. Cached on success; `force` bypasses for a manual refresh.\n */\nexport async function fetchOssApps(base: string, force = false): Promise<OssApp[]> {\n const key = base.replace(/\\/+$/, '')\n if (!force) {\n const hit = cache.get(key)\n if (hit) return hit\n const pending = inflight.get(key)\n if (pending) return pending\n }\n const run = (async () => {\n const res = await fetch(`${key}/meta.json`, {\n headers: { Accept: 'application/json' },\n // Public catalog — no credentials, so a session cookie never leaks cross-origin.\n credentials: 'omit',\n })\n if (!res.ok) throw new Error(`Catalog unavailable (HTTP ${res.status})`)\n const apps = normalizeOssApps(await res.json())\n cache.set(key, apps)\n return apps\n })()\n inflight.set(key, run)\n try {\n return await run\n } finally {\n inflight.delete(key)\n }\n}\n\n/**\n * Fetch one app's `docker-compose.yml` as raw text, or null when the entry publishes\n * none. A 404 is a NORMAL answer for a large community catalog — not every blueprint\n * ships compose — so this never throws: a detail view treats an absent blueprint as\n * \"nothing to show\", and an optional asset must not fail a whole page.\n */\nexport async function fetchCompose(base: string, id: string): Promise<string | null> {\n try {\n const res = await fetch(`${blueprintBase(base, id)}/docker-compose.yml`, {\n headers: { Accept: 'text/plain' },\n credentials: 'omit',\n })\n if (!res.ok) return null\n const text = await res.text()\n return text.trim() ? text : null\n } catch {\n return null\n }\n}\n","/**\n * What an OSS blueprint actually provisions, read from its own `docker-compose.yml`.\n *\n * This is the one implementation. It was written twice before it lived here — once in\n * TypeScript for the console's App Store and once in vanilla JS for oss.hanzo.ai — and\n * two readers of the same file format drift, which means two surfaces can disagree\n * about what a deploy will start.\n *\n * Deliberately a SMALL structural reader, not a YAML implementation: it walks the\n * `services:` block by indentation and pulls only the keys a detail view shows.\n * Anything it cannot read is absent, never guessed, so a surface degrades to \"no\n * blueprint detail\" instead of asserting something false about what will run.\n *\n * Pure and total — it never throws on malformed or hostile input — so it is safe to\n * run on untrusted CDN content and testable without a DOM or a network.\n */\n\n/**\n * One service a blueprint provisions. `image` is absent for a service built from\n * source (`build:` rather than `image:`).\n */\nexport type Service = { name: string; image?: string; ports: string[] }\n\n/** What a blueprint provisions: the containers it starts and the config it expects. */\nexport type Blueprint = { services: Service[]; env: string[] }\n\n/** Indent width of a line, tabs counted as one column (compose files are space-indented). */\nconst indent = (line: string): number => line.length - line.trimStart().length\n\n/**\n * Parse the load-bearing facts out of a `docker-compose.yml`: the services it starts\n * (with image + published ports) and the environment keys it expects.\n *\n * Environment KEYS only — never the values, which are routinely secrets.\n */\nexport function parseBlueprint(yaml: string): Blueprint {\n const lines = String(yaml ?? '').split(/\\r?\\n/)\n const services: Service[] = []\n const env = new Set<string>()\n\n let servicesAt = -1 // indent of the `services:` key, -1 until seen\n let current: Service | null = null\n let currentAt = -1 // indent of the current service's name (bookkeeping, not a field)\n let listKey: 'ports' | 'environment' | null = null\n let listAt = -1\n\n for (const raw of lines) {\n const line = raw.replace(/\\t/g, ' ')\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) continue\n const col = indent(line)\n\n if (servicesAt < 0) {\n if (/^services\\s*:/.test(trimmed)) servicesAt = col\n continue\n }\n // Dedent back to or past `services:` ends the block (e.g. a following `volumes:`).\n if (col <= servicesAt) {\n if (!/^services\\s*:/.test(trimmed)) break\n continue\n }\n\n // A service name sits exactly one level inside `services:`.\n if (current === null || col <= currentAt) {\n const m = trimmed.match(/^([A-Za-z0-9._-]+)\\s*:\\s*$/)\n if (m) {\n current = { name: m[1], ports: [] }\n currentAt = col\n services.push(current)\n listKey = null\n continue\n }\n }\n if (!current) continue\n\n if (listKey && col > listAt && trimmed.startsWith('-')) {\n const item = trimmed.replace(/^-\\s*/, '').replace(/^[\"']|[\"']$/g, '')\n if (listKey === 'ports') current.ports.push(item)\n else {\n const key = item.split(/[=:]/)[0]?.trim()\n if (key) env.add(key)\n }\n continue\n }\n listKey = null\n\n const img = trimmed.match(/^image\\s*:\\s*(.+)$/)\n if (img) {\n current.image = img[1].trim().replace(/^[\"']|[\"']$/g, '')\n continue\n }\n if (/^ports\\s*:/.test(trimmed)) {\n listKey = 'ports'\n listAt = col\n continue\n }\n if (/^environment\\s*:/.test(trimmed)) {\n listKey = 'environment'\n listAt = col\n continue\n }\n }\n\n return { services, env: [...env].sort((a, b) => a.localeCompare(b)) }\n}\n"]}
|
package/dist/oss.d.ts
ADDED
package/dist/oss.js
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
// src/oss/catalog.ts
|
|
3
|
+
var str = (v) => typeof v === "string" ? v : "";
|
|
4
|
+
var strTrim = (v) => {
|
|
5
|
+
const s = str(v).trim();
|
|
6
|
+
return s ? s : void 0;
|
|
7
|
+
};
|
|
8
|
+
var strList = (v) => Array.isArray(v) ? v.map((x) => typeof x === "string" ? x.trim() : "").filter((x) => x !== "") : [];
|
|
9
|
+
var asRecord = (v) => v && typeof v === "object" && !Array.isArray(v) ? v : {};
|
|
10
|
+
function normalizeOssApp(raw) {
|
|
11
|
+
const r = asRecord(raw);
|
|
12
|
+
const id = str(r.id).trim();
|
|
13
|
+
const name = str(r.name).trim() || id;
|
|
14
|
+
if (!id || !name) return null;
|
|
15
|
+
const links = asRecord(r.links);
|
|
16
|
+
return {
|
|
17
|
+
id,
|
|
18
|
+
name,
|
|
19
|
+
description: str(r.description).trim(),
|
|
20
|
+
version: str(r.version).trim() || "latest",
|
|
21
|
+
logo: str(r.logo).trim(),
|
|
22
|
+
tags: strList(r.tags),
|
|
23
|
+
links: {
|
|
24
|
+
github: strTrim(links.github),
|
|
25
|
+
website: strTrim(links.website),
|
|
26
|
+
docs: strTrim(links.docs)
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function normalizeOssApps(payload) {
|
|
31
|
+
let arr = [];
|
|
32
|
+
if (Array.isArray(payload)) arr = payload;
|
|
33
|
+
else if (payload && typeof payload === "object") {
|
|
34
|
+
for (const k of ["data", "apps", "templates", "items", "rows"]) {
|
|
35
|
+
const v = payload[k];
|
|
36
|
+
if (Array.isArray(v)) {
|
|
37
|
+
arr = v;
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const out = [];
|
|
43
|
+
const seen = /* @__PURE__ */ new Set();
|
|
44
|
+
for (const raw of arr) {
|
|
45
|
+
const app = normalizeOssApp(raw);
|
|
46
|
+
if (app && !seen.has(app.id)) {
|
|
47
|
+
seen.add(app.id);
|
|
48
|
+
out.push(app);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return out;
|
|
52
|
+
}
|
|
53
|
+
function blueprintBase(base, id) {
|
|
54
|
+
return `${base.replace(/\/+$/, "")}/blueprints/${encodeURIComponent(id)}`;
|
|
55
|
+
}
|
|
56
|
+
function logoUrl(base, app) {
|
|
57
|
+
if (!app.logo) return null;
|
|
58
|
+
return `${blueprintBase(base, app.id)}/${app.logo}`;
|
|
59
|
+
}
|
|
60
|
+
function ownerRepo(githubUrl) {
|
|
61
|
+
if (!githubUrl) return null;
|
|
62
|
+
const m = githubUrl.match(/github\.com\/([^/\s]+)\/([^/\s#?]+)/i);
|
|
63
|
+
if (!m) return null;
|
|
64
|
+
const owner = m[1];
|
|
65
|
+
const repo = m[2].replace(/\.git$/i, "");
|
|
66
|
+
if (!owner || !repo) return null;
|
|
67
|
+
return `${owner}/${repo}`;
|
|
68
|
+
}
|
|
69
|
+
function hasDeploySource(app) {
|
|
70
|
+
return Boolean(app.links.github);
|
|
71
|
+
}
|
|
72
|
+
var cache = /* @__PURE__ */ new Map();
|
|
73
|
+
var inflight = /* @__PURE__ */ new Map();
|
|
74
|
+
async function fetchOssApps(base, force = false) {
|
|
75
|
+
const key = base.replace(/\/+$/, "");
|
|
76
|
+
if (!force) {
|
|
77
|
+
const hit = cache.get(key);
|
|
78
|
+
if (hit) return hit;
|
|
79
|
+
const pending = inflight.get(key);
|
|
80
|
+
if (pending) return pending;
|
|
81
|
+
}
|
|
82
|
+
const run = (async () => {
|
|
83
|
+
const res = await fetch(`${key}/meta.json`, {
|
|
84
|
+
headers: { Accept: "application/json" },
|
|
85
|
+
// Public catalog — no credentials, so a session cookie never leaks cross-origin.
|
|
86
|
+
credentials: "omit"
|
|
87
|
+
});
|
|
88
|
+
if (!res.ok) throw new Error(`Catalog unavailable (HTTP ${res.status})`);
|
|
89
|
+
const apps = normalizeOssApps(await res.json());
|
|
90
|
+
cache.set(key, apps);
|
|
91
|
+
return apps;
|
|
92
|
+
})();
|
|
93
|
+
inflight.set(key, run);
|
|
94
|
+
try {
|
|
95
|
+
return await run;
|
|
96
|
+
} finally {
|
|
97
|
+
inflight.delete(key);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async function fetchCompose(base, id) {
|
|
101
|
+
try {
|
|
102
|
+
const res = await fetch(`${blueprintBase(base, id)}/docker-compose.yml`, {
|
|
103
|
+
headers: { Accept: "text/plain" },
|
|
104
|
+
credentials: "omit"
|
|
105
|
+
});
|
|
106
|
+
if (!res.ok) return null;
|
|
107
|
+
const text = await res.text();
|
|
108
|
+
return text.trim() ? text : null;
|
|
109
|
+
} catch {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// src/oss/blueprint.ts
|
|
115
|
+
var indent = (line) => line.length - line.trimStart().length;
|
|
116
|
+
function parseBlueprint(yaml) {
|
|
117
|
+
const lines = String(yaml ?? "").split(/\r?\n/);
|
|
118
|
+
const services = [];
|
|
119
|
+
const env = /* @__PURE__ */ new Set();
|
|
120
|
+
let servicesAt = -1;
|
|
121
|
+
let current = null;
|
|
122
|
+
let currentAt = -1;
|
|
123
|
+
let listKey = null;
|
|
124
|
+
let listAt = -1;
|
|
125
|
+
for (const raw of lines) {
|
|
126
|
+
const line = raw.replace(/\t/g, " ");
|
|
127
|
+
const trimmed = line.trim();
|
|
128
|
+
if (!trimmed || trimmed.startsWith("#")) continue;
|
|
129
|
+
const col = indent(line);
|
|
130
|
+
if (servicesAt < 0) {
|
|
131
|
+
if (/^services\s*:/.test(trimmed)) servicesAt = col;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (col <= servicesAt) {
|
|
135
|
+
if (!/^services\s*:/.test(trimmed)) break;
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (current === null || col <= currentAt) {
|
|
139
|
+
const m = trimmed.match(/^([A-Za-z0-9._-]+)\s*:\s*$/);
|
|
140
|
+
if (m) {
|
|
141
|
+
current = { name: m[1], ports: [] };
|
|
142
|
+
currentAt = col;
|
|
143
|
+
services.push(current);
|
|
144
|
+
listKey = null;
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (!current) continue;
|
|
149
|
+
if (listKey && col > listAt && trimmed.startsWith("-")) {
|
|
150
|
+
const item = trimmed.replace(/^-\s*/, "").replace(/^["']|["']$/g, "");
|
|
151
|
+
if (listKey === "ports") current.ports.push(item);
|
|
152
|
+
else {
|
|
153
|
+
const key = item.split(/[=:]/)[0]?.trim();
|
|
154
|
+
if (key) env.add(key);
|
|
155
|
+
}
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
listKey = null;
|
|
159
|
+
const img = trimmed.match(/^image\s*:\s*(.+)$/);
|
|
160
|
+
if (img) {
|
|
161
|
+
current.image = img[1].trim().replace(/^["']|["']$/g, "");
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (/^ports\s*:/.test(trimmed)) {
|
|
165
|
+
listKey = "ports";
|
|
166
|
+
listAt = col;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (/^environment\s*:/.test(trimmed)) {
|
|
170
|
+
listKey = "environment";
|
|
171
|
+
listAt = col;
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return { services, env: [...env].sort((a, b) => a.localeCompare(b)) };
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export { blueprintBase, fetchCompose, fetchOssApps, hasDeploySource, logoUrl, normalizeOssApp, normalizeOssApps, ownerRepo, parseBlueprint };
|
|
179
|
+
//# sourceMappingURL=oss.js.map
|
|
180
|
+
//# sourceMappingURL=oss.js.map
|
package/dist/oss.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/oss/catalog.ts","../src/oss/blueprint.ts"],"names":[],"mappings":"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","file":"oss.js","sourcesContent":["/**\n * The OSS App Store catalog — the shared client for the 1000+-app one-click\n * open-source catalog served as a flat JSON array at `<base>/meta.json`, with per-app\n * blueprint assets under `<base>/blueprints/<id>/`.\n *\n * One catalog, several surfaces: the console App Store, platform.hanzo.ai, and the\n * public gallery at oss.hanzo.ai. They previously each carried their own copy of the\n * shape, the normalizer and the URL builders, which is how three surfaces come to\n * disagree about the same catalog row. This is the one implementation.\n *\n * The catalog is a PUBLIC CDN with open CORS, so a browser fetches it DIRECTLY — no\n * BFF, no `/v1` proxy — which is why this works in the go:embed console where the\n * Next reverse-proxies are pruned. The base URL is INJECTED by the caller, so this\n * module holds no config import and its normalizers + URL builders stay pure.\n */\n\n/** One open-source app in the catalog (the meta.json entry, load-bearing fields only). */\nexport type OssApp = {\n /** Stable catalog id + blueprint path segment, e.g. `2fauth`, `n8n`, `postgres`. */\n id: string\n /** Display name, e.g. \"2FAuth\". */\n name: string\n /** One-line description. */\n description: string\n /** Version label — often the literal string `\"latest\"`, rendered raw. */\n version: string\n /** Bare logo filename (e.g. `logo.svg`), resolved against the blueprint path. */\n logo: string\n /** Category/provenance tags (e.g. `productivity`, `self-hosted`, `caprover`). */\n tags: string[]\n /** External links; only github/website/docs are surfaced. */\n links: { github?: string; website?: string; docs?: string }\n}\n\nconst str = (v: unknown): string => (typeof v === 'string' ? v : '')\nconst strTrim = (v: unknown): string | undefined => {\n const s = str(v).trim()\n return s ? s : undefined\n}\nconst strList = (v: unknown): string[] =>\n Array.isArray(v) ? v.map((x) => (typeof x === 'string' ? x.trim() : '')).filter((x) => x !== '') : []\nconst asRecord = (v: unknown): Record<string, unknown> =>\n v && typeof v === 'object' && !Array.isArray(v) ? (v as Record<string, unknown>) : {}\n\n/** Normalize one catalog record to an `OssApp` (drops a record with no id + name). */\nexport function normalizeOssApp(raw: unknown): OssApp | null {\n const r = asRecord(raw)\n const id = str(r.id).trim()\n const name = str(r.name).trim() || id\n if (!id || !name) return null\n const links = asRecord(r.links)\n return {\n id,\n name,\n description: str(r.description).trim(),\n version: str(r.version).trim() || 'latest',\n logo: str(r.logo).trim(),\n tags: strList(r.tags),\n links: {\n github: strTrim(links.github),\n website: strTrim(links.website),\n docs: strTrim(links.docs),\n },\n }\n}\n\n/** Normalize the catalog payload to the app list (bare array OR a `{data|apps|…}` wrap). */\nexport function normalizeOssApps(payload: unknown): OssApp[] {\n let arr: unknown[] = []\n if (Array.isArray(payload)) arr = payload\n else if (payload && typeof payload === 'object') {\n for (const k of ['data', 'apps', 'templates', 'items', 'rows']) {\n const v = (payload as Record<string, unknown>)[k]\n if (Array.isArray(v)) {\n arr = v\n break\n }\n }\n }\n const out: OssApp[] = []\n const seen = new Set<string>()\n for (const raw of arr) {\n const app = normalizeOssApp(raw)\n if (app && !seen.has(app.id)) {\n seen.add(app.id)\n out.push(app)\n }\n }\n return out\n}\n\n/** The per-app blueprint asset base: `<base>/blueprints/<id>`. */\nexport function blueprintBase(base: string, id: string): string {\n return `${base.replace(/\\/+$/, '')}/blueprints/${encodeURIComponent(id)}`\n}\n\n/**\n * The app's logo URL, or null when the entry carries no logo filename — a surface then\n * renders its monogram fallback rather than a broken image.\n */\nexport function logoUrl(base: string, app: OssApp): string | null {\n if (!app.logo) return null\n return `${blueprintBase(base, app.id)}/${app.logo}`\n}\n\n/**\n * Derive `owner/repo` from a GitHub URL — the maker identity, since the catalog\n * carries no author field. Returns null for a non-GitHub / malformed URL.\n */\nexport function ownerRepo(githubUrl?: string): string | null {\n if (!githubUrl) return null\n const m = githubUrl.match(/github\\.com\\/([^/\\s]+)\\/([^/\\s#?]+)/i)\n if (!m) return null\n const owner = m[1]\n const repo = m[2].replace(/\\.git$/i, '')\n if (!owner || !repo) return null\n return `${owner}/${repo}`\n}\n\n/** An app is one-click deployable when it carries a buildable source (its repo). */\nexport function hasDeploySource(app: OssApp): boolean {\n return Boolean(app.links.github)\n}\n\n// ── Live fetch (the one impure surface) ──────────────────────────────────────\n//\n// Cached per base URL so several mounts share ONE ~500 KB fetch. An in-flight fetch is\n// de-duped (concurrent callers await the same promise); a failure is not cached.\nconst cache = new Map<string, OssApp[]>()\nconst inflight = new Map<string, Promise<OssApp[]>>()\n\n/**\n * Fetch + normalize the catalog from `<base>/meta.json`. Cross-origin and\n * unauthenticated (public CDN); throws on a non-2xx or parse failure so the caller can\n * show an honest error state. Cached on success; `force` bypasses for a manual refresh.\n */\nexport async function fetchOssApps(base: string, force = false): Promise<OssApp[]> {\n const key = base.replace(/\\/+$/, '')\n if (!force) {\n const hit = cache.get(key)\n if (hit) return hit\n const pending = inflight.get(key)\n if (pending) return pending\n }\n const run = (async () => {\n const res = await fetch(`${key}/meta.json`, {\n headers: { Accept: 'application/json' },\n // Public catalog — no credentials, so a session cookie never leaks cross-origin.\n credentials: 'omit',\n })\n if (!res.ok) throw new Error(`Catalog unavailable (HTTP ${res.status})`)\n const apps = normalizeOssApps(await res.json())\n cache.set(key, apps)\n return apps\n })()\n inflight.set(key, run)\n try {\n return await run\n } finally {\n inflight.delete(key)\n }\n}\n\n/**\n * Fetch one app's `docker-compose.yml` as raw text, or null when the entry publishes\n * none. A 404 is a NORMAL answer for a large community catalog — not every blueprint\n * ships compose — so this never throws: a detail view treats an absent blueprint as\n * \"nothing to show\", and an optional asset must not fail a whole page.\n */\nexport async function fetchCompose(base: string, id: string): Promise<string | null> {\n try {\n const res = await fetch(`${blueprintBase(base, id)}/docker-compose.yml`, {\n headers: { Accept: 'text/plain' },\n credentials: 'omit',\n })\n if (!res.ok) return null\n const text = await res.text()\n return text.trim() ? text : null\n } catch {\n return null\n }\n}\n","/**\n * What an OSS blueprint actually provisions, read from its own `docker-compose.yml`.\n *\n * This is the one implementation. It was written twice before it lived here — once in\n * TypeScript for the console's App Store and once in vanilla JS for oss.hanzo.ai — and\n * two readers of the same file format drift, which means two surfaces can disagree\n * about what a deploy will start.\n *\n * Deliberately a SMALL structural reader, not a YAML implementation: it walks the\n * `services:` block by indentation and pulls only the keys a detail view shows.\n * Anything it cannot read is absent, never guessed, so a surface degrades to \"no\n * blueprint detail\" instead of asserting something false about what will run.\n *\n * Pure and total — it never throws on malformed or hostile input — so it is safe to\n * run on untrusted CDN content and testable without a DOM or a network.\n */\n\n/**\n * One service a blueprint provisions. `image` is absent for a service built from\n * source (`build:` rather than `image:`).\n */\nexport type Service = { name: string; image?: string; ports: string[] }\n\n/** What a blueprint provisions: the containers it starts and the config it expects. */\nexport type Blueprint = { services: Service[]; env: string[] }\n\n/** Indent width of a line, tabs counted as one column (compose files are space-indented). */\nconst indent = (line: string): number => line.length - line.trimStart().length\n\n/**\n * Parse the load-bearing facts out of a `docker-compose.yml`: the services it starts\n * (with image + published ports) and the environment keys it expects.\n *\n * Environment KEYS only — never the values, which are routinely secrets.\n */\nexport function parseBlueprint(yaml: string): Blueprint {\n const lines = String(yaml ?? '').split(/\\r?\\n/)\n const services: Service[] = []\n const env = new Set<string>()\n\n let servicesAt = -1 // indent of the `services:` key, -1 until seen\n let current: Service | null = null\n let currentAt = -1 // indent of the current service's name (bookkeeping, not a field)\n let listKey: 'ports' | 'environment' | null = null\n let listAt = -1\n\n for (const raw of lines) {\n const line = raw.replace(/\\t/g, ' ')\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) continue\n const col = indent(line)\n\n if (servicesAt < 0) {\n if (/^services\\s*:/.test(trimmed)) servicesAt = col\n continue\n }\n // Dedent back to or past `services:` ends the block (e.g. a following `volumes:`).\n if (col <= servicesAt) {\n if (!/^services\\s*:/.test(trimmed)) break\n continue\n }\n\n // A service name sits exactly one level inside `services:`.\n if (current === null || col <= currentAt) {\n const m = trimmed.match(/^([A-Za-z0-9._-]+)\\s*:\\s*$/)\n if (m) {\n current = { name: m[1], ports: [] }\n currentAt = col\n services.push(current)\n listKey = null\n continue\n }\n }\n if (!current) continue\n\n if (listKey && col > listAt && trimmed.startsWith('-')) {\n const item = trimmed.replace(/^-\\s*/, '').replace(/^[\"']|[\"']$/g, '')\n if (listKey === 'ports') current.ports.push(item)\n else {\n const key = item.split(/[=:]/)[0]?.trim()\n if (key) env.add(key)\n }\n continue\n }\n listKey = null\n\n const img = trimmed.match(/^image\\s*:\\s*(.+)$/)\n if (img) {\n current.image = img[1].trim().replace(/^[\"']|[\"']$/g, '')\n continue\n }\n if (/^ports\\s*:/.test(trimmed)) {\n listKey = 'ports'\n listAt = col\n continue\n }\n if (/^environment\\s*:/.test(trimmed)) {\n listKey = 'environment'\n listAt = col\n continue\n }\n }\n\n return { services, env: [...env].sort((a, b) => a.localeCompare(b)) }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { AspectRatio } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Avatar } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { AvatarFallback } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { AvatarImage } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Badge } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Button } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Card } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CardAction } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CardContent } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CardDescription } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CardFooter } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CardHeader } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CardTitle } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Checkbox } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Collapsible } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CollapsibleContent } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CollapsibleTrigger } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Command } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CommandDialog } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CommandEmpty } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CommandGroup } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CommandInput } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CommandItem } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CommandList } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CommandSeparator } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CommandShortcut } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Dialog } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DialogClose } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DialogContent } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DialogDescription } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DialogFooter } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DialogHeader } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DialogOverlay } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DialogPortal } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DialogTitle } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DialogTrigger } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DropdownMenu } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DropdownMenuCheckboxItem } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DropdownMenuContent } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DropdownMenuGroup } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DropdownMenuItem } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DropdownMenuLabel } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DropdownMenuPortal } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DropdownMenuRadioGroup } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DropdownMenuRadioItem } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DropdownMenuSeparator } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DropdownMenuShortcut } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DropdownMenuSub } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DropdownMenuSubContent } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DropdownMenuSubTrigger } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DropdownMenuTrigger } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Input } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Label } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Popover } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { PopoverAnchor } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { PopoverContent } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { PopoverTrigger } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Progress } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ScrollArea } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ScrollBar } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Select } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { SelectContent } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { SelectGroup } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { SelectItem } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { SelectLabel } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { SelectScrollDownButton } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { SelectScrollUpButton } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { SelectSeparator } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { SelectTrigger } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { SelectValue } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Separator } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Slider } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Switch } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Tabs } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { TabsContent } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { TabsList } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { TabsTrigger } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Textarea } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Toaster } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Tooltip } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { TooltipContent } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { TooltipProvider } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { TooltipTrigger } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { badgeVariants } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { buttonVariants } from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../backends/shadcn';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { toast } from '../backends/shadcn';
|