# Artifacts for Tools and Agents

This page is for developers building a tool, a code generator, or an agent that works with Dynamic UI and needs to read its API, examples, or tokens programmatically. It describes which files each Dynamic UI version publishes, where they are, and what each one contains. If you build widgets by hand you do not need it: what these files describe is explained for people in Components and Theming.

The examples and counts on this page are from Dynamic UI 2.12.1.

# Published Artifacts

The base of every path is https://cdn.dynamicframework.dev/assets/.

Artifact CDN path In the npm package Purpose
api.json {version}/ui-react/api.json dist/api.json Components, contexts, and hooks with their props, signatures, and types
components.json {version}/ui-react/manifests/components.json No Storybook stories with their import and the code of each example
docs.json {version}/ui-react/manifests/docs.json No Storybook documentation pages in MDX
token-overrides.json {version}/ui-react/tokens/token-overrides.json No Which theme variables can be overridden and how
known-tokens.json No scripts/theme/known-tokens.json Inventory of every custom property in the version's CSS
icons-core.json {version}/ui-react/icons-core.json dist/icons-core.json Lucide icons the library uses internally
dynamic-ui.css {version}/ui-react/css/dynamic-ui.css dist/css/dynamic-ui.css Compiled CSS
dynamic-ui.min.css {version}/ui-react/css/dynamic-ui.min.css dist/css/dynamic-ui.min.css Compiled and minified CSS
manifest.json manifest.json (outside {version}) No Index of published versions

Package paths are relative to node_modules/@dynamic-framework/ui-react/.

# Versions

Always use the versioned path, with the same version as the CSS the application loads. The latest/ui-react/ path exists, but its content changes with every release.

To find the most recent version, read the latest field of https://cdn.dynamicframework.dev/assets/manifest.json. Do not rely on the order of the versions keys: it is not a version order.

// jq '{latest}' manifest.json
{
  "latest": "2.12.1"
}

Each versions entry points to that version's api.json and states its publication date and whether it is deprecated:

// jq '.versions["2.12.1"]' manifest.json
{
  "ui-react": "https://cdn.dynamicframework.dev/assets/2.12.1/ui-react/api.json",
  "publishedAt": "2026-10-26T19:46:17Z",
  "deprecated": false
}

# api.json

api.json is generated from the package types; when api.json and the types in dist/types/ differ, the types prevail.

Top-level fields:

Field Content
$schema URL of the file's JSON schema
schemaVersion Version of the file structure, independent of the package version (1.2.0 in 2.12.1)
packageVersion Dynamic UI version
repository Link to the release
generatedAt Generation date
components Components, by name
contexts Contexts, by name
hooks Hooks, by name

# Components, Contexts, and Hooks

components, contexts, and hooks are objects whose keys are the names used in code. In 2.12.1 there are 81 entries in components, 1 in contexts (DContextProvider), and 25 in hooks. TypeScript types are read from the npm package, in dist/types/.

Each component has description, sourcePath, props, forwardedProps, and types. Each prop states its type, whether it is required, its default value, and its description:

// jq '.components.DButton.props.variant' api.json
{
  "type": "undefined | \"solid\" | \"outline\" | \"link\" | \"soft\"",
  "required": false,
  "defaultValue": "solid",
  "description": ""
}

Each hook has name, kind, source, description, signature, parameters, returns, returnType, requires, and types. requires lists what must be mounted for the hook to work:

// jq '.hooks.useCountdown | {name, signature, returnType, requires}' api.json
{
  "name": "useCountdown",
  "signature": "useCountdown(seconds: number) => { secondsLeft, restartCountdown }",
  "returnType": "{ secondsLeft: number; restartCountdown: () => void; }",
  "requires": []
}
// jq -c '.hooks.useDPortalContext.requires' api.json
["DContextProvider"]

Contexts have the same shape as hooks, with props instead of parameters and returns.

# Subcomponents

A subcomponent is a components entry with parent and accessor. A subcomponent is used through its accessor and is not imported by its name:

