base-paint 0.1.0 → 0.3.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.
Files changed (64) hide show
  1. package/dist/blocks.d.ts +169 -0
  2. package/dist/blocks.d.ts.map +1 -0
  3. package/dist/blocks.js +862 -0
  4. package/dist/blocks.js.map +1 -0
  5. package/dist/charts.d.ts +62 -0
  6. package/dist/charts.d.ts.map +1 -0
  7. package/dist/charts.js +1677 -0
  8. package/dist/charts.js.map +1 -0
  9. package/dist/contract.d.ts.map +1 -1
  10. package/dist/contract.js +7 -1
  11. package/dist/contract.js.map +1 -1
  12. package/dist/controls.d.ts +139 -0
  13. package/dist/controls.d.ts.map +1 -0
  14. package/dist/controls.js +1182 -0
  15. package/dist/controls.js.map +1 -0
  16. package/dist/help.d.ts +24 -0
  17. package/dist/help.d.ts.map +1 -0
  18. package/dist/help.js +604 -0
  19. package/dist/help.js.map +1 -0
  20. package/dist/index.d.ts +21 -1
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +21 -1
  23. package/dist/index.js.map +1 -1
  24. package/dist/spec/charts.d.ts +222 -0
  25. package/dist/spec/charts.d.ts.map +1 -0
  26. package/dist/spec/charts.js +35 -0
  27. package/dist/spec/charts.js.map +1 -0
  28. package/dist/spec/controls.d.ts +329 -0
  29. package/dist/spec/controls.d.ts.map +1 -0
  30. package/dist/spec/controls.js +119 -0
  31. package/dist/spec/controls.js.map +1 -0
  32. package/dist/spec/help.d.ts +353 -0
  33. package/dist/spec/help.d.ts.map +1 -0
  34. package/dist/spec/help.js +167 -0
  35. package/dist/spec/help.js.map +1 -0
  36. package/dist/spec/index.d.ts +40 -0
  37. package/dist/spec/index.d.ts.map +1 -0
  38. package/dist/spec/index.js +164 -0
  39. package/dist/spec/index.js.map +1 -0
  40. package/dist/spec/style.d.ts +46 -0
  41. package/dist/spec/style.d.ts.map +1 -0
  42. package/dist/spec/style.js +39 -0
  43. package/dist/spec/style.js.map +1 -0
  44. package/dist/spec/template.d.ts +363 -0
  45. package/dist/spec/template.d.ts.map +1 -0
  46. package/dist/spec/template.js +252 -0
  47. package/dist/spec/template.js.map +1 -0
  48. package/dist/spec/text.d.ts +157 -0
  49. package/dist/spec/text.d.ts.map +1 -0
  50. package/dist/spec/text.js +83 -0
  51. package/dist/spec/text.js.map +1 -0
  52. package/dist/style.d.ts +19 -0
  53. package/dist/style.d.ts.map +1 -1
  54. package/dist/style.js +1091 -0
  55. package/dist/style.js.map +1 -1
  56. package/dist/template.d.ts +27 -0
  57. package/dist/template.d.ts.map +1 -0
  58. package/dist/template.js +362 -0
  59. package/dist/template.js.map +1 -0
  60. package/dist/text.d.ts +19 -0
  61. package/dist/text.d.ts.map +1 -0
  62. package/dist/text.js +448 -0
  63. package/dist/text.js.map +1 -0
  64. package/package.json +5 -3
