@morya-ui/mcp 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -69,6 +69,11 @@ Resource templates:
69
69
  | `recommend_page` | Recommend a pattern from page intent; optional starter scaffold |
70
70
  | `get_design_rules` | Design-token and composition rules |
71
71
  | `recommend_component` | List, read, or recommend component selection guides |
72
+ | `list_golden_pages` | List golden page samples (list / form / dashboard) |
73
+ | `get_golden_page` | Read golden page Vue source |
74
+ | `list_page_snippets` | List section snippets for local page edits |
75
+ | `get_page_snippet` | Read a section snippet (`filters`, `toolbar`, `form-actions`…) |
76
+ | `validate_page` | Check page composition, spacing, and border anti-patterns |
72
77
 
73
78
  `mode`: `zh` (default) or `en`.
74
79
 
@@ -85,10 +90,19 @@ Component lookup accepts common aliases such as `DataTable`, `数据表格`, `Pa
85
90
  **Plan a page:**
86
91
 
87
92
  1. `recommend_page` with business intent, page type, and features
88
- 2. `get_pattern` for the returned `matchedPattern`
89
- 3. `get_component` / `get_example` for core components
90
- 4. `get_design_rules` before custom layout or CSS
91
- 5. `recommend_component` when choosing between similar components
93
+ 2. `get_golden_page` for the matched golden sample (`list-page`, `form-page`, `dashboard-page`)
94
+ 3. `get_pattern` for the returned `matchedPattern`
95
+ 4. `get_design_rules` for MPage* composition recipes
96
+ 5. `get_component` / `get_example` for core components (including `Page`)
97
+ 6. `recommend_component` when choosing between similar components
98
+ 7. `validate_page` on generated Vue code before finishing
99
+
100
+ **Edit one section of an existing page:**
101
+
102
+ 1. `list_page_snippets` with `query` or `pageType`
103
+ 2. `get_page_snippet` for the matched section (`list-filters`, `form-actions`, …)
104
+ 3. `get_component` / `get_example` for unfamiliar imports
105
+ 4. `validate_usage` + `validate_page` on the merged result
92
106
 
93
107
  For a starter Vue file, pass `includeScaffold: true` to `recommend_page`:
94
108
 
package/data/catalog.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
- "generatedAt": "2026-09-14T01:38:21.808Z",
2
+ "generatedAt": "2026-09-14T03:20:02.421Z",
3
3
  "library": {
4
4
  "name": "morya-ui",
5
- "version": "0.2.2"
5
+ "version": "0.2.3"
6
6
  },
7
7
  "mcp": {
8
8
  "name": "@morya-ui/mcp",
9
- "version": "0.2.2"
9
+ "version": "0.2.3"
10
10
  },
11
11
  "components": [
12
12
  {
@@ -13553,6 +13553,150 @@
13553
13553
  }
13554
13554
  }
13555
13555
  },
13556
+ {
13557
+ "id": "Page",
13558
+ "name": "Page",
13559
+ "exportName": "MPageContent",
13560
+ "category": "06 / LAYOUT",
13561
+ "description": "业务页面组合区块,封装间距、边框与标题层级,少写或不写页面 CSS。",
13562
+ "descriptionEn": "Composable page sections for spacing, borders, and headings with little or no custom CSS.",
13563
+ "import": "import { MPageContent } from 'morya-ui'",
13564
+ "props": [],
13565
+ "events": [],
13566
+ "slots": [],
13567
+ "examples": [
13568
+ {
13569
+ "id": "引入-1",
13570
+ "section": "引入",
13571
+ "sectionId": "引入",
13572
+ "lang": "ts",
13573
+ "preview": false,
13574
+ "code": "import {\n MPageContent,\n MPageFilters,\n MPageHeader,\n MPagePlaceholder,\n MPageSection,\n MPageStat,\n MPageToolbar,\n} from 'morya-ui'",
13575
+ "locale": "zh-CN"
13576
+ },
13577
+ {
13578
+ "id": "列表页组合-1",
13579
+ "section": "列表页组合",
13580
+ "sectionId": "列表页组合",
13581
+ "lang": "vue",
13582
+ "preview": true,
13583
+ "code": "<script setup lang=\"ts\">\nimport {\n MButton,\n MInput,\n MPageContent,\n MPageFilters,\n MPageToolbar,\n MSpace,\n} from 'morya-ui'\nimport { ref } from 'vue'\n\nconst keyword = ref('')\n</script>\n\n<template>\n <div\n class=\"doc-demo-frame\"\n style=\"border:1px solid var(--m-color-border);border-radius:var(--m-radius-md);overflow:hidden;background:var(--m-color-surface)\"\n >\n <MPageContent>\n <MPageFilters aria-label=\"筛选\">\n <MSpace wrap>\n <MInput v-model=\"keyword\" placeholder=\"搜索\" clearable style=\"width:12rem\" />\n <MButton severity=\"primary\">查询</MButton>\n </MSpace>\n </MPageFilters>\n <MPageToolbar title=\"用户管理\">\n <template #actions>\n <MButton severity=\"primary\">新建</MButton>\n </template>\n </MPageToolbar>\n </MPageContent>\n </div>\n</template>",
13584
+ "locale": "zh-CN"
13585
+ },
13586
+ {
13587
+ "id": "表单页组合-1",
13588
+ "section": "表单页组合",
13589
+ "sectionId": "表单页组合",
13590
+ "lang": "vue",
13591
+ "preview": true,
13592
+ "code": "<script setup lang=\"ts\">\nimport {\n MButton,\n MForm,\n MFormItem,\n MInput,\n MPageContent,\n MPageHeader,\n MPageSection,\n MSpace,\n} from 'morya-ui'\nimport { ref } from 'vue'\n\nconst name = ref('')\n</script>\n\n<template>\n <div\n class=\"doc-demo-frame\"\n style=\"border:1px solid var(--m-color-border);border-radius:var(--m-radius-md);overflow:hidden;background:var(--m-color-surface)\"\n >\n <MPageContent width=\"narrow\">\n <MPageHeader title=\"新建用户\" description=\"填写基本信息。\" />\n <MPageSection variant=\"form\">\n <MForm @submit.prevent>\n <MFormItem label=\"姓名\" name=\"name\">\n <MInput v-model=\"name\" fluid />\n </MFormItem>\n <MPageSection variant=\"actions\">\n <MSpace>\n <MButton native-type=\"submit\" severity=\"primary\">保存</MButton>\n <MButton severity=\"secondary\">取消</MButton>\n </MSpace>\n </MPageSection>\n </MForm>\n </MPageSection>\n </MPageContent>\n </div>\n</template>",
13593
+ "locale": "zh-CN"
13594
+ },
13595
+ {
13596
+ "id": "仪表盘-kpi-1",
13597
+ "section": "仪表盘 KPI",
13598
+ "sectionId": "仪表盘-kpi",
13599
+ "lang": "vue",
13600
+ "preview": true,
13601
+ "code": "<script setup lang=\"ts\">\nimport { MPageContent, MPageStat } from 'morya-ui'\n</script>\n\n<template>\n <div\n class=\"doc-demo-frame\"\n style=\"border:1px solid var(--m-color-border);border-radius:var(--m-radius-md);overflow:hidden;background:var(--m-color-surface)\"\n >\n <MPageContent density=\"compact\">\n <MPageStat label=\"总用户\" value=\"12,480\" trend=\"+8.2%\" icon=\"users\" />\n </MPageContent>\n </div>\n</template>",
13602
+ "locale": "zh-CN"
13603
+ },
13604
+ {
13605
+ "id": "import-1",
13606
+ "section": "Import",
13607
+ "sectionId": "import",
13608
+ "lang": "ts",
13609
+ "preview": false,
13610
+ "code": "import {\n MPageContent,\n MPageFilters,\n MPageHeader,\n MPagePlaceholder,\n MPageSection,\n MPageStat,\n MPageToolbar,\n} from 'morya-ui'",
13611
+ "locale": "en-US"
13612
+ },
13613
+ {
13614
+ "id": "list-page-stack-1",
13615
+ "section": "List page stack",
13616
+ "sectionId": "list-page-stack",
13617
+ "lang": "vue",
13618
+ "preview": true,
13619
+ "code": "<script setup lang=\"ts\">\nimport {\n MButton,\n MInput,\n MPageContent,\n MPageFilters,\n MPageToolbar,\n MSpace,\n} from 'morya-ui'\nimport { ref } from 'vue'\n\nconst keyword = ref('')\n</script>\n\n<template>\n <div\n class=\"doc-demo-frame\"\n style=\"border:1px solid var(--m-color-border);border-radius:var(--m-radius-md);overflow:hidden;background:var(--m-color-surface)\"\n >\n <MPageContent>\n <MPageFilters aria-label=\"Filters\">\n <MSpace wrap>\n <MInput v-model=\"keyword\" placeholder=\"Search\" clearable style=\"width:12rem\" />\n <MButton severity=\"primary\">Search</MButton>\n </MSpace>\n </MPageFilters>\n <MPageToolbar title=\"Users\">\n <template #actions>\n <MButton severity=\"primary\">Create</MButton>\n </template>\n </MPageToolbar>\n </MPageContent>\n </div>\n</template>",
13620
+ "locale": "en-US"
13621
+ }
13622
+ ],
13623
+ "locales": {
13624
+ "zh-CN": {
13625
+ "title": "Page",
13626
+ "description": "业务页面组合区块,封装间距、边框与标题层级,少写或不写页面 CSS。",
13627
+ "sections": [
13628
+ {
13629
+ "id": "overview",
13630
+ "title": "",
13631
+ "body": "# Page\n\n业务页面组合组件。与 `MLayout` 搭配使用,把列表页筛选区、工具栏、表单分组、KPI 卡片等常见区块的间距和边框内聚到组件内,**优先用 Page 组件拼装页面,而不是每页手写 scoped CSS**。"
13632
+ },
13633
+ {
13634
+ "id": "引入",
13635
+ "title": "引入",
13636
+ "body": "```ts\nimport {\n MPageContent,\n MPageFilters,\n MPageHeader,\n MPagePlaceholder,\n MPageSection,\n MPageStat,\n MPageToolbar,\n} from 'morya-ui'\n```"
13637
+ },
13638
+ {
13639
+ "id": "列表页组合",
13640
+ "title": "列表页组合",
13641
+ "body": "`MPageContent` 负责内容区 **padding**(默认 `--m-space-6`)与子区块 **gap**(默认 `--m-space-4`),文档预览中外框仅模拟 `MLayoutContent` 边界。\n\n```vue preview\n<script setup lang=\"ts\">\nimport {\n MButton,\n MInput,\n MPageContent,\n MPageFilters,\n MPageToolbar,\n MSpace,\n} from 'morya-ui'\nimport { ref } from 'vue'\n\nconst keyword = ref('')\n</script>\n\n<template>\n <div\n class=\"doc-demo-frame\"\n style=\"border:1px solid var(--m-color-border);border-radius:var(--m-radius-md);overflow:hidden;background:var(--m-color-surface)\"\n >\n <MPageContent>\n <MPageFilters aria-label=\"筛选\">\n <MSpace wrap>\n <MInput v-model=\"keyword\" placeholder=\"搜索\" clearable style=\"width:12rem\" />\n <MButton severity=\"primary\">查询</MButton>\n </MSpace>\n </MPageFilters>\n <MPageToolbar title=\"用户管理\">\n <template #actions>\n <MButton severity=\"primary\">新建</MButton>\n </template>\n </MPageToolbar>\n </MPageContent>\n </div>\n</template>\n```"
13642
+ },
13643
+ {
13644
+ "id": "表单页组合",
13645
+ "title": "表单页组合",
13646
+ "body": "`MPageContent width=\"narrow\"` 限制表单宽度;`MPageSection variant=\"form\"` 提供表单表面;`variant=\"actions\"` 用于底栏操作。\n\n```vue preview\n<script setup lang=\"ts\">\nimport {\n MButton,\n MForm,\n MFormItem,\n MInput,\n MPageContent,\n MPageHeader,\n MPageSection,\n MSpace,\n} from 'morya-ui'\nimport { ref } from 'vue'\n\nconst name = ref('')\n</script>\n\n<template>\n <div\n class=\"doc-demo-frame\"\n style=\"border:1px solid var(--m-color-border);border-radius:var(--m-radius-md);overflow:hidden;background:var(--m-color-surface)\"\n >\n <MPageContent width=\"narrow\">\n <MPageHeader title=\"新建用户\" description=\"填写基本信息。\" />\n <MPageSection variant=\"form\">\n <MForm @submit.prevent>\n <MFormItem label=\"姓名\" name=\"name\">\n <MInput v-model=\"name\" fluid />\n </MFormItem>\n <MPageSection variant=\"actions\">\n <MSpace>\n <MButton native-type=\"submit\" severity=\"primary\">保存</MButton>\n <MButton severity=\"secondary\">取消</MButton>\n </MSpace>\n </MPageSection>\n </MForm>\n </MPageSection>\n </MPageContent>\n </div>\n</template>\n```"
13647
+ },
13648
+ {
13649
+ "id": "仪表盘-kpi",
13650
+ "title": "仪表盘 KPI",
13651
+ "body": "```vue preview\n<script setup lang=\"ts\">\nimport { MPageContent, MPageStat } from 'morya-ui'\n</script>\n\n<template>\n <div\n class=\"doc-demo-frame\"\n style=\"border:1px solid var(--m-color-border);border-radius:var(--m-radius-md);overflow:hidden;background:var(--m-color-surface)\"\n >\n <MPageContent density=\"compact\">\n <MPageStat label=\"总用户\" value=\"12,480\" trend=\"+8.2%\" icon=\"users\" />\n </MPageContent>\n </div>\n</template>\n```"
13652
+ },
13653
+ {
13654
+ "id": "组合规则",
13655
+ "title": "组合规则",
13656
+ "body": "| 场景 | 推荐组件 | 避免 |\n| --- | --- | --- |\n| 内容区垂直堆叠 | `MPageContent` | 手写 `gap` / `padding` |\n| 筛选区 | `MPageFilters` + `MSpace` / `MFlex` | 额外包一层 `MCard` |\n| 标题 + 主操作 | `MPageToolbar` | 裸 `div` + `justify-content` |\n| 页面说明 | `MPageHeader` | 无层级的裸 `h1` |\n| 表单主体 | `MPageSection variant=\"form\"` | 重复边框的 `MCard` 嵌套 |\n| 列表表格 | 直接放 `MTable` | `MCard` 再包 `MTable bordered` |\n| KPI | `MPageStat` | 每页自定义 stat CSS |\n| 图表占位 | `MPagePlaceholder` | dashed border 手写样式 |\n\n完整黄金样例见 `docs/golden-pages/`(MCP:`get_golden_page`)。**局部修改**时用 MCP `get_page_snippet`(如 `filters`、`toolbar`、`form-actions`)。"
13657
+ },
13658
+ {
13659
+ "id": "api",
13660
+ "title": "API",
13661
+ "body": "### MPageContent\n\n| Prop | 类型 | 默认 | 说明 |\n| --- | --- | --- | --- |\n| `density` | `'default' \\| 'compact' \\| 'spacious'` | `'default'` | 子区块垂直间距。 |\n| `width` | `'full' \\| 'narrow'` | `'full'` | `narrow` 约 42rem,适合表单页。 |\n\n### MPageFilters\n\n| Prop | 类型 | 默认 | 说明 |\n| --- | --- | --- | --- |\n| `ariaLabel` | `string` | — | 筛选区无障碍名称。 |\n\n### MPageToolbar\n\n| Prop | 类型 | 默认 | 说明 |\n| --- | --- | --- | --- |\n| `title` | `string` | — | 页面标题。 |\n| `headingLevel` | `1–6` | `1` | 标题层级。 |\n\n| Slot | 说明 |\n| --- | --- |\n| `default` | 无 `title` 时的左侧内容。 |\n| `actions` | 右侧操作区。 |\n\n### MPageHeader\n\n| Prop | 类型 | 默认 | 说明 |\n| --- | --- | --- | --- |\n| `title` | `string` | — | 页面标题。 |\n| `description` | `string` | — | 副标题/说明。 |\n| `headingLevel` | `1–6` | `1` | 标题层级。 |\n\n| Slot | 说明 |\n| --- | --- |\n| `actions` | 右侧操作。 |\n\n### MPageSection\n\n| Prop | 类型 | 默认 | 说明 |\n| --- | --- | --- | --- |\n| `variant` | `'default' \\| 'muted' \\| 'form' \\| 'actions'` | `'default'` | 视觉变体。 |\n| `title` | `string` | — | 可选分组标题。 |\n\n### MPageStat\n\n| Prop | 类型 | 默认 | 说明 |\n| --- | --- | --- | --- |\n| `label` | `string` | — | 指标名称。 |\n| `value` | `string \\| number` | — | 主数值。 |\n| `trend` | `string` | — | 变化量或说明。 |\n| `trendSeverity` | `'primary' \\| 'success' \\| 'warn' \\| 'danger' \\| 'secondary'` | `'primary'` | 趋势色。 |\n| `icon` | `string` | — | 右侧图标名。 |\n\n### MPagePlaceholder\n\n| Prop | 类型 | 默认 | 说明 |\n| --- | --- | --- | --- |\n| `description` | `string` | — | 占位说明。 |\n| `ariaLabel` | `string` | `'Placeholder'` | 无障碍标签。 |\n| `minHeight` | `number \\| string` | `'12rem'` | 最小高度。 |"
13662
+ }
13663
+ ],
13664
+ "markdown": "---\ntitle: Page\ncategory: 06 / LAYOUT\ndescription: 业务页面组合区块,封装间距、边框与标题层级,少写或不写页面 CSS。\n---\n\n# Page\n\n业务页面组合组件。与 `MLayout` 搭配使用,把列表页筛选区、工具栏、表单分组、KPI 卡片等常见区块的间距和边框内聚到组件内,**优先用 Page 组件拼装页面,而不是每页手写 scoped CSS**。\n\n## 引入\n\n```ts\nimport {\n MPageContent,\n MPageFilters,\n MPageHeader,\n MPagePlaceholder,\n MPageSection,\n MPageStat,\n MPageToolbar,\n} from 'morya-ui'\n```\n\n## 列表页组合\n\n`MPageContent` 负责内容区 **padding**(默认 `--m-space-6`)与子区块 **gap**(默认 `--m-space-4`),文档预览中外框仅模拟 `MLayoutContent` 边界。\n\n```vue preview\n<script setup lang=\"ts\">\nimport {\n MButton,\n MInput,\n MPageContent,\n MPageFilters,\n MPageToolbar,\n MSpace,\n} from 'morya-ui'\nimport { ref } from 'vue'\n\nconst keyword = ref('')\n</script>\n\n<template>\n <div\n class=\"doc-demo-frame\"\n style=\"border:1px solid var(--m-color-border);border-radius:var(--m-radius-md);overflow:hidden;background:var(--m-color-surface)\"\n >\n <MPageContent>\n <MPageFilters aria-label=\"筛选\">\n <MSpace wrap>\n <MInput v-model=\"keyword\" placeholder=\"搜索\" clearable style=\"width:12rem\" />\n <MButton severity=\"primary\">查询</MButton>\n </MSpace>\n </MPageFilters>\n <MPageToolbar title=\"用户管理\">\n <template #actions>\n <MButton severity=\"primary\">新建</MButton>\n </template>\n </MPageToolbar>\n </MPageContent>\n </div>\n</template>\n```\n\n## 表单页组合\n\n`MPageContent width=\"narrow\"` 限制表单宽度;`MPageSection variant=\"form\"` 提供表单表面;`variant=\"actions\"` 用于底栏操作。\n\n```vue preview\n<script setup lang=\"ts\">\nimport {\n MButton,\n MForm,\n MFormItem,\n MInput,\n MPageContent,\n MPageHeader,\n MPageSection,\n MSpace,\n} from 'morya-ui'\nimport { ref } from 'vue'\n\nconst name = ref('')\n</script>\n\n<template>\n <div\n class=\"doc-demo-frame\"\n style=\"border:1px solid var(--m-color-border);border-radius:var(--m-radius-md);overflow:hidden;background:var(--m-color-surface)\"\n >\n <MPageContent width=\"narrow\">\n <MPageHeader title=\"新建用户\" description=\"填写基本信息。\" />\n <MPageSection variant=\"form\">\n <MForm @submit.prevent>\n <MFormItem label=\"姓名\" name=\"name\">\n <MInput v-model=\"name\" fluid />\n </MFormItem>\n <MPageSection variant=\"actions\">\n <MSpace>\n <MButton native-type=\"submit\" severity=\"primary\">保存</MButton>\n <MButton severity=\"secondary\">取消</MButton>\n </MSpace>\n </MPageSection>\n </MForm>\n </MPageSection>\n </MPageContent>\n </div>\n</template>\n```\n\n## 仪表盘 KPI\n\n```vue preview\n<script setup lang=\"ts\">\nimport { MPageContent, MPageStat } from 'morya-ui'\n</script>\n\n<template>\n <div\n class=\"doc-demo-frame\"\n style=\"border:1px solid var(--m-color-border);border-radius:var(--m-radius-md);overflow:hidden;background:var(--m-color-surface)\"\n >\n <MPageContent density=\"compact\">\n <MPageStat label=\"总用户\" value=\"12,480\" trend=\"+8.2%\" icon=\"users\" />\n </MPageContent>\n </div>\n</template>\n```\n\n## 组合规则\n\n| 场景 | 推荐组件 | 避免 |\n| --- | --- | --- |\n| 内容区垂直堆叠 | `MPageContent` | 手写 `gap` / `padding` |\n| 筛选区 | `MPageFilters` + `MSpace` / `MFlex` | 额外包一层 `MCard` |\n| 标题 + 主操作 | `MPageToolbar` | 裸 `div` + `justify-content` |\n| 页面说明 | `MPageHeader` | 无层级的裸 `h1` |\n| 表单主体 | `MPageSection variant=\"form\"` | 重复边框的 `MCard` 嵌套 |\n| 列表表格 | 直接放 `MTable` | `MCard` 再包 `MTable bordered` |\n| KPI | `MPageStat` | 每页自定义 stat CSS |\n| 图表占位 | `MPagePlaceholder` | dashed border 手写样式 |\n\n完整黄金样例见 `docs/golden-pages/`(MCP:`get_golden_page`)。**局部修改**时用 MCP `get_page_snippet`(如 `filters`、`toolbar`、`form-actions`)。\n\n## API\n\n### MPageContent\n\n| Prop | 类型 | 默认 | 说明 |\n| --- | --- | --- | --- |\n| `density` | `'default' \\| 'compact' \\| 'spacious'` | `'default'` | 子区块垂直间距。 |\n| `width` | `'full' \\| 'narrow'` | `'full'` | `narrow` 约 42rem,适合表单页。 |\n\n### MPageFilters\n\n| Prop | 类型 | 默认 | 说明 |\n| --- | --- | --- | --- |\n| `ariaLabel` | `string` | — | 筛选区无障碍名称。 |\n\n### MPageToolbar\n\n| Prop | 类型 | 默认 | 说明 |\n| --- | --- | --- | --- |\n| `title` | `string` | — | 页面标题。 |\n| `headingLevel` | `1–6` | `1` | 标题层级。 |\n\n| Slot | 说明 |\n| --- | --- |\n| `default` | 无 `title` 时的左侧内容。 |\n| `actions` | 右侧操作区。 |\n\n### MPageHeader\n\n| Prop | 类型 | 默认 | 说明 |\n| --- | --- | --- | --- |\n| `title` | `string` | — | 页面标题。 |\n| `description` | `string` | — | 副标题/说明。 |\n| `headingLevel` | `1–6` | `1` | 标题层级。 |\n\n| Slot | 说明 |\n| --- | --- |\n| `actions` | 右侧操作。 |\n\n### MPageSection\n\n| Prop | 类型 | 默认 | 说明 |\n| --- | --- | --- | --- |\n| `variant` | `'default' \\| 'muted' \\| 'form' \\| 'actions'` | `'default'` | 视觉变体。 |\n| `title` | `string` | — | 可选分组标题。 |\n\n### MPageStat\n\n| Prop | 类型 | 默认 | 说明 |\n| --- | --- | --- | --- |\n| `label` | `string` | — | 指标名称。 |\n| `value` | `string \\| number` | — | 主数值。 |\n| `trend` | `string` | — | 变化量或说明。 |\n| `trendSeverity` | `'primary' \\| 'success' \\| 'warn' \\| 'danger' \\| 'secondary'` | `'primary'` | 趋势色。 |\n| `icon` | `string` | — | 右侧图标名。 |\n\n### MPagePlaceholder\n\n| Prop | 类型 | 默认 | 说明 |\n| --- | --- | --- | --- |\n| `description` | `string` | — | 占位说明。 |\n| `ariaLabel` | `string` | `'Placeholder'` | 无障碍标签。 |\n| `minHeight` | `number \\| string` | `'12rem'` | 最小高度。 |\n"
13665
+ },
13666
+ "en-US": {
13667
+ "title": "Page",
13668
+ "description": "Composable page sections for spacing, borders, and headings with little or no custom CSS.",
13669
+ "sections": [
13670
+ {
13671
+ "id": "overview",
13672
+ "title": "",
13673
+ "body": "# Page\n\nPage composition components. Use them with `MLayout` to encode filter bars, toolbars, form surfaces, KPI cards, and other admin-page blocks **without rewriting scoped CSS on every page**."
13674
+ },
13675
+ {
13676
+ "id": "import",
13677
+ "title": "Import",
13678
+ "body": "```ts\nimport {\n MPageContent,\n MPageFilters,\n MPageHeader,\n MPagePlaceholder,\n MPageSection,\n MPageStat,\n MPageToolbar,\n} from 'morya-ui'\n```"
13679
+ },
13680
+ {
13681
+ "id": "list-page-stack",
13682
+ "title": "List page stack",
13683
+ "body": "`MPageContent` owns content **padding** (default `--m-space-6`) and section **gap** (default `--m-space-4`). The bordered frame in previews simulates `MLayoutContent` only.\n\n```vue preview\n<script setup lang=\"ts\">\nimport {\n MButton,\n MInput,\n MPageContent,\n MPageFilters,\n MPageToolbar,\n MSpace,\n} from 'morya-ui'\nimport { ref } from 'vue'\n\nconst keyword = ref('')\n</script>\n\n<template>\n <div\n class=\"doc-demo-frame\"\n style=\"border:1px solid var(--m-color-border);border-radius:var(--m-radius-md);overflow:hidden;background:var(--m-color-surface)\"\n >\n <MPageContent>\n <MPageFilters aria-label=\"Filters\">\n <MSpace wrap>\n <MInput v-model=\"keyword\" placeholder=\"Search\" clearable style=\"width:12rem\" />\n <MButton severity=\"primary\">Search</MButton>\n </MSpace>\n </MPageFilters>\n <MPageToolbar title=\"Users\">\n <template #actions>\n <MButton severity=\"primary\">Create</MButton>\n </template>\n </MPageToolbar>\n </MPageContent>\n </div>\n</template>\n```"
13684
+ },
13685
+ {
13686
+ "id": "form-page-stack",
13687
+ "title": "Form page stack",
13688
+ "body": "Use `MPageContent width=\"narrow\"`, `MPageSection variant=\"form\"`, and `variant=\"actions\"` for the footer."
13689
+ },
13690
+ {
13691
+ "id": "composition-rules",
13692
+ "title": "Composition rules",
13693
+ "body": "| Scenario | Use | Avoid |\n| --- | --- | --- |\n| Vertical page stack | `MPageContent` | Hand-written `gap` / `padding` |\n| Filters | `MPageFilters` | Extra bordered `MCard` wrapper |\n| Title + actions | `MPageToolbar` | Raw flex divs |\n| Form surface | `MPageSection variant=\"form\"` | Nested bordered cards |\n| Data table | `MTable` directly | `MCard` around bordered table |\n| KPI metric | `MPageStat` | Custom stat CSS per page |\n\nGolden references: `docs/golden-pages/` (MCP: `get_golden_page`)."
13694
+ }
13695
+ ],
13696
+ "markdown": "---\ntitle: Page\ncategory: 06 / LAYOUT\ndescription: Composable page sections for spacing, borders, and headings with little or no custom CSS.\n---\n\n# Page\n\nPage composition components. Use them with `MLayout` to encode filter bars, toolbars, form surfaces, KPI cards, and other admin-page blocks **without rewriting scoped CSS on every page**.\n\n## Import\n\n```ts\nimport {\n MPageContent,\n MPageFilters,\n MPageHeader,\n MPagePlaceholder,\n MPageSection,\n MPageStat,\n MPageToolbar,\n} from 'morya-ui'\n```\n\n## List page stack\n\n`MPageContent` owns content **padding** (default `--m-space-6`) and section **gap** (default `--m-space-4`). The bordered frame in previews simulates `MLayoutContent` only.\n\n```vue preview\n<script setup lang=\"ts\">\nimport {\n MButton,\n MInput,\n MPageContent,\n MPageFilters,\n MPageToolbar,\n MSpace,\n} from 'morya-ui'\nimport { ref } from 'vue'\n\nconst keyword = ref('')\n</script>\n\n<template>\n <div\n class=\"doc-demo-frame\"\n style=\"border:1px solid var(--m-color-border);border-radius:var(--m-radius-md);overflow:hidden;background:var(--m-color-surface)\"\n >\n <MPageContent>\n <MPageFilters aria-label=\"Filters\">\n <MSpace wrap>\n <MInput v-model=\"keyword\" placeholder=\"Search\" clearable style=\"width:12rem\" />\n <MButton severity=\"primary\">Search</MButton>\n </MSpace>\n </MPageFilters>\n <MPageToolbar title=\"Users\">\n <template #actions>\n <MButton severity=\"primary\">Create</MButton>\n </template>\n </MPageToolbar>\n </MPageContent>\n </div>\n</template>\n```\n\n## Form page stack\n\nUse `MPageContent width=\"narrow\"`, `MPageSection variant=\"form\"`, and `variant=\"actions\"` for the footer.\n\n## Composition rules\n\n| Scenario | Use | Avoid |\n| --- | --- | --- |\n| Vertical page stack | `MPageContent` | Hand-written `gap` / `padding` |\n| Filters | `MPageFilters` | Extra bordered `MCard` wrapper |\n| Title + actions | `MPageToolbar` | Raw flex divs |\n| Form surface | `MPageSection variant=\"form\"` | Nested bordered cards |\n| Data table | `MTable` directly | `MCard` around bordered table |\n| KPI metric | `MPageStat` | Custom stat CSS per page |\n\nGolden references: `docs/golden-pages/` (MCP: `get_golden_page`).\n"
13697
+ }
13698
+ }
13699
+ },
13556
13700
  {
13557
13701
  "id": "Pagination",
13558
13702
  "name": "Pagination",
@@ -24417,7 +24561,7 @@
24417
24561
  "zh-CN": {
24418
24562
  "title": "MCP",
24419
24563
  "description": "可选的 MCP 服务,供支持 Model Context Protocol 的 AI 客户端检索本库文档。",
24420
- "markdown": "---\ntitle: MCP\norder: 10\ndescription: 可选的 MCP 服务,供支持 Model Context Protocol 的 AI 客户端检索本库文档。\n---\n\n# MCP\n\n[`@morya-ui/mcp`](https://www.npmjs.com/package/@morya-ui/mcp) 是可选的 [Model Context Protocol](https://modelcontextprotocol.io/)(stdio)服务。它把本站组件文档、示例与指南做成可检索工具,方便 **支持 MCP 的 AI 客户端** 按真实 API 生成代码。\n\n日常使用组件库 **不需要** 安装或配置 MCP。应用里仍然只依赖:\n\n```bash\npnpm add morya-ui\n```\n\n```ts\nimport 'morya-ui/styles.css'\n```\n\n## 接入方式\n\nMCP 客户端通过 stdio 启动本包即可:\n\n```bash\nnpx -y @morya-ui/mcp\n```\n\n通用写法:\n\n```json\n{\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@morya-ui/mcp\"]\n}\n```\n\n字段名因客户端而异,只要支持 MCP stdio 即可接入。\n\n### 常见客户端配置示例\n\n以下为常见产品的配置片段,键名可能随版本变化,以各产品官方文档为准。\n\n**Cursor**(`.cursor/mcp.json` 或用户级 MCP 配置):\n\n```json\n{\n \"mcpServers\": {\n \"morya-ui\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@morya-ui/mcp\"]\n }\n }\n}\n```\n\n**Claude Desktop / Claude Code**(`claude_desktop_config.json` 等):\n\n```json\n{\n \"mcpServers\": {\n \"morya-ui\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@morya-ui/mcp\"]\n }\n }\n}\n```\n\n**Windsurf**(MCP 设置中的 servers 配置):\n\n```json\n{\n \"mcpServers\": {\n \"morya-ui\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@morya-ui/mcp\"]\n }\n }\n}\n```\n\n**Cline**(VS Code 扩展设置中的 MCP servers):\n\n```json\n{\n \"mcpServers\": {\n \"morya-ui\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@morya-ui/mcp\"]\n }\n }\n}\n```\n\n**Zed**(`settings.json` → `context_servers`):\n\n```json\n{\n \"context_servers\": {\n \"morya-ui\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@morya-ui/mcp\"]\n }\n }\n}\n```\n\n**Continue**(`config.json` / YAML 中的 MCP servers,字段名以当前版本为准):\n\n```json\n{\n \"mcpServers\": [\n {\n \"name\": \"morya-ui\",\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@morya-ui/mcp\"]\n }\n ]\n}\n```\n\n## 可用工具\n\n### 基础 — 查组件文档\n\n| 工具 | 作用 |\n| --- | --- |\n| `list` | 列出组件 / 指南 / 示例 / 分类 / 页面模式 |\n| `search` | 搜索文档、示例、页面模式与组件选型指南 |\n| `get_component` | 读取组件说明与 API |\n| `get_example` | 获取源码示例 |\n| `get_guide` | 读取指南 |\n| `get_setup` | 安装与初始化说明 |\n| `validate_usage` | 对照文档粗检 props / events 用法 |\n| `version` | 版本与目录状态 |\n\n### 高级 — 页面组合(可选)\n\n| 工具 | 作用 |\n| --- | --- |\n| `list_patterns` | 列出可复用的页面组合模式 |\n| `get_pattern` | 读取模式的结构、布局与交互规则 |\n| `recommend_page` | 根据页面意图推荐模式;可附带 starter 脚手架 |\n| `get_design_rules` | 设计令牌与组合规则 |\n| `recommend_component` | 列出、阅读或推荐组件选型指南 |\n\n多数工具支持 `mode`:`zh`(默认)或 `en`。\n\n### 推荐工作流\n\n**查单个组件:** `search` / `get_component` → `get_example` → `validate_usage`\n\n**规划整页:** `recommend_page` → `get_pattern` → `get_component` / `get_example` → `get_design_rules`;组件取舍不明时调用 `recommend_component`\n\n需要 starter 代码时,给 `recommend_page` 传 `includeScaffold: true`:\n\n```json\n{\n \"intent\": \"油井管理列表\",\n \"pageType\": \"list\",\n \"features\": [\"筛选\", \"新增\", \"分页\"],\n \"includeScaffold\": true\n}\n```\n\n`recommend_component` 用法:\n\n- 不传 `query` 和 `decision` → 列出全部选型指南\n- 只传 `decision`(如 `overlay-choice`)→ 阅读某一指南\n- 传 `query` → 根据问题推荐组件\n\n## 对话示例\n\n接入后,可直接让助手调用本服务,例如:\n\n> 用 morya-ui 的 MCP 查一下 Dialog 的 props,并给一个带确认 / 取消按钮的示例。\n\n> 搜索和「日期」相关的组件,选一个适合表单的,按文档写出最小用法。\n\n> 根据 MCP 里 Button 的文档,写一个 `severity=\"danger\"` 的删除按钮,并校验 props 是否合法。\n\n助手应先调用工具,再基于返回内容生成类似:\n\n```vue\n<script setup lang=\"ts\">\nimport { MButton } from 'morya-ui'\n</script>\n\n<template>\n <MButton label=\"删除\" severity=\"danger\" />\n</template>\n```\n\n## 与文档站的关系\n\n目录与本站同源(组件 `docs/` + 指南 Markdown)。官网文档更新后,维护者重新发布 `@morya-ui/mcp`,客户端通过 `npx -y` 即可拿到新版本。\n\n更多实现细节见仓库内 [packages/ui-mcp/README.md](https://github.com/morya-space/morya-ui/tree/main/packages/ui-mcp)。\n\n## 下一步\n\n- [快速上手](/docs/quick-start):在应用中安装并使用组件\n- [组件](/components):浏览全部组件与交互示例\n",
24564
+ "markdown": "---\ntitle: MCP\norder: 10\ndescription: 可选的 MCP 服务,供支持 Model Context Protocol 的 AI 客户端检索本库文档。\n---\n\n# MCP\n\n[`@morya-ui/mcp`](https://www.npmjs.com/package/@morya-ui/mcp) 是可选的 [Model Context Protocol](https://modelcontextprotocol.io/)(stdio)服务。它把本站组件文档、示例与指南做成可检索工具,方便 **支持 MCP 的 AI 客户端** 按真实 API 生成代码。\n\n日常使用组件库 **不需要** 安装或配置 MCP。应用里仍然只依赖:\n\n```bash\npnpm add morya-ui\n```\n\n```ts\nimport 'morya-ui/styles.css'\n```\n\n## 接入方式\n\nMCP 客户端通过 stdio 启动本包即可:\n\n```bash\nnpx -y @morya-ui/mcp\n```\n\n通用写法:\n\n```json\n{\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@morya-ui/mcp\"]\n}\n```\n\n字段名因客户端而异,只要支持 MCP stdio 即可接入。\n\n### 常见客户端配置示例\n\n以下为常见产品的配置片段,键名可能随版本变化,以各产品官方文档为准。\n\n**Cursor**(`.cursor/mcp.json` 或用户级 MCP 配置):\n\n```json\n{\n \"mcpServers\": {\n \"morya-ui\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@morya-ui/mcp\"]\n }\n }\n}\n```\n\n**Claude Desktop / Claude Code**(`claude_desktop_config.json` 等):\n\n```json\n{\n \"mcpServers\": {\n \"morya-ui\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@morya-ui/mcp\"]\n }\n }\n}\n```\n\n**Windsurf**(MCP 设置中的 servers 配置):\n\n```json\n{\n \"mcpServers\": {\n \"morya-ui\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@morya-ui/mcp\"]\n }\n }\n}\n```\n\n**Cline**(VS Code 扩展设置中的 MCP servers):\n\n```json\n{\n \"mcpServers\": {\n \"morya-ui\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@morya-ui/mcp\"]\n }\n }\n}\n```\n\n**Zed**(`settings.json` → `context_servers`):\n\n```json\n{\n \"context_servers\": {\n \"morya-ui\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@morya-ui/mcp\"]\n }\n }\n}\n```\n\n**Continue**(`config.json` / YAML 中的 MCP servers,字段名以当前版本为准):\n\n```json\n{\n \"mcpServers\": [\n {\n \"name\": \"morya-ui\",\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@morya-ui/mcp\"]\n }\n ]\n}\n```\n\n## 可用工具\n\n### 基础 — 查组件文档\n\n| 工具 | 作用 |\n| --- | --- |\n| `list` | 列出组件 / 指南 / 示例 / 分类 / 页面模式 |\n| `search` | 搜索文档、示例、页面模式与组件选型指南 |\n| `get_component` | 读取组件说明与 API |\n| `get_example` | 获取源码示例 |\n| `get_guide` | 读取指南 |\n| `get_setup` | 安装与初始化说明 |\n| `validate_usage` | 对照文档粗检 props / events 用法 |\n| `version` | 版本与目录状态 |\n\n### 高级 — 页面组合(可选)\n\n| 工具 | 作用 |\n| --- | --- |\n| `list_patterns` | 列出可复用的页面组合模式 |\n| `get_pattern` | 读取模式的结构、布局与交互规则 |\n| `recommend_page` | 根据页面意图推荐模式;可附带 starter 脚手架 |\n| `get_design_rules` | 设计令牌与 MPage* 组合配方 |\n| `recommend_component` | 列出、阅读或推荐组件选型指南 |\n| `list_golden_pages` | 列出黄金样例页面 |\n| `get_golden_page` | 读取黄金样例 Vue 源码 |\n| `list_page_snippets` | 列出可复用的页面区块 snippet |\n| `get_page_snippet` | 读取局部区块 snippet(筛选区、工具栏等) |\n| `validate_page` | 校验页面组合、间距与双边框问题 |\n\n多数工具支持 `mode`:`zh`(默认)或 `en`。\n\n### 推荐工作流\n\n**查单个组件:** `search` / `get_component` → `get_example` → `validate_usage`\n\n**规划整页:** `recommend_page` → `get_golden_page` → `get_pattern` → `get_design_rules` → `get_component` / `get_example` → `validate_page`\n\n**改局部区块:** `get_page_snippet(section)` → `get_component` / `get_example` → `validate_usage` → `validate_page`\n\n需要 starter 代码时,给 `recommend_page` 传 `includeScaffold: true`:\n\n```json\n{\n \"intent\": \"油井管理列表\",\n \"pageType\": \"list\",\n \"features\": [\"筛选\", \"新增\", \"分页\"],\n \"includeScaffold\": true\n}\n```\n\n`recommend_component` 用法:\n\n- 不传 `query` 和 `decision` → 列出全部选型指南\n- 只传 `decision`(如 `overlay-choice`)→ 阅读某一指南\n- 传 `query` → 根据问题推荐组件\n\n## 对话示例\n\n接入后,可直接让助手调用本服务,例如:\n\n> 用 morya-ui 的 MCP 查一下 Dialog 的 props,并给一个带确认 / 取消按钮的示例。\n\n> 搜索和「日期」相关的组件,选一个适合表单的,按文档写出最小用法。\n\n> 根据 MCP 里 Button 的文档,写一个 `severity=\"danger\"` 的删除按钮,并校验 props 是否合法。\n\n助手应先调用工具,再基于返回内容生成类似:\n\n```vue\n<script setup lang=\"ts\">\nimport { MButton } from 'morya-ui'\n</script>\n\n<template>\n <MButton label=\"删除\" severity=\"danger\" />\n</template>\n```\n\n## 与文档站的关系\n\n目录与本站同源(组件 `docs/` + 指南 Markdown)。官网文档更新后,维护者重新发布 `@morya-ui/mcp`,客户端通过 `npx -y` 即可拿到新版本。\n\n更多实现细节见仓库内 [packages/ui-mcp/README.md](https://github.com/morya-space/morya-ui/tree/main/packages/ui-mcp)。\n\n## 下一步\n\n- [快速上手](/docs/quick-start):在应用中安装并使用组件\n- [组件](/components):浏览全部组件与交互示例\n",
24421
24565
  "sections": [
24422
24566
  {
24423
24567
  "title": "",
@@ -24432,7 +24576,7 @@
24432
24576
  {
24433
24577
  "title": "可用工具",
24434
24578
  "id": "可用工具",
24435
- "body": "### 基础 — 查组件文档\n\n| 工具 | 作用 |\n| --- | --- |\n| `list` | 列出组件 / 指南 / 示例 / 分类 / 页面模式 |\n| `search` | 搜索文档、示例、页面模式与组件选型指南 |\n| `get_component` | 读取组件说明与 API |\n| `get_example` | 获取源码示例 |\n| `get_guide` | 读取指南 |\n| `get_setup` | 安装与初始化说明 |\n| `validate_usage` | 对照文档粗检 props / events 用法 |\n| `version` | 版本与目录状态 |\n\n### 高级 — 页面组合(可选)\n\n| 工具 | 作用 |\n| --- | --- |\n| `list_patterns` | 列出可复用的页面组合模式 |\n| `get_pattern` | 读取模式的结构、布局与交互规则 |\n| `recommend_page` | 根据页面意图推荐模式;可附带 starter 脚手架 |\n| `get_design_rules` | 设计令牌与组合规则 |\n| `recommend_component` | 列出、阅读或推荐组件选型指南 |\n\n多数工具支持 `mode`:`zh`(默认)或 `en`。\n\n### 推荐工作流\n\n**查单个组件:** `search` / `get_component` → `get_example` → `validate_usage`\n\n**规划整页:** `recommend_page` → `get_pattern` → `get_component` / `get_example` → `get_design_rules`;组件取舍不明时调用 `recommend_component`\n\n需要 starter 代码时,给 `recommend_page` 传 `includeScaffold: true`:\n\n```json\n{\n \"intent\": \"油井管理列表\",\n \"pageType\": \"list\",\n \"features\": [\"筛选\", \"新增\", \"分页\"],\n \"includeScaffold\": true\n}\n```\n\n`recommend_component` 用法:\n\n- 不传 `query` 和 `decision` → 列出全部选型指南\n- 只传 `decision`(如 `overlay-choice`)→ 阅读某一指南\n- 传 `query` → 根据问题推荐组件"
24579
+ "body": "### 基础 — 查组件文档\n\n| 工具 | 作用 |\n| --- | --- |\n| `list` | 列出组件 / 指南 / 示例 / 分类 / 页面模式 |\n| `search` | 搜索文档、示例、页面模式与组件选型指南 |\n| `get_component` | 读取组件说明与 API |\n| `get_example` | 获取源码示例 |\n| `get_guide` | 读取指南 |\n| `get_setup` | 安装与初始化说明 |\n| `validate_usage` | 对照文档粗检 props / events 用法 |\n| `version` | 版本与目录状态 |\n\n### 高级 — 页面组合(可选)\n\n| 工具 | 作用 |\n| --- | --- |\n| `list_patterns` | 列出可复用的页面组合模式 |\n| `get_pattern` | 读取模式的结构、布局与交互规则 |\n| `recommend_page` | 根据页面意图推荐模式;可附带 starter 脚手架 |\n| `get_design_rules` | 设计令牌与 MPage* 组合配方 |\n| `recommend_component` | 列出、阅读或推荐组件选型指南 |\n| `list_golden_pages` | 列出黄金样例页面 |\n| `get_golden_page` | 读取黄金样例 Vue 源码 |\n| `list_page_snippets` | 列出可复用的页面区块 snippet |\n| `get_page_snippet` | 读取局部区块 snippet(筛选区、工具栏等) |\n| `validate_page` | 校验页面组合、间距与双边框问题 |\n\n多数工具支持 `mode`:`zh`(默认)或 `en`。\n\n### 推荐工作流\n\n**查单个组件:** `search` / `get_component` → `get_example` → `validate_usage`\n\n**规划整页:** `recommend_page` → `get_golden_page` → `get_pattern` → `get_design_rules` → `get_component` / `get_example` → `validate_page`\n\n**改局部区块:** `get_page_snippet(section)` → `get_component` / `get_example` → `validate_usage` → `validate_page`\n\n需要 starter 代码时,给 `recommend_page` 传 `includeScaffold: true`:\n\n```json\n{\n \"intent\": \"油井管理列表\",\n \"pageType\": \"list\",\n \"features\": [\"筛选\", \"新增\", \"分页\"],\n \"includeScaffold\": true\n}\n```\n\n`recommend_component` 用法:\n\n- 不传 `query` 和 `decision` → 列出全部选型指南\n- 只传 `decision`(如 `overlay-choice`)→ 阅读某一指南\n- 传 `query` → 根据问题推荐组件"
24436
24580
  },
24437
24581
  {
24438
24582
  "title": "对话示例",
@@ -1,6 +1,6 @@
1
1
  {
2
- "generatedAt": "2026-09-14T01:38:04.233Z",
3
- "catalogGeneratedAt": "2026-09-14T01:38:01.275Z",
2
+ "generatedAt": "2026-09-14T03:19:40.333Z",
3
+ "catalogGeneratedAt": "2026-09-14T03:19:36.680Z",
4
4
  "components": [
5
5
  {
6
6
  "id": "Accordion",
@@ -1762,6 +1762,31 @@
1762
1762
  "missing": []
1763
1763
  }
1764
1764
  },
1765
+ {
1766
+ "id": "Page",
1767
+ "exportName": "MPageContent",
1768
+ "examples": 6,
1769
+ "props": {
1770
+ "total": 0,
1771
+ "covered": 0,
1772
+ "missing": []
1773
+ },
1774
+ "events": {
1775
+ "total": 0,
1776
+ "covered": 0,
1777
+ "missing": []
1778
+ },
1779
+ "slots": {
1780
+ "total": 0,
1781
+ "covered": 0,
1782
+ "missing": []
1783
+ },
1784
+ "methods": {
1785
+ "total": 0,
1786
+ "covered": 0,
1787
+ "missing": []
1788
+ }
1789
+ },
1765
1790
  {
1766
1791
  "id": "Pagination",
1767
1792
  "exportName": "MPagination",
@@ -3075,8 +3100,8 @@
3075
3100
  }
3076
3101
  ],
3077
3102
  "summary": {
3078
- "components": 88,
3103
+ "components": 89,
3079
3104
  "componentsWithMissingCoverage": 84,
3080
- "totalExamples": 751
3105
+ "totalExamples": 757
3081
3106
  }
3082
3107
  }
@@ -0,0 +1,103 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * 黄金样例:仪表盘页
4
+ * @see DESIGN.md §3
5
+ */
6
+ import {
7
+ MBreadcrumb,
8
+ MCard,
9
+ MConfigProvider,
10
+ MGrid,
11
+ MGridItem,
12
+ MLayout,
13
+ MLayoutContent,
14
+ MLayoutHeader,
15
+ MPageContent,
16
+ MPageHeader,
17
+ MPagePlaceholder,
18
+ MPageStat,
19
+ MTable,
20
+ MTag,
21
+ zhCN,
22
+ } from 'morya-ui'
23
+
24
+ const stats = [
25
+ { label: '总用户', value: '12,480', trend: '+8.2%', icon: 'users' },
26
+ { label: '今日活跃', value: '1,926', trend: '+3.1%', icon: 'activity' },
27
+ { label: '待处理工单', value: '47', trend: '-12%', trendSeverity: 'warn' as const, icon: 'clipboard' },
28
+ { label: '系统健康', value: '99.9%', trend: '稳定', trendSeverity: 'secondary' as const, icon: 'heart' },
29
+ ]
30
+
31
+ const recentColumns = [
32
+ { key: 'id', label: '工单号', width: 96 },
33
+ { key: 'title', label: '标题' },
34
+ { key: 'priority', label: '优先级', width: 96 },
35
+ { key: 'status', label: '状态', width: 96 },
36
+ ]
37
+
38
+ const recentRows = [
39
+ { id: 'WO-1024', title: '登录异常反馈', priority: 'high', status: 'open' },
40
+ { id: 'WO-1023', title: '导出任务超时', priority: 'medium', status: 'progress' },
41
+ { id: 'WO-1022', title: '权限配置咨询', priority: 'low', status: 'done' },
42
+ ]
43
+
44
+ function prioritySeverity(p: string) {
45
+ if (p === 'high') return 'danger'
46
+ if (p === 'medium') return 'warn'
47
+ return 'secondary'
48
+ }
49
+
50
+ function statusLabel(s: string) {
51
+ if (s === 'open') return '待处理'
52
+ if (s === 'progress') return '进行中'
53
+ return '已完成'
54
+ }
55
+ </script>
56
+
57
+ <template>
58
+ <MConfigProvider :locale="zhCN">
59
+ <MLayout fill-viewport>
60
+ <MLayoutHeader :padding="'var(--m-space-4) var(--m-space-6)'">
61
+ <MBreadcrumb :model="[{ label: '首页' }, { label: '仪表盘' }]" />
62
+ </MLayoutHeader>
63
+
64
+ <MLayoutContent>
65
+ <MPageContent density="spacious">
66
+ <MPageHeader title="仪表盘" />
67
+
68
+ <MGrid :cols="4" :x-gap="16" :y-gap="16" responsive="screen">
69
+ <MGridItem v-for="item in stats" :key="item.label" :span="1">
70
+ <MPageStat
71
+ :label="item.label"
72
+ :value="item.value"
73
+ :trend="item.trend"
74
+ :trend-severity="item.trendSeverity ?? 'primary'"
75
+ :icon="item.icon"
76
+ />
77
+ </MGridItem>
78
+ </MGrid>
79
+
80
+ <MGrid :cols="2" :x-gap="16" :y-gap="16">
81
+ <MGridItem :span="1">
82
+ <MCard title="趋势概览">
83
+ <MPagePlaceholder aria-label="图表占位" description="图表区域(接入 ECharts / 业务组件)" />
84
+ </MCard>
85
+ </MGridItem>
86
+ <MGridItem :span="1">
87
+ <MCard title="最近工单">
88
+ <MTable :columns="recentColumns" :rows="recentRows" size="small" :paginator="false" bordered>
89
+ <template #cell-priority="{ value }">
90
+ <MTag :value="String(value)" :severity="prioritySeverity(String(value))" />
91
+ </template>
92
+ <template #cell-status="{ value }">
93
+ <MTag :value="statusLabel(String(value))" severity="info" />
94
+ </template>
95
+ </MTable>
96
+ </MCard>
97
+ </MGridItem>
98
+ </MGrid>
99
+ </MPageContent>
100
+ </MLayoutContent>
101
+ </MLayout>
102
+ </MConfigProvider>
103
+ </template>
@@ -0,0 +1,103 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * 黄金样例:表单页
4
+ * @see DESIGN.md §3
5
+ */
6
+ import {
7
+ MBreadcrumb,
8
+ MButton,
9
+ MConfigProvider,
10
+ MDatePicker,
11
+ MForm,
12
+ MFormItem,
13
+ MInput,
14
+ MLayout,
15
+ MLayoutContent,
16
+ MLayoutHeader,
17
+ MPageContent,
18
+ MPageHeader,
19
+ MPageSection,
20
+ MSelect,
21
+ MSpace,
22
+ MSwitch,
23
+ MTextarea,
24
+ zhCN,
25
+ } from 'morya-ui'
26
+ import { reactive, ref } from 'vue'
27
+
28
+ const submitting = ref(false)
29
+
30
+ const model = reactive({
31
+ name: '',
32
+ email: '',
33
+ role: undefined as string | undefined,
34
+ active: true,
35
+ joinedAt: null as string | null,
36
+ bio: '',
37
+ })
38
+
39
+ const roleOptions = [
40
+ { label: '管理员', value: 'admin' },
41
+ { label: '成员', value: 'member' },
42
+ ]
43
+
44
+ async function onSubmit() {
45
+ submitting.value = true
46
+ try {
47
+ // await api.save(model)
48
+ } finally {
49
+ submitting.value = false
50
+ }
51
+ }
52
+ </script>
53
+
54
+ <template>
55
+ <MConfigProvider :locale="zhCN">
56
+ <MLayout fill-viewport>
57
+ <MLayoutHeader :padding="'var(--m-space-4) var(--m-space-6)'">
58
+ <MBreadcrumb :model="[{ label: '首页', to: '/' }, { label: '用户管理', to: '/users' }, { label: '新建用户' }]" />
59
+ </MLayoutHeader>
60
+
61
+ <MLayoutContent>
62
+ <MPageContent width="narrow">
63
+ <MPageHeader title="新建用户" description="填写基本信息并分配角色。" />
64
+
65
+ <MPageSection variant="form">
66
+ <MForm @submit="onSubmit">
67
+ <MFormItem label="姓名" name="name" required>
68
+ <MInput v-model="model.name" placeholder="请输入姓名" fluid />
69
+ </MFormItem>
70
+
71
+ <MFormItem label="邮箱" name="email" required>
72
+ <MInput v-model="model.email" type="email" placeholder="name@example.com" fluid />
73
+ </MFormItem>
74
+
75
+ <MFormItem label="角色" name="role" required>
76
+ <MSelect v-model="model.role" :options="roleOptions" placeholder="请选择角色" fluid />
77
+ </MFormItem>
78
+
79
+ <MFormItem label="入职日期" name="joinedAt">
80
+ <MDatePicker v-model="model.joinedAt" placeholder="选择日期" fluid />
81
+ </MFormItem>
82
+
83
+ <MFormItem label="启用账号" name="active">
84
+ <MSwitch v-model="model.active" />
85
+ </MFormItem>
86
+
87
+ <MFormItem label="简介" name="bio">
88
+ <MTextarea v-model="model.bio" :rows="4" placeholder="可选" fluid />
89
+ </MFormItem>
90
+
91
+ <MPageSection variant="actions">
92
+ <MSpace>
93
+ <MButton native-type="submit" severity="primary" :loading="submitting">保存</MButton>
94
+ <MButton severity="secondary">取消</MButton>
95
+ </MSpace>
96
+ </MPageSection>
97
+ </MForm>
98
+ </MPageSection>
99
+ </MPageContent>
100
+ </MLayoutContent>
101
+ </MLayout>
102
+ </MConfigProvider>
103
+ </template>