// jq '.components.DCardHeader | {parent, accessor}' api.json
{
  "parent": "DCard",
  "accessor": "DCard.Header"
}

In code, DCardHeader is written <DCard.Header>.

# forwardedProps and types

forwardedProps states which element or component receives the props the component does not declare, and with what type. Those props are not listed in props. It is null when the component does not forward props.

// jq '.components.DButton.forwardedProps' api.json
{
  "target": "button",
  "type": "ButtonHTMLAttributes<HTMLButtonElement>"
}

types defines the named types that appear in props, parameters, or return values, so they do not have to be resolved from another file. Each entry has description and type; object types also describe each field in fields, and in components, unions of literals list their values in values:

// jq '.components.DButton.types.IconValue' api.json
{
  "description": "",
  "type": "string | IconComponent"
}

A fields entry, in a DContextProvider type:

// jq '.contexts.DContextProvider.types.CurrencyProps.fields.symbol' api.json
{
  "type": "string",
  "required": true,
  "description": "Currency symbol (e.g. `\"$\"`, `\"€\"`)."
}

# manifests/components.json

Index of the Storybook stories. It has two top-level fields: v, the format version, and components, an object whose keys are story ids. In 2.12.1 it has 73 entries: 52 for components (design-system-*) and 21 for patterns (patterns-*).

Each entry has:

Field Content
id Story id
name Main component of the story
path Story file
import Import line the examples use
stories Examples, each with id, name, and snippet (JSX code)
jsDocTags JSDoc tags of the component
reactDocgen Component props according to react-docgen

Some pattern entries have no reactDocgen and include an error field, because the story does not declare a component.

// jq '.components["design-system-components-box"]' manifests/components.json
{
  "id": "design-system-components-box",
  "name": "DBox",
  "path": "./stories/components/DBox.stories.tsx",
  "stories": [
    {
      "id": "design-system-components-box--default",
      "name": "Default",
      "snippet": "const Default = () => <DBox>(<>\n      <h4>Hello world</h4>\n      <p className=\"m-0\">Loren ipsum dolor</p>\n    </>)</DBox>;"
    },
    {
      "id": "design-system-components-box--custom-padding",
      "name": "Custom Padding",
      "snippet": "const CustomPadding = () => <DBox className=\"p-8\">(<>\n      <h4>Hello world</h4>\n      <p className=\"m-0\">Lorem ipsum dolor</p>\n    </>)</DBox>;"
    }
  ],
  "import": "import { DBox } from \"@dynamic-framework/ui-react\";",
  "jsDocTags": {},
  "reactDocgen": {
    "description": "",
    "methods": [],
    "displayName": "DBox",
    "definedInFile": "src/components/DBox/DBox.tsx",
    "actualName": "DBox",
    "exportName": "default",
    "props": {
      "style": {
        "required": false,
        "tsType": {
          "name": "CSSProperties | undefined"
        }
      },
      "className": {
        "required": false,
        "tsType": {
          "name": "string | undefined"
        }
      },
      "dataAttributes": {
        "required": false,
        "tsType": {
          "name": "DataAttributes | undefined"
        }
      },
      "children": {
        "required": false,
        "tsType": {
          "name": "ReactNode"
        }
      }
    }
  }
}

# manifests/docs.json

Storybook documentation pages: usage guides, foundations, hooks, and utilities. It has two top-level fields: v and docs, an object whose keys are page ids. In 2.12.1 it has 32 pages.

Each page has id, name, path, title, and content, which is the full MDX:

// jq '.docs["design-system-utils-formatcurrency--docs"] | {id, name, path, title}' manifests/docs.json
{
  "id": "design-system-utils-formatcurrency--docs",
  "name": "Docs",
  "path": "./stories/utils/formatCurrency.mdx",
  "title": "Design System/Utils/formatCurrency"
}

# tokens/token-overrides.json

Describes which theme variables can be overridden, how they behave when you do, and what should not be touched. It is the machine version of Theming, which is the theming contract for people.

Top-level fields:

