xiaohao-components 0.0.0-stage → 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Hubei Yunzhimeng Technology Co., Ltd.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,122 @@
1
- # Temporary Holding Version
1
+ # xiaohao-components
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ A2UI 卡片的 **Web 渲染层**:官方引擎(`@a2ui/react` / `@a2ui/web_core`,版本随包锁定)
4
+ + 20 个组件的 shadcn 映射 + 动作状态机。任何 React 18/19 的 Web 页面要显示 A2UI 卡,
5
+ 一律安装这个包,不再由各项目自己实现一份——「同一张 JSON 在所有宿主里长得一样、
6
+ 动作规则一样」。
7
+
8
+ 宿主无关:包内不 import 任何业务模块。网络上行(`onAction`)、通知(`onNotify`)、
9
+ 日志(`logger`)全部由 props 注入;**不传 `onAction` 即预览模式**——按钮可点、
10
+ 只回调 `onPreviewAction`,不进状态机、不写回、不冻结、不发请求。
11
+
12
+ > 维护本包请先读 [`docs/FILE-GUIDE.md`](docs/FILE-GUIDE.md):每个文件的职责、
13
+ > 改动影响面、构建与发版检查清单都在那里。
14
+
15
+ ## 安装
16
+
17
+ ```bash
18
+ npm install xiaohao-components@0.1.0
19
+ ```
20
+
21
+ 包发布在**官方 npm 源**(`https://registry.npmjs.org/`)。宿主默认源若是 npmmirror 等镜像,
22
+ 新版本可能要几小时才同步;急用可临时指定官方源安装:
23
+
24
+ ```bash
25
+ npm install xiaohao-components@0.1.0 --registry=https://registry.npmjs.org/
26
+ ```
27
+
28
+ 唯一 peer 是 `react` / `react-dom`(^18 或 ^19);`@a2ui/*` 已打进包内,宿主无需安装。
29
+
30
+ ## 使用
31
+
32
+ ```tsx
33
+ import { A2uiRenderer } from "xiaohao-components";
34
+ // 🔴 样式必须引(预编译 CSS,全部选择器带 .xa2ui-root 作用域,不会污染宿主)
35
+ import "xiaohao-components/styles.css";
36
+
37
+ <A2uiRenderer
38
+ card={{ cardInstanceId: "c1", tool: "mcp__plg_x__cloud__open_console",
39
+ json: cardJson, structuredContent: data }}
40
+ onAction={async (req) => await callCardTool(req)} // 缺省 = 预览模式
41
+ onNotify={({ level, message }) => toast[level](message)}
42
+ />
43
+ ```
44
+
45
+ 深浅主题:`theme="light" | "dark" | "auto"`(`auto` 跟随 `prefers-color-scheme`,
46
+ 根节点加 `.xa2ui-root` / `.xa2ui-root.xa2ui-dark`)。
47
+
48
+ ## 版本纪律
49
+
50
+ - 桌面端与协同端(以及今后所有宿主)**必须锁同一个精确版本**(不用 `^`);
51
+ - 升级引擎(`@a2ui/*`)只能通过发新版包完成,宿主没有升级入口;
52
+ - 包导出 `RENDERER_VERSION`,预览页角落显示、CI 可断言。
53
+
54
+ ## 样例夹具(同源)
55
+
56
+ ```ts
57
+ import { TRACK_SAMPLE_JSON, TRACK_SAMPLE_DATA } from "xiaohao-components/fixtures";
58
+ ```
59
+
60
+ 五张样例(展示卡 / 表单卡 / 三幕联动 / 轨迹卡 / 可编辑明细卡)以本文件为**唯一来源**:
61
+ `playground` 直接消费它,桌面 `/dev/a2ui` 在迁到本包后同样消费(迁移完成前那边还有一份
62
+ 副本,改样例要两边一起改)。
63
+
64
+ ## 基础组件的有意分叉
65
+
66
+ 包内 `src/ui/` 自带 11 个 shadcn 基础组件(button/input/textarea/label/separator/
67
+ card/checkbox/slider/tabs/dialog/select),**不再由 shadcn CLI 管理**、与宿主自己的
68
+ `src/ui/` 是有意分叉:卡片范围内的视觉以包内为准。**改这 11 个必须改包并升版本**,
69
+ 不能只改桌面。
70
+
71
+ ## `Table` / `EditableTable` 是项目扩展
72
+
73
+ 官方 basic catalog 的 18 个组件之外,本包带两个扩展:
74
+
75
+ | 组件 | 用途 | 状态 |
76
+ |------|------|------|
77
+ | `Table` | **只读**展示一行一条的记录(轨迹、明细清单) | 桌面 + 手机均可用 |
78
+ | `EditableTable` | **录入**明细,行数由用户加 / 删 | 桌面已实现,手机同批跟进中 |
79
+
80
+ 判据只有一条:**要不要用户填**。只展示用 `Table`,要录入用 `EditableTable`。
81
+
82
+ ### `Table`
83
+
84
+ `columns[{label,key,width?}]`、`rows` 写 `{"path":"/x"}`(裸字符串 `"/x"` 两端也认,
85
+ 但过不了协同端发布校验)、`key` 按 `.` 逐层取、`null` → 空串、其余 `String()`
86
+ (嵌套对象显示 `[object Object]`)。手机端按同一口径实现在
87
+ `xiaohao_mobile/lib/core/a2ui/catalog/table.dart`。
88
+
89
+ ### `EditableTable`
90
+
91
+ ```json
92
+ { "id": "goodsTable", "component": "EditableTable",
93
+ "columns": [
94
+ { "label": "货物名称", "key": "name" },
95
+ { "label": "重量(kg)", "key": "weight", "type": "number", "width": 90 },
96
+ { "label": "单位", "key": "unit", "type": "select",
97
+ "options": { "source": "/units", "label": "name", "value": "code" } } ],
98
+ "rows": { "path": "/goods" },
99
+ "addLabel": "添加一行", "removeLabel": "删除这一行",
100
+ "emptyHint": "还没有货物,点「添加一行」开始" }
101
+ ```
102
+
103
+ 三条与手机端逐字对齐的约定(改一边必须同时改另一边):
104
+
105
+ 1. **写回整条数组**:单元格编辑、加行、删行都整体替换 `rows` 指向的数组,
106
+ 不写下标路径(两端同一语义,联动通知一定落在 `/goods` 上);
107
+ 2. **`number` 列写数字、文本列写字符串、`select` 列写选项 `value` 原值**
108
+ (数字列输入过程中解析不出来的内容**不写**,保留上一次的值);
109
+ 3. **冻结**:数据模型里 `/submitted === true` 或 `/formValid === false` 时整表只读。
110
+
111
+ `type` 只认 `text`(缺省)/ `number` / `select`,写错按 `text` 处理;
112
+ `select` 的 `options` 与 `ChoicePicker` 同一套写法——静态数组或
113
+ `{source,label,value}` 远程选项(数据未到时该格显示「暂无选项」,数据到达只刷新那一格,
114
+ 已输入的文字不丢)。
115
+
116
+ ## 开发(本仓库内)
117
+
118
+ ```bash
119
+ npm -w xiaohao-components run test # 单测(jsdom)
120
+ npm -w xiaohao-components run build # dist/index.js + dist/fixtures.js + dist/a2ui.css + 守卫
121
+ npm run playground # antd 沙箱(宿主零变化验证,需先 build 出 a2ui.css)
122
+ ```
@@ -0,0 +1,8 @@
1
+ import { A2uiRendererProps } from './types';
2
+ /**
3
+ * A2UI 卡片入口:只做「能不能渲」这一层判断,把状态与引擎交给 {@link A2uiSurfaceRuntime}。
4
+ *
5
+ * 三档结局:载荷缺失 → 兜底;JSON 解析失败 → 兜底 + 错误日志;其余进引擎。
6
+ * key 用 `surfaceId`:换 surface 必须重挂载,否则旧 surface 的组件树会串到新卡上。
7
+ */
8
+ export declare function A2uiRenderer({ card, onAction, onPreviewAction, onNotify, logger, renderFallback, theme, className, }: A2uiRendererProps): import("react").JSX.Element;
package/dist/a2ui.css ADDED
@@ -0,0 +1 @@
1
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){.xa2ui-root *, .xa2ui-root :before, .xa2ui-root :after, .xa2ui-root ::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-duration:initial;--tw-content:"";--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{.xa2ui-root, .xa2ui-root :host{--color-emerald-600:oklch(59.6% .145 163.225);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-medium:500;--font-weight-semibold:600;--leading-snug:1.375;--radius-md:calc(var(--radius) * .8);--blur-xs:4px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}.xa2ui-root{--radius:.625rem;--background:oklch(100% 0 0);--foreground:oklch(14.5% 0 0);--card:oklch(100% 0 0);--card-foreground:oklch(14.5% 0 0);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.5% 0 0);--primary:oklch(20.5% 0 0);--primary-foreground:oklch(98.5% 0 0);--secondary:oklch(97% 0 0);--secondary-foreground:oklch(20.5% 0 0);--muted:oklch(97% 0 0);--muted-foreground:oklch(55.6% 0 0);--accent:oklch(97% 0 0);--accent-foreground:oklch(20.5% 0 0);--destructive:oklch(57.7% .245 27.325);--border:oklch(92.2% 0 0);--input:oklch(92.2% 0 0);--ring:oklch(70.8% 0 0)}.xa2ui-root.xa2ui-dark{--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(20.5% 0 0);--card-foreground:oklch(98.5% 0 0);--popover:oklch(20.5% 0 0);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(92.2% 0 0);--primary-foreground:oklch(20.5% 0 0);--secondary:oklch(26.9% 0 0);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(26.9% 0 0);--muted-foreground:oklch(70.8% 0 0);--accent:oklch(26.9% 0 0);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(70.4% .191 22.216);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(55.6% 0 0)}}@layer utilities{.xa2ui-root .\@container\/card-header{container:card-header/inline-size}.xa2ui-root .pointer-events-none{pointer-events:none}.xa2ui-root .sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.xa2ui-root .absolute{position:absolute}.xa2ui-root .fixed{position:fixed}.xa2ui-root .relative{position:relative}.xa2ui-root .inset-0{inset:0}.xa2ui-root .top-0{top:0}.xa2ui-root .top-1\/2{top:50%}.xa2ui-root .top-2{top:calc(var(--spacing) * 2)}.xa2ui-root .right-2{right:calc(var(--spacing) * 2)}.xa2ui-root .bottom-0{bottom:0}.xa2ui-root .left-1\/2{left:50%}.xa2ui-root .isolate{isolation:isolate}.xa2ui-root .z-10{z-index:10}.xa2ui-root .z-50{z-index:50}.xa2ui-root .col-start-2{grid-column-start:2}.xa2ui-root .row-span-2{grid-row:span 2/span 2}.xa2ui-root .row-start-1{grid-row-start:1}.xa2ui-root .container{width:100%}@media(min-width:40rem){.xa2ui-root .container{max-width:40rem}}@media(min-width:48rem){.xa2ui-root .container{max-width:48rem}}@media(min-width:64rem){.xa2ui-root .container{max-width:64rem}}@media(min-width:80rem){.xa2ui-root .container{max-width:80rem}}@media(min-width:96rem){.xa2ui-root .container{max-width:96rem}}.xa2ui-root .m-0{margin:0}.xa2ui-root .-mx-1{margin-inline:calc(var(--spacing) * -1)}.xa2ui-root .-mx-4{margin-inline:calc(var(--spacing) * -4)}.xa2ui-root .my-1{margin-block:var(--spacing)}.xa2ui-root .-mb-4{margin-bottom:calc(var(--spacing) * -4)}.xa2ui-root .block{display:block}.xa2ui-root .flex{display:flex}.xa2ui-root .grid{display:grid}.xa2ui-root .inline{display:inline}.xa2ui-root .inline-block{display:inline-block}.xa2ui-root .inline-flex{display:inline-flex}.xa2ui-root .field-sizing-content{field-sizing:content}.xa2ui-root .size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.xa2ui-root .size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.xa2ui-root .size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.xa2ui-root .size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.xa2ui-root .size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.xa2ui-root .size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.xa2ui-root .size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.xa2ui-root .size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.xa2ui-root .h-6{height:calc(var(--spacing) * 6)}.xa2ui-root .h-7{height:calc(var(--spacing) * 7)}.xa2ui-root .h-8{height:calc(var(--spacing) * 8)}.xa2ui-root .h-9{height:calc(var(--spacing) * 9)}.xa2ui-root .h-24{height:calc(var(--spacing) * 24)}.xa2ui-root .h-32{height:calc(var(--spacing) * 32)}.xa2ui-root .h-40{height:calc(var(--spacing) * 40)}.xa2ui-root .h-64{height:calc(var(--spacing) * 64)}.xa2ui-root .h-\[calc\(100\%-1px\)\]{height:calc(100% - 1px)}.xa2ui-root .h-px{height:1px}.xa2ui-root .max-h-\(--available-height\){max-height:var(--available-height)}.xa2ui-root .min-h-16{min-height:calc(var(--spacing) * 16)}.xa2ui-root .w-\(--anchor-width\){width:var(--anchor-width)}.xa2ui-root .w-10{width:calc(var(--spacing) * 10)}.xa2ui-root .w-fit{width:fit-content}.xa2ui-root .w-full{width:100%}.xa2ui-root .max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.xa2ui-root .min-w-0{min-width:0}.xa2ui-root .min-w-36{min-width:calc(var(--spacing) * 36)}.xa2ui-root .flex-1{flex:1}.xa2ui-root .shrink-0{flex-shrink:0}.xa2ui-root .flex-grow, .xa2ui-root .grow{flex-grow:1}.xa2ui-root .border-collapse{border-collapse:collapse}.xa2ui-root .origin-\(--transform-origin\){transform-origin:var(--transform-origin)}.xa2ui-root .-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.xa2ui-root .-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.xa2ui-root .cursor-default{cursor:default}.xa2ui-root .cursor-pointer{cursor:pointer}.xa2ui-root .touch-none{touch-action:none}.xa2ui-root .scroll-my-1{scroll-margin-block:var(--spacing)}.xa2ui-root .list-none{list-style-type:none}.xa2ui-root .auto-rows-min{grid-auto-rows:min-content}.xa2ui-root .flex-col{flex-direction:column}.xa2ui-root .flex-col-reverse{flex-direction:column-reverse}.xa2ui-root .flex-row{flex-direction:row}.xa2ui-root .flex-wrap{flex-wrap:wrap}.xa2ui-root .place-content-center{place-content:center}.xa2ui-root .items-center{align-items:center}.xa2ui-root .items-end{align-items:flex-end}.xa2ui-root .items-start{align-items:flex-start}.xa2ui-root .items-stretch{align-items:stretch}.xa2ui-root .justify-around{justify-content:space-around}.xa2ui-root .justify-between{justify-content:space-between}.xa2ui-root .justify-center{justify-content:center}.xa2ui-root .justify-end{justify-content:flex-end}.xa2ui-root .justify-evenly{justify-content:space-evenly}.xa2ui-root .justify-start{justify-content:flex-start}.xa2ui-root .justify-stretch{justify-content:stretch}.xa2ui-root .gap-\(--card-spacing\){gap:var(--card-spacing)}.xa2ui-root .gap-1{gap:var(--spacing)}.xa2ui-root .gap-1\.5{gap:calc(var(--spacing) * 1.5)}.xa2ui-root .gap-2{gap:calc(var(--spacing) * 2)}.xa2ui-root .gap-3{gap:calc(var(--spacing) * 3)}.xa2ui-root .gap-4{gap:calc(var(--spacing) * 4)}.xa2ui-root .self-start{align-self:flex-start}.xa2ui-root .justify-self-end{justify-self:flex-end}.xa2ui-root .overflow-hidden{overflow:hidden}.xa2ui-root .overflow-x-auto{overflow-x:auto}.xa2ui-root .overflow-x-hidden{overflow-x:hidden}.xa2ui-root .overflow-y-auto{overflow-y:auto}.xa2ui-root .rounded-\[4px\]{border-radius:4px}.xa2ui-root .rounded-\[min\(var\(--radius-md\)\,10px\)\]{border-radius:min(var(--radius-md),10px)}.xa2ui-root .rounded-\[min\(var\(--radius-md\)\,12px\)\]{border-radius:min(var(--radius-md),12px)}.xa2ui-root .rounded-full{border-radius:3.40282e38px}.xa2ui-root .rounded-lg{border-radius:var(--radius)}.xa2ui-root .rounded-md{border-radius:calc(var(--radius) * .8)}.xa2ui-root .rounded-xl{border-radius:calc(var(--radius) * 1.4)}.xa2ui-root .rounded-t-xl{border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}.xa2ui-root .rounded-b-xl{border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.xa2ui-root .border{border-style:var(--tw-border-style);border-width:1px}.xa2ui-root .border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.xa2ui-root .border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.xa2ui-root .border-border, .xa2ui-root .border-border\/60{border-color:var(--border)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .border-border\/60{border-color:color-mix(in oklab,var(--border) 60%,transparent)}}.xa2ui-root .border-input{border-color:var(--input)}.xa2ui-root .border-ring{border-color:var(--ring)}.xa2ui-root .border-transparent{border-color:#0000}.xa2ui-root .bg-background, .xa2ui-root .bg-background\/95{background-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .bg-background\/95{background-color:color-mix(in oklab,var(--background) 95%,transparent)}}.xa2ui-root .bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .bg-black\/10{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.xa2ui-root .bg-border{background-color:var(--border)}.xa2ui-root .bg-card{background-color:var(--card)}.xa2ui-root .bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .bg-destructive\/10{background-color:color-mix(in oklab,var(--destructive) 10%,transparent)}}.xa2ui-root .bg-muted{background-color:var(--muted)}.xa2ui-root .bg-muted-foreground\/40{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .bg-muted-foreground\/40{background-color:color-mix(in oklab,var(--muted-foreground) 40%,transparent)}}.xa2ui-root .bg-muted\/50{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .bg-muted\/50{background-color:color-mix(in oklab,var(--muted) 50%,transparent)}}.xa2ui-root .bg-popover{background-color:var(--popover)}.xa2ui-root .bg-primary{background-color:var(--primary)}.xa2ui-root .bg-secondary{background-color:var(--secondary)}.xa2ui-root .bg-transparent{background-color:#0000}.xa2ui-root .bg-white{background-color:var(--color-white)}.xa2ui-root .bg-clip-padding{background-clip:padding-box}.xa2ui-root .fill-current{fill:currentColor}.xa2ui-root .object-contain{object-fit:contain}.xa2ui-root .object-cover{object-fit:cover}.xa2ui-root .object-fill{object-fit:fill}.xa2ui-root .object-none{object-fit:none}.xa2ui-root .object-scale-down{object-fit:scale-down}.xa2ui-root .p-\(--card-spacing\){padding:var(--card-spacing)}.xa2ui-root .p-0{padding:0}.xa2ui-root .p-1{padding:var(--spacing)}.xa2ui-root .p-4{padding:calc(var(--spacing) * 4)}.xa2ui-root .p-\[3px\]{padding:3px}.xa2ui-root .px-\(--card-spacing\){padding-inline:var(--card-spacing)}.xa2ui-root .px-1{padding-inline:var(--spacing)}.xa2ui-root .px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.xa2ui-root .px-2{padding-inline:calc(var(--spacing) * 2)}.xa2ui-root .px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.xa2ui-root .px-3{padding-inline:calc(var(--spacing) * 3)}.xa2ui-root .py-\(--card-spacing\){padding-block:var(--card-spacing)}.xa2ui-root .py-0\.5{padding-block:calc(var(--spacing) * .5)}.xa2ui-root .py-1{padding-block:var(--spacing)}.xa2ui-root .py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.xa2ui-root .py-2{padding-block:calc(var(--spacing) * 2)}.xa2ui-root .py-6{padding-block:calc(var(--spacing) * 6)}.xa2ui-root .pt-4{padding-top:calc(var(--spacing) * 4)}.xa2ui-root .pr-2{padding-right:calc(var(--spacing) * 2)}.xa2ui-root .pr-8{padding-right:calc(var(--spacing) * 8)}.xa2ui-root .pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.xa2ui-root .pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.xa2ui-root .text-center{text-align:center}.xa2ui-root .text-left{text-align:left}.xa2ui-root .align-middle{vertical-align:middle}.xa2ui-root .align-top{vertical-align:top}.xa2ui-root .text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.xa2ui-root .text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.xa2ui-root .text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.xa2ui-root .text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.xa2ui-root .text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.xa2ui-root .text-\[0\.8rem\]{font-size:.8rem}.xa2ui-root .leading-none{--tw-leading:1;line-height:1}.xa2ui-root .leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.xa2ui-root .font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.xa2ui-root .font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.xa2ui-root .whitespace-nowrap{white-space:nowrap}.xa2ui-root .text-card-foreground{color:var(--card-foreground)}.xa2ui-root .text-current{color:currentColor}.xa2ui-root .text-destructive{color:var(--destructive)}.xa2ui-root .text-emerald-600{color:var(--color-emerald-600)}.xa2ui-root .text-foreground, .xa2ui-root .text-foreground\/60{color:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .text-foreground\/60{color:color-mix(in oklab,var(--foreground) 60%,transparent)}}.xa2ui-root .text-muted-foreground{color:var(--muted-foreground)}.xa2ui-root .text-popover-foreground{color:var(--popover-foreground)}.xa2ui-root .text-primary{color:var(--primary)}.xa2ui-root .text-primary-foreground{color:var(--primary-foreground)}.xa2ui-root .text-secondary-foreground{color:var(--secondary-foreground)}.xa2ui-root .underline-offset-4{text-underline-offset:4px}.xa2ui-root .opacity-60{opacity:.6}.xa2ui-root .shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.xa2ui-root .shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.xa2ui-root .shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.xa2ui-root .ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.xa2ui-root .ring-foreground\/10{--tw-ring-color:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .ring-foreground\/10{--tw-ring-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}.xa2ui-root .ring-ring\/50{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .ring-ring\/50{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.xa2ui-root .outline-hidden{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.xa2ui-root .outline-hidden{outline-offset:2px;outline:2px solid #0000}}.xa2ui-root .outline{outline-style:var(--tw-outline-style);outline-width:1px}.xa2ui-root .transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.xa2ui-root .transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.xa2ui-root .transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.xa2ui-root .transition-none{transition-property:none}.xa2ui-root .duration-100{--tw-duration:.1s;transition-duration:.1s}.xa2ui-root .outline-none{--tw-outline-style:none;outline-style:none}.xa2ui-root .select-none{-webkit-user-select:none;user-select:none}.xa2ui-root .\[--card-spacing\:--spacing\(4\)\]{--card-spacing:calc(var(--spacing) * 4)}.xa2ui-root .group-has-disabled\/field\:opacity-50:is(:where(.group\/field):has(:disabled) *){opacity:.5}.xa2ui-root .group-data-horizontal\/tabs\:h-8:is(:where(.group\/tabs)[data-horizontal] *){height:calc(var(--spacing) * 8)}.xa2ui-root .group-data-vertical\/tabs\:h-fit:is(:where(.group\/tabs)[data-vertical] *){height:fit-content}.xa2ui-root .group-data-vertical\/tabs\:w-full:is(:where(.group\/tabs)[data-vertical] *){width:100%}.xa2ui-root .group-data-vertical\/tabs\:flex-col:is(:where(.group\/tabs)[data-vertical] *){flex-direction:column}.xa2ui-root .group-data-vertical\/tabs\:justify-start:is(:where(.group\/tabs)[data-vertical] *){justify-content:flex-start}.xa2ui-root .group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.xa2ui-root .group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.xa2ui-root .group-data-\[size\=sm\]\/card\:text-sm:is(:where(.group\/card)[data-size=sm] *){font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.xa2ui-root .group-data-\[variant\=line\]\/tabs-list\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *){background-color:#0000}.xa2ui-root .peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.xa2ui-root .peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.xa2ui-root .file\:inline-flex::file-selector-button{display:inline-flex}.xa2ui-root .file\:h-6::file-selector-button{height:calc(var(--spacing) * 6)}.xa2ui-root .file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.xa2ui-root .file\:bg-transparent::file-selector-button{background-color:#0000}.xa2ui-root .file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.xa2ui-root .file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.xa2ui-root .file\:text-foreground::file-selector-button{color:var(--foreground)}.xa2ui-root .placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.xa2ui-root .after\:absolute:after{content:var(--tw-content);position:absolute}.xa2ui-root .after\:-inset-2:after{content:var(--tw-content);inset:calc(var(--spacing) * -2)}.xa2ui-root .after\:-inset-x-3:after{content:var(--tw-content);inset-inline:calc(var(--spacing) * -3)}.xa2ui-root .after\:-inset-y-2:after{content:var(--tw-content);inset-block:calc(var(--spacing) * -2)}.xa2ui-root .after\:bg-foreground:after{content:var(--tw-content);background-color:var(--foreground)}.xa2ui-root .after\:opacity-0:after{content:var(--tw-content);opacity:0}.xa2ui-root .after\:transition-opacity:after{content:var(--tw-content);transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.xa2ui-root .group-data-horizontal\/tabs\:after\:inset-x-0:is(:where(.group\/tabs)[data-horizontal] *):after{content:var(--tw-content);inset-inline:0}.xa2ui-root .group-data-horizontal\/tabs\:after\:bottom-\[-5px\]:is(:where(.group\/tabs)[data-horizontal] *):after{content:var(--tw-content);bottom:-5px}.xa2ui-root .group-data-horizontal\/tabs\:after\:h-0\.5:is(:where(.group\/tabs)[data-horizontal] *):after{content:var(--tw-content);height:calc(var(--spacing) * .5)}.xa2ui-root .group-data-vertical\/tabs\:after\:inset-y-0:is(:where(.group\/tabs)[data-vertical] *):after{content:var(--tw-content);inset-block:0}.xa2ui-root .group-data-vertical\/tabs\:after\:-right-1:is(:where(.group\/tabs)[data-vertical] *):after{content:var(--tw-content);right:calc(var(--spacing) * -1)}.xa2ui-root .group-data-vertical\/tabs\:after\:w-0\.5:is(:where(.group\/tabs)[data-vertical] *):after{content:var(--tw-content);width:calc(var(--spacing) * .5)}.xa2ui-root .last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}@media(hover:hover){.xa2ui-root .hover\:bg-\[color-mix\(in_oklch\,var\(--secondary\)\,var\(--foreground\)_5\%\)\]:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .hover\:bg-\[color-mix\(in_oklch\,var\(--secondary\)\,var\(--foreground\)_5\%\)\]:hover{background-color:color-mix(in oklch,var(--secondary),var(--foreground) 5%)}}.xa2ui-root .hover\:bg-destructive\/20:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .hover\:bg-destructive\/20:hover{background-color:color-mix(in oklab,var(--destructive) 20%,transparent)}}.xa2ui-root .hover\:bg-muted:hover{background-color:var(--muted)}.xa2ui-root .hover\:bg-primary\/80:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .hover\:bg-primary\/80:hover{background-color:color-mix(in oklab,var(--primary) 80%,transparent)}}.xa2ui-root .hover\:text-foreground:hover{color:var(--foreground)}.xa2ui-root .hover\:underline:hover{text-decoration-line:underline}.xa2ui-root .hover\:ring-3:hover{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.xa2ui-root .focus\:bg-accent:focus{background-color:var(--accent)}.xa2ui-root .focus\:text-accent-foreground:focus, .xa2ui-root :is(.not-data-\[variant\=destructive\]\:focus\:\*\*\:text-accent-foreground:not([data-variant=destructive]):focus *){color:var(--accent-foreground)}.xa2ui-root .focus-visible\:border-destructive\/40:focus-visible{border-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .focus-visible\:border-destructive\/40:focus-visible{border-color:color-mix(in oklab,var(--destructive) 40%,transparent)}}.xa2ui-root .focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.xa2ui-root .focus-visible\:ring-3:focus-visible, .xa2ui-root .focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.xa2ui-root .focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.xa2ui-root .focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.xa2ui-root .focus-visible\:outline-hidden:focus-visible{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.xa2ui-root .focus-visible\:outline-hidden:focus-visible{outline-offset:2px;outline:2px solid #0000}}.xa2ui-root .focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.xa2ui-root .focus-visible\:outline-ring:focus-visible{outline-color:var(--ring)}.xa2ui-root .active\:ring-3:active{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.xa2ui-root .active\:not-aria-\[haspopup\]\:translate-y-px:active:not([aria-haspopup]){--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.xa2ui-root .disabled\:pointer-events-none:disabled{pointer-events:none}.xa2ui-root .disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.xa2ui-root .disabled\:bg-input\/50:disabled{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .disabled\:bg-input\/50:disabled{background-color:color-mix(in oklab,var(--input) 50%,transparent)}}.xa2ui-root .disabled\:opacity-50:disabled{opacity:.5}.xa2ui-root :where([data-slot=button-group]) .in-data-\[slot\=button-group\]\:rounded-lg{border-radius:var(--radius)}.xa2ui-root .has-data-\[icon\=inline-end\]\:pr-1:has([data-icon=inline-end]){padding-right:var(--spacing)}.xa2ui-root .has-data-\[icon\=inline-end\]\:pr-1\.5:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 1.5)}.xa2ui-root .has-data-\[icon\=inline-end\]\:pr-2:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 2)}.xa2ui-root .has-data-\[icon\=inline-start\]\:pl-1:has([data-icon=inline-start]){padding-left:var(--spacing)}.xa2ui-root .has-data-\[icon\=inline-start\]\:pl-1\.5:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 1.5)}.xa2ui-root .has-data-\[icon\=inline-start\]\:pl-2:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 2)}.xa2ui-root .has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.xa2ui-root .has-data-\[slot\=card-description\]\:grid-rows-\[auto_auto\]:has([data-slot=card-description]){grid-template-rows:auto auto}.xa2ui-root .has-data-\[slot\=card-footer\]\:pb-0:has([data-slot=card-footer]){padding-bottom:0}.xa2ui-root .has-\[\>img\:first-child\]\:pt-0:has(>img:first-child){padding-top:0}.xa2ui-root .aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.xa2ui-root .aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.xa2ui-root .aria-expanded\:bg-muted[aria-expanded=true]{background-color:var(--muted)}.xa2ui-root .aria-expanded\:bg-secondary[aria-expanded=true]{background-color:var(--secondary)}.xa2ui-root .aria-expanded\:text-foreground[aria-expanded=true]{color:var(--foreground)}.xa2ui-root .aria-expanded\:text-secondary-foreground[aria-expanded=true]{color:var(--secondary-foreground)}.xa2ui-root .aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.xa2ui-root .aria-invalid\:ring-3[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.xa2ui-root .aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.xa2ui-root .aria-invalid\:aria-checked\:border-primary[aria-invalid=true][aria-checked=true]{border-color:var(--primary)}.xa2ui-root .data-active\:bg-background[data-active]{background-color:var(--background)}.xa2ui-root .data-active\:text-foreground[data-active]{color:var(--foreground)}.xa2ui-root .group-data-\[variant\=default\]\/tabs-list\:data-active\:shadow-sm:is(:where(.group\/tabs-list)[data-variant=default] *)[data-active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.xa2ui-root .group-data-\[variant\=line\]\/tabs-list\:data-active\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *)[data-active]{background-color:#0000}.xa2ui-root .group-data-\[variant\=line\]\/tabs-list\:data-active\:shadow-none:is(:where(.group\/tabs-list)[data-variant=line] *)[data-active]{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.xa2ui-root .group-data-\[variant\=line\]\/tabs-list\:data-active\:after\:opacity-100:is(:where(.group\/tabs-list)[data-variant=line] *)[data-active]:after{content:var(--tw-content);opacity:1}.xa2ui-root .data-checked\:border-primary[data-checked]{border-color:var(--primary)}.xa2ui-root .data-checked\:bg-primary[data-checked]{background-color:var(--primary)}.xa2ui-root .data-checked\:text-primary-foreground[data-checked]{color:var(--primary-foreground)}.xa2ui-root .data-disabled\:pointer-events-none[data-disabled]{pointer-events:none}.xa2ui-root .data-disabled\:opacity-50[data-disabled]{opacity:.5}.xa2ui-root .data-horizontal\:h-1[data-horizontal]{height:var(--spacing)}.xa2ui-root .data-horizontal\:h-full[data-horizontal]{height:100%}.xa2ui-root .data-horizontal\:h-px[data-horizontal]{height:1px}.xa2ui-root .data-horizontal\:w-full[data-horizontal]{width:100%}.xa2ui-root .data-horizontal\:flex-col[data-horizontal]{flex-direction:column}.xa2ui-root .data-placeholder\:text-muted-foreground[data-placeholder]{color:var(--muted-foreground)}.xa2ui-root .data-vertical\:h-full[data-vertical]{height:100%}.xa2ui-root .data-vertical\:min-h-40[data-vertical]{min-height:calc(var(--spacing) * 40)}.xa2ui-root .data-vertical\:w-1[data-vertical]{width:var(--spacing)}.xa2ui-root .data-vertical\:w-auto[data-vertical]{width:auto}.xa2ui-root .data-vertical\:w-full[data-vertical]{width:100%}.xa2ui-root .data-vertical\:w-px[data-vertical]{width:1px}.xa2ui-root .data-vertical\:flex-col[data-vertical]{flex-direction:column}.xa2ui-root .data-vertical\:self-stretch[data-vertical]{align-self:stretch}.xa2ui-root .data-\[align-trigger\=true\]\:animate-none[data-align-trigger=true]{animation:none}.xa2ui-root .data-\[size\=default\]\:h-8[data-size=default]{height:calc(var(--spacing) * 8)}.xa2ui-root .data-\[size\=sm\]\:h-7[data-size=sm]{height:calc(var(--spacing) * 7)}.xa2ui-root .data-\[size\=sm\]\:rounded-\[min\(var\(--radius-md\)\,10px\)\][data-size=sm]{border-radius:min(var(--radius-md),10px)}.xa2ui-root .data-\[size\=sm\]\:\[--card-spacing\:--spacing\(3\)\][data-size=sm]{--card-spacing:calc(var(--spacing) * 3)}.xa2ui-root .data-\[size\=sm\]\:has-data-\[slot\=card-footer\]\:pb-0[data-size=sm]:has([data-slot=card-footer]){padding-bottom:0}.xa2ui-root :is(.\*\:data-\[slot\=select-value\]\:line-clamp-1>*)[data-slot=select-value]{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.xa2ui-root :is(.\*\:data-\[slot\=select-value\]\:flex>*)[data-slot=select-value]{display:flex}.xa2ui-root :is(.\*\:data-\[slot\=select-value\]\:items-center>*)[data-slot=select-value]{align-items:center}.xa2ui-root :is(.\*\:data-\[slot\=select-value\]\:gap-1\.5>*)[data-slot=select-value]{gap:calc(var(--spacing) * 1.5)}.xa2ui-root .data-\[variant\=line\]\:rounded-none[data-variant=line]{border-radius:0}@supports ((-webkit-backdrop-filter:var(--tw)) or (backdrop-filter:var(--tw))){.xa2ui-root .supports-backdrop-filter\:backdrop-blur-xs{--tw-backdrop-blur:blur(var(--blur-xs));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}}@media(min-width:40rem){.xa2ui-root .sm\:max-w-sm{max-width:var(--container-sm)}.xa2ui-root .sm\:flex-row{flex-direction:row}.xa2ui-root .sm\:justify-end{justify-content:flex-end}}@media(min-width:48rem){.xa2ui-root .md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.xa2ui-root .dark\:border-input:is(.xa2ui-root.xa2ui-dark *){border-color:var(--input)}.xa2ui-root .dark\:bg-destructive\/20:is(.xa2ui-root.xa2ui-dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .dark\:bg-destructive\/20:is(.xa2ui-root.xa2ui-dark *){background-color:color-mix(in oklab,var(--destructive) 20%,transparent)}}.xa2ui-root .dark\:bg-input\/30:is(.xa2ui-root.xa2ui-dark *){background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .dark\:bg-input\/30:is(.xa2ui-root.xa2ui-dark *){background-color:color-mix(in oklab,var(--input) 30%,transparent)}}.xa2ui-root .dark\:text-muted-foreground:is(.xa2ui-root.xa2ui-dark *){color:var(--muted-foreground)}@media(hover:hover){.xa2ui-root .dark\:hover\:bg-destructive\/30:is(.xa2ui-root.xa2ui-dark *):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .dark\:hover\:bg-destructive\/30:is(.xa2ui-root.xa2ui-dark *):hover{background-color:color-mix(in oklab,var(--destructive) 30%,transparent)}}.xa2ui-root .dark\:hover\:bg-input\/50:is(.xa2ui-root.xa2ui-dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .dark\:hover\:bg-input\/50:is(.xa2ui-root.xa2ui-dark *):hover{background-color:color-mix(in oklab,var(--input) 50%,transparent)}}.xa2ui-root .dark\:hover\:bg-muted\/50:is(.xa2ui-root.xa2ui-dark *):hover{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .dark\:hover\:bg-muted\/50:is(.xa2ui-root.xa2ui-dark *):hover{background-color:color-mix(in oklab,var(--muted) 50%,transparent)}}.xa2ui-root .dark\:hover\:text-foreground:is(.xa2ui-root.xa2ui-dark *):hover{color:var(--foreground)}}.xa2ui-root .dark\:focus-visible\:ring-destructive\/40:is(.xa2ui-root.xa2ui-dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .dark\:focus-visible\:ring-destructive\/40:is(.xa2ui-root.xa2ui-dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.xa2ui-root .dark\:disabled\:bg-input\/80:is(.xa2ui-root.xa2ui-dark *):disabled{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .dark\:disabled\:bg-input\/80:is(.xa2ui-root.xa2ui-dark *):disabled{background-color:color-mix(in oklab,var(--input) 80%,transparent)}}.xa2ui-root .dark\:aria-invalid\:border-destructive\/50:is(.xa2ui-root.xa2ui-dark *)[aria-invalid=true]{border-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .dark\:aria-invalid\:border-destructive\/50:is(.xa2ui-root.xa2ui-dark *)[aria-invalid=true]{border-color:color-mix(in oklab,var(--destructive) 50%,transparent)}}.xa2ui-root .dark\:aria-invalid\:ring-destructive\/40:is(.xa2ui-root.xa2ui-dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .dark\:aria-invalid\:ring-destructive\/40:is(.xa2ui-root.xa2ui-dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.xa2ui-root .dark\:data-active\:border-input:is(.xa2ui-root.xa2ui-dark *)[data-active]{border-color:var(--input)}.xa2ui-root .dark\:data-active\:bg-input\/30:is(.xa2ui-root.xa2ui-dark *)[data-active]{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.xa2ui-root .dark\:data-active\:bg-input\/30:is(.xa2ui-root.xa2ui-dark *)[data-active]{background-color:color-mix(in oklab,var(--input) 30%,transparent)}}.xa2ui-root .dark\:data-active\:text-foreground:is(.xa2ui-root.xa2ui-dark *)[data-active]{color:var(--foreground)}.xa2ui-root .dark\:group-data-\[variant\=line\]\/tabs-list\:data-active\:border-transparent:is(.xa2ui-root.xa2ui-dark *):is(:where(.group\/tabs-list)[data-variant=line] *)[data-active]{border-color:#0000}.xa2ui-root .dark\:group-data-\[variant\=line\]\/tabs-list\:data-active\:bg-transparent:is(.xa2ui-root.xa2ui-dark *):is(:where(.group\/tabs-list)[data-variant=line] *)[data-active]{background-color:#0000}.xa2ui-root .dark\:data-checked\:bg-primary:is(.xa2ui-root.xa2ui-dark *)[data-checked]{background-color:var(--primary)}.xa2ui-root .\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.xa2ui-root .\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.xa2ui-root .\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.xa2ui-root .\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3\.5 svg:not([class*=size-]){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.xa2ui-root .\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.xa2ui-root .\[\.border-b\]\:pb-\(--card-spacing\).border-b{padding-bottom:var(--card-spacing)}.xa2ui-root :is(.\*\:\[a\]\:underline>*):is(a){text-decoration-line:underline}.xa2ui-root :is(.\*\:\[a\]\:underline-offset-3>*):is(a){text-underline-offset:3px}@media(hover:hover){.xa2ui-root :is(.\*\:\[a\]\:hover\:text-foreground>*):is(a):hover{color:var(--foreground)}}.xa2ui-root :is(.\*\:\[img\:first-child\]\:rounded-t-xl>*):is(img:first-child){border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}.xa2ui-root :is(.\*\:\[img\:last-child\]\:rounded-b-xl>*):is(img:last-child){border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.xa2ui-root :is(.\*\:\[span\]\:last\:flex>*):is(span):last-child{display:flex}.xa2ui-root :is(.\*\:\[span\]\:last\:items-center>*):is(span):last-child{align-items:center}.xa2ui-root :is(.\*\:\[span\]\:last\:gap-2>*):is(span):last-child{gap:calc(var(--spacing) * 2)}.xa2ui-root .\[\&\>svg\]\:size-3\.5>svg{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-duration{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * 卡片按钮 → 工具注册名的补全(A2UI分端实施说明 §4.6)。
3
+ *
4
+ * 卡片里写的按钮名是**短名**(`scale_up_service`),服务端只认注册名
5
+ * `mcp__{pluginId}__{serverName}__{toolName}`。补全规则只有两条,缺一不可:
6
+ *
7
+ * 1. **已带 `mcp__` 的一律原样返回**(幂等)——`apps-ui` 的卡片片段约定 `data-tool`
8
+ * 写完整注册名;不长眼地再拼一层会得到 `mcp__…__mcp__…__tool`,服务端判成
9
+ * 「未对当前助手开放」,而报错文案看起来像权限问题,极难查。
10
+ * 2. 其余一律拼上前缀。前缀从**这张卡的 `tool`** 推导(去掉最后一段),不是从
11
+ * `resourceUri` 推——两者在 a2ui 卡上不是同一套形状。
12
+ *
13
+ * 短名里自带 `__` 也没关系:我们只**加**前缀,不按 `__` 切分短名。
14
+ */
15
+ /**
16
+ * 注册名前缀:`mcp__{pluginId}__{serverName}__{toolName}` 去尾段、保留分隔符。
17
+ *
18
+ * 取**最后一个** `__` 而不是第一个:`pluginId` / `serverName` 里理论上不含 `__`,
19
+ * 但工具名里可能含(如 `user__profile`),只有最后一个 `__` 前面的部分才是前缀。
20
+ */
21
+ export declare function deriveToolPrefix(tool: string): string;
22
+ /**
23
+ * 按钮名补全成注册名。**幂等**:已是 `mcp__…` 的原样返回。
24
+ *
25
+ * `prefix` 为空(卡片的 `tool` 本身就不是注册名)时原样返回,不做二次猜测——
26
+ * 拼错的前缀比不拼更难查。
27
+ */
28
+ export declare function resolveToolName(name: string, prefix: string): string;
@@ -0,0 +1,10 @@
1
+ import { ComponentApi } from '@a2ui/web_core/v0_9';
2
+ import { ReactComponentImplementation } from '@a2ui/react/v0_9';
3
+ export declare const EditableTableApi: ComponentApi;
4
+ /**
5
+ * 显式标注返回类型:不标注时 tsc 推断出的类型会引用 `@a2ui/web_core` 内嵌 zod 3 的
6
+ * `ZodTypeAny`,vite-plugin-dts 无法把这个名字写进 `.d.ts`(TS2883),于是**整个
7
+ * `catalog/` 的声明文件被跳过**——`dist/index.d.ts` 里指向 `./catalog/shadcn-catalog`
8
+ * 的导出就成了断链,消费者 tsc 报 TS2307。别删这个注解。
9
+ */
10
+ export declare const ShadcnEditableTable: ReactComponentImplementation;
@@ -0,0 +1,16 @@
1
+ import { Catalog, ComponentApi } from '@a2ui/web_core/v0_9';
2
+ /**
3
+ * 补秒:`datetime-local` / `time` 在用户没动过秒那一格时只会给到分钟(`2026-10-30T14:30`)。
4
+ * 手机端的同组件写回 `HH:mm:ss`,两端要按同一种精度交给工具,所以这里统一补 `:00`。
5
+ */
6
+ export declare function withSeconds(value: string): string;
7
+ /**
8
+ * shadcn 组件目录:官方引擎用它来把 A2UI 组件名解析成 React 组件。
9
+ *
10
+ * 🔴 catalogId 必须用**官方 basic catalog 的规范 id**(不是随便一个唯一串):
11
+ * 协同端下发的组件树里 `createSurface.catalogId` 就是它,移动端 `genui` 的
12
+ * `BasicCatalog` 也用同一个 id —— 两端靠这个 id 认领同一份卡片,换 id 会直接「卡片找不到目录」。
13
+ */
14
+ export declare const shadcnCatalog: Catalog<ComponentApi>;
15
+ /** 卡片 createSurface 消息里 catalogId 必须指向这个 id,引擎才能把组件名解析到 shadcn 映射。 */
16
+ export declare const shadcnCatalogId: string;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 默认兜底渲染:纯文本节点(宿主可用 `renderFallback` 覆盖,
3
+ * 桌面传 `(t) => <CardFallback text={t} />` 保持气泡观感)。
4
+ */
5
+ export declare function A2uiFallback({ text }: {
6
+ text: string;
7
+ }): import("react").JSX.Element;