@manohub/app-kit 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.
Files changed (103) hide show
  1. package/CONTRACT.md +592 -0
  2. package/README.md +27 -0
  3. package/dist/atoms/app-button.d.ts +90 -0
  4. package/dist/atoms/app-button.js +74 -0
  5. package/dist/atoms/app-checkbox.d.ts +86 -0
  6. package/dist/atoms/app-checkbox.js +78 -0
  7. package/dist/atoms/app-icon-button.d.ts +79 -0
  8. package/dist/atoms/app-icon-button.js +54 -0
  9. package/dist/atoms/app-input.d.ts +118 -0
  10. package/dist/atoms/app-input.js +83 -0
  11. package/dist/atoms/app-layout.d.ts +348 -0
  12. package/dist/atoms/app-layout.js +102 -0
  13. package/dist/atoms/app-notice.d.ts +90 -0
  14. package/dist/atoms/app-notice.js +59 -0
  15. package/dist/atoms/app-query-state.d.ts +191 -0
  16. package/dist/atoms/app-query-state.js +161 -0
  17. package/dist/atoms/app-radio-card.d.ts +80 -0
  18. package/dist/atoms/app-radio-card.js +72 -0
  19. package/dist/atoms/app-search-box.d.ts +80 -0
  20. package/dist/atoms/app-search-box.js +64 -0
  21. package/dist/atoms/app-select.d.ts +106 -0
  22. package/dist/atoms/app-select.js +74 -0
  23. package/dist/atoms/app-switch.d.ts +72 -0
  24. package/dist/atoms/app-switch.js +66 -0
  25. package/dist/atoms/app-textarea.d.ts +89 -0
  26. package/dist/atoms/app-textarea.js +61 -0
  27. package/dist/atoms/app-tooltip.d.ts +70 -0
  28. package/dist/atoms/app-tooltip.js +48 -0
  29. package/dist/atoms/atoms.css +679 -0
  30. package/dist/atoms/state-illustration.d.ts +21 -0
  31. package/dist/atoms/state-illustration.js +101 -0
  32. package/dist/components/app-badge.d.ts +72 -0
  33. package/dist/components/app-badge.js +40 -0
  34. package/dist/components/app-dialog.d.ts +164 -0
  35. package/dist/components/app-dialog.js +121 -0
  36. package/dist/components/app-filter.d.ts +173 -0
  37. package/dist/components/app-filter.js +200 -0
  38. package/dist/components/app-form.d.ts +446 -0
  39. package/dist/components/app-form.js +159 -0
  40. package/dist/components/app-pagination.d.ts +78 -0
  41. package/dist/components/app-pagination.js +57 -0
  42. package/dist/components/app-panel.d.ts +399 -0
  43. package/dist/components/app-panel.js +213 -0
  44. package/dist/components/app-section.d.ts +68 -0
  45. package/dist/components/app-section.js +28 -0
  46. package/dist/components/app-steps.d.ts +115 -0
  47. package/dist/components/app-steps.js +108 -0
  48. package/dist/components/app-table.d.ts +415 -0
  49. package/dist/components/app-table.js +479 -0
  50. package/dist/components/app-tabs.d.ts +58 -0
  51. package/dist/components/app-tabs.js +54 -0
  52. package/dist/components/app-tree.d.ts +273 -0
  53. package/dist/components/app-tree.js +222 -0
  54. package/dist/components/components.css +597 -0
  55. package/dist/composables/use-client-pagination.d.ts +39 -0
  56. package/dist/composables/use-client-pagination.js +29 -0
  57. package/dist/entry/create-query-client.d.ts +8 -0
  58. package/dist/entry/create-query-client.js +14 -0
  59. package/dist/entry/create-sub-app.d.ts +45 -0
  60. package/dist/entry/create-sub-app.js +110 -0
  61. package/dist/entry/index.d.ts +4 -0
  62. package/dist/entry/index.js +12 -0
  63. package/dist/entry/initial-guard.d.ts +12 -0
  64. package/dist/entry/initial-guard.js +23 -0
  65. package/dist/index.d.ts +37 -0
  66. package/dist/index.js +67 -0
  67. package/dist/providers/setup-i18n.d.ts +19 -0
  68. package/dist/providers/setup-i18n.js +24 -0
  69. package/dist/services/app-container.d.ts +15 -0
  70. package/dist/services/app-container.js +7 -0
  71. package/dist/services/app-context.d.ts +4 -0
  72. package/dist/services/app-context.js +17 -0
  73. package/dist/services/index.d.ts +5 -0
  74. package/dist/services/loading.d.ts +16 -0
  75. package/dist/services/loading.js +27 -0
  76. package/dist/services/message-box.d.ts +84 -0
  77. package/dist/services/message-box.js +65 -0
  78. package/dist/services/modal.d.ts +51 -0
  79. package/dist/services/modal.js +51 -0
  80. package/dist/services/notify.d.ts +24 -0
  81. package/dist/services/notify.js +22 -0
  82. package/dist/shell/AppShell.d.ts +139 -0
  83. package/dist/shell/AppShell.js +171 -0
  84. package/dist/shell/shell.css +153 -0
  85. package/dist/styles/farris-bridge.css +129 -0
  86. package/dist/styles/index.css +16 -0
  87. package/dist/styles/markdown.css +85 -0
  88. package/dist/styles/reset.css +74 -0
  89. package/dist/styles/tokens.css +111 -0
  90. package/lint/__tests__/fixtures/clean-src/styles.css +14 -0
  91. package/lint/__tests__/fixtures/clean-src/views/good-page.tsx +15 -0
  92. package/lint/__tests__/fixtures/violations-src/styles.css +18 -0
  93. package/lint/__tests__/fixtures/violations-src/views/bad-page.tsx +38 -0
  94. package/lint/__tests__/fixtures/violations-src/views/no-shell-page.tsx +4 -0
  95. package/lint/__tests__/guardrails.spec.mjs +144 -0
  96. package/lint/component-audit.mjs +131 -0
  97. package/lint/guardrails.config.schema.json +74 -0
  98. package/lint/pre-commit.sample +26 -0
  99. package/lint/run-all.mjs +59 -0
  100. package/lint/shared.mjs +347 -0
  101. package/lint/structure-audit.mjs +254 -0
  102. package/lint/style-audit.mjs +200 -0
  103. package/package.json +78 -0
