diff --git a/apps/web/package.json b/apps/web/package.json index b5477183..5b160971 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -13,7 +13,7 @@ "dependencies": { "@corbits-builder/client": "workspace:*", "@corbits-builder/schemas": "workspace:*", - "@corbits/react-ui": "0.4.0", + "@corbits/react-ui": "0.5.0", "@radix-ui/react-dialog": "1.3.1", "@radix-ui/react-dropdown-menu": "2.2.1", "@radix-ui/react-slot": "1.5.0", diff --git a/apps/web/src/config.ts b/apps/web/src/config.ts index 856c4b98..181f313a 100644 --- a/apps/web/src/config.ts +++ b/apps/web/src/config.ts @@ -178,6 +178,8 @@ export const wording = { shareDocument: "Share as Markdown", downloadDesign: "Download the design", shareDesign: "Share the design", + downloadSheet: "Download as CSV", + shareSheet: "Share as CSV", downloaded: (name: string) => `Downloaded ${name}.`, shareReady: (name: string) => `${name} is ready to share.`, shareNow: "Share now", diff --git a/apps/web/src/pages/workspace/artifact-pane.tsx b/apps/web/src/pages/workspace/artifact-pane.tsx index 92959930..104fe76a 100644 --- a/apps/web/src/pages/workspace/artifact-pane.tsx +++ b/apps/web/src/pages/workspace/artifact-pane.tsx @@ -30,6 +30,7 @@ import { import { DeliverableBody, type DeliverableState, + fillsPane, type ReadVersion, } from "./deliverable-block.tsx"; import { @@ -68,7 +69,7 @@ export const LIVE_TAB = "live-app"; const liveIds = panelTabIds(TAB_PREFIX, LIVE_TAB); const THEMES_TAB = "design-themes"; const themesIds = panelTabIds(TAB_PREFIX, THEMES_TAB); -// A pane whose page fills it edge to edge: the app, a mockup or the design draft. +// A pane whose page fills it edge to edge: the app, a mockup, a spreadsheet or the design draft. const FILL_PANE = "workspace-pane-fill"; const POINTER_TABS = "data-pointer-tabs"; const TAB_KEYS = new Set([ @@ -473,7 +474,9 @@ export function ArtifactPane({ + state?.status === "ready" && + mediaKind(state.document.mediaType, state.document.title) === "sheet"; + export function DeliverableBody({ state, designPart = "mockup", @@ -132,15 +140,22 @@ export function DeliverableBody({ ); } -const documentFile = (file: File): PaneFile => ({ - type: MARKDOWN_TYPE, - download: wording.paneFile.downloadDocument, - share: wording.paneFile.shareDocument, +const shownFile = (file: File, download: string, share: string): PaneFile => ({ + type: file.type, + download, + share, key: file.name, prepare: "shown", build: () => Promise.resolve({ file }), }); +const documentFile = (file: File) => + shownFile( + file, + wording.paneFile.downloadDocument, + wording.paneFile.shareDocument, + ); + function ReadyDocument({ document, designPart, @@ -193,7 +208,7 @@ function ReadyDocument({ const viewed = document.versions?.find((item) => item.version === viewing); const mediaType = viewed?.mediaType ?? document.mediaType; const title = viewed?.title ?? document.title; - const kind = mediaKind(mediaType); + const kind = mediaKind(mediaType, title); const shown = readFor(viewing); const approaches = shown?.approaches; const chooseApproach = @@ -274,28 +289,36 @@ function ReadyDocument({ ) : null; const stem = fileStem( fileName.project, - fileName.document, + kind === "sheet" + ? fileName.document.replace(/\.csv$/i, "") + : fileName.document, `v${String(viewing)}`, ); const design = kind === "design" && afterText !== null ? parseBundle(afterText) : null; const plan = designPart === "plan" ? design?.["DESIGN.md"] : undefined; - const source: PaneFile | null = - kind === "prose" && afterText !== null - ? documentFile(markdownFile(stem, afterText)) - : plan !== undefined - ? documentFile(markdownFile(stem, plan)) - : design !== null && designPart === "mockup" - ? { - type: ZIP_TYPE, - download: wording.paneFile.downloadDesign, - share: wording.paneFile.shareDesign, - key: `${stem}.zip`, - prepare: "shown", - build: async () => ({ file: await zipFile(stem, design) }), - } - : null; - const files = useFileGroup(source); + const sourceFile = (): PaneFile | null => { + if (kind === "prose" && afterText !== null) + return documentFile(markdownFile(stem, afterText)); + if (plan !== undefined) return documentFile(markdownFile(stem, plan)); + if (design !== null && designPart === "mockup") + return { + type: ZIP_TYPE, + download: wording.paneFile.downloadDesign, + share: wording.paneFile.shareDesign, + key: `${stem}.zip`, + prepare: "shown", + build: async () => ({ file: await zipFile(stem, design) }), + }; + if (kind === "sheet" && afterText !== null) + return shownFile( + csvFile(stem, afterText), + wording.paneFile.downloadSheet, + wording.paneFile.shareSheet, + ); + return null; + }; + const files = useFileGroup(sourceFile()); const barGroups = [ versionGroup({ versions: document.versions ?? [], @@ -314,33 +337,42 @@ function ReadyDocument({ ]; const visual = kind === "html" || (kind === "design" && designPart === "mockup"); - const reading = - kind === "html" ? ( - - ) : kind === "design" ? ( - - ) : kind === "json" || kind === "text" ? ( -
{body}
- ) : kind === "image" ? ( - {title} - ) : kind === "file" ? ( -

- - {wording.attach.open(title)} - -

- ) : comparing ? null : ( + const readingView = () => { + if (kind === "html") + return ( + + ); + if (kind === "design") + return ( + + ); + if (kind === "sheet") + return ; + if (kind === "json" || kind === "text") + return
{body}
; + if (kind === "image") + return {title}; + if (kind === "file") + return ( +

+ + {wording.attach.open(title)} + +

+ ); + if (comparing) return null; + return ( <> {approaches === undefined ? null : ( ); + }; const add = onAddToPrompt === undefined ? {} : { onAdd: onAddToPrompt }; - // A mockup fills the pane edge to edge: its tab names it, and its notes float over the page. - const fill = kind === "design" && designPart === "mockup"; + // A mockup or spreadsheet fills the pane edge to edge: its tab names it, and its notes float over the page. + const fill = + (kind === "design" && designPart === "mockup") || kind === "sheet"; const notes = ( <> {viewing !== document.version ? ( @@ -411,7 +445,7 @@ function ReadyDocument({ )} - {reading} + {readingView()} {comparison} {visual ? null : ( diff --git a/apps/web/src/pages/workspace/pane-file.tsx b/apps/web/src/pages/workspace/pane-file.tsx index b9671440..f7d0ca1a 100644 --- a/apps/web/src/pages/workspace/pane-file.tsx +++ b/apps/web/src/pages/workspace/pane-file.tsx @@ -1,7 +1,8 @@ /** * A pane's Download and Share actions for the one file it gives away: a document as Markdown, a - * design as a zip, the app as the hub's zip. Both actions take the same file, built before the - * press where it can be, because a share sheet opens only inside the press that asked for it. + * spreadsheet as its CSV, a design as a zip, the app as the hub's zip. Both actions take the same + * file, built before the press where it can be, because a share sheet opens only inside the press + * that asked for it. */ import JSZip from "jszip"; import { useEffect, useRef } from "react"; @@ -10,12 +11,14 @@ import { toast } from "sonner"; import { wording } from "../../config.ts"; import type { PaneBarGroup } from "./pane-bar.tsx"; -export const MARKDOWN_TYPE = "text/markdown"; +const MARKDOWN_TYPE = "text/markdown"; export const ZIP_TYPE = "application/zip"; +const CSV_TYPE = "text/csv"; const EXTENSION: Record = { [MARKDOWN_TYPE]: "md", [ZIP_TYPE]: "zip", + [CSV_TYPE]: "csv", }; /** A file name a person's system keeps as one name, as the hub names the app's zip. */ @@ -29,6 +32,9 @@ export const fileStem = (...parts: readonly string[]) => export const markdownFile = (stem: string, markdown: string) => new File([markdown], `${stem}.md`, { type: MARKDOWN_TYPE }); +export const csvFile = (stem: string, csv: string) => + new File([csv], `${stem}.csv`, { type: CSV_TYPE }); + /** The files under one directory named after the zip, as the app's zip is laid out. */ export async function zipFile( stem: string, diff --git a/apps/web/src/pages/workspace/passage-note.tsx b/apps/web/src/pages/workspace/passage-note.tsx index 7405eda9..0e51a344 100644 --- a/apps/web/src/pages/workspace/passage-note.tsx +++ b/apps/web/src/pages/workspace/passage-note.tsx @@ -31,7 +31,12 @@ function passageQuote( root: HTMLElement, ): string | null { if (!(target instanceof Element)) return null; - if (target.closest("button, a, input, textarea, select, label, iframe")) + // A click in a grid picks a cell, so it offers no quote. + if ( + target.closest( + "button, a, input, textarea, select, label, iframe, [role=grid]", + ) + ) return null; const block = target.closest( "p, li, h1, h2, h3, h4, blockquote, pre, td, th", diff --git a/bun.lock b/bun.lock index 0d77bca2..1aa84442 100644 --- a/bun.lock +++ b/bun.lock @@ -118,7 +118,7 @@ "dependencies": { "@corbits-builder/client": "workspace:*", "@corbits-builder/schemas": "workspace:*", - "@corbits/react-ui": "0.4.0", + "@corbits/react-ui": "0.5.0", "@radix-ui/react-dialog": "1.3.1", "@radix-ui/react-dropdown-menu": "2.2.1", "@radix-ui/react-slot": "1.5.0", @@ -600,7 +600,7 @@ "name": "@corbits-builder/coder", "version": "0.9.0", "dependencies": { - "@corbits/react-ui": "0.4.0", + "@corbits/react-ui": "0.5.0", "@intx/agent": "workspace:*", "@intx/workflow": "workspace:*", }, @@ -748,7 +748,7 @@ "@corbits/openai-responses": ["@corbits/openai-responses@0.2.3", "", { "dependencies": { "arktype": "2.2.3" }, "peerDependencies": { "@intx/inference": "^0.5.0", "@intx/types": "^0.5.0" } }, "sha512-9msL1hy3jINpJsdbv2+EZsjVvKIZ8lSO7oJcwKSyphog87U+fePhQtsBq/HNJbKY+zQeHYoaL2MbuYGo/aMIfA=="], - "@corbits/react-ui": ["@corbits/react-ui@0.4.0", "", { "dependencies": { "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "tailwind-merge": "^3.3.1" }, "peerDependencies": { "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-tooltip": "^1.2.8", "lucide-react": "^0.545.0 || ^1.0.0", "react": "^18.2.0 || ^19.0.0", "react-dom": "^18.2.0 || ^19.0.0", "sonner": "^2.0.7" }, "optionalPeers": ["@radix-ui/react-dialog", "@radix-ui/react-dropdown-menu", "@radix-ui/react-tooltip", "sonner"] }, "sha512-Iu8GMhSl/YjxDUvpJXqolxUzki1iR06SAFqBRcHtqkG+hwTJaeXXqXHw7/BlSPN+EgT2DAEGzc39FWG+xTM/NA=="], + "@corbits/react-ui": ["@corbits/react-ui@0.5.0", "", { "dependencies": { "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "tailwind-merge": "^3.3.1" }, "peerDependencies": { "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-tooltip": "^1.2.8", "lucide-react": "^0.545.0 || ^1.0.0", "react": "^18.2.0 || ^19.0.0", "react-dom": "^18.2.0 || ^19.0.0", "sonner": "^2.0.7" }, "optionalPeers": ["@radix-ui/react-dialog", "@radix-ui/react-dropdown-menu", "@radix-ui/react-tooltip", "sonner"] }, "sha512-tFTkT7sqYuVavKOVEyP9CrDbXomuOWY/AX1oFjLgsgFc/DdUAMcf6cRMHILdfRI/6HV3W+82hCX+efKlD1JD8g=="], "@corbits/xai-provider": ["@corbits/xai-provider@0.1.6", "", { "dependencies": { "arktype": "^2.2.3" }, "peerDependencies": { "@corbits/oauth-core": "^0.3.4", "@corbits/openai-responses": "^0.2.3", "@intx/inference": "^0.5.0", "@intx/types": "^0.5.0" } }, "sha512-tXWyloKzGicQZV9M/u/XCvVHHEqWkeKCBmc15PxJ9MyG3j5xnzKyagMCuvv81r/CaEG/7yeFcjDOHdJHljzwSw=="], diff --git a/scripts/react-ui-api.ts b/scripts/react-ui-api.ts index f6994d8b..10ae672c 100644 --- a/scripts/react-ui-api.ts +++ b/scripts/react-ui-api.ts @@ -50,6 +50,7 @@ const groups = { controls: { title: "buttons, inputs, filters, dialogs, menus and toasts", modules: [ + "action-bar", "bulk-action-bar", "button", "checkbox", @@ -93,6 +94,7 @@ const groups = { "rich-empty-state", "shimmer-text", "skeleton", + "sort-header-button", "sortable-table", "sparkline", "stat-grid", diff --git a/workflows/coder/package.json b/workflows/coder/package.json index a1621d3d..55dec889 100644 --- a/workflows/coder/package.json +++ b/workflows/coder/package.json @@ -13,7 +13,7 @@ "./assets": "./src/assets.ts" }, "dependencies": { - "@corbits/react-ui": "0.4.0", + "@corbits/react-ui": "0.5.0", "@intx/agent": "workspace:*", "@intx/workflow": "workspace:*" } diff --git a/workflows/coder/starter/bun.lock b/workflows/coder/starter/bun.lock index 399345a0..57664094 100644 --- a/workflows/coder/starter/bun.lock +++ b/workflows/coder/starter/bun.lock @@ -13,7 +13,7 @@ "name": "@app/client", "dependencies": { "@app/shared": "workspace:*", - "@corbits/react-ui": "0.4.0", + "@corbits/react-ui": "0.5.0", "@radix-ui/react-slot": "1.5.0", "@tanstack/react-query": "5.105.0", "lucide-react": "1.64.0", @@ -55,7 +55,7 @@ "@app/shared": ["@app/shared@workspace:packages/shared"], - "@corbits/react-ui": ["@corbits/react-ui@0.4.0", "", { "dependencies": { "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "tailwind-merge": "^3.3.1" }, "peerDependencies": { "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-tooltip": "^1.2.8", "lucide-react": "^0.545.0 || ^1.0.0", "react": "^18.2.0 || ^19.0.0", "react-dom": "^18.2.0 || ^19.0.0", "sonner": "^2.0.7" }, "optionalPeers": ["@radix-ui/react-dialog", "@radix-ui/react-dropdown-menu", "@radix-ui/react-tooltip", "sonner"] }, "sha512-Iu8GMhSl/YjxDUvpJXqolxUzki1iR06SAFqBRcHtqkG+hwTJaeXXqXHw7/BlSPN+EgT2DAEGzc39FWG+xTM/NA=="], + "@corbits/react-ui": ["@corbits/react-ui@0.5.0", "", { "dependencies": { "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "tailwind-merge": "^3.3.1" }, "peerDependencies": { "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-tooltip": "^1.2.8", "lucide-react": "^0.545.0 || ^1.0.0", "react": "^18.2.0 || ^19.0.0", "react-dom": "^18.2.0 || ^19.0.0", "sonner": "^2.0.7" }, "optionalPeers": ["@radix-ui/react-dialog", "@radix-ui/react-dropdown-menu", "@radix-ui/react-tooltip", "sonner"] }, "sha512-tFTkT7sqYuVavKOVEyP9CrDbXomuOWY/AX1oFjLgsgFc/DdUAMcf6cRMHILdfRI/6HV3W+82hCX+efKlD1JD8g=="], "@hono/zod-validator": ["@hono/zod-validator@0.9.1", "", { "peerDependencies": { "hono": ">=4.11.2", "zod": "^3.25.0 || ^4.0.0" } }, "sha512-iiv6w0qrIc0arfvCtUqBWsvl4fXjzaTcQcCJTTtCnkawF9HHGE+KjEl0ox3gQJ6rKZEgE3mLExlQCF72M+mNuw=="], diff --git a/workflows/coder/starter/client/package.json b/workflows/coder/starter/client/package.json index 1bf0cebd..bad9e65a 100644 --- a/workflows/coder/starter/client/package.json +++ b/workflows/coder/starter/client/package.json @@ -9,7 +9,7 @@ }, "dependencies": { "@app/shared": "workspace:*", - "@corbits/react-ui": "0.4.0", + "@corbits/react-ui": "0.5.0", "@radix-ui/react-slot": "1.5.0", "@tanstack/react-query": "5.105.0", "lucide-react": "1.64.0", diff --git a/workflows/designer/skills/react-ui/SKILL.md b/workflows/designer/skills/react-ui/SKILL.md index 544e2da3..bb12053d 100644 --- a/workflows/designer/skills/react-ui/SKILL.md +++ b/workflows/designer/skills/react-ui/SKILL.md @@ -3,9 +3,9 @@ name: react-ui description: Use before hand-writing any UI - which @corbits/react-ui component to use for app shell, pages, forms, tables, stats, charts, status, empty and loading states; install, theme tokens, dark mode and extra packages. --- -# @corbits/react-ui (0.4.0) +# @corbits/react-ui (0.5.0) -The client starter pins `@corbits/react-ui` 0.4.0. Components take props and +The client starter pins `@corbits/react-ui` 0.5.0. Components take props and render markup; data comes from the app's queries. Styling is Tailwind v4 classes backed by theme tokens, so everything inherits light and dark mode and the same spacing, radius and type. diff --git a/workflows/designer/skills/react-ui/reference/api-agent.md b/workflows/designer/skills/react-ui/reference/api-agent.md index e25d470a..22615a31 100644 --- a/workflows/designer/skills/react-ui/reference/api-agent.md +++ b/workflows/designer/skills/react-ui/reference/api-agent.md @@ -1,6 +1,6 @@ - + -# react-ui: conversation, agent runs, media and artifacts (0.4.0) +# react-ui: conversation, agent runs, media and artifacts (0.5.0) Props per exported component, from the installed declarations. `?` marks optional. `+native` means the component also accepts the native props of the element it renders (`className`, `onClick`, ...). Import from the package root unless SKILL.md lists the module as a subpath. diff --git a/workflows/designer/skills/react-ui/reference/api-controls.md b/workflows/designer/skills/react-ui/reference/api-controls.md index 9e2ffce7..a218c505 100644 --- a/workflows/designer/skills/react-ui/reference/api-controls.md +++ b/workflows/designer/skills/react-ui/reference/api-controls.md @@ -1,9 +1,25 @@ - + -# react-ui: buttons, inputs, filters, dialogs, menus and toasts (0.4.0) +# react-ui: buttons, inputs, filters, dialogs, menus and toasts (0.5.0) Props per exported component, from the installed declarations. `?` marks optional. `+native` means the component also accepts the native props of the element it renders (`className`, `onClick`, ...). Import from the package root unless SKILL.md lists the module as a subpath. +## ui/action-bar + +### ActionBar — One bar of quiet controls for a view: groups of icon or text buttons with a rule between them, toggles, menus, status notes and a sideways-scrolling strip. +label: string — The toolbar's accessible name. +groups: readonly ActionBarGroup[] — Drawn in order with a rule between; empty groups are skipped. +placement?: "inline" | "floating" — `floating` pins the bar to the bottom centre of the nearest positioned ancestor and lets it collapse to a small handle; `inline` sticks to the foot of its scroll container. +collapsed?: boolean +defaultCollapsed?: boolean +onCollapsedChange?: ((collapsed: boolean) => void) +popover?: ReactNode — A panel shown just above the bar, such as one an action opens. +rootRef?: Ref — The element around the bar and its popover, so a press on either can count as inside. +barRef?: Ref — The bar itself, or its handle while collapsed, for measuring the space it covers. +collapseLabel?: string +expandLabel?: string +className?: string + ## ui/bulk-action-bar ### BulkActionBar — The floating pill that appears once a list has a selection: fixed to the bottom of the viewport (or the nearest ancestor that establishes its own containing block — a `transform`, `filter`, or similar CSS property on an ancestor changes what `fixed` positions against), riding in with a small rise so it reads as newly arrived rather than always having been there. diff --git a/workflows/designer/skills/react-ui/reference/api-data-display.md b/workflows/designer/skills/react-ui/reference/api-data-display.md index 7a251315..0f8330aa 100644 --- a/workflows/designer/skills/react-ui/reference/api-data-display.md +++ b/workflows/designer/skills/react-ui/reference/api-data-display.md @@ -1,6 +1,6 @@ - + -# react-ui: tables, stats, charts, status, avatars, empty and loading states (0.4.0) +# react-ui: tables, stats, charts, status, avatars, empty and loading states (0.5.0) Props per exported component, from the installed declarations. `?` marks optional. `+native` means the component also accepts the native props of the element it renders (`className`, `onClick`, ...). Import from the package root unless SKILL.md lists the module as a subpath. @@ -84,8 +84,18 @@ className?: string ## ui/csv-table ### CsvTable — CSV text, rendered as a table when that is honest and as raw text when it is not. -text: string +text?: string +sheets?: readonly CsvTableSheet[] — Several sheets of one workbook, switched by tabs under the grid. caption?: string +interactive?: boolean — A compact spreadsheet grid that sorts, selects and copies, and applies the host's `query` and `filters`. +query?: string — The search query. +filters?: Readonly> +sort?: CsvSort | null +onSortChange?: ((sort: CsvSort | null) => void) +sheet?: number — The open sheet's index in `sheets`. +onSheetChange?: ((sheet: number) => void) +labels?: Partial +onSelectionChange?: ((selection: CsvSelection | null) => void) ## ui/empty-state @@ -158,6 +168,11 @@ className?: string ### Skeleton +native — A placeholder for content that has not arrived. +## ui/sort-header-button + +### SortHeaderButton +native — The control inside a sortable column header. +direction: SortDirection | null + ## ui/sortable-table ### SortableTable — A table you can sort by clicking a header. diff --git a/workflows/designer/skills/react-ui/reference/api-layout.md b/workflows/designer/skills/react-ui/reference/api-layout.md index b89dac9f..e4bffdad 100644 --- a/workflows/designer/skills/react-ui/reference/api-layout.md +++ b/workflows/designer/skills/react-ui/reference/api-layout.md @@ -1,6 +1,6 @@ - + -# react-ui: app shell and page layout (0.4.0) +# react-ui: app shell and page layout (0.5.0) Props per exported component, from the installed declarations. `?` marks optional. `+native` means the component also accepts the native props of the element it renders (`className`, `onClick`, ...). Import from the package root unless SKILL.md lists the module as a subpath. diff --git a/workflows/designer/skills/react-ui/reference/controls.md b/workflows/designer/skills/react-ui/reference/controls.md index 4803e4a0..5dadc445 100644 --- a/workflows/designer/skills/react-ui/reference/controls.md +++ b/workflows/designer/skills/react-ui/reference/controls.md @@ -1,6 +1,6 @@ # react-ui: controls -Source: @corbits/react-ui 0.4.0 npm package (README.md and dist/ui/*.d.ts), the version pinned in workflows/coder/starter/client/package.json +Source: @corbits/react-ui 0.5.0 npm package (README.md and dist/ui/*.d.ts), the version pinned in workflows/coder/starter/client/package.json Fetched: 2026-10-29 --- diff --git a/workflows/designer/skills/react-ui/reference/data-display.md b/workflows/designer/skills/react-ui/reference/data-display.md index a72d4bcb..03fca570 100644 --- a/workflows/designer/skills/react-ui/reference/data-display.md +++ b/workflows/designer/skills/react-ui/reference/data-display.md @@ -1,6 +1,6 @@ # react-ui: data display, empty and loading states -Source: @corbits/react-ui 0.4.0 npm package (README.md and dist/ui/*.d.ts), the version pinned in workflows/coder/starter/client/package.json +Source: @corbits/react-ui 0.5.0 npm package (README.md and dist/ui/*.d.ts), the version pinned in workflows/coder/starter/client/package.json Fetched: 2026-10-29 --- diff --git a/workflows/designer/skills/react-ui/reference/layout.md b/workflows/designer/skills/react-ui/reference/layout.md index f10a51fd..016993d1 100644 --- a/workflows/designer/skills/react-ui/reference/layout.md +++ b/workflows/designer/skills/react-ui/reference/layout.md @@ -1,6 +1,6 @@ # react-ui: layout components -Source: @corbits/react-ui 0.4.0 npm package (README.md and dist/ui/*.d.ts), the version pinned in workflows/coder/starter/client/package.json +Source: @corbits/react-ui 0.5.0 npm package (README.md and dist/ui/*.d.ts), the version pinned in workflows/coder/starter/client/package.json Fetched: 2026-10-29 --- diff --git a/workflows/designer/skills/react-ui/reference/theming.md b/workflows/designer/skills/react-ui/reference/theming.md index 8cbfa9bc..3bfa16d3 100644 --- a/workflows/designer/skills/react-ui/reference/theming.md +++ b/workflows/designer/skills/react-ui/reference/theming.md @@ -1,6 +1,6 @@ # react-ui: install, theme and tokens -Source: @corbits/react-ui 0.4.0 npm package (README.md, dist/theme.css, dist/ui/theme-provider.d.ts), the version pinned in workflows/coder/starter/client/package.json +Source: @corbits/react-ui 0.5.0 npm package (README.md, dist/theme.css, dist/ui/theme-provider.d.ts), the version pinned in workflows/coder/starter/client/package.json Fetched: 2026-10-29 ---