Field Content
$schema URL of the file's JSON schema
dynamicUi Dynamic UI version it belongs to
generatedFrom, generatedAt Source and generation date
consumption Anchor selector, how to win the cascade with and without @layer, color format, and how to wire your own variables
behaviorClasses The four behavior classes when overriding a variable
color Hue groups, ramps, and the scope of a rebrand
typography, spacing, radius, shadow Variables of each foundation
slots Variables the CSS references and does not declare
gaps Known limitations of theming with variables, with their state and the workaround
componentTokens Status of component variables

The behavior classes:

// jq '.behaviorClasses' tokens/token-overrides.json
{
  "override-base": "Override the base --bs-X-rgb. Drags --bs-X and --bs-X-500-rgb along. Does NOT recolor the rest of the ramp.",
  "override-leaf": "Baked literal. Override one by one; does not follow the base.",
  "follows": "Auto-derived (alias/wrapper). Do NOT override; it recolors itself.",
  "not-overridable": "Baked value outside var() (data-URI). Replace the whole variable or treat as a gap."
}

Coverage in 2.12.1: the file names 281 of the 1,215 custom properties the compiled CSS declares in :root, [data-bs-theme="dynamic"], the theme variables. The count is the variable names that appear in the file and are also declared in that selector. Component variables (--bs-{component}-*) are not enumerated: componentTokens states that they are deferred and how many there are.

// jq '.componentTokens | {status, deferredCount}' tokens/token-overrides.json
{
  "status": "deferred",
  "deferredCount": 703
}

Read the file of the same version as the CSS the application loads.

# known-tokens.json

Full inventory of the --bs-* custom properties declared by the version's compiled CSS, in alphabetical order. It ships only in the npm package, at node_modules/@dynamic-framework/ui-react/scripts/theme/known-tokens.json. Use it to check that a variable exists before overriding or referencing it.

// jq '{dynamicUi, count}' scripts/theme/known-tokens.json
{
  "dynamicUi": "2.12.1",
  "count": 1908
}

tokens is the array of names.

# icons-core.json

The lucide-react icons the library uses internally: chevrons, close, alert states, input adornments, and file actions. It is for anyone who trims lucide-react in their build: these icons must stay included even if the application does not use them directly. In 2.12.1 there are 27.

// jq '.' icons-core.json
{
  "dynamicUi": "2.12.1",
  "lucideReact": "^0.553.0",
  "icons": [
    "AlertCircle",
    "AlertTriangle",
    "Calendar",
    "Check",
    "CheckCircle",
    "ChevronDown",
    "ChevronLeft",
    "ChevronRight",
    "ChevronUp",
    "Eye",
    "EyeOff",
    "Info",
    "Minus",
    "Plus",
    "Search",
    "Upload",
    "X",
    "Circle",
    "CircleCheck",
    "CircleCheckBig",
    "Download",
    "FileText",
    "MoreVertical",
    "Paperclip",
    "RefreshCw",
    "Share2",
    "Trash"
  ]
}

# Schemas

api.json and token-overrides.json declare their JSON schema (draft 2020-12) in the $schema field:

Artifact Schema
api.json https://cdn.dynamicframework.dev/assets/schema/v1.json
token-overrides.json https://cdn.dynamicframework.dev/assets/schema/token-overrides.v1.json

components.json and docs.json have no published schema.

# Paths That Do Not Exist

These paths return an error. There is no directory listing.

Path Use instead
{version}/ui-react/token-overrides.json {version}/ui-react/tokens/token-overrides.json
{version}/ui-react/tokens-overrides.json {version}/ui-react/tokens/token-overrides.json
{version}/ui-react/dynamic-ui.css {version}/ui-react/css/dynamic-ui.css
{version}/ui-react/dynamic-ui.min.css {version}/ui-react/css/dynamic-ui.min.css
{version}/ui-react/known-tokens.json scripts/theme/known-tokens.json in the npm package
{version}/ui-react/ The paths in the artifacts table
schema/ The $schema URLs