@@ -0,0 +1,329 @@
1
+ /** base-paint/spec/controls:控件层契约(#76 冻结面)。
2
+ *
3
+ * 「无宿主(纯 HTML)可用」(AC-16):本层全部是**纯函数产 HTML 字符串** +
4
+ * **显式端口**(CopyPorts/ToastHostPort),不读浏览器全局对象(AC-7),
5
+ * 不引 `node:`(浏览器侧资产 browser-safe)。纯静态可用的控件零运行时;
6
+ * 需交互的控件由调用方注入端口,在**普通 .html 文件**里即可跑(不依赖 DSH 宿主)。
7
+ *
8
+ * #76/#77/#90 共用同一签名:本文件是唯一真相源,三票不得各定一套。
9
+ */
10
+ import type { CopyFormat } from './text.js';
11
+ /** AC-14:HTML 转义集固定五字符(技能侧本地副本一律删除,执行归 #74/#79)。 */
12
+ export declare const ESCAPE_HTML_CHARS: readonly ["&", "<", ">", "\"", "'"];
13
+ export type EscapeHtmlChar = (typeof ESCAPE_HTML_CHARS)[number];
14
+ export declare const ESCAPE_HTML_ENTITIES: Readonly<{
15
+ readonly '&': "&amp;";
16
+ readonly '<': "&lt;";
17
+ readonly '>': "&gt;";
18
+ readonly '"': "&quot;";
19
+ readonly "'": "&#39;";
20
+ }>;
21
+ /** 冻结签名:`escapeHtml(s: string): string`。 */
22
+ export type EscapeHtml = (s: string) => string;
23
+ /** 通道 1 = 浏览器 Clipboard API;通道 2 = 兜底(选区 + execCommand 等)。 */
24
+ export declare const COPY_CHANNELS: readonly ["clipboard", "fallback"];
25
+ export type CopyChannel = (typeof COPY_CHANNELS)[number];
26
+ export interface ClipboardChannel {
27
+ writeText(text: string): Promise<void>;
28
+ }
29
+ /** 调用方显式注入(禁全局对象兜底)。 */
30
+ export interface CopyPorts {
31
+ /** 无宿主/无 Clipboard API 时传 null,直接走 fallback。 */
32
+ readonly clipboard: ClipboardChannel | null;
33
+ readonly fallback: (text: string) => boolean;
34
+ /** 反馈通道(FX-3 定死):`copyText` **直接挂载**,不把 HTML 片段交调用方插入。
35
+ * 缺省(未提供)时只回调 + 返回 outcome,不产 HTML、不抛错(降级,非「需要宿主」)。 */
36
+ readonly toast?: ToastHostPort;
37
+ }
38
+ export interface CopyToastText {
39
+ readonly msg: string;
40
+ readonly detail?: string;
41
+ readonly icon?: ToastIcon;
42
+ }
43
+ export interface CopyTextOptions {
44
+ /** 静默:不弹 toast,但回调仍触发。 */
45
+ readonly silent?: boolean;
46
+ readonly toast?: {
47
+ readonly ok?: CopyToastText;
48
+ readonly fail?: CopyToastText;
49
+ };
50
+ readonly onOk?: (channel: CopyChannel) => void;
51
+ readonly onFail?: (reason: string) => void;
52
+ }
53
+ export interface CopyTextOutcome {
54
+ readonly ok: boolean;
55
+ /** 命中通道;空串短路时为 null。 */
56
+ readonly channel: CopyChannel | null;
57
+ readonly reason?: string;
58
+ }
59
+ /** 冻结签名:`copyText(text: string, ports: CopyPorts, opts?: CopyTextOptions): Promise<CopyTextOutcome>`。 */
60
+ export type CopyText = (text: string, ports: CopyPorts, opts?: CopyTextOptions) => Promise<CopyTextOutcome>;
61
+ export declare const COPY_TEXT_DEFAULTS: Readonly<{
62
+ readonly emptyTextShortCircuit: true;
63
+ /** 失败徽章恒在:失败态经 `ports.toast.mount` 挂载,不受 `opts.silent` 影响。 */
64
+ readonly failBadgeAlwaysOn: true;
65
+ readonly okMessage: "已复制";
66
+ readonly okDetail: "粘贴给 AI";
67
+ readonly failMessage: "复制失败";
68
+ readonly failDetail: "长按选择文本手动复制";
69
+ }>;
70
+ export interface CopyRuntime {
71
+ copyText(text: string, opts?: CopyTextOptions): Promise<CopyTextOutcome>;
72
+ dispose(): void;
73
+ }
74
+ /** 冻结签名:`createCopyRuntime(ports: CopyPorts): CopyRuntime`。 */
75
+ export type CreateCopyRuntime = (ports: CopyPorts) => CopyRuntime;
76
+ /** 复制按钮上承载 `actionId` 的属性名(FX-17④,冻结):`renderActionBar`/`renderErrorReceipt`
77
+ * /HELP 壳**渲染期**写入该属性;调用方的 `CopyActionHostPort.listActionIds()` 据此发现 id 集合。
78
+ * 文本仍走 `SharedHelpersInput.dataAttr`(缺省 `DEFAULT_DATA_ATTR = 'data-t'`)——id 与文本是两个属性,不得混用。 */
79
+ export declare const ACTION_ID_ATTR: "data-action-id";
80
+ /** 复制按钮的 actionId 冻结表(FX-17②):`actionBar` 的复制数据/日志 + `errorReceipt` 的两个按钮。
81
+ *
82
+ * **与旧侧 `data-t` 口径的偏离(显式声明)**:旧侧复制按钮**无 id**——激活靠内联脚本
83
+ * `onclick="copyText(this.dataset.t)"`(`base.js:311,648-649`),只有 `data-t` 一个属性。
84
+ * 新契约禁内联脚本(AC-7 零注入面),激活一律经 `bindCopyAction` 事件委派 → **必须**冻结 id 集合;
85
+ * 旧侧 `data-t` 的文本载体语义**保留**(属性名 = `SharedHelpersInput.dataAttr`,缺省 `DEFAULT_DATA_ATTR = 'data-t'`)。
86
+ *
87
+ * 约定:全部 base-paint actionId(含 `HELP_COPY_ACTIONS`)在**同一页面内唯一**;调用方可覆盖
88
+ * `ErrorReceiptInput.dataActionId`/`logActionId`,覆盖值同样必须唯一且可被 `listActionIds()` 发现。
89
+ * **例外(#78 记账,R27)**:HELP 壳按 §3.5.3 字面把三个复制目标的 actionId **逐字**写入**每张**场景卡
90
+ * (多场景卡必然页内重复,且 §3.5.3 禁「另定通配约定」)。歧义由宿主适配端解决——
91
+ * `readDataText(actionId)` 在激活处理内**同步**调用(§3.3 语义 2),适配端按「最近一次激活元素」关联。
92
+ */
93
+ export declare const COPY_ACTION_IDS: Readonly<{
94
+ readonly actionBar: {
95
+ readonly copyData: "ilife-copy-data";
96
+ readonly copyLog: "ilife-copy-log";
97
+ };
98
+ readonly errorReceipt: {
99
+ readonly copyData: "ilife-error-copy-data";
100
+ readonly copyLog: "ilife-error-copy-log";
101
+ };
102
+ }>;
103
+ /** DOM 适配端口(AC-7/§4.1:DOM 不得进 base-paint,故 `el` 以端口替代)。
104
+ * 调用方用内联适配器实现(普通 .html 即可),base-paint 自身不读任何浏览器全局对象。 */
105
+ export interface CopyActionHostPort {
106
+ /** **发现机制(FX-17③,必填)**:本端口可接线的全部 actionId(由渲染出的 `ACTION_ID_ATTR` 属性收集,
107
+ * 顺序无语义、可含重复但须自行去重)。`bindCopyAction` **只**订阅这里列出的 id——
108
+ * 不得猜 id、不得约定通配前缀、不得订阅未列出的 id。
109
+ * 允许包含**非复制按钮**(如 `ActionBarButton` 的场景按钮):binder 一律靠
110
+ * `readDataText → undefined` 跳过,不报错、不另设白名单。 */
111
+ listActionIds(): readonly string[];
112
+ /** 读取渲染期写入的复制文本(`dataAttr`,缺省 `data-t`);该 actionId 无文本返回 undefined。 */
113
+ readDataText(actionId: string): string | undefined;
114
+ /** 订阅按钮激活(click/keydown 由宿主适配);返回解绑函数(幂等,重复调用无害)。 */
115
+ onActivate(actionId: string, handler: () => void): () => void;
116
+ }
117
+ /** 冻结签名:`bindCopyAction(port: CopyActionHostPort, ports: CopyPorts, opts?: CopyTextOptions): { dispose(): void }`。
118
+ *
119
+ * **语义(FX-17③,逐条定死)**:
120
+ * 1. `port.listActionIds()` 是唯一 id 来源;对每个 id 调 `port.onActivate(actionId, handler)`;
121
+ * 2. `handler` 在**激活时**读 `port.readDataText(actionId)`(与旧侧 `this.dataset.t` 同时机),
122
+ * 返回 `undefined` → 本次跳过(不抛错、不产 toast;非复制按钮即由此跳过);否则 `void copyText(text, ports, opts)`;
123
+ * 3. 失败徽章仍由 `copyText` 经 `ports.toast` 挂载(FX-3②),binder 不另出反馈;
124
+ * 4. `dispose()` 解绑**全部**已订阅 id,**幂等**(重复调用无害)。 */
125
+ export type BindCopyAction = (port: CopyActionHostPort, ports: CopyPorts, opts?: CopyTextOptions) => {
126
+ dispose(): void;
127
+ };
128
+ export interface SharedHelpersInput {
129
+ /** 类名前缀;缺省既有 `STYLE_PREFIX`(`ilife-`)。 */
130
+ readonly prefix?: string;
131
+ /** 复制文本数据属性名;缺省 `DEFAULT_DATA_ATTR`(`data-t`,`renderActionBar` 渲染期写入)。
132
+ * 覆盖**只影响产出 helpers JS 的选择器**;渲染端恒写 `DEFAULT_DATA_ATTR`(不一致由调用方自负,见文档 §3.3「`dataAttr` 覆盖口径」)。 */
133
+ readonly dataAttr?: string;
134
+ }
135
+ /** 复制文本的默认承载属性名(缺省 `SharedHelpersInput.dataAttr`):渲染端与 `CopyActionHostPort`
136
+ * 适配端必须用**同一个**名字——它是「渲染期写入 → 激活期读回」的唯一约定,故冻结为常量而非散文。 */
137
+ export declare const DEFAULT_DATA_ATTR: "data-t";
138
+ /** `buildSharedHelpersJs`/`buildChartsHelpersJs` 的**产出内容契约(FX-18,机读)**——
139
+ * dist 纯度扫描(`test/contract-signatures.test.mjs`)与 §6.3 验收条文**必须**与本表逐项一致:
140
+ *
141
+ * - `selfContained`:自包含,不依赖外部脚本/其它全局,不 import 任何东西;
142
+ * - `idempotent`:可重复注入(同页面注入两次,行为与注入一次等价);
143
+ * - `domAllowed`:**允许**页面侧 DOM API(`document.*` 读取/事件绑定)——共享 JS 是页面侧代码;
144
+ * - `forbidGlobalAssignment`:**禁止**向 `window.<id>`/`globalThis.<id>` **赋值**(不得新增隐式全局,AC-7);
145
+ * - `forbidNodeBuiltins`:禁止 `node:` 内建(浏览器侧资产必须 browser-safe,边界规则 7)。
146
+ *
147
+ * 注意:本表约束的是**产出的 JS 文本**,不是 base-paint 自身运行时——`src/spec/*.ts` 与
148
+ * base-paint 的运行时代码仍**不得**读 `window.`/`document.`(AC-7;DOM 只经端口或产出文本)。 */
149
+ export declare const SHARED_HELPERS_JS_RULE: Readonly<{
150
+ readonly selfContained: true;
151
+ readonly idempotent: true;
152
+ readonly domAllowed: true;
153
+ readonly forbidGlobalAssignment: true;
154
+ readonly forbidNodeBuiltins: true;
155
+ }>;
156
+ /** 冻结签名:`buildSharedHelpersJs(input?: SharedHelpersInput): string`。
157
+ * 恒返回非空 JS 文本(IIFE/显式挂载点,不得引入隐式全局,AC-7);产出内容受
158
+ * `SHARED_HELPERS_JS_RULE` 约束(FX-18);空串视为实现缺陷 → `fillTemplate` 抛 `asset-missing`。 */
159
+ export type BuildSharedHelpersJs = (input?: SharedHelpersInput) => string;
160
+ export declare const TOAST_ICONS: readonly ["copy", "ok", "warn", "danger", "info"];
161
+ export type ToastIcon = (typeof TOAST_ICONS)[number];
162
+ export declare const TOAST_DEFAULTS: Readonly<{
163
+ readonly timeoutMs: 4500;
164
+ readonly maxStack: 5;
165
+ readonly mobileMaxStack: 3;
166
+ readonly mobileMaxPx: 820;
167
+ readonly gapPx: 8;
168
+ readonly role: "status";
169
+ readonly ariaLive: "polite";
170
+ readonly defaultIcon: "copy";
171
+ }>;
172
+ export interface ToastBadge {
173
+ readonly text: string;
174
+ readonly type: 'ok' | 'warn' | 'danger';
175
+ }
176
+ /** 操作按钮只带 actionId:HTML 里零内联脚本(零注入面)。 */
177
+ export interface ToastAction {
178
+ readonly label: string;
179
+ readonly actionId: string;
180
+ }
181
+ export interface ToastInput {
182
+ readonly msg: string;
183
+ readonly detail?: string;
184
+ readonly icon?: ToastIcon;
185
+ readonly badge?: ToastBadge;
186
+ readonly actions?: readonly ToastAction[];
187
+ readonly count?: string;
188
+ readonly lines?: readonly string[];
189
+ readonly code?: string;
190
+ readonly timeoutMs?: number;
191
+ readonly maxStack?: number;
192
+ }
193
+ /** 冻结签名:`renderToast(input: ToastInput): string`。 */
194
+ export type RenderToast = (input: ToastInput) => string;
195
+ export interface ToastHostPort {
196
+ mount(html: string): {
197
+ remove(): void;
198
+ };
199
+ }
200
+ export interface ToastController {
201
+ show(input: ToastInput): void;
202
+ /** 清空栈(旧 `__hmToastFlush` 的显式替代,不落全局)。 */
203
+ flush(): void;
204
+ dispose(): void;
205
+ }
206
+ /** 冻结签名:`createToastController(port: ToastHostPort): ToastController`。 */
207
+ export type CreateToastController = (port: ToastHostPort) => ToastController;
208
+ export declare const ACTION_BAR_KINDS: readonly ["primary", "red", "ghost"];
209
+ export type ActionBarKind = (typeof ACTION_BAR_KINDS)[number];
210
+ export interface ActionBarButton {
211
+ readonly label: string;
212
+ readonly kind: ActionBarKind;
213
+ readonly actionId: string;
214
+ }
215
+ export interface CopyButtonInput {
216
+ /** **必填(FX-17①)**:按钮的 `actionId`——`renderActionBar` 的复制数据/日志取
217
+ * `COPY_ACTION_IDS.actionBar.copyData`/`copyLog`(或调用方自定,须页面内唯一),
218
+ * 渲染期写入 `ACTION_ID_ATTR` 属性,供 `CopyActionHostPort.listActionIds()` 发现。
219
+ * 空串/非字符串/与同一次渲染内其它按钮重复 → 抛 `ControlsError` code `bad-input`。 */
220
+ readonly actionId: string;
221
+ /** 缺省 `ACTION_BAR_DEFAULTS.copyDataLabel`/`copyLogLabel`(按用途)。 */
222
+ readonly label?: string;
223
+ /** 渲染期已序列化的文本(走 buildDataText/buildLogText),存 `data-t`,零注入面。 */
224
+ readonly text?: string;
225
+ readonly format?: CopyFormat;
226
+ }
227
+ export interface ActionBarInput {
228
+ readonly buttons?: readonly ActionBarButton[];
229
+ readonly copyData?: CopyButtonInput;
230
+ readonly copyLog?: CopyButtonInput;
231
+ }
232
+ export declare const ACTION_BAR_DEFAULTS: Readonly<{
233
+ readonly copyDataLabel: "复制数据";
234
+ readonly copyLogLabel: "复制日志";
235
+ readonly ghostOwnRow: true;
236
+ readonly evenRowPairs: 2;
237
+ readonly minHeightPx: 40;
238
+ readonly fontSizePx: 12;
239
+ readonly fontWeight: 600;
240
+ readonly ghostBorderAlpha: 0.38;
241
+ }>;
242
+ /** 冻结签名:`renderActionBar(input: ActionBarInput): string`。 */
243
+ export type RenderActionBar = (input: ActionBarInput) => string;
244
+ export declare const STATUS_KINDS: readonly ["ok", "warn", "danger", "empty"];
245
+ export type StatusKind = (typeof STATUS_KINDS)[number];
246
+ export declare const STATUS_DEFAULT_TEXT: Readonly<{
247
+ readonly ok: "成功";
248
+ readonly warn: "警告";
249
+ readonly danger: "失败";
250
+ readonly empty: "无数据";
251
+ }>;
252
+ export interface StatusBadgeInput {
253
+ readonly status: StatusKind;
254
+ readonly text?: string;
255
+ }
256
+ /** 非法 status 白名单降级 empty(不抛错,防无样式徽章)。 */
257
+ export type RenderStatusBadge = (input: StatusBadgeInput) => string;
258
+ export interface EmptyStateInput {
259
+ readonly icon?: string;
260
+ readonly text: string;
261
+ readonly hint?: string;
262
+ /** 受信 HTML 透传:调用方负责其内容安全(不转义)。 */
263
+ readonly actionHtml?: string;
264
+ }
265
+ export type RenderEmptyState = (input: EmptyStateInput) => string;
266
+ export interface ErrorReceiptInput {
267
+ readonly message: string;
268
+ readonly retryPrompt?: string;
269
+ /** 显式传入;不得读旧全局 `__hmPayload` 兜底(AC-7)。 */
270
+ readonly dataText?: string;
271
+ readonly logText?: string;
272
+ /** 复制数据按钮的 `actionId`;缺省 `COPY_ACTION_IDS.errorReceipt.copyData`(FX-17②)。 */
273
+ readonly dataActionId?: string;
274
+ /** 复制日志按钮的 `actionId`;缺省 `COPY_ACTION_IDS.errorReceipt.copyLog`。 */
275
+ readonly logActionId?: string;
276
+ }
277
+ /** 缺 dataText/logText → 不渲染对应复制按钮(容错,不抛错)。 */
278
+ export type RenderErrorReceipt = (input: ErrorReceiptInput) => string;
279
+ export declare const CONTROLS_ERROR_CODES: readonly ["bad-input", "bad-format"];
280
+ export type ControlsErrorCode = (typeof CONTROLS_ERROR_CODES)[number];
281
+ export interface ControlsErrorShape {
282
+ readonly name: 'ControlsError';
283
+ readonly code: ControlsErrorCode;
284
+ readonly message: string;
285
+ }
286
+ export declare const CONTROL_NAMES: readonly ["toast", "copyText", "actionBar", "statusBadge", "emptyState", "errorReceipt"];
287
+ export type ControlName = (typeof CONTROL_NAMES)[number];
288
+ /** 全部控件在纯 HTML(无 DSH 宿主)下可用;`needsRuntime` 只表示需浏览器能力。 */
289
+ export declare const CONTROLS_HOST_REQUIREMENT: "none";
290
+ export interface ControlAvailability {
291
+ /** 纯静态即可产出 HTML(Node 侧也可)。 */
292
+ readonly staticHtml: boolean;
293
+ /** 需浏览器运行时(DOM/Clipboard),端口由调用方显式注入。 */
294
+ readonly needsRuntime: boolean;
295
+ readonly runtimePort: 'CopyPorts' | 'ToastHostPort' | 'CopyPorts+ToastHostPort' | null;
296
+ }
297
+ export declare const CONTROL_AVAILABILITY: Readonly<{
298
+ readonly toast: {
299
+ readonly staticHtml: true;
300
+ readonly needsRuntime: true;
301
+ readonly runtimePort: "ToastHostPort";
302
+ };
303
+ readonly copyText: {
304
+ readonly staticHtml: false;
305
+ readonly needsRuntime: true;
306
+ readonly runtimePort: "CopyPorts";
307
+ };
308
+ readonly actionBar: {
309
+ readonly staticHtml: true;
310
+ readonly needsRuntime: true;
311
+ readonly runtimePort: "CopyPorts+ToastHostPort";
312
+ };
313
+ readonly statusBadge: {
314
+ readonly staticHtml: true;
315
+ readonly needsRuntime: false;
316
+ readonly runtimePort: null;
317
+ };
318
+ readonly emptyState: {
319
+ readonly staticHtml: true;
320
+ readonly needsRuntime: false;
321
+ readonly runtimePort: null;
322
+ };
323
+ readonly errorReceipt: {
324
+ readonly staticHtml: true;
325
+ readonly needsRuntime: true;
326
+ readonly runtimePort: "CopyPorts+ToastHostPort";
327
+ };
328
+ }>;
329
+ //# sourceMappingURL=controls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controls.d.ts","sourceRoot":"","sources":["../../src/spec/controls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ /** base-paint/spec/controls:控件层契约(#76 冻结面)。
2
+ *
3
+ * 「无宿主(纯 HTML)可用」(AC-16):本层全部是**纯函数产 HTML 字符串** +
4
+ * **显式端口**(CopyPorts/ToastHostPort),不读浏览器全局对象(AC-7),
5
+ * 不引 `node:`(浏览器侧资产 browser-safe)。纯静态可用的控件零运行时;
6
+ * 需交互的控件由调用方注入端口,在**普通 .html 文件**里即可跑(不依赖 DSH 宿主)。
7
+ *
8
+ * #76/#77/#90 共用同一签名:本文件是唯一真相源,三票不得各定一套。
9
+ */
10
+ /** AC-14:HTML 转义集固定五字符(技能侧本地副本一律删除,执行归 #74/#79)。 */
11
+ export const ESCAPE_HTML_CHARS = ['&', '<', '>', '"', "'"];
12
+ export const ESCAPE_HTML_ENTITIES = Object.freeze({
13
+ '&': '&amp;',
14
+ '<': '&lt;',
15
+ '>': '&gt;',
16
+ '"': '&quot;',
17
+ "'": '&#39;',
18
+ });
19
+ /* ── 复制双通道(Q13/AC-16①) ───────────────────────────── */
20
+ /** 通道 1 = 浏览器 Clipboard API;通道 2 = 兜底(选区 + execCommand 等)。 */
21
+ export const COPY_CHANNELS = ['clipboard', 'fallback'];
22
+ export const COPY_TEXT_DEFAULTS = Object.freeze({
23
+ emptyTextShortCircuit: true,
24
+ /** 失败徽章恒在:失败态经 `ports.toast.mount` 挂载,不受 `opts.silent` 影响。 */
25
+ failBadgeAlwaysOn: true,
26
+ okMessage: '已复制',
27
+ okDetail: '粘贴给 AI',
28
+ failMessage: '复制失败',
29
+ failDetail: '长按选择文本手动复制',
30
+ });
31
+ /* ── 复制接线(FX-3/FX-17/#90 可直接使用) ────────────────── */
32
+ /** 复制按钮上承载 `actionId` 的属性名(FX-17④,冻结):`renderActionBar`/`renderErrorReceipt`
33
+ * /HELP 壳**渲染期**写入该属性;调用方的 `CopyActionHostPort.listActionIds()` 据此发现 id 集合。
34
+ * 文本仍走 `SharedHelpersInput.dataAttr`(缺省 `DEFAULT_DATA_ATTR = 'data-t'`)——id 与文本是两个属性,不得混用。 */
35
+ export const ACTION_ID_ATTR = 'data-action-id';
36
+ /** 复制按钮的 actionId 冻结表(FX-17②):`actionBar` 的复制数据/日志 + `errorReceipt` 的两个按钮。
37
+ *
38
+ * **与旧侧 `data-t` 口径的偏离(显式声明)**:旧侧复制按钮**无 id**——激活靠内联脚本
39
+ * `onclick="copyText(this.dataset.t)"`(`base.js:311,648-649`),只有 `data-t` 一个属性。
40
+ * 新契约禁内联脚本(AC-7 零注入面),激活一律经 `bindCopyAction` 事件委派 → **必须**冻结 id 集合;
41
+ * 旧侧 `data-t` 的文本载体语义**保留**(属性名 = `SharedHelpersInput.dataAttr`,缺省 `DEFAULT_DATA_ATTR = 'data-t'`)。
42
+ *
43
+ * 约定:全部 base-paint actionId(含 `HELP_COPY_ACTIONS`)在**同一页面内唯一**;调用方可覆盖
44
+ * `ErrorReceiptInput.dataActionId`/`logActionId`,覆盖值同样必须唯一且可被 `listActionIds()` 发现。
45
+ * **例外(#78 记账,R27)**:HELP 壳按 §3.5.3 字面把三个复制目标的 actionId **逐字**写入**每张**场景卡
46
+ * (多场景卡必然页内重复,且 §3.5.3 禁「另定通配约定」)。歧义由宿主适配端解决——
47
+ * `readDataText(actionId)` 在激活处理内**同步**调用(§3.3 语义 2),适配端按「最近一次激活元素」关联。
48
+ */
49
+ export const COPY_ACTION_IDS = Object.freeze({
50
+ actionBar: { copyData: 'ilife-copy-data', copyLog: 'ilife-copy-log' },
51
+ errorReceipt: { copyData: 'ilife-error-copy-data', copyLog: 'ilife-error-copy-log' },
52
+ });
53
+ /** 复制文本的默认承载属性名(缺省 `SharedHelpersInput.dataAttr`):渲染端与 `CopyActionHostPort`
54
+ * 适配端必须用**同一个**名字——它是「渲染期写入 → 激活期读回」的唯一约定,故冻结为常量而非散文。 */
55
+ export const DEFAULT_DATA_ATTR = 'data-t';
56
+ /** `buildSharedHelpersJs`/`buildChartsHelpersJs` 的**产出内容契约(FX-18,机读)**——
57
+ * dist 纯度扫描(`test/contract-signatures.test.mjs`)与 §6.3 验收条文**必须**与本表逐项一致:
58
+ *
59
+ * - `selfContained`:自包含,不依赖外部脚本/其它全局,不 import 任何东西;
60
+ * - `idempotent`:可重复注入(同页面注入两次,行为与注入一次等价);
61
+ * - `domAllowed`:**允许**页面侧 DOM API(`document.*` 读取/事件绑定)——共享 JS 是页面侧代码;
62
+ * - `forbidGlobalAssignment`:**禁止**向 `window.<id>`/`globalThis.<id>` **赋值**(不得新增隐式全局,AC-7);
63
+ * - `forbidNodeBuiltins`:禁止 `node:` 内建(浏览器侧资产必须 browser-safe,边界规则 7)。
64
+ *
65
+ * 注意:本表约束的是**产出的 JS 文本**,不是 base-paint 自身运行时——`src/spec/*.ts` 与
66
+ * base-paint 的运行时代码仍**不得**读 `window.`/`document.`(AC-7;DOM 只经端口或产出文本)。 */
67
+ export const SHARED_HELPERS_JS_RULE = Object.freeze({
68
+ selfContained: true,
69
+ idempotent: true,
70
+ domAllowed: true,
71
+ forbidGlobalAssignment: true,
72
+ forbidNodeBuiltins: true,
73
+ });
74
+ /* ── toast(堆叠提示) ──────────────────────────────────── */
75
+ export const TOAST_ICONS = ['copy', 'ok', 'warn', 'danger', 'info'];
76
+ export const TOAST_DEFAULTS = Object.freeze({
77
+ timeoutMs: 4500,
78
+ maxStack: 5,
79
+ mobileMaxStack: 3,
80
+ mobileMaxPx: 820,
81
+ gapPx: 8,
82
+ role: 'status',
83
+ ariaLive: 'polite',
84
+ defaultIcon: 'copy',
85
+ });
86
+ /* ── actionBar(复制三件套) ─────────────────────────────── */
87
+ export const ACTION_BAR_KINDS = ['primary', 'red', 'ghost'];
88
+ export const ACTION_BAR_DEFAULTS = Object.freeze({
89
+ copyDataLabel: '复制数据',
90
+ copyLogLabel: '复制日志',
91
+ ghostOwnRow: true,
92
+ evenRowPairs: 2,
93
+ minHeightPx: 40,
94
+ fontSizePx: 12,
95
+ fontWeight: 600,
96
+ ghostBorderAlpha: 0.38,
97
+ });
98
+ /* ── 状态三控件 ────────────────────────────────────────── */
99
+ export const STATUS_KINDS = ['ok', 'warn', 'danger', 'empty'];
100
+ export const STATUS_DEFAULT_TEXT = Object.freeze({
101
+ ok: '成功',
102
+ warn: '警告',
103
+ danger: '失败',
104
+ empty: '无数据',
105
+ });
106
+ export const CONTROLS_ERROR_CODES = ['bad-input', 'bad-format'];
107
+ /* ── 无宿主可用性边界(AC-16②) ────────────────────────── */
108
+ export const CONTROL_NAMES = ['toast', 'copyText', 'actionBar', 'statusBadge', 'emptyState', 'errorReceipt'];
109
+ /** 全部控件在纯 HTML(无 DSH 宿主)下可用;`needsRuntime` 只表示需浏览器能力。 */
110
+ export const CONTROLS_HOST_REQUIREMENT = 'none';
111
+ export const CONTROL_AVAILABILITY = Object.freeze({
112
+ toast: { staticHtml: true, needsRuntime: true, runtimePort: 'ToastHostPort' },
113
+ copyText: { staticHtml: false, needsRuntime: true, runtimePort: 'CopyPorts' },
114
+ actionBar: { staticHtml: true, needsRuntime: true, runtimePort: 'CopyPorts+ToastHostPort' },
115
+ statusBadge: { staticHtml: true, needsRuntime: false, runtimePort: null },
116
+ emptyState: { staticHtml: true, needsRuntime: false, runtimePort: null },
117
+ errorReceipt: { staticHtml: true, needsRuntime: true, runtimePort: 'CopyPorts+ToastHostPort' },
118
+ });
119
+ //# sourceMappingURL=controls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controls.js","sourceRoot":"","sources":["../../src/spec/controls.ts"],"names":[],"mappings":"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"}