@@ -0,0 +1,348 @@
1
+ import { type PropType, type SlotsType, type VNodeChild } from 'vue';
2
+ /**
3
+ * 布局间距档:**只开放令牌档位,不开放任意 px**(`none/sm/md/lg/xl` → `0 / --ui-space-1/2/3/4`)。
4
+ *
5
+ * 间距一旦可以随便写,同一个页面里就会出现 6/7/9/10/14… 这些"看着差不多"的值,
6
+ * 而它们在不同缩放档/不同人手里会继续分叉 —— 这正是应用侧 CSS 只允许写布局的同一理由。
7
+ */
8
+ export type AppLayoutGap = 'none' | 'sm' | 'md' | 'lg' | 'xl';
9
+ /** 轴向对齐(`align-items`):主轴方向的排布用 `justify` */
10
+ export type AppLayoutAlign = 'start' | 'center' | 'end' | 'baseline' | 'stretch';
11
+ /** 主轴排布(`justify-content`):`between` = 两端对齐(左文右操作这种) */
12
+ export type AppLayoutJustify = 'start' | 'center' | 'end' | 'between';
13
+ /**
14
+ * 栅格列数**上限**(传了它才切成等分栅格;实际列数还受最小列宽约束,窄了会自动减列)。
15
+ */
16
+ export type AppLayoutColumns = 1 | 2 | 3 | 4;
17
+ /** 栅格单元跨格数:不应超过所在行的 `columns`(超了 auto-fit 会为它多开轨道) */
18
+ export type AppLayoutSpan = 1 | 2 | 3 | 4;
19
+ /**
20
+ * 列(`AppLayout.Column`)—— **水平容器**:一行里的一格,内容**左右排**。
21
+ *
22
+ * ```tsx
23
+ * // 标签 + 值(摘要、只读信息)
24
+ * <AppLayout.Column gap="sm"><span>缓存方式</span><span>按需缓存</span></AppLayout.Column>
25
+ *
26
+ * // 一格里要上下两行(标签在上、值在下)→ 列里再放一条竖排的 Row
27
+ * <AppLayout.Column gap="sm">
28
+ * <span>缓存方式</span>
29
+ * <AppLayout.Row gap="none"><span>按需缓存</span></AppLayout.Row>
30
+ * </AppLayout.Column>
31
+ * ```
32
+ *
33
+ * - 作为 `Row columns={n}` 的子项时它同时是**栅格单元**:`span` 决定占几格(默认 1)。
34
+ * - 默认 `align-items: center`(徽标 / 控件与文本齐中线);贴顶写 `align="start"`,要齐宽写 `align="stretch"`。
35
+ * - 内容宽了要折行(表格单元格里的「按钮 + 摘要」):`wrap`。
36
+ * - **不要拿它当竖排容器用**(`.ak-column` 里堆一串块级元素靠的是块级默认流,不是它的本意):
37
+ * 要一条一条往下堆,用 `AppLayout.Row`,或交给父容器的间距。
38
+ *
39
+ * 方向为什么与 CSS 属性名相反(`.ak-column` = `flex-direction: row`):见 `AppLayout.Row` 的「方向口径」。
40
+ */
41
+ export declare const AppLayoutColumn: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
42
+ /** 单元内间距档(默认 `md` 8px;要贴紧写 `none`) */
43
+ gap: {
44
+ type: PropType<AppLayoutGap>;
45
+ default: string;
46
+ };
47
+ /** 单元内交叉轴对齐;不传即 `center`(内容齐中线) */
48
+ align: {
49
+ type: PropType<AppLayoutAlign>;
50
+ default: undefined;
51
+ };
52
+ /** 单元内主轴排布;不传即 `start` */
53
+ justify: {
54
+ type: PropType<AppLayoutJustify>;
55
+ default: undefined;
56
+ };
57
+ /** 允许折行:内容宽过容器时下一项换行(窄格子里的「按钮 + 摘要」靠它不撑破外层) */
58
+ wrap: {
59
+ type: BooleanConstructor;
60
+ default: boolean;
61
+ };
62
+ /** 跨格数(默认 1);不要超过所在行的 `columns` */
63
+ span: {
64
+ type: PropType<AppLayoutSpan>;
65
+ default: number;
66
+ };
67
+ }>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
68
+ /** 单元内间距档(默认 `md` 8px;要贴紧写 `none`) */
69
+ gap: {
70
+ type: PropType<AppLayoutGap>;
71
+ default: string;
72
+ };
73
+ /** 单元内交叉轴对齐;不传即 `center`(内容齐中线) */
74
+ align: {
75
+ type: PropType<AppLayoutAlign>;
76
+ default: undefined;
77
+ };
78
+ /** 单元内主轴排布;不传即 `start` */
79
+ justify: {
80
+ type: PropType<AppLayoutJustify>;
81
+ default: undefined;
82
+ };
83
+ /** 允许折行:内容宽过容器时下一项换行(窄格子里的「按钮 + 摘要」靠它不撑破外层) */
84
+ wrap: {
85
+ type: BooleanConstructor;
86
+ default: boolean;
87
+ };
88
+ /** 跨格数(默认 1);不要超过所在行的 `columns` */
89
+ span: {
90
+ type: PropType<AppLayoutSpan>;
91
+ default: number;
92
+ };
93
+ }>> & Readonly<{}>, {
94
+ span: AppLayoutSpan;
95
+ wrap: boolean;
96
+ justify: AppLayoutJustify;
97
+ align: AppLayoutAlign;
98
+ gap: AppLayoutGap;
99
+ }, SlotsType<{
100
+ default?: () => VNodeChild;
101
+ }>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
102
+ /**
103
+ * 行(`AppLayout.Row`)—— **竖排容器**(行与行是上下关系):行一条一条往下堆。
104
+ *
105
+ * | 形态 | 触发 | 行为 | 典型场景 |
106
+ * |---|---|---|---|
107
+ * | **竖排** | 不传 `columns` | `flex-direction: column`:子项一条一行往下排 | 校验结果、摘要字段、逐条说明 |
108
+ * | **一行分 n 列** | 传 `columns` | `grid`:这一行的子项并排(列数上限 + 窄了自动减列) | 并排字段/卡片(配 `Column` 的 `span` 做 2:1) |
109
+ *
110
+ * ## 方向口径(别再改回去)
111
+ *
112
+ * 名字说的是"**它排什么**",不是"它自己长什么样":`Row` 排的是**行**(行与行上下相邻 ⇒ 自己竖着堆),
113
+ * `Column` 排的是**列**(列与列左右相邻 ⇒ 自己横着排)。于是 CSS 里 `.ak-row` 是 `flex-direction: column`、
114
+ * `.ak-column` 是 `row` —— **与 CSS 命名直觉正好相反**,这是刻意的(两种读法都自洽,判据是"读表格":
115
+ * `<tr>` 一行行往下堆、一行里的格子左右并排)。写代码时按"**我要排行还是排列**"想:往下堆用 `Row`,
116
+ * 横着排一组(徽标+文本 / 标签+值 / 控件+按钮)用 `Column`。
117
+ *
118
+ * - `columns` 是**列数上限**(1/2/3/4;不传 = 纯竖排),`minColumnWidth` 是单元最小宽度
119
+ * (默认取令牌 `--ui-grid-column-min` 260):两者一起决定实际列数 —— **宽容器最多 N 列,窄了自动减列**。
120
+ * 实测(Chrome,N=2 / 最小 260):1400→2、900→2、600→2、500→1 列。
121
+ * - `justify` / `align`:竖排时主轴是纵向、交叉轴是水平(`align` 不传即 CSS 默认的 stretch,子项齐宽)。
122
+ * - 栅格子项请用 `AppLayout.Column`;竖排时子项随意,但"一条里的横排内容"要包一层 `Column`。
123
+ *
124
+ * 实现说明(栅格形态为什么不用"固定 N 列 + 媒体查询"):固定份数在宽容器里会挤成很窄的多列;
125
+ * 而断点式媒体查询与**容器宽度**无关(本仓页面都在弹窗/分栏里,视口宽度根本代表不了容器)。
126
+ * 故用 auto-fit + minmax,track 下限取 `max(最小列宽, 按上限等分)` —— 上限与回落一句话同时成立。
127
+ *
128
+ * @example 竖排:一条一行(行内一列横着排)
129
+ * <AppLayout.Row gap="lg">
130
+ * <AppLayout.Column gap="sm"><AppBadge tone="success" shape="soft">通过</AppBadge><span>编码唯一性</span></AppLayout.Column>
131
+ * <AppLayout.Column gap="sm"><AppBadge tone="success" shape="soft">通过</AppBadge><span>列结构一致性</span></AppLayout.Column>
132
+ * </AppLayout.Row>
133
+ *
134
+ * @example 一行分 n 列 + 跨格
135
+ * <AppLayout.Row columns={2} gap="lg">
136
+ * <AppLayout.Column gap="sm">…</AppLayout.Column>
137
+ * <AppLayout.Column gap="sm">…</AppLayout.Column>
138
+ * <AppLayout.Column span={2}>整行内容</AppLayout.Column>
139
+ * </AppLayout.Row>
140
+ */
141
+ export declare const AppLayoutRow: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
142
+ /** 行间距档(默认 `md` 8px;要贴紧写 `none`) */
143
+ gap: {
144
+ type: PropType<AppLayoutGap>;
145
+ default: string;
146
+ };
147
+ /** 交叉轴对齐(竖排时是水平方向);不传即 CSS 默认 `stretch`(子项齐宽) */
148
+ align: {
149
+ type: PropType<AppLayoutAlign>;
150
+ default: undefined;
151
+ };
152
+ /** 主轴排布(竖排时是纵向);不传即 `start` */
153
+ justify: {
154
+ type: PropType<AppLayoutJustify>;
155
+ default: undefined;
156
+ };
157
+ /** 列数上限;**不传 = 纯竖排**,传了 = 一行分 n 列(等分栅格) */
158
+ columns: {
159
+ type: PropType<AppLayoutColumns>;
160
+ default: undefined;
161
+ };
162
+ /** 单元最小宽度(px,栅格形态);缺省取令牌 `--ui-grid-column-min`(260) */
163
+ minColumnWidth: {
164
+ type: NumberConstructor;
165
+ default: undefined;
166
+ };
167
+ }>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
168
+ /** 行间距档(默认 `md` 8px;要贴紧写 `none`) */
169
+ gap: {
170
+ type: PropType<AppLayoutGap>;
171
+ default: string;
172
+ };
173
+ /** 交叉轴对齐(竖排时是水平方向);不传即 CSS 默认 `stretch`(子项齐宽) */
174
+ align: {
175
+ type: PropType<AppLayoutAlign>;
176
+ default: undefined;
177
+ };
178
+ /** 主轴排布(竖排时是纵向);不传即 `start` */
179
+ justify: {
180
+ type: PropType<AppLayoutJustify>;
181
+ default: undefined;
182
+ };
183
+ /** 列数上限;**不传 = 纯竖排**,传了 = 一行分 n 列(等分栅格) */
184
+ columns: {
185
+ type: PropType<AppLayoutColumns>;
186
+ default: undefined;
187
+ };
188
+ /** 单元最小宽度(px,栅格形态);缺省取令牌 `--ui-grid-column-min`(260) */
189
+ minColumnWidth: {
190
+ type: NumberConstructor;
191
+ default: undefined;
192
+ };
193
+ }>> & Readonly<{}>, {
194
+ justify: AppLayoutJustify;
195
+ columns: AppLayoutColumns;
196
+ align: AppLayoutAlign;
197
+ gap: AppLayoutGap;
198
+ minColumnWidth: number;
199
+ }, SlotsType<{
200
+ default?: () => VNodeChild;
201
+ }>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
202
+ /**
203
+ * 布局原子件族(命名空间,**本身不是组件**)。
204
+ *
205
+ * | 成员 | 干什么 | 什么时候用 |
206
+ * |---|---|---|
207
+ * | `AppLayout.Row` | **排「行」**:竖排(一条一行往下堆);传 `columns` 则一行分 n 列(列数上限 + 窄了自动减列) | 逐条清单 / 摘要字段 / 并排字段与卡片 |
208
+ * | `AppLayout.Column` | **排「列」**:水平容器(内容左右排),同时是 `Row columns` 的栅格单元 | 徽标+文本 / 标签+值 / 控件+按钮 / 一行里的一格 |
209
+ *
210
+ * ## 命名与方向口径(别再改回去)
211
+ *
212
+ * - **方向按表格语义定**:行与行上下相邻 ⇒ `Row` 竖排;列与列左右相邻 ⇒ `Column` 横排。
213
+ * 故 `.ak-column` 是 `flex-direction: row`、`.ak-row` 是 `column` —— **与 CSS 属性名相反**是刻意的(见 `AppLayout.Row`)。
214
+ * - `columns` 说的是"**这一行分几列**"(每行摆几格),不是"这个容器有几种方向"。
215
+ * - 嵌套:要分栏/栅格就 `Row columns={n}` + `Column`;一格里要上下堆,就在 `Column` 里再放 `Row`。
216
+ * - **公开面只出 `AppLayout`**,不平级导出 `AppRow` / `AppColumn` —— 通用词会与 `AppTableColumn`
217
+ * 在一份 import 清单里混读,也破坏「成族子件用点号」的约定(`AppShell.Header` / `AppForm.Item`)。
218
+ *
219
+ * ## 与其它件的边界
220
+ *
221
+ * - 表单里并排字段用 `AppForm columns={2}`(它管 label 列与行距),不要用本族拼表单;
222
+ * - 页面级两栏(各自滚动)用 `AppShell.Split`;
223
+ * - 只有"块与块怎么摆"这一件事归本族,滚动 / 工具位 / 卡片外观都不归它。
224
+ */
225
+ export declare const AppLayout: {
226
+ Row: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
227
+ /** 行间距档(默认 `md` 8px;要贴紧写 `none`) */
228
+ gap: {
229
+ type: PropType<AppLayoutGap>;
230
+ default: string;
231
+ };
232
+ /** 交叉轴对齐(竖排时是水平方向);不传即 CSS 默认 `stretch`(子项齐宽) */
233
+ align: {
234
+ type: PropType<AppLayoutAlign>;
235
+ default: undefined;
236
+ };
237
+ /** 主轴排布(竖排时是纵向);不传即 `start` */
238
+ justify: {
239
+ type: PropType<AppLayoutJustify>;
240
+ default: undefined;
241
+ };
242
+ /** 列数上限;**不传 = 纯竖排**,传了 = 一行分 n 列(等分栅格) */
243
+ columns: {
244
+ type: PropType<AppLayoutColumns>;
245
+ default: undefined;
246
+ };
247
+ /** 单元最小宽度(px,栅格形态);缺省取令牌 `--ui-grid-column-min`(260) */
248
+ minColumnWidth: {
249
+ type: NumberConstructor;
250
+ default: undefined;
251
+ };
252
+ }>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
253
+ /** 行间距档(默认 `md` 8px;要贴紧写 `none`) */
254
+ gap: {
255
+ type: PropType<AppLayoutGap>;
256
+ default: string;
257
+ };
258
+ /** 交叉轴对齐(竖排时是水平方向);不传即 CSS 默认 `stretch`(子项齐宽) */
259
+ align: {
260
+ type: PropType<AppLayoutAlign>;
261
+ default: undefined;
262
+ };
263
+ /** 主轴排布(竖排时是纵向);不传即 `start` */
264
+ justify: {
265
+ type: PropType<AppLayoutJustify>;
266
+ default: undefined;
267
+ };
268
+ /** 列数上限;**不传 = 纯竖排**,传了 = 一行分 n 列(等分栅格) */
269
+ columns: {
270
+ type: PropType<AppLayoutColumns>;
271
+ default: undefined;
272
+ };
273
+ /** 单元最小宽度(px,栅格形态);缺省取令牌 `--ui-grid-column-min`(260) */
274
+ minColumnWidth: {
275
+ type: NumberConstructor;
276
+ default: undefined;
277
+ };
278
+ }>> & Readonly<{}>, {
279
+ justify: AppLayoutJustify;
280
+ columns: AppLayoutColumns;
281
+ align: AppLayoutAlign;
282
+ gap: AppLayoutGap;
283
+ minColumnWidth: number;
284
+ }, SlotsType<{
285
+ default?: () => VNodeChild;
286
+ }>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
287
+ Column: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
288
+ /** 单元内间距档(默认 `md` 8px;要贴紧写 `none`) */
289
+ gap: {
290
+ type: PropType<AppLayoutGap>;
291
+ default: string;
292
+ };
293
+ /** 单元内交叉轴对齐;不传即 `center`(内容齐中线) */
294
+ align: {
295
+ type: PropType<AppLayoutAlign>;
296
+ default: undefined;
297
+ };
298
+ /** 单元内主轴排布;不传即 `start` */
299
+ justify: {
300
+ type: PropType<AppLayoutJustify>;
301
+ default: undefined;
302
+ };
303
+ /** 允许折行:内容宽过容器时下一项换行(窄格子里的「按钮 + 摘要」靠它不撑破外层) */
304
+ wrap: {
305
+ type: BooleanConstructor;
306
+ default: boolean;
307
+ };
308
+ /** 跨格数(默认 1);不要超过所在行的 `columns` */
309
+ span: {
310
+ type: PropType<AppLayoutSpan>;
311
+ default: number;
312
+ };
313
+ }>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
314
+ /** 单元内间距档(默认 `md` 8px;要贴紧写 `none`) */
315
+ gap: {
316
+ type: PropType<AppLayoutGap>;
317
+ default: string;
318
+ };
319
+ /** 单元内交叉轴对齐;不传即 `center`(内容齐中线) */
320
+ align: {
321
+ type: PropType<AppLayoutAlign>;
322
+ default: undefined;
323
+ };
324
+ /** 单元内主轴排布;不传即 `start` */
325
+ justify: {
326
+ type: PropType<AppLayoutJustify>;
327
+ default: undefined;
328
+ };
329
+ /** 允许折行:内容宽过容器时下一项换行(窄格子里的「按钮 + 摘要」靠它不撑破外层) */
330
+ wrap: {
331
+ type: BooleanConstructor;
332
+ default: boolean;
333
+ };
334
+ /** 跨格数(默认 1);不要超过所在行的 `columns` */
335
+ span: {
336
+ type: PropType<AppLayoutSpan>;
337
+ default: number;
338
+ };
339
+ }>> & Readonly<{}>, {
340
+ span: AppLayoutSpan;
341
+ wrap: boolean;
342
+ justify: AppLayoutJustify;
343
+ align: AppLayoutAlign;
344
+ gap: AppLayoutGap;
345
+ }, SlotsType<{
346
+ default?: () => VNodeChild;
347
+ }>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
348
+ };
@@ -0,0 +1,102 @@
1
+ import { defineComponent, createVNode } from "vue";
2
+ function modifier(base, name, value) {
3
+ return value === void 0 || value === "" ? "" : `${base}--${name}-${value}`;
4
+ }
5
+ const AppLayoutColumn = /* @__PURE__ */ defineComponent({
6
+ name: "AppLayoutColumn",
7
+ inheritAttrs: false,
8
+ props: {
9
+ /** 单元内间距档(默认 `md` 8px;要贴紧写 `none`) */
10
+ gap: {
11
+ type: String,
12
+ default: "md"
13
+ },
14
+ /** 单元内交叉轴对齐;不传即 `center`(内容齐中线) */
15
+ align: {
16
+ type: String,
17
+ default: void 0
18
+ },
19
+ /** 单元内主轴排布;不传即 `start` */
20
+ justify: {
21
+ type: String,
22
+ default: void 0
23
+ },
24
+ /** 允许折行:内容宽过容器时下一项换行(窄格子里的「按钮 + 摘要」靠它不撑破外层) */
25
+ wrap: {
26
+ type: Boolean,
27
+ default: false
28
+ },
29
+ /** 跨格数(默认 1);不要超过所在行的 `columns` */
30
+ span: {
31
+ type: Number,
32
+ default: 1
33
+ }
34
+ },
35
+ slots: Object,
36
+ setup(props, {
37
+ slots,
38
+ attrs
39
+ }) {
40
+ return () => createVNode("div", {
41
+ "class": ["ak-column", modifier("ak-column", "gap", props.gap), modifier("ak-column", "align", props.align), props.justify && props.justify !== "start" ? modifier("ak-column", "justify", props.justify) : "", props.wrap ? "ak-column--wrap" : "", props.span > 1 ? `ak-column--span-${props.span}` : "", attrs.class].filter(Boolean).join(" "),
42
+ "style": attrs.style
43
+ }, [slots.default?.()]);
44
+ }
45
+ });
46
+ const AppLayoutRow = /* @__PURE__ */ defineComponent({
47
+ name: "AppLayoutRow",
48
+ inheritAttrs: false,
49
+ props: {
50
+ /** 行间距档(默认 `md` 8px;要贴紧写 `none`) */
51
+ gap: {
52
+ type: String,
53
+ default: "md"
54
+ },
55
+ /** 交叉轴对齐(竖排时是水平方向);不传即 CSS 默认 `stretch`(子项齐宽) */
56
+ align: {
57
+ type: String,
58
+ default: void 0
59
+ },
60
+ /** 主轴排布(竖排时是纵向);不传即 `start` */
61
+ justify: {
62
+ type: String,
63
+ default: void 0
64
+ },
65
+ /** 列数上限;**不传 = 纯竖排**,传了 = 一行分 n 列(等分栅格) */
66
+ columns: {
67
+ type: Number,
68
+ default: void 0
69
+ },
70
+ /** 单元最小宽度(px,栅格形态);缺省取令牌 `--ui-grid-column-min`(260) */
71
+ minColumnWidth: {
72
+ type: Number,
73
+ default: void 0
74
+ }
75
+ },
76
+ slots: Object,
77
+ setup(props, {
78
+ slots,
79
+ attrs
80
+ }) {
81
+ return () => {
82
+ const isGrid = props.columns !== void 0;
83
+ const style = {
84
+ ...attrs.style ?? {}
85
+ };
86
+ if (props.minColumnWidth) style["--ak-row-min"] = `${props.minColumnWidth}px`;
87
+ return createVNode("div", {
88
+ "class": ["ak-row", modifier("ak-row", "gap", props.gap), modifier("ak-row", "align", props.align), props.justify && props.justify !== "start" ? modifier("ak-row", "justify", props.justify) : "", isGrid ? "ak-row--grid" : "", isGrid ? `ak-row--columns-${props.columns}` : "", attrs.class].filter(Boolean).join(" "),
89
+ "style": style
90
+ }, [slots.default?.()]);
91
+ };
92
+ }
93
+ });
94
+ const AppLayout = {
95
+ Row: AppLayoutRow,
96
+ Column: AppLayoutColumn
97
+ };
98
+ export {
99
+ AppLayout,
100
+ AppLayoutColumn,
101
+ AppLayoutRow
102
+ };
@@ -0,0 +1,90 @@
1
+ import { type PropType, type SlotsType, type VNodeChild } from 'vue';
2
+ export type AppNoticeTone = 'info' | 'success' | 'warning' | 'error';
3
+ /**
4
+ * 说明条 / 警告提示(**自建**,不封装 farris)。
5
+ *
6
+ * ## 为什么自建
7
+ *
8
+ * `@farris/ui-vue` 1.8.4 **没有 Alert 组件**(`types/` 下无 `alert` 目录、无 `FAlert` 导出,
9
+ * 产物 `farris.all.esm.js` 里 `f-alert` 零命中);`index.css` 里唯一带 message 的
10
+ * `.f-message-strip` 只是 notify 的 toast 容器(`.f-message-strip .toast`),不是内联说明块。
11
+ * 故这里自建,**视觉规范对齐 `@aihub/theme` 的 Alert(`.sem-bar`)**:
12
+ * 通栏 100% 宽、高 42、圆角 6、投影 `0 2 10 rgba(0,0,0,.08)`、文案 15px、
13
+ * 语义三件套(底 / 边 / 字),操作为文字按钮。
14
+ *
15
+ * ## 口径(取自主题包 Alert 规范)
16
+ *
17
+ * - **警示 / 错误须常驻**(不渲染关闭按钮),只有通知类信息才可关闭 —— 故 `closable` 默认 `false`,
18
+ * 由消费方显式开启;`tone='warning' | 'error'` 时即使传了 `closable` 也只按消费方意愿渲染,
19
+ * 但规范建议不这么做(见主题包 `alert.html` 「2 不可关闭」)。
20
+ * - 位置:页面顶部通栏(`AppShell.Body` 顶部),静态展示、不随滚动消失。
21
+ *
22
+ * @example 可关闭的说明条(列表页顶部)
23
+ * <AppNotice closable onClose={() => (noticeVisible = false)}>
24
+ * <p>值映射用于将来源向量转换为单个目标值。</p>
25
+ * </AppNotice>
26
+ *
27
+ * @example 警示 + 文字按钮操作
28
+ * <AppNotice tone="warning" action="立即认证" onAction={goAuth}>使用该服务前须完成实名认证</AppNotice>
29
+ */
30
+ export declare const AppNotice: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
31
+ /** 语义类型;决定底/边/字三件套 */
32
+ tone: {
33
+ type: PropType<AppNoticeTone>;
34
+ default: string;
35
+ };
36
+ /** 是否渲染右上关闭按钮(规范:仅通知类信息可关闭) */
37
+ closable: {
38
+ type: BooleanConstructor;
39
+ default: boolean;
40
+ };
41
+ /** 右侧文字按钮文案(不传则不渲染操作位) */
42
+ action: {
43
+ type: StringConstructor;
44
+ default: undefined;
45
+ };
46
+ /** 文字按钮点击 */
47
+ onAction: {
48
+ type: PropType<() => void>;
49
+ default: undefined;
50
+ };
51
+ /** 关闭回调(配合 `closable`;关闭动作由消费方决定可见性) */
52
+ onClose: {
53
+ type: PropType<() => void>;
54
+ default: undefined;
55
+ };
56
+ }>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
57
+ /** 语义类型;决定底/边/字三件套 */
58
+ tone: {
59
+ type: PropType<AppNoticeTone>;
60
+ default: string;
61
+ };
62
+ /** 是否渲染右上关闭按钮(规范:仅通知类信息可关闭) */
63
+ closable: {
64
+ type: BooleanConstructor;
65
+ default: boolean;
66
+ };
67
+ /** 右侧文字按钮文案(不传则不渲染操作位) */
68
+ action: {
69
+ type: StringConstructor;
70
+ default: undefined;
71
+ };
72
+ /** 文字按钮点击 */
73
+ onAction: {
74
+ type: PropType<() => void>;
75
+ default: undefined;
76
+ };
77
+ /** 关闭回调(配合 `closable`;关闭动作由消费方决定可见性) */
78
+ onClose: {
79
+ type: PropType<() => void>;
80
+ default: undefined;
81
+ };
82
+ }>> & Readonly<{}>, {
83
+ tone: AppNoticeTone;
84
+ closable: boolean;
85
+ action: string;
86
+ onAction: () => void;
87
+ onClose: () => void;
88
+ }, SlotsType<{
89
+ default?: () => VNodeChild;
90
+ }>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -0,0 +1,59 @@
1
+ import { defineComponent, createVNode, createTextVNode } from "vue";
2
+ const AppNotice = /* @__PURE__ */ defineComponent({
3
+ name: "AppNotice",
4
+ inheritAttrs: false,
5
+ props: {
6
+ /** 语义类型;决定底/边/字三件套 */
7
+ tone: {
8
+ type: String,
9
+ default: "info"
10
+ },
11
+ /** 是否渲染右上关闭按钮(规范:仅通知类信息可关闭) */
12
+ closable: {
13
+ type: Boolean,
14
+ default: false
15
+ },
16
+ /** 右侧文字按钮文案(不传则不渲染操作位) */
17
+ action: {
18
+ type: String,
19
+ default: void 0
20
+ },
21
+ /** 文字按钮点击 */
22
+ onAction: {
23
+ type: Function,
24
+ default: void 0
25
+ },
26
+ /** 关闭回调(配合 `closable`;关闭动作由消费方决定可见性) */
27
+ onClose: {
28
+ type: Function,
29
+ default: void 0
30
+ }
31
+ },
32
+ slots: Object,
33
+ setup(props, {
34
+ slots,
35
+ attrs
36
+ }) {
37
+ const close = () => {
38
+ props.onClose?.();
39
+ };
40
+ return () => createVNode("div", {
41
+ "class": [attrs.class, "ak-notice", `ak-notice--${props.tone}`].filter(Boolean).join(" "),
42
+ "role": "alert"
43
+ }, [createVNode("div", {
44
+ "class": "ak-notice__body"
45
+ }, [slots.default?.()]), props.action ? createVNode("button", {
46
+ "type": "button",
47
+ "class": "ak-notice__action",
48
+ "onClick": () => props.onAction?.()
49
+ }, [props.action]) : null, props.closable ? createVNode("button", {
50
+ "type": "button",
51
+ "class": "ak-notice__close",
52
+ "aria-label": "关闭",
53
+ "onClick": close
54
+ }, [createTextVNode("✕")]) : null]);
55
+ }
56
+ });
57
+ export {
58
+ AppNotice
59
+ };