Fable UI Core
fable-ui/coreFreeUtility
Shared tool rendering, data-source types, schemas, registry, local querying, and provider utilities.
Live preview
live · rendered by the registry
Rendered by fable-ui on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://fable-ui.shobky.com/r/core.jsonSource
1import * as React from "react"2import type { ReactNode } from "react"34import {5 getToolNameFromPart,6 ToolPayloadError,7 type FableToolRegistry,8 type ToolPartLike,9 type ToolRenderHandlers,10} from "./definitions"1112function UnknownToolPart({ name }: { name: string }) {13 return (14 <div className="rounded-md border bg-muted/40 p-4 text-sm text-muted-foreground">15 Unknown Fable tool part: <code>{name}</code>16 </div>17 )18}1920function renderComponent(21 Component: FableToolRegistry[string]["renderer"]["Component"],22 props: Record<string, unknown>,23) {24 return (25 <React.Suspense fallback={null}>26 <Component {...props} />27 </React.Suspense>28 )29}3031export function renderFableToolPart({32 part,33 registry,34 handlers = {},35}: {36 part: ToolPartLike37 registry: FableToolRegistry38 handlers?: ToolRenderHandlers39}): ReactNode {40 const toolName = getToolNameFromPart(part)41 const def = toolName ? registry[toolName] : undefined4243 if (!def) {44 return <UnknownToolPart name={toolName ?? part.type} />45 }4647 const fableState = part.toolMetadata?.fableState48 const isDisabled = fableState === "disabled"4950 if (part.state === "input-streaming" || fableState === "loading") {51 return renderComponent(def.renderer.Component, def.renderer.loadingProps)52 }5354 if (part.state === "output-error" || fableState === "error") {55 return renderComponent(56 def.renderer.Component,57 def.renderer.errorProps(part.errorText || "The tool result could not be rendered."),58 )59 }6061 if (fableState === "empty") {62 return renderComponent(def.renderer.Component, def.renderer.emptyProps)63 }6465 const parsed = def.schema.safeParse(part.output ?? part.input)6667 if (!parsed.success) {68 return renderComponent(69 def.renderer.Component,70 def.renderer.errorProps("The tool result did not match the expected data contract."),71 )72 }7374 try {75 return renderComponent(76 def.renderer.Component,77 {78 ...def.renderer.toProps(parsed.data, handlers),79 isDisabled,80 },81 )82 } catch (error) {83 const description =84 error instanceof ToolPayloadError ? error.message : "Unexpected error rendering component."8586 return renderComponent(def.renderer.Component, def.renderer.errorProps(description))87 }88}8990export function FableToolPart({91 part,92 registry,93 handlers,94}: {95 part: ToolPartLike96 registry: FableToolRegistry97 handlers?: ToolRenderHandlers98}) {99// … truncated
What it pulls in
npm packages
Files it writes
More from fable-ui
All 10 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Firebase Data Source Driverfirebase-driver | fable-ui | Utilities | Free | 1 dep · 3 files | |
| REST Data Source Driverrest-driver | fable-ui | Utilities | Free | no deps · 3 files |
