{"_id":"@openuidev/svelte-lang","_rev":"5-102f567d3e6cb6d0d5f17e93d5638744","name":"@openuidev/svelte-lang","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"@openuidev/svelte-lang","version":"0.1.0","keywords":["openui","generative-ui","svelte","svelte5","llm","streaming","renderer","parser","ai","components","prompt-generation","zod","ui-generation","model-driven-ui","openui-lang"],"author":{"name":"engineering@thesys.dev"},"license":"MIT","_id":"@openuidev/svelte-lang@0.1.0","maintainers":[{"name":"rabi.thesys","email":"rabi@thesys.dev"},{"name":"abhithesys","email":"abhishek@thesys.dev"}],"homepage":"https://openui.com","bugs":{"url":"https://github.com/thesysdev/openui/issues"},"dist":{"shasum":"675aa6fceaaaac18edb6a761f7bd32baccfbc43e","tarball":"https://registry.npmjs.org/@openuidev/svelte-lang/-/svelte-lang-0.1.0.tgz","fileCount":21,"integrity":"sha512-DxH9V3OOs8Z3MzIQTJ6K+cEjVWhzRVf2L9PbI/ybqOKCHqa+6+euB6EeAe/Y5/koAZkoTxrYSd7FL36TDmbkaQ==","signatures":[{"sig":"MEUCIA/qzk3gns6atIg8EwDQF47qXRdtnaNzNlnlNCJ8UGn0AiEAhGTIhNzORslJwbtUgP7aS4w0RdK/BrOakYIMbG4sIJE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43703},"main":"dist/index.js","type":"module","_from":"file:openuidev-svelte-lang-0.1.0.tgz","types":"dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","svelte":"./dist/index.js"}},"scripts":{"ci":"pnpm run lint:check && pnpm run format:check","test":"vitest run","build":"svelte-package","check":"svelte-check --tsconfig ./tsconfig.json","watch":"svelte-package --watch","lint:fix":"eslint ./src --fix","format:fix":"prettier --write ./src","lint:check":"eslint ./src","format:check":"prettier --check ./src"},"_npmUser":{"name":"abhithesys","email":"abhishek@thesys.dev"},"_resolved":"/private/var/folders/n0/k94j510n4slfvfdhf04dm50m0000gn/T/81ea8562d1e5d3be2b8c02b420ff3703/openuidev-svelte-lang-0.1.0.tgz","_integrity":"sha512-DxH9V3OOs8Z3MzIQTJ6K+cEjVWhzRVf2L9PbI/ybqOKCHqa+6+euB6EeAe/Y5/koAZkoTxrYSd7FL36TDmbkaQ==","repository":{"url":"git+https://github.com/thesysdev/openui.git","type":"git","directory":"packages/svelte-lang"},"_npmVersion":"10.9.4","description":"Define component libraries, generate LLM system prompts, and render streaming OpenUI Lang output in Svelte 5 — the Svelte runtime for OpenUI generative UI","directories":{},"_nodeVersion":"22.21.1","dependencies":{"zod":"^4.0.0","@openuidev/lang-core":"^0.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^26.1.0","svelte":"^5.0.0","vitest":"^3.0.0","typescript":"^5.0.0","svelte-check":"^4.0.0","@sveltejs/package":"^2.3.0","@testing-library/svelte":"^5.2.0","@sveltejs/vite-plugin-svelte":"^5.0.0"},"peerDependencies":{"svelte":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/svelte-lang_0.1.0_1774429101989_0.13844273640617888","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@openuidev/svelte-lang","version":"0.1.1","keywords":["openui","generative-ui","svelte","svelte5","llm","streaming","renderer","parser","ai","components","prompt-generation","zod","ui-generation","model-driven-ui","openui-lang"],"author":{"name":"engineering@thesys.dev"},"license":"MIT","_id":"@openuidev/svelte-lang@0.1.1","maintainers":[{"name":"rabi.thesys","email":"rabi@thesys.dev"},{"name":"abhithesys","email":"abhishek@thesys.dev"}],"homepage":"https://openui.com","bugs":{"url":"https://github.com/thesysdev/openui/issues"},"dist":{"shasum":"318e850be09ab251de1b10452c2deae39bb393a4","tarball":"https://registry.npmjs.org/@openuidev/svelte-lang/-/svelte-lang-0.1.1.tgz","fileCount":21,"integrity":"sha512-PbRFoOL7WipR4/HLYIzifU1yxgT80T9un750VTf03iyTySnqrGS/yKGOdPXWvXAEiQUlaWeJDfXQiYYdPVXJzA==","signatures":[{"sig":"MEUCIQDoXKZmHSVLeahRtc/rNqoXuQYciRDpYG5rpaifjSefiwIgCIrW5iyZTogG20qOUE/bGYuREtQdN2HRJWDtmHxYWqk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openuidev%2fsvelte-lang@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":43798},"main":"dist/index.js","type":"module","_from":"file:openuidev-svelte-lang-0.1.1.tgz","types":"dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","svelte":"./dist/index.js"}},"scripts":{"ci":"pnpm run lint:check && pnpm run format:check","test":"vitest run","build":"svelte-package","check":"svelte-check --tsconfig ./tsconfig.json","watch":"svelte-package --watch","lint:fix":"eslint ./src --fix","format:fix":"prettier --write ./src","lint:check":"eslint ./src","format:check":"prettier --check ./src"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6957667a-b503-4c5d-b0b0-e0cd0f0c6c0b"}},"_resolved":"/tmp/e3096957a8603c22f6ea99bf57f23c08/openuidev-svelte-lang-0.1.1.tgz","_integrity":"sha512-PbRFoOL7WipR4/HLYIzifU1yxgT80T9un750VTf03iyTySnqrGS/yKGOdPXWvXAEiQUlaWeJDfXQiYYdPVXJzA==","repository":{"url":"git+https://github.com/thesysdev/openui.git","type":"git","directory":"packages/svelte-lang"},"_npmVersion":"11.6.4","description":"Define component libraries, generate LLM system prompts, and render streaming OpenUI Lang output in Svelte 5 — the Svelte runtime for OpenUI generative UI","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@openuidev/lang-core":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^26.1.0","svelte":"^5.0.0","vitest":"^3.0.0","typescript":"^5.0.0","svelte-check":"^4.0.0","@sveltejs/package":"^2.3.0","@testing-library/svelte":"^5.2.0","@sveltejs/vite-plugin-svelte":"^5.0.0"},"peerDependencies":{"zod":"^3.25.0 || ^4.0.0","svelte":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/svelte-lang_0.1.1_1776146758783_0.31800879339138555","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@openuidev/svelte-lang","version":"0.1.2","keywords":["openui","generative-ui","svelte","svelte5","llm","streaming","renderer","parser","ai","components","prompt-generation","zod","ui-generation","model-driven-ui","openui-lang"],"author":{"name":"engineering@thesys.dev"},"license":"MIT","_id":"@openuidev/svelte-lang@0.1.2","maintainers":[{"name":"abhithesys","email":"abhishek@thesys.dev"}],"homepage":"https://openui.com","bugs":{"url":"https://github.com/thesysdev/openui/issues"},"dist":{"shasum":"297cb55cecbcb2d8dc7750884c6b7e21a1e8a192","tarball":"https://registry.npmjs.org/@openuidev/svelte-lang/-/svelte-lang-0.1.2.tgz","fileCount":21,"integrity":"sha512-f9m3lu162lUM2SgpSnNXA5FrYBxQ2k4k/qlZPHDWBucGKvyJpnPMVJBIsuyAibkP4bjELAmXLJX4gzhlr13g/g==","signatures":[{"sig":"MEUCIHmjFvjF02m6durhlsOz8yDIXdqjuvNevIQZYuZvMgVwAiEAukxg20A2i+0WfeISIJOTAcxw9fMQAcKsrmJwUrZZwaA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openuidev%2fsvelte-lang@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":43852},"main":"dist/index.js","type":"module","_from":"file:openuidev-svelte-lang-0.1.2.tgz","types":"dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","svelte":"./dist/index.js"}},"scripts":{"ci":"pnpm run lint:check && pnpm run format:check","test":"vitest run","build":"svelte-package","check":"svelte-check --tsconfig ./tsconfig.json","watch":"svelte-package --watch","lint:fix":"eslint ./src --fix","format:fix":"prettier --write ./src","lint:check":"eslint ./src","format:check":"prettier --check ./src"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6957667a-b503-4c5d-b0b0-e0cd0f0c6c0b"}},"_resolved":"/tmp/cea37fc8f85f5db85fba3deb8210b039/openuidev-svelte-lang-0.1.2.tgz","_integrity":"sha512-f9m3lu162lUM2SgpSnNXA5FrYBxQ2k4k/qlZPHDWBucGKvyJpnPMVJBIsuyAibkP4bjELAmXLJX4gzhlr13g/g==","repository":{"url":"git+https://github.com/thesysdev/openui.git","type":"git","directory":"packages/svelte-lang"},"_npmVersion":"11.6.4","description":"Define component libraries, generate LLM system prompts, and render streaming OpenUI Lang output in Svelte 5 — the Svelte runtime for OpenUI generative UI","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@openuidev/lang-core":"^0.2.5"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^26.1.0","svelte":"^5.0.0","vitest":"^3.0.0","typescript":"^5.0.0","svelte-check":"^4.0.0","@sveltejs/package":"^2.3.0","@testing-library/svelte":"^5.2.0","@sveltejs/vite-plugin-svelte":"^5.0.0"},"peerDependencies":{"zod":"^3.25.0 || ^4.0.0","svelte":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/svelte-lang_0.1.2_1779272006529_0.30981348223491434","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"_id":"@openuidev/svelte-lang@0.3.0","bugs":{"url":"https://github.com/thesysdev/openui/issues"},"dist":{"shasum":"62c5fab0e94d50f034296767b5df8778265328d4","tarball":"https://registry.npmjs.org/@openuidev/svelte-lang/-/svelte-lang-0.3.0.tgz","fileCount":21,"integrity":"sha512-ps/czPlXq6WzfMXECB1V2wRhDaDRmnA0D4poVcgCZOh9X7bssad9v3aFMpFkQ+vTKJNsVVyk8hk7YgpnjWonIQ==","signatures":[{"sig":"MEYCIQDxvw51NqC18SU7EsoLFJZfLM9n8rd0/dKrUJwXjM6jiwIhAMTkRUnf4U7H7hwnabkXICQYRV235sAqqL4w9X0IL1Xl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCo6sGpmxltVr/2FhuXXnnCaGJr4wviTiIGmoFWeTb5wQIhAJvQVaw0utFCBNfoqwDtWiBOOV6T8F6QzeKx0BES0Re7"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openuidev%2fsvelte-lang@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":44107},"main":"dist/index.js","name":"@openuidev/svelte-lang","type":"module","_from":"file:openuidev-svelte-lang-0.3.0.tgz","types":"dist/index.d.ts","author":{"name":"engineering@thesys.dev"},"svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","svelte":"./dist/index.js"}},"license":"MIT","scripts":{"ci":"pnpm run lint:check && pnpm run format:check","test":"vitest run","build":"svelte-package","check":"svelte-check --tsconfig ./tsconfig.json","watch":"svelte-package --watch","lint:fix":"eslint ./src --fix","format:fix":"prettier --write ./src","lint:check":"eslint ./src","format:check":"prettier --check ./src"},"version":"0.3.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ebb24b71-4619-42f8-b402-372736250ecb"}},"homepage":"https://openui.com","keywords":["openui","generative-ui","svelte","svelte5","llm","streaming","renderer","parser","ai","components","prompt-generation","zod","ui-generation","model-driven-ui","openui-lang"],"_resolved":"/tmp/70164f2bf7626047b6f2f2c087b419ea/openuidev-svelte-lang-0.3.0.tgz","_integrity":"sha512-ps/czPlXq6WzfMXECB1V2wRhDaDRmnA0D4poVcgCZOh9X7bssad9v3aFMpFkQ+vTKJNsVVyk8hk7YgpnjWonIQ==","repository":{"url":"git+https://github.com/thesysdev/openui.git","type":"git","directory":"packages/svelte-lang"},"_npmVersion":"11.6.4","description":"Define component libraries, generate LLM system prompts, and render streaming OpenUI Lang output in Svelte 5 — the Svelte runtime for OpenUI generative UI","directories":{},"maintainers":[{"name":"abhithesys","email":"abhishek@thesys.dev"}],"_nodeVersion":"22.23.2","dependencies":{"@openuidev/lang-core":"^0.3.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^26.1.0","svelte":"^5.0.0","vitest":"^4.1.0","typescript":"^5.9.3","svelte-check":"^4.0.0","@sveltejs/package":"^2.3.0","@testing-library/svelte":"^5.2.0","@sveltejs/vite-plugin-svelte":"^5.0.0"},"peerDependencies":{"zod":"^3.25.0 || ^4.0.0","svelte":">=5.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/svelte-lang_0.3.0_1789449503071_0.652675212152521"}}},"time":{"created":"2026-03-25T08:58:21.904Z","modified":"2026-09-15T05:18:23.524Z","0.1.0":"2026-03-25T08:58:22.124Z","0.1.1":"2026-04-14T06:05:58.915Z","0.1.2":"2026-05-20T10:13:26.678Z","0.3.0":"2026-09-15T05:18:23.164Z"},"bugs":{"url":"https://github.com/thesysdev/openui/issues"},"author":{"name":"engineering@thesys.dev"},"license":"MIT","homepage":"https://openui.com","keywords":["openui","generative-ui","svelte","svelte5","llm","streaming","renderer","parser","ai","components","prompt-generation","zod","ui-generation","model-driven-ui","openui-lang"],"repository":{"url":"git+https://github.com/thesysdev/openui.git","type":"git","directory":"packages/svelte-lang"},"description":"Define component libraries, generate LLM system prompts, and render streaming OpenUI Lang output in Svelte 5 — the Svelte runtime for OpenUI generative UI","maintainers":[{"name":"abhithesys","email":"abhishek@thesys.dev"}],"readme":"# @openuidev/svelte-lang\n\nSvelte 5 bindings for OpenUI Lang. Define model-renderable Svelte components, generate prompts from those definitions, and render streamed OpenUI Lang in a Svelte app.\n\n[![npm version](https://img.shields.io/npm/v/@openuidev/svelte-lang)](https://www.npmjs.com/package/@openuidev/svelte-lang)\n[![monthly downloads](https://img.shields.io/npm/dm/@openuidev/svelte-lang)](https://www.npmjs.com/package/@openuidev/svelte-lang)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/thesysdev/openui/blob/main/LICENSE)\n\n**Links:** [OpenUI Lang docs](https://openui.com/docs/openui-lang) | [GitHub repo](https://github.com/thesysdev/openui)\n\n## Install\n\n```bash\nnpm install @openuidev/svelte-lang\n# or\npnpm add @openuidev/svelte-lang\n```\n\n**Peer dependencies:** `svelte >=5.0.0`\n\n## Overview\n\n`@openuidev/svelte-lang` brings the OpenUI Lang runtime to Svelte:\n\n1. **Define Svelte components** that a model is allowed to call, with Zod schemas for props.\n2. **Generate prompts** from the component library.\n3. **Render streamed output** with `<Renderer>` as OpenUI Lang arrives.\n\n## Quick Start\n\n### 1. Define a component\n\n```svelte\n<!-- Greeting.svelte -->\n<script lang=\"ts\">\n  import type { ComponentRenderProps } from \"@openuidev/svelte-lang\";\n\n  let { props, renderNode }: ComponentRenderProps<{ name: string; mood?: \"happy\" | \"excited\" }> = $props();\n</script>\n\n<div class={props.mood === \"excited\" ? \"text-xl font-bold\" : \"\"}>\n  Hello, {props.name}!\n</div>\n```\n\n```ts\nimport { defineComponent } from \"@openuidev/svelte-lang\";\nimport { z } from \"zod\";\nimport Greeting from \"./Greeting.svelte\";\n\nconst GreetingDef = defineComponent({\n  name: \"Greeting\",\n  description: \"Displays a greeting message\",\n  props: z.object({\n    name: z.string().describe(\"The person's name\"),\n    mood: z.enum([\"happy\", \"excited\"]).optional().describe(\"Tone of the greeting\"),\n  }),\n  component: Greeting,\n});\n```\n\n### 2. Create a library\n\n```ts\nimport { createLibrary } from \"@openuidev/svelte-lang\";\n\nconst library = createLibrary({\n  components: [GreetingDef, CardDef, TableDef /* ... */],\n  root: \"Card\", // optional default root component\n});\n```\n\n### 3. Generate a system prompt\n\n```ts\nconst systemPrompt = library.prompt({\n  preamble: \"You are a helpful assistant.\",\n  additionalRules: [\"Always greet the user by name.\"],\n  examples: ['User: Hi\\n\\nroot = Greeting(\"Alice\", \"happy\")'],\n});\n```\n\n### 4. Render streamed output\n\n```svelte\n<script lang=\"ts\">\n  import { Renderer } from \"@openuidev/svelte-lang\";\n  import { library } from \"$lib/library\";\n\n  let { response, isStreaming }: { response: string | null; isStreaming: boolean } = $props();\n</script>\n\n<Renderer\n  {response}\n  {library}\n  {isStreaming}\n  onAction={(event) => console.log(\"Action:\", event)}\n/>\n```\n\n## API Reference\n\n### Component Definition\n\n| Export                      | Description                                                                                |\n| :-------------------------- | :----------------------------------------------------------------------------------------- |\n| `defineComponent(config)`   | Define a single component with a name, Zod props schema, description, and Svelte component |\n| `createLibrary(definition)` | Create a library from an array of defined components                                       |\n\n### Rendering\n\n| Export     | Description                                                 |\n| :--------- | :---------------------------------------------------------- |\n| `Renderer` | Svelte component that parses and renders OpenUI Lang output |\n\n**`RendererProps`:**\n\n| Prop            | Type                                    | Description                                                       |\n| :-------------- | :-------------------------------------- | :---------------------------------------------------------------- |\n| `response`      | `string \\| null`                        | Raw OpenUI Lang text from the model                               |\n| `library`       | `Library`                               | Component library from `createLibrary()`                          |\n| `isStreaming`   | `boolean`                               | Whether the model is still streaming (disables form interactions) |\n| `onAction`      | `(event: ActionEvent) => void`          | Callback when a component triggers an action                      |\n| `onStateUpdate` | `(state: Record<string, any>) => void`  | Callback when form field values change                            |\n| `initialState`  | `Record<string, any>`                   | Initial form state for hydration                                  |\n| `onParseResult` | `(result: ParseResult \\| null) => void` | Callback when the parse result changes                            |\n\n### Children Rendering\n\nSvelte components receive `renderNode` as a **snippet prop** (not via context). Use it to render child element nodes:\n\n```svelte\n<script lang=\"ts\">\n  import type { Snippet } from \"svelte\";\n\n  let { props, renderNode }: { props: { children?: unknown }; renderNode: Snippet<[unknown]> } = $props();\n</script>\n\n<div>\n  {#if props.children}\n    {@render renderNode(props.children)}\n  {/if}\n</div>\n```\n\n### Parser (Server-Side)\n\n| Export                          | Description                                            |\n| :------------------------------ | :----------------------------------------------------- |\n| `createParser(schema)`          | Create a one-shot parser for complete OpenUI Lang text |\n| `createStreamingParser(schema)` | Create an incremental parser for streaming input       |\n\nThe streaming parser exposes two methods:\n\n| Method        | Description                                           |\n| :------------ | :---------------------------------------------------- |\n| `push(chunk)` | Feed the next chunk; returns the latest `ParseResult` |\n| `getResult()` | Get the latest result without consuming new data      |\n\nAfter the stream ends, check `meta.unresolved` for any identifiers that were referenced but never defined. During streaming these are expected (forward refs) and are not treated as errors.\n\n#### Errors\n\n`ParseResult.meta.errors` contains structured `OpenUIError` objects. Each error has a `type` discriminant (currently always `\"validation\"`) and a `code` for consumer-side filtering:\n\n| Code                | Meaning                                             |\n| :------------------ | :-------------------------------------------------- |\n| `missing-required`  | Required prop absent with no default                |\n| `null-required`     | Required prop explicitly null with no default       |\n| `unknown-component` | Component name not found in the library schema      |\n| `excess-args`       | More positional args passed than the schema defines |\n\nErrors do not affect rendering. The parser stays permissive and renders what it can:\n\n```ts\nconst result = parser.parse(output);\nconst critical = result.meta.errors.filter((e) => e.code === \"unknown-component\");\n```\n\n### Context Getters\n\nUse these inside component renderers to interact with the rendering context:\n\n| Function                   | Returns               | Description                                                                    |\n| :------------------------- | :-------------------- | :----------------------------------------------------------------------------- |\n| `getOpenUIContext()`       | `OpenUIContextValue`  | Access the full context object (library, streaming state, field accessors)     |\n| `getIsStreaming()`         | `() => boolean`       | Returns a getter for the streaming state. Call it reactively: `isStreaming()` |\n| `getTriggerAction()`       | `Function`            | Trigger an action event                                                        |\n| `getGetFieldValue()`       | `Function`            | Get a form field's current value                                               |\n| `getSetFieldValue()`       | `Function`            | Set a form field's value                                                       |\n| `getFormName()`            | `string \\| undefined` | Get the current form's name                                                    |\n| `useSetDefaultValue(opts)` | `void`                | Set a field's default value once streaming completes                           |\n\n### Form Validation\n\n| Export                       | Description                                           |\n| :--------------------------- | :---------------------------------------------------- |\n| `getFormValidation()`        | Access form validation state                          |\n| `createFormValidation()`     | Create a form validation context                      |\n| `setFormValidationContext()` | Provide validation context to child components        |\n| `validate(value, rules)`     | Run validation rules against a value                  |\n| `builtInValidators`          | Built-in validators (required, email, min, max, etc.) |\n| `parseRules(rules)`          | Parse a rules config object into `ParsedRule[]`       |\n\n### Types\n\n```ts\nimport type {\n  // Component definition\n  Library,\n  LibraryDefinition,\n  DefinedComponent,\n  ComponentRenderer,\n  ComponentRenderProps,\n  ComponentGroup,\n  SubComponentOf,\n  PromptOptions,\n\n  // Rendering\n  RendererProps,\n  OpenUIContextValue,\n  ActionConfig,\n\n  // Parser & core\n  ActionEvent,\n  ElementNode,\n  ParseResult,\n  LibraryJSONSchema,\n\n  // Validation\n  FormValidationContextValue,\n  ParsedRule,\n  ValidatorFn,\n} from \"@openuidev/svelte-lang\";\n```\n\n## JSON Schema Output\n\nLibraries can also produce a JSON Schema representation of their components:\n\n```ts\nconst schema = library.toJSONSchema();\n// schema.$defs[\"Card\"]     → { properties: {...}, required: [...] }\n// schema.$defs[\"Greeting\"] → { properties: {...}, required: [...] }\n```\n\n## Differences from React\n\n| Concern            | `react-lang`                                     | `svelte-lang`                                    |\n| :----------------- | :----------------------------------------------- | :----------------------------------------------- |\n| Children rendering | `renderNode` function prop returning `ReactNode` | `renderNode` **snippet** (`Snippet<[unknown]>`)  |\n| Context access     | Hooks (`useIsStreaming()`, etc.)                 | Getters (`getIsStreaming()`, etc.)               |\n| Error boundaries   | Class-based, preserves last valid render         | `svelte:boundary` with auto-retry on prop change |\n| Reactivity         | Hooks re-run on every render                     | Runes (`$state`, `$derived`, `$effect`)          |\n\n## Documentation\n\n- [OpenUI Lang guide](https://openui.com/docs/openui-lang)\n- [Language specification](https://openui.com/docs/openui-lang/specification-v05)\n- [Source on GitHub](https://github.com/thesysdev/openui/tree/main/packages/svelte-lang)\n\n## License\n\n[MIT](https://github.com/thesysdev/openui/blob/main/LICENSE)\n","readmeFilename":"README.md"}