cortena-ui 1.3.1 → 1.4.0
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/README.md +74 -3
- package/dist/a2ui/catalogue-doc.d.ts +44 -0
- package/dist/a2ui/catalogue-doc.js +169 -0
- package/dist/a2ui/catalogue-doc.js.map +1 -0
- package/dist/a2ui/catalogue.d.ts +44 -0
- package/dist/a2ui/catalogue.js +942 -0
- package/dist/a2ui/catalogue.js.map +1 -0
- package/dist/a2ui/index.d.ts +7 -0
- package/dist/a2ui/message.d.ts +232 -0
- package/dist/a2ui/message.js +365 -0
- package/dist/a2ui/message.js.map +1 -0
- package/dist/a2ui/renderer.d.ts +46 -0
- package/dist/a2ui/renderer.js +252 -0
- package/dist/a2ui/renderer.js.map +1 -0
- package/dist/a2ui/views.d.ts +80 -0
- package/dist/a2ui/views.js +596 -0
- package/dist/a2ui/views.js.map +1 -0
- package/dist/a2ui.d.ts +8 -0
- package/dist/a2ui.js +7 -0
- package/dist/chart.d.ts +9 -0
- package/dist/chart.js +9 -0
- package/dist/components/accordion.d.ts +22 -0
- package/dist/components/accordion.js +63 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/alert.d.ts +15 -0
- package/dist/components/alert.js +64 -0
- package/dist/components/alert.js.map +1 -0
- package/dist/components/avatar.d.ts +18 -0
- package/dist/components/avatar.js +40 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.d.ts +12 -0
- package/dist/components/badge.js +47 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/breadcrumb.d.ts +71 -0
- package/dist/components/breadcrumb.js +123 -0
- package/dist/components/breadcrumb.js.map +1 -0
- package/dist/components/button-link.d.ts +28 -0
- package/dist/components/button-link.js +24 -0
- package/dist/components/button-link.js.map +1 -0
- package/dist/components/button.d.ts +24 -0
- package/dist/components/button.js +65 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/calendar.d.ts +28 -0
- package/dist/components/calendar.js +123 -0
- package/dist/components/calendar.js.map +1 -0
- package/dist/components/card.d.ts +32 -0
- package/dist/components/card.js +57 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/chart/chart.d.ts +71 -0
- package/dist/components/chart/chart.js +167 -0
- package/dist/components/chart/chart.js.map +1 -0
- package/dist/components/chart/container.d.ts +88 -0
- package/dist/components/chart/container.js +189 -0
- package/dist/components/chart/container.js.map +1 -0
- package/dist/components/chart/data.js +128 -0
- package/dist/components/chart/data.js.map +1 -0
- package/dist/components/chart/index.d.ts +9 -0
- package/dist/components/chart/index.js +10 -0
- package/dist/components/chart/nivo-charts.js +225 -0
- package/dist/components/chart/nivo-charts.js.map +1 -0
- package/dist/components/chart/nivo-lazy.js +50 -0
- package/dist/components/chart/nivo-lazy.js.map +1 -0
- package/dist/components/chart/nivo-theme.d.ts +156 -0
- package/dist/components/chart/nivo-theme.js +161 -0
- package/dist/components/chart/nivo-theme.js.map +1 -0
- package/dist/components/chart/recharts-charts.js +276 -0
- package/dist/components/chart/recharts-charts.js.map +1 -0
- package/dist/components/chart/recharts-lazy.js +58 -0
- package/dist/components/chart/recharts-lazy.js.map +1 -0
- package/dist/components/chart/recharts-parts.d.ts +10 -0
- package/dist/components/chart/recharts-parts.js +25 -0
- package/dist/components/chart/recharts-parts.js.map +1 -0
- package/dist/components/chart/tokens.d.ts +62 -0
- package/dist/components/chart/tokens.js +192 -0
- package/dist/components/chart/tokens.js.map +1 -0
- package/dist/components/chart/types.d.ts +114 -0
- package/dist/components/chart/types.js +27 -0
- package/dist/components/chart/types.js.map +1 -0
- package/dist/components/checkbox.d.ts +20 -0
- package/dist/components/checkbox.js +24 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/chip.d.ts +17 -0
- package/dist/components/chip.js +47 -0
- package/dist/components/chip.js.map +1 -0
- package/dist/components/combobox.d.ts +76 -0
- package/dist/components/combobox.js +201 -0
- package/dist/components/combobox.js.map +1 -0
- package/dist/components/command.d.ts +50 -0
- package/dist/components/command.js +117 -0
- package/dist/components/command.js.map +1 -0
- package/dist/components/data-table/data-table.d.ts +65 -0
- package/dist/components/data-table/data-table.js +588 -0
- package/dist/components/data-table/data-table.js.map +1 -0
- package/dist/components/data-table/export.d.ts +23 -0
- package/dist/components/data-table/export.js +95 -0
- package/dist/components/data-table/export.js.map +1 -0
- package/dist/components/data-table/features.d.ts +66 -0
- package/dist/components/data-table/features.js +103 -0
- package/dist/components/data-table/features.js.map +1 -0
- package/dist/components/data-table/index.d.ts +8 -0
- package/dist/components/data-table/parts.d.ts +79 -0
- package/dist/components/data-table/parts.js +400 -0
- package/dist/components/data-table/parts.js.map +1 -0
- package/dist/components/data-table/system-columns.js +84 -0
- package/dist/components/data-table/system-columns.js.map +1 -0
- package/dist/components/data-table/types.d.ts +172 -0
- package/dist/components/data-table/use-data-table.d.ts +19 -0
- package/dist/components/data-table/use-data-table.js +171 -0
- package/dist/components/data-table/use-data-table.js.map +1 -0
- package/dist/components/data-table/use-server-source.js +200 -0
- package/dist/components/data-table/use-server-source.js.map +1 -0
- package/dist/components/date-field.d.ts +54 -0
- package/dist/components/date-field.js +235 -0
- package/dist/components/date-field.js.map +1 -0
- package/dist/components/date-picker.d.ts +42 -0
- package/dist/components/date-picker.js +125 -0
- package/dist/components/date-picker.js.map +1 -0
- package/dist/components/dialog.d.ts +36 -0
- package/dist/components/dialog.js +97 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/dropdown-menu.d.ts +54 -0
- package/dist/components/dropdown-menu.js +191 -0
- package/dist/components/dropdown-menu.js.map +1 -0
- package/dist/components/dropzone.d.ts +48 -0
- package/dist/components/dropzone.js +185 -0
- package/dist/components/dropzone.js.map +1 -0
- package/dist/components/empty-state.d.ts +22 -0
- package/dist/components/empty-state.js +46 -0
- package/dist/components/empty-state.js.map +1 -0
- package/dist/components/error-banner.d.ts +17 -0
- package/dist/components/error-banner.js +52 -0
- package/dist/components/error-banner.js.map +1 -0
- package/dist/components/field.d.ts +64 -0
- package/dist/components/field.js +133 -0
- package/dist/components/field.js.map +1 -0
- package/dist/components/form.d.ts +37 -0
- package/dist/components/form.js +103 -0
- package/dist/components/form.js.map +1 -0
- package/dist/components/input.d.ts +17 -0
- package/dist/components/input.js +26 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/kbd.d.ts +11 -0
- package/dist/components/kbd.js +20 -0
- package/dist/components/kbd.js.map +1 -0
- package/dist/components/label.d.ts +14 -0
- package/dist/components/label.js +28 -0
- package/dist/components/label.js.map +1 -0
- package/dist/components/loading-skeleton.d.ts +22 -0
- package/dist/components/loading-skeleton.js +123 -0
- package/dist/components/loading-skeleton.js.map +1 -0
- package/dist/components/markdown.d.ts +44 -0
- package/dist/components/markdown.js +231 -0
- package/dist/components/markdown.js.map +1 -0
- package/dist/components/page-header.d.ts +26 -0
- package/dist/components/page-header.js +53 -0
- package/dist/components/page-header.js.map +1 -0
- package/dist/components/popover.d.ts +29 -0
- package/dist/components/popover.js +74 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/progress.d.ts +22 -0
- package/dist/components/progress.js +49 -0
- package/dist/components/progress.js.map +1 -0
- package/dist/components/radio-group.d.ts +20 -0
- package/dist/components/radio-group.js +29 -0
- package/dist/components/radio-group.js.map +1 -0
- package/dist/components/scroll-area.d.ts +25 -0
- package/dist/components/scroll-area.js +39 -0
- package/dist/components/scroll-area.js.map +1 -0
- package/dist/components/section-card.d.ts +29 -0
- package/dist/components/section-card.js +55 -0
- package/dist/components/section-card.js.map +1 -0
- package/dist/components/segmented.d.ts +27 -0
- package/dist/components/segmented.js +32 -0
- package/dist/components/segmented.js.map +1 -0
- package/dist/components/select.d.ts +62 -0
- package/dist/components/select.js +97 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/separator.d.ts +19 -0
- package/dist/components/separator.js +23 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/sheet.d.ts +35 -0
- package/dist/components/sheet.js +131 -0
- package/dist/components/sheet.js.map +1 -0
- package/dist/components/skeleton.d.ts +12 -0
- package/dist/components/skeleton.js +22 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/sortable-list.d.ts +67 -0
- package/dist/components/sortable-list.js +206 -0
- package/dist/components/sortable-list.js.map +1 -0
- package/dist/components/spinner.d.ts +29 -0
- package/dist/components/spinner.js +34 -0
- package/dist/components/spinner.js.map +1 -0
- package/dist/components/status-dot.d.ts +26 -0
- package/dist/components/status-dot.js +47 -0
- package/dist/components/status-dot.js.map +1 -0
- package/dist/components/switch.d.ts +21 -0
- package/dist/components/switch.js +21 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/tabs.d.ts +24 -0
- package/dist/components/tabs.js +60 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/textarea.d.ts +19 -0
- package/dist/components/textarea.js +47 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/toast.d.ts +47 -0
- package/dist/components/toast.js +106 -0
- package/dist/components/toast.js.map +1 -0
- package/dist/components/toolbar.d.ts +19 -0
- package/dist/components/toolbar.js +45 -0
- package/dist/components/toolbar.js.map +1 -0
- package/dist/components/tooltip.d.ts +28 -0
- package/dist/components/tooltip.js +59 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/core.d.ts +44 -0
- package/dist/core.js +44 -0
- package/dist/data-table.d.ts +9 -0
- package/dist/data-table.js +7 -0
- package/dist/form.d.ts +7 -0
- package/dist/form.js +7 -0
- package/dist/hooks/use-cortena-theme.d.ts +98 -0
- package/dist/hooks/use-cortena-theme.js +145 -0
- package/dist/hooks/use-cortena-theme.js.map +1 -0
- package/dist/index.d.ts +75 -2681
- package/dist/index.js +66 -8670
- package/dist/lib/cn.d.ts +10 -0
- package/dist/lib/cn.js +15 -0
- package/dist/lib/cn.js.map +1 -0
- package/dist/lib/render.d.ts +23 -0
- package/dist/lib/render.js +20 -0
- package/dist/lib/render.js.map +1 -0
- package/dist/lib/shakeable.js +39 -0
- package/dist/lib/shakeable.js.map +1 -0
- package/dist/markdown.d.ts +3 -0
- package/dist/markdown.js +3 -0
- package/dist/sortable-list.d.ts +3 -0
- package/dist/sortable-list.js +3 -0
- package/package.json +34 -4
- package/src/a2ui/catalogue.ts +131 -103
- package/src/a2ui/views.tsx +5 -2
- package/src/components/alert.tsx +1 -1
- package/src/components/badge.tsx +1 -1
- package/src/components/button.tsx +1 -1
- package/src/components/chart/chart.tsx +48 -34
- package/src/components/chart/container.tsx +24 -39
- package/src/components/chart/index.tsx +4 -2
- package/src/components/chart/nivo-lazy.tsx +52 -0
- package/src/components/chart/recharts-charts.tsx +98 -3
- package/src/components/chart/recharts-lazy.tsx +72 -0
- package/src/components/chart/recharts-parts.tsx +34 -0
- package/src/components/chart/tokens.ts +1 -1
- package/src/components/chart/types.ts +14 -0
- package/src/components/chip.tsx +1 -1
- package/src/components/combobox.tsx +2 -2
- package/src/components/data-table/features.ts +77 -45
- package/src/components/data-table/parts.tsx +15 -0
- package/src/components/data-table/use-data-table.ts +7 -2
- package/src/components/date-field.tsx +1 -1
- package/src/components/error-banner.tsx +1 -1
- package/src/components/field.tsx +2 -2
- package/src/components/form.tsx +2 -2
- package/src/components/input.tsx +1 -1
- package/src/components/label.tsx +1 -1
- package/src/components/markdown.tsx +5 -4
- package/src/components/sheet.tsx +2 -2
- package/src/components/sortable-list.tsx +2 -2
- package/src/components/textarea.tsx +1 -1
- package/src/components/toast.tsx +1 -1
- package/src/entries/a2ui.ts +11 -0
- package/src/entries/chart.ts +10 -0
- package/src/entries/core.ts +91 -0
- package/src/entries/data-table.ts +9 -0
- package/src/entries/form.ts +24 -0
- package/src/entries/markdown.ts +9 -0
- package/src/entries/sortable-list.ts +13 -0
- package/src/index.ts +32 -98
- package/src/lib/shakeable.ts +33 -0
- package/dist/index.js.map +0 -1
package/dist/lib/cn.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { ClassValue } from "clsx";
|
|
3
|
+
//#region src/lib/cn.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Merge class names the shadcn way: clsx for conditionals, tailwind-merge so a
|
|
6
|
+
* consumer's `className` wins over a component's default for the same utility.
|
|
7
|
+
*/
|
|
8
|
+
export declare function cn(...inputs: ClassValue[]): string;
|
|
9
|
+
//#endregion
|
|
10
|
+
//# sourceMappingURL=cn.d.ts.map
|
package/dist/lib/cn.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { clsx } from "clsx";
|
|
3
|
+
import { twMerge } from "tailwind-merge";
|
|
4
|
+
//#region src/lib/cn.ts
|
|
5
|
+
/**
|
|
6
|
+
* Merge class names the shadcn way: clsx for conditionals, tailwind-merge so a
|
|
7
|
+
* consumer's `className` wins over a component's default for the same utility.
|
|
8
|
+
*/
|
|
9
|
+
function cn(...inputs) {
|
|
10
|
+
return twMerge(clsx(inputs));
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
export { cn };
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=cn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cn.js","names":[],"sources":["../../src/lib/cn.ts"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merge class names the shadcn way: clsx for conditionals, tailwind-merge so a\n * consumer's `className` wins over a component's default for the same utility.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n"],"mappings":";;;;;;;;AAOA,SAAgB,GAAG,GAAG,QAA8B;CAClD,OAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
//#region src/lib/render.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* The `render` prop for the components that are plain markup rather than Base
|
|
6
|
+
* UI primitives (Card, SectionCard, ButtonLink, BreadcrumbLink).
|
|
7
|
+
*
|
|
8
|
+
* Base UI parts take their own `render` and need nothing from here. The rest
|
|
9
|
+
* are a `<div>` or an `<a>` this package writes itself, and a consumer
|
|
10
|
+
* sometimes needs a different element under the same styling: a Card that is
|
|
11
|
+
* the page's `<aside>` landmark, or a link that is the router's `<Link>`.
|
|
12
|
+
* Passing an element rather than a component keeps the call site readable and
|
|
13
|
+
* lets the caller set props on it (`render={<Link to="/x" />}`).
|
|
14
|
+
*
|
|
15
|
+
* `props` wins over the passed element's own props, so the `className` and
|
|
16
|
+
* handlers a component computed are not silently dropped, while the element's
|
|
17
|
+
* own props (`href`, `to`, `aria-labelledby`) come through untouched. What a
|
|
18
|
+
* component lets a *caller* override is decided by the order it builds `props`
|
|
19
|
+
* in, not here. Children are `children`, falling back to the element's.
|
|
20
|
+
*/
|
|
21
|
+
export type RenderProp = React.ReactElement<Record<string, unknown>>;
|
|
22
|
+
//#endregion
|
|
23
|
+
//# sourceMappingURL=render.d.ts.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
//#region src/lib/render.tsx
|
|
4
|
+
function renderWith(render, props, children, Fallback) {
|
|
5
|
+
if (!render) return /* @__PURE__ */ jsx(Fallback, {
|
|
6
|
+
...props,
|
|
7
|
+
children
|
|
8
|
+
});
|
|
9
|
+
const Element = render.type;
|
|
10
|
+
const given = render.props;
|
|
11
|
+
return /* @__PURE__ */ jsx(Element, {
|
|
12
|
+
...render.props,
|
|
13
|
+
...props,
|
|
14
|
+
children: children ?? given.children
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { renderWith };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","names":["Element"],"sources":["../../src/lib/render.tsx"],"sourcesContent":["import type * as React from \"react\";\n\n/**\n * The `render` prop for the components that are plain markup rather than Base\n * UI primitives (Card, SectionCard, ButtonLink, BreadcrumbLink).\n *\n * Base UI parts take their own `render` and need nothing from here. The rest\n * are a `<div>` or an `<a>` this package writes itself, and a consumer\n * sometimes needs a different element under the same styling: a Card that is\n * the page's `<aside>` landmark, or a link that is the router's `<Link>`.\n * Passing an element rather than a component keeps the call site readable and\n * lets the caller set props on it (`render={<Link to=\"/x\" />}`).\n *\n * `props` wins over the passed element's own props, so the `className` and\n * handlers a component computed are not silently dropped, while the element's\n * own props (`href`, `to`, `aria-labelledby`) come through untouched. What a\n * component lets a *caller* override is decided by the order it builds `props`\n * in, not here. Children are `children`, falling back to the element's.\n */\nexport type RenderProp = React.ReactElement<Record<string, unknown>>;\n\nexport function renderWith(\n render: RenderProp | undefined,\n props: Record<string, unknown>,\n children: React.ReactNode,\n Fallback: React.ElementType,\n): React.ReactElement {\n if (!render) {\n const Element = Fallback;\n return <Element {...props}>{children}</Element>;\n }\n const Element = render.type as React.ElementType;\n const given = render.props as { children?: React.ReactNode };\n return (\n <Element {...(render.props as Record<string, unknown>)} {...props}>\n {children ?? given.children}\n </Element>\n );\n}\n"],"mappings":";;;AAqBA,SAAgB,WACd,QACA,OACA,UACA,UACoB;CACpB,IAAI,CAAC,QAEH,OAAO,oBAACA,UAAD;EAAS,GAAI;EAAQ;CAAkB,CAAA;CAEhD,MAAM,UAAU,OAAO;CACvB,MAAM,QAAQ,OAAO;CACrB,OACE,oBAAC,SAAD;EAAS,GAAK,OAAO;EAAmC,GAAI;EACzD,UAAA,YAAY,MAAM;CACZ,CAAA;AAEb"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
//#region src/lib/shakeable.ts
|
|
3
|
+
/**
|
|
4
|
+
* Evaluates `build` immediately and returns its value.
|
|
5
|
+
*
|
|
6
|
+
* A pass-through with exactly one job: to let a consumer's bundler delete what
|
|
7
|
+
* it wraps.
|
|
8
|
+
*
|
|
9
|
+
* The package is one ESM module tree with no side effects, so a bundler is free
|
|
10
|
+
* to drop anything an app does not reach. It can only do that for statements it
|
|
11
|
+
* can prove are safe to skip, and a top-level call it cannot see inside —
|
|
12
|
+
* `tableFeatures({ … })`, a `z.enum(...).describe(...)` chain, `Object.freeze`
|
|
13
|
+
* over a spread — is never provably safe. The statement is kept, and with it
|
|
14
|
+
* every module it can reach. That is how `import { Button } from "cortena-ui"`
|
|
15
|
+
* came to pull recharts, nivo, exceljs, dnd-kit, react-markdown, cmdk and
|
|
16
|
+
* react-day-picker into an app that renders one button: 2,479 kB of it.
|
|
17
|
+
*
|
|
18
|
+
* Wrapped in a thunk the same work is no longer a top-level expression, and the
|
|
19
|
+
* `@__PURE__` annotation each call site carries tells the bundler the call may
|
|
20
|
+
* be dropped when its result is unused. Runtime behaviour is unchanged — the
|
|
21
|
+
* thunk runs on the line it is written — so nothing is deferred, lazy or
|
|
22
|
+
* asynchronous. Only the bundler sees a difference.
|
|
23
|
+
*
|
|
24
|
+
* Use it for a module-scope constant built by a call. Prefer a bare
|
|
25
|
+
* `/* @__PURE__ *\/` annotation where the call's arguments are literals
|
|
26
|
+
* (`cva(...)`, `cn(...)`, `React.createContext(...)`); the thunk is for the
|
|
27
|
+
* cases where the arguments themselves contain calls, because a bundler
|
|
28
|
+
* evaluates arguments even when the call around them is annotated pure.
|
|
29
|
+
*
|
|
30
|
+
* `test/bundle-probe.test.mjs` measures a real consumer bundle, which is what
|
|
31
|
+
* stops any of this being quietly undone.
|
|
32
|
+
*/
|
|
33
|
+
function shakeable(build) {
|
|
34
|
+
return build();
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { shakeable };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=shakeable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shakeable.js","names":[],"sources":["../../src/lib/shakeable.ts"],"sourcesContent":["/**\n * Evaluates `build` immediately and returns its value.\n *\n * A pass-through with exactly one job: to let a consumer's bundler delete what\n * it wraps.\n *\n * The package is one ESM module tree with no side effects, so a bundler is free\n * to drop anything an app does not reach. It can only do that for statements it\n * can prove are safe to skip, and a top-level call it cannot see inside —\n * `tableFeatures({ … })`, a `z.enum(...).describe(...)` chain, `Object.freeze`\n * over a spread — is never provably safe. The statement is kept, and with it\n * every module it can reach. That is how `import { Button } from \"cortena-ui\"`\n * came to pull recharts, nivo, exceljs, dnd-kit, react-markdown, cmdk and\n * react-day-picker into an app that renders one button: 2,479 kB of it.\n *\n * Wrapped in a thunk the same work is no longer a top-level expression, and the\n * `@__PURE__` annotation each call site carries tells the bundler the call may\n * be dropped when its result is unused. Runtime behaviour is unchanged — the\n * thunk runs on the line it is written — so nothing is deferred, lazy or\n * asynchronous. Only the bundler sees a difference.\n *\n * Use it for a module-scope constant built by a call. Prefer a bare\n * `/* @__PURE__ *\\/` annotation where the call's arguments are literals\n * (`cva(...)`, `cn(...)`, `React.createContext(...)`); the thunk is for the\n * cases where the arguments themselves contain calls, because a bundler\n * evaluates arguments even when the call around them is annotated pure.\n *\n * `test/bundle-probe.test.mjs` measures a real consumer bundle, which is what\n * stops any of this being quietly undone.\n */\nexport function shakeable<T>(build: () => T): T {\n return build();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,SAAgB,UAAa,OAAmB;CAC9C,OAAO,MAAM;AACf"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { CodeRendererProps, Markdown, MarkdownComponents as Components, MarkdownProps, markdownSanitizeSchema } from "./components/markdown.js";
|
|
3
|
+
export { type CodeRendererProps, Markdown, type Components as MarkdownComponents, type MarkdownProps, markdownSanitizeSchema };
|
package/dist/markdown.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { SortableHandle, SortableHandleProps, SortableList, SortableListProps, SortableRenderState, SortableReorderDetails, arrayMove } from "./components/sortable-list.js";
|
|
3
|
+
export { SortableHandle, type SortableHandleProps, SortableList, type SortableListProps, type SortableRenderState, type SortableReorderDetails, arrayMove };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cortena-ui",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Cortena UI — the shared React component library for cortenaweb and every Cortena extension. shadcn over Base UI, styled entirely from cortena-design tokens.",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"repository": {
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
},
|
|
11
11
|
"type": "module",
|
|
12
12
|
"sideEffects": [
|
|
13
|
-
"
|
|
13
|
+
"**/*.css"
|
|
14
14
|
],
|
|
15
15
|
"engines": {
|
|
16
16
|
"node": ">=22"
|
|
@@ -25,6 +25,34 @@
|
|
|
25
25
|
"types": "./dist/index.d.ts",
|
|
26
26
|
"default": "./dist/index.js"
|
|
27
27
|
},
|
|
28
|
+
"./core": {
|
|
29
|
+
"types": "./dist/core.d.ts",
|
|
30
|
+
"default": "./dist/core.js"
|
|
31
|
+
},
|
|
32
|
+
"./form": {
|
|
33
|
+
"types": "./dist/form.d.ts",
|
|
34
|
+
"default": "./dist/form.js"
|
|
35
|
+
},
|
|
36
|
+
"./data-table": {
|
|
37
|
+
"types": "./dist/data-table.d.ts",
|
|
38
|
+
"default": "./dist/data-table.js"
|
|
39
|
+
},
|
|
40
|
+
"./chart": {
|
|
41
|
+
"types": "./dist/chart.d.ts",
|
|
42
|
+
"default": "./dist/chart.js"
|
|
43
|
+
},
|
|
44
|
+
"./markdown": {
|
|
45
|
+
"types": "./dist/markdown.d.ts",
|
|
46
|
+
"default": "./dist/markdown.js"
|
|
47
|
+
},
|
|
48
|
+
"./a2ui": {
|
|
49
|
+
"types": "./dist/a2ui.d.ts",
|
|
50
|
+
"default": "./dist/a2ui.js"
|
|
51
|
+
},
|
|
52
|
+
"./sortable-list": {
|
|
53
|
+
"types": "./dist/sortable-list.d.ts",
|
|
54
|
+
"default": "./dist/sortable-list.js"
|
|
55
|
+
},
|
|
28
56
|
"./styles.css": "./src/styles/index.css",
|
|
29
57
|
"./package.json": "./package.json"
|
|
30
58
|
},
|
|
@@ -32,11 +60,13 @@
|
|
|
32
60
|
"build": "tsdown",
|
|
33
61
|
"check": "tsc --noEmit",
|
|
34
62
|
"lint:design": "node ../../lint/cli.mjs --exempt chart-import src",
|
|
35
|
-
"test": "vitest run",
|
|
63
|
+
"test": "vitest run && vitest run --config vitest.bundle.config.ts",
|
|
36
64
|
"guide": "vite --config guide/vite.config.ts",
|
|
37
65
|
"guide:build": "vite build --config guide/vite.config.ts",
|
|
38
66
|
"a2ui:catalogue": "node scripts/a2ui-catalogue.mjs",
|
|
39
|
-
"prepack": "pnpm build"
|
|
67
|
+
"prepack": "pnpm build",
|
|
68
|
+
"test:bundle": "vitest run --config vitest.bundle.config.ts",
|
|
69
|
+
"bundle:probe": "node scripts/bundle-probe.mjs"
|
|
40
70
|
},
|
|
41
71
|
"peerDependencies": {
|
|
42
72
|
"@tanstack/react-query": "^5.0.0",
|
package/src/a2ui/catalogue.ts
CHANGED
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
27
|
import { z } from "zod";
|
|
28
|
+
import { shakeable } from "@/lib/shakeable";
|
|
28
29
|
import type { A2UIComponentSpec } from "./message";
|
|
29
30
|
import * as views from "./views";
|
|
30
31
|
import type { A2UIView } from "./views";
|
|
@@ -74,50 +75,66 @@ function entry<P>(definition: A2UICatalogueEntry<P>): A2UICatalogueEntry<never>
|
|
|
74
75
|
* bare `{ name, context }`, or just the name as a string; the renderer
|
|
75
76
|
* normalises all three to this before validation.
|
|
76
77
|
*/
|
|
77
|
-
const Action =
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
78
|
+
const Action = /* @__PURE__ */ shakeable(() =>
|
|
79
|
+
z
|
|
80
|
+
.object({
|
|
81
|
+
name: z.string().describe("Event name sent back to the agent."),
|
|
82
|
+
context: z
|
|
83
|
+
.record(z.string(), z.unknown())
|
|
84
|
+
.optional()
|
|
85
|
+
.describe("Extra values merged into the action payload."),
|
|
86
|
+
})
|
|
87
|
+
.describe("An action reported to the agent when the user interacts.")
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
const Option = /* @__PURE__ */ shakeable(() =>
|
|
91
|
+
z.object({
|
|
92
|
+
value: z.string().describe("Value written to the data model."),
|
|
93
|
+
label: z.string().optional().describe("Text shown to the user; defaults to the value."),
|
|
94
|
+
disabled: z.boolean().optional(),
|
|
84
95
|
})
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
const justification =
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
const gap = /* @__PURE__ */ shakeable(() =>
|
|
99
|
+
z
|
|
100
|
+
.union([z.literal(0), z.literal(1), z.literal(2), z.literal(3), z.literal(4), z.literal(6), z.literal(8)])
|
|
101
|
+
.describe("Spacing step between children.")
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
const padding = /* @__PURE__ */ shakeable(() =>
|
|
105
|
+
z
|
|
106
|
+
.union([z.literal(0), z.literal(1), z.literal(2), z.literal(3), z.literal(4), z.literal(6), z.literal(8)])
|
|
107
|
+
.describe("Inner padding step.")
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
const alignment = /* @__PURE__ */ shakeable(() =>
|
|
111
|
+
z
|
|
112
|
+
.enum(["start", "center", "end", "stretch", "baseline"])
|
|
113
|
+
.describe("Cross-axis alignment.")
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
const justification = /* @__PURE__ */ shakeable(() =>
|
|
117
|
+
z
|
|
118
|
+
.enum(["start", "center", "end", "between"])
|
|
119
|
+
.describe("Main-axis distribution.")
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
const fieldChrome = /* @__PURE__ */ shakeable(() => ({
|
|
110
123
|
label: z.string().optional().describe("Field label."),
|
|
111
124
|
description: z.string().optional().describe("Helper text under the control."),
|
|
112
125
|
error: z.string().optional().describe("Validation message; also marks the field invalid."),
|
|
113
126
|
disabled: z.boolean().optional(),
|
|
114
|
-
};
|
|
127
|
+
}));
|
|
115
128
|
|
|
116
|
-
const buttonVariant =
|
|
117
|
-
|
|
118
|
-
|
|
129
|
+
const buttonVariant = /* @__PURE__ */ shakeable(() =>
|
|
130
|
+
z
|
|
131
|
+
.enum(["primary", "secondary", "outline", "ghost", "soft", "destructive", "link"])
|
|
132
|
+
.describe("Visual weight.")
|
|
133
|
+
);
|
|
119
134
|
|
|
120
|
-
const buttonSize =
|
|
135
|
+
const buttonSize = /* @__PURE__ */ shakeable(() =>
|
|
136
|
+
z.enum(["sm", "md", "lg"]).describe("Control size.")
|
|
137
|
+
);
|
|
121
138
|
|
|
122
139
|
/**
|
|
123
140
|
* Root-relative means one slash and then a path. `//evil.example/x` is
|
|
@@ -135,40 +152,46 @@ const rootRelative = (value: string) =>
|
|
|
135
152
|
* friends never reach the DOM because they never pass validation, so the
|
|
136
153
|
* component gets an error card instead.
|
|
137
154
|
*/
|
|
138
|
-
const httpUrl =
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
155
|
+
const httpUrl = /* @__PURE__ */ shakeable(() =>
|
|
156
|
+
z
|
|
157
|
+
.string()
|
|
158
|
+
.refine(
|
|
159
|
+
(value) => /^https?:\/\//i.test(value) || rootRelative(value) || value.startsWith("#"),
|
|
160
|
+
"Must be an http(s), root-relative or fragment URL.",
|
|
161
|
+
)
|
|
162
|
+
.describe("Destination URL (http, https, root-relative or fragment).")
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
const imageUrl = /* @__PURE__ */ shakeable(() =>
|
|
166
|
+
z
|
|
167
|
+
.string()
|
|
168
|
+
.refine(
|
|
169
|
+
(value) => /^https?:\/\//i.test(value) || /^data:image\//i.test(value) || rootRelative(value),
|
|
170
|
+
"Must be an http(s), root-relative or data:image URL.",
|
|
171
|
+
)
|
|
172
|
+
.describe("Image URL (http, https, root-relative or data:image).")
|
|
173
|
+
);
|
|
153
174
|
|
|
154
175
|
/** Every chart type the Chart composite draws, Recharts and Nivo alike. */
|
|
155
|
-
const chartType =
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
176
|
+
const chartType = /* @__PURE__ */ shakeable(() =>
|
|
177
|
+
z
|
|
178
|
+
.enum([
|
|
179
|
+
"bar",
|
|
180
|
+
"line",
|
|
181
|
+
"area",
|
|
182
|
+
"pie",
|
|
183
|
+
"donut",
|
|
184
|
+
"scatter",
|
|
185
|
+
"scatterplot",
|
|
186
|
+
"radar",
|
|
187
|
+
"funnel",
|
|
188
|
+
"heatmap",
|
|
189
|
+
"calendar",
|
|
190
|
+
"treemap",
|
|
191
|
+
"sunburst",
|
|
192
|
+
])
|
|
193
|
+
.describe("Chart type; the package picks Recharts or Nivo for it.")
|
|
194
|
+
);
|
|
172
195
|
|
|
173
196
|
/**
|
|
174
197
|
* A table's rows, or a handle to them.
|
|
@@ -178,26 +201,29 @@ const chartType = z
|
|
|
178
201
|
* it through `resolveDataSource`, so search, sort and paging stay on the backend
|
|
179
202
|
* and a large result never travels through the model.
|
|
180
203
|
*/
|
|
181
|
-
const tableSource =
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
204
|
+
const tableSource = /* @__PURE__ */ shakeable(() =>
|
|
205
|
+
z
|
|
206
|
+
.union([
|
|
207
|
+
z.object({
|
|
208
|
+
kind: z.literal("client"),
|
|
209
|
+
rows: z.array(z.record(z.string(), z.unknown())).describe("The rows, inline."),
|
|
210
|
+
}),
|
|
211
|
+
z.object({
|
|
212
|
+
kind: z.literal("server"),
|
|
213
|
+
sourceId: z
|
|
214
|
+
.string()
|
|
215
|
+
.describe("Handle obtained from a tool; the host resolves it to a server source."),
|
|
216
|
+
}),
|
|
217
|
+
])
|
|
218
|
+
.describe("Where the table's rows come from.")
|
|
219
|
+
);
|
|
220
|
+
|
|
195
221
|
|
|
196
222
|
/* ------------------------------------------------------------------ */
|
|
197
223
|
/* The catalogue */
|
|
198
224
|
/* ------------------------------------------------------------------ */
|
|
199
225
|
|
|
200
|
-
const layout = {
|
|
226
|
+
const layout = /* @__PURE__ */ shakeable(() => ({
|
|
201
227
|
Column: entry<views.ColumnProps>({
|
|
202
228
|
name: "Column",
|
|
203
229
|
group: "layout",
|
|
@@ -304,9 +330,9 @@ const layout = {
|
|
|
304
330
|
example: { components: [{ id: "spacer", component: "Spacer", size: 4 }] },
|
|
305
331
|
view: views.SpacerView,
|
|
306
332
|
}),
|
|
307
|
-
};
|
|
333
|
+
}));
|
|
308
334
|
|
|
309
|
-
const text = {
|
|
335
|
+
const text = /* @__PURE__ */ shakeable(() => ({
|
|
310
336
|
Text: entry<views.TextProps>({
|
|
311
337
|
name: "Text",
|
|
312
338
|
group: "text",
|
|
@@ -356,9 +382,9 @@ const text = {
|
|
|
356
382
|
},
|
|
357
383
|
view: views.MarkdownView,
|
|
358
384
|
}),
|
|
359
|
-
};
|
|
385
|
+
}));
|
|
360
386
|
|
|
361
|
-
const input = {
|
|
387
|
+
const input = /* @__PURE__ */ shakeable(() => ({
|
|
362
388
|
TextField: entry<views.TextFieldProps>({
|
|
363
389
|
name: "TextField",
|
|
364
390
|
group: "input",
|
|
@@ -629,9 +655,9 @@ const input = {
|
|
|
629
655
|
},
|
|
630
656
|
view: views.ButtonLinkView,
|
|
631
657
|
}),
|
|
632
|
-
};
|
|
658
|
+
}));
|
|
633
659
|
|
|
634
|
-
const feedback = {
|
|
660
|
+
const feedback = /* @__PURE__ */ shakeable(() => ({
|
|
635
661
|
Badge: entry<views.BadgeViewProps>({
|
|
636
662
|
name: "Badge",
|
|
637
663
|
group: "feedback",
|
|
@@ -745,9 +771,9 @@ const feedback = {
|
|
|
745
771
|
},
|
|
746
772
|
view: views.EmptyStateView,
|
|
747
773
|
}),
|
|
748
|
-
};
|
|
774
|
+
}));
|
|
749
775
|
|
|
750
|
-
const data = {
|
|
776
|
+
const data = /* @__PURE__ */ shakeable(() => ({
|
|
751
777
|
DataTable: entry<views.DataTableViewProps>({
|
|
752
778
|
name: "DataTable",
|
|
753
779
|
group: "data",
|
|
@@ -844,9 +870,9 @@ const data = {
|
|
|
844
870
|
},
|
|
845
871
|
view: views.ChartView,
|
|
846
872
|
}),
|
|
847
|
-
};
|
|
873
|
+
}));
|
|
848
874
|
|
|
849
|
-
const other = {
|
|
875
|
+
const other = /* @__PURE__ */ shakeable(() => ({
|
|
850
876
|
Tabs: entry<views.TabsViewProps>({
|
|
851
877
|
name: "Tabs",
|
|
852
878
|
group: "layout",
|
|
@@ -932,7 +958,7 @@ const other = {
|
|
|
932
958
|
},
|
|
933
959
|
view: views.LinkView,
|
|
934
960
|
}),
|
|
935
|
-
};
|
|
961
|
+
}));
|
|
936
962
|
|
|
937
963
|
/**
|
|
938
964
|
* The catalogue an agent draws from, and the renderer's default.
|
|
@@ -941,14 +967,16 @@ const other = {
|
|
|
941
967
|
* with components the prompt does not describe: an agent can only usefully
|
|
942
968
|
* emit what `catalogue-doc.ts` told it about.
|
|
943
969
|
*/
|
|
944
|
-
export const defaultCatalogue: A2UICatalogue =
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
970
|
+
export const defaultCatalogue: A2UICatalogue = /* @__PURE__ */ shakeable(() =>
|
|
971
|
+
Object.freeze({
|
|
972
|
+
...layout,
|
|
973
|
+
...text,
|
|
974
|
+
...input,
|
|
975
|
+
...feedback,
|
|
976
|
+
...data,
|
|
977
|
+
...other,
|
|
978
|
+
}),
|
|
979
|
+
);
|
|
952
980
|
|
|
953
981
|
/** Catalogue id an agent may echo in `createSurface.catalogId`. */
|
|
954
982
|
export const A2UI_CATALOGUE_ID = "https://cortena.ai/a2ui/catalogues/cortena-ui/v1.json";
|
package/src/a2ui/views.tsx
CHANGED
|
@@ -25,8 +25,11 @@ import { Badge } from "@/components/badge";
|
|
|
25
25
|
import { Button } from "@/components/button";
|
|
26
26
|
import { ButtonLink } from "@/components/button-link";
|
|
27
27
|
import { Card, CardContent } from "@/components/card";
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
// Straight at the composite, not at `@/components/chart`: the chart module's
|
|
29
|
+
// index re-exports the raw Recharts primitives, and reaching the catalogue
|
|
30
|
+
// through it puts them in A2UI's static graph for nothing.
|
|
31
|
+
import { Chart } from "@/components/chart/chart";
|
|
32
|
+
import type { ChartDataFor, ChartType } from "@/components/chart/types";
|
|
30
33
|
import { Checkbox } from "@/components/checkbox";
|
|
31
34
|
import { DataTable } from "@/components/data-table";
|
|
32
35
|
import type { DataSource, DataTableColumnDef } from "@/components/data-table";
|
package/src/components/alert.tsx
CHANGED
|
@@ -15,7 +15,7 @@ import { cn } from "@/lib/cn";
|
|
|
15
15
|
const DESTRUCTIVE_ALERT =
|
|
16
16
|
"bg-[var(--ds-destructive-soft)] border-[var(--ds-destructive)]/35 [&_[data-slot=alert-icon]]:text-[color:var(--ds-destructive)]";
|
|
17
17
|
|
|
18
|
-
const alertVariants = cva(
|
|
18
|
+
const alertVariants = /* @__PURE__ */ cva(
|
|
19
19
|
[
|
|
20
20
|
"flex gap-3 rounded-[var(--ds-radius-md)] border px-3.5 py-3",
|
|
21
21
|
"text-[length:var(--ds-text-caption-lg)] leading-[var(--ds-text-caption-lg--line-height)]",
|
package/src/components/badge.tsx
CHANGED
|
@@ -12,7 +12,7 @@ import { cn } from "@/lib/cn";
|
|
|
12
12
|
*/
|
|
13
13
|
const DESTRUCTIVE_BADGE = "bg-[var(--ds-destructive-soft)] text-[color:var(--ds-destructive)]";
|
|
14
14
|
|
|
15
|
-
const badgeVariants = cva(
|
|
15
|
+
const badgeVariants = /* @__PURE__ */ cva(
|
|
16
16
|
[
|
|
17
17
|
"inline-flex items-center gap-1.5 px-1.5 py-0.5 whitespace-nowrap",
|
|
18
18
|
"rounded-[var(--ds-radius-sm)]",
|
|
@@ -15,7 +15,7 @@ import { cn } from "@/lib/cn";
|
|
|
15
15
|
* Radix users: `asChild` is gone. Pass `render={<a href=... />}` to change the
|
|
16
16
|
* rendered element, which is Base UI's equivalent.
|
|
17
17
|
*/
|
|
18
|
-
const buttonVariants = cva(
|
|
18
|
+
const buttonVariants = /* @__PURE__ */ cva(
|
|
19
19
|
[
|
|
20
20
|
"inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap",
|
|
21
21
|
"font-medium",
|