企业产品设计 · 新资源

Morningstar 设计系统.

构建一个让数字对齐、资产颜色保持原有含义、文字清晰易读的研究界面。探索 MDS 常量、Vue 3 集成、Morningstar Intrinsic 迁移,以及一个可排序的虚构资产配置记录簿。

OpenDesign 指南7 个章节37 条参考条目原始应用指南
01

Morningstar 设计系统 界面预览

切换两个原始配置模型并按百分比排序,同时保持颜色与资产类别的对应关系。

虚构的配置笔记本打开完整示例
离线原生 HTML 解读,采用文中引用的历史 MDS 配置颜色和系统字体。不使用 MDS Vue 运行时、专有评级或实时投资数据。· 实现参考
02

Morningstar 设计系统 设计参考

采用当前 Vue 3 的方式,并参考 2025 年 Intrinsic 指南,同时明确标注公开常量的版本。旧版 v2.37 数值仅作历史参考,并不代表当前 Vue 3 软件包中的数值。此示例采用所引用的历史图表颜色,并使用自有应用布局。

当前采用边界

来源
名称 / 规则值 / 配置用途
UI scope@mds组件分别进行版本管理。
Chart scope@mce图表元素单独设定作用域。
Vue 3 packages-vue3 suffix使用对应版本的库。
Registryartifacts.morningstar.com/repository/npm-prod-group/需要内部访问权限。
SassDart Sass / sass package编译提供的组件样式。
CSS Modules[local]___researchNotebook示例应用命名空间,并非官方要求的后缀。

Intrinsic 过渡

来源
名称 / 规则值 / 配置用途
TypefaceMorningstar Intrinsic必须单独获取获准使用的资源。
WeightsRegular and Bold当前支持的字重系列。
Thin / Light / RegularMap to Intrinsic Regular旧字重名称不代表新增了三种字体文件。
Bold / HeavyMap to Intrinsic Bold有意识地使用强调效果。
Vue 3 typography@mds/typography-vue3更新后的 mixin。
Legacy monolith / MBCNo Intrinsic updates新集成不要基于旧的单体软件包。

文本颜色 — constants 3.3.0 快照

来源
名称 / 规则值 / 配置用途
$mds-text-color-primary#1e1e1e 浅色背景上的主要文本。
$mds-text-color-secondary#5e5e5e 浅色背景上的辅助文本。
$mds-text-color-primary-on-dark#ffffff 深色背景上的主要文本。
$mds-text-color-secondary-on-dark#ababab 深色背景上的辅助文本。
$mds-text-color-interactive-primary#006fba 交互文本;链接应优先使用 link mixin。
$mds-text-color-error#ca0000 错误文本,与反馈填充色有所区别。

历史配置配色 — v2.37

来源
名称 / 规则值 / 配置用途
$mds-visualization-color-asset-allocation-equity#1f55a5 股票图表区段。
$mds-visualization-color-asset-allocation-fixed-income#ef7622 固定收益图表区段。
$mds-visualization-color-asset-allocation-cash#518428 现金图表区段。
$mds-visualization-color-asset-allocation-alternative#a50032 另类资产区段。
$mds-visualization-color-asset-allocation-not-classified#e5e5e5 未分类区段;应搭配标签使用。

历史间距 — v2.37

来源
名称 / 规则值 / 配置用途
$mds-space-quarter-x2px历史常量;采用前请核实已安装的软件包。
$mds-space-half-x4px历史常量;采用前请核实已安装的软件包。
$mds-space-1-x8px历史常量;采用前请核实已安装的软件包。
$mds-space-1-and-a-half-x12px历史常量;采用前请核实已安装的软件包。
$mds-space-2-x16px历史常量;采用前请核实已安装的软件包。
$mds-space-3-x24px历史常量;采用前请核实已安装的软件包。
$mds-space-4-x32px历史常量;采用前请核实已安装的软件包。
$mds-space-6-x48px历史常量;采用前请核实已安装的软件包。

表格组合控制项

来源
名称 / 规则值 / 配置用途
row-numbersBoolean on mds-table在 mds-tr 上提供行号。
nested-headersNumber of levels使用 mds-thead-group-n 插槽。
multiselectionBoolean on mds-table区分全选和部分选中状态。
mds-thead.indeterminateBoolean表示部分选中。
mds-tr.multiselection-labelRow-identifying text为选择复选框命名。
mds-pagination-page-changedPagination event应用程序提供页面切换逻辑。
03

Morningstar 设计系统 完整指南

实用指南,介绍如何为真实界面选择、应用和评审此系统。

DESIGN-morningstar.md

完整指导、实现起点和源代码链接。

下载指南

Morningstar 设计系统 围绕可比较数字构建的研究笔记本

表格承载精确数值

原始示例展示了两个虚构的配置模型、一条堆叠条形图和一张精确数值表。图形条带用于说明相对构成;表格则是权威的数据阅读界面。每个模型的总和均为 100%,所选模型的名称同时显示在标题和表格说明中。

摘自本 OpenDesign 指南

排序只会改变行的顺序,不会改变分母或资产类别的颜色。读者可以从整体配置印象切换到精确百分比,无需解读专有评级图标。这是一项具体的研究交互,并非虚构的 Morningstar 产品或投资建议。

阅读配套规范

Morningstar 设计系统 常量具有预期用途和版本边界

不要把所有灰色都变成文本令牌

MDS 区分基于角色的常量和通用颜色。工程师指南特别说明:当非文本元素需要使用与文本相同的视觉值时,应将文本颜色与通用中性色区分开。所提供的 Sass 示例将阅读角色用于文本,将通用中性色用于自定义表格分隔线。

参考表保留了各自的版本边界:constants 3.3.0 支持文中引用的文本值,公开的 v2.37 存档支持历史配置和间距值。这些内容有助于理解现有界面,但不能证明当前 Vue 3 中的每个常量都能以相同方式解析。将存档数值视为当前设计要求前,请检查获准使用的软件包。

阅读配套规范

Morningstar 设计系统 Morningstar Intrinsic 改变了实现基准

两个字重系列,组件协同更新

2025 年的 Intrinsic 公告将旧有的 thin、light 和 regular 名称对应到 regular 字体,将 bold 和 heavy 对应到 bold 字体。仅更新 font-family 声明并不能完成这次迁移:公告要求更新组件,包括字体和排版软件包。

旧版 morningstar-design-system 单体软件包和 Morningstar Base Charts 不会获得 Intrinsic 更新。新示例不应将这些已存档的安装路径与当前 Vue 3 指引混用。此离线笔记本使用系统回退字体,不嵌入专有字体文件。

阅读配套规范

Morningstar 设计系统 显式组合表格功能

选择、嵌套表头和分页各自承担不同职责

MDS 提供用于组合的表格元素,而不是将所有数据操作强行塞进一个不透明的数据网格。文档中的模式支持行号、嵌套表头插槽、多选和分页。应用仍需自行负责数据转换和选择状态。

提供的工作示例有意采用基于常量样式的原生表格。转向原生组件系列时,文档中的 MDS 组合参考仍然有用:部分选中状态应体现在表头的不确定状态中,每个行复选框都需要一个用于标识行的多选标签。

  • 百分比值应保持数值类型,直到显示格式化时再处理;不要对格式化后的字符串排序。
  • 数值列标题应与其单元格一样右对齐。
  • 排序时保留资产标签;索引位置不是稳定的记录标识符。

阅读配套规范

Morningstar 设计系统 资产颜色不是通用装饰

固定颜色含义,并提供对应的文本说明

历史资产配置配色区分股票、固定收益、现金、另类资产和未分类资产。在示例中,这三种相关资产颜色始终对应各自的资产类别,不因模型或行顺序变化而改变。颜色不会根据恰好排在首位的分段轮换。

文本表格会重复列出每个数值,因此用户无需分辨蓝色、橙色和绿色,也能理解该模型。示例避免使用 Morningstar 星级、Medalist 或风格箱图像:官方图标参考规定,知识产权图标只能用于其既定含义。

阅读配套规范

Morningstar 设计系统 将历史间距尺度与应用布局分开

紧凑的阅读界面,不隐藏列

归档资料记录了以 8 像素为基准的间距步长,并包含四分之一和二分之一的步长。示例采用克制的 8/16/24/32 节奏,灵感来自该历史参考。整体宽度、堆叠条高度和移动端断点均为应用自身的设计选择,并非虚构的官方常量。

表格仅保留三列:资产类别、百分比和对比条。窄屏下会移除微型对比条,同时保留资产和精确百分比。模型选择器位于数据上方,且标签始终可见;这里没有无标签的纯图标筛选器。

阅读配套规范

Morningstar 设计系统 在授权范围内采用当前一代软件包

为产品添加样式前,先配置实际资源

获授权的团队可以使用文档中说明的内部注册表、Vue 3 软件包后缀和 Sass 配置。CSS 模块会限定组件样式的作用域,因此不同版本可以共存;示例使用了产品专属命名空间。使用字体的样式编译前,必须先配置托管的字体资源。

公共预览不需要任何此类访问权限。它是一个完整、独立的 HTML 配置交互演示,采用有来源依据的历史配色,并明确回退到系统字体。单独的 Vue 示例提供了基于常量的具体接入方式;这并不意味着此页面能够授予注册表或字体访问权限。

  1. 确认已获批的内部注册表和字体访问权限,然后创建上方所示的作用域项目配置。
  2. 先编译 Sass 入口,再编译应用组件,并挂载完整的 App.vue 示例。
  3. 在预览中切换资产配置模型,分别按升序和降序排序,并确认标签、数值和总计始终保持同步。

阅读配套规范

Morningstar 设计系统组件示例

完整的独立交互示例

将完整文档保存为 index.html 并在浏览器中打开。离线原生 HTML 示例采用文中引用的历史 MDS 资产配置配色和系统字体。不包含 MDS Vue 运行时、专有评级或实时投资数据。

html
<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Allocation notebook — MDS interpretation</title><style>*{box-sizing:border-box}body{margin:0;background:#fff;color:#1e1e1e;font:16px/1.45 Arial,sans-serif}.app{max-width:1100px;margin:auto;padding:32px}.mast{border-bottom:2px solid #333;display:flex;justify-content:space-between;padding-bottom:16px;gap:16px}.mast b{letter-spacing:.06em}.mast span,.muted{color:#5e5e5e;font-size:13px}h1{font-size:36px;font-weight:400;line-height:1.2;margin:28px 0 10px}.intro{max-width:600px;color:#5e5e5e;margin:0 0 24px}.controls{background:#f2f2f2;display:flex;align-items:center;gap:16px;padding:16px;margin-bottom:24px}select{font:inherit;padding:8px 32px 8px 10px;background:white;border:1px solid #808080;border-radius:2px}button:focus-visible,select:focus-visible{outline:3px solid #006fba;outline-offset:3px}.chart{display:grid;grid-template-columns:1fr 90px;gap:24px;align-items:center;margin:28px 0 32px}.stack{display:flex;height:42px;overflow:hidden}.segment{min-width:0}.total{text-align:right;font-size:30px}.total small{display:block;font-size:11px;color:#5e5e5e}.legend{display:flex;flex-wrap:wrap;gap:16px;font-size:13px;margin-top:12px}.legend i{display:inline-block;width:8px;height:8px;margin-right:6px}table{width:100%;border-collapse:collapse}caption{text-align:left;font-size:20px;padding-bottom:12px}th,td{padding:16px 8px;border-bottom:1px solid #e5e5e5;text-align:left;font-weight:400}thead th{border-top:2px solid #333;border-bottom:1px solid #808080;font-size:13px}.numeric{text-align:right;font-variant-numeric:tabular-nums}.sort{border:0;background:none;color:#006fba;cursor:pointer;padding:0;font:inherit;text-align:right}.spark{width:35%}.track{height:6px;background:#f2f2f2}.fill{height:6px}.status{font-size:12px;min-height:20px;color:#5e5e5e}.foot{margin-top:32px;padding-top:16px;border-top:1px solid #ccc;font-size:12px;color:#5e5e5e}@media(max-width:600px){.app{padding:20px}.mast{flex-direction:column;gap:4px}h1{font-size:30px}.controls{align-items:flex-start;flex-direction:column;gap:8px}.chart{grid-template-columns:1fr 70px;gap:12px}.spark{display:none}.numeric{width:35%}th,td{padding:16px 4px}.legend{gap:10px}}</style><main class="app"><header class="mast"><b>RESEARCH NOTEBOOK</b><span>Independent MDS interpretation</span></header><h1>One model. Every allocation.</h1><p class="intro">Read the mix at a glance, then inspect the exact numbers. These two original models are fictional.</p><div class="controls"><label for="model">Sample model</label><select id="model"><option value="balanced">Balanced sample</option><option value="reserve">Reserve sample</option></select><span class="muted">No market data or investment recommendation</span></div><div class="chart"><div><div class="stack" id="stack" aria-hidden="true"></div><div class="legend"><span><i style="background:#1f55a5"></i>Equity</span><span><i style="background:#ef7622"></i>Fixed income</span><span><i style="background:#518428"></i>Cash</span></div></div><div class="total">100<small>PERCENT TOTAL</small></div></div><table><caption id="caption">Balanced sample allocation</caption><thead><tr><th scope="col">Asset class</th><th scope="col" id="sorthead" class="numeric" aria-sort="descending"><button class="sort" id="sort">Allocation (%) ↓</button></th><th scope="col" class="spark">Share of model</th></tr></thead><tbody id="rows"></tbody></table><p class="status" id="status" role="status">Sorted by allocation, highest first.</p><p class="foot">Historical MDS v2.37 allocation colors; original application layout and system-font fallback. No Morningstar ratings, proprietary font assets or native Vue components are included.</p></main><script>const models={balanced:[55,35,10],reserve:[20,45,35]},assets=[{name:'Equity',color:'#1f55a5'},{name:'Fixed income',color:'#ef7622'},{name:'Cash',color:'#518428'}];let ascending=false;const model=document.querySelector('#model');function render(){const entries=assets.map((a,i)=>({...a,value:models[model.value][i]}));document.querySelector('#stack').innerHTML=entries.map(a=>`<div class="segment" style="width:${a.value}%;background:${a.color}"></div>`).join('');document.querySelector('#caption').textContent=model.selectedOptions[0].textContent+' allocation';document.querySelector('#rows').innerHTML=[...entries].sort((a,b)=>ascending?a.value-b.value:b.value-a.value).map(a=>`<tr><th scope="row">${a.name}</th><td class="numeric">${a.value.toFixed(1)}%</td><td class="spark"><div class="track"><div class="fill" style="width:${a.value}%;background:${a.color}"></div></div></td></tr>`).join('');document.querySelector('#sorthead').setAttribute('aria-sort',ascending?'ascending':'descending');document.querySelector('#sort').textContent='Allocation (%) '+(ascending?'↑':'↓');document.querySelector('#status').textContent='Sorted by allocation, '+(ascending?'lowest first.':'highest first.')}model.onchange=render;document.querySelector('#sort').onclick=()=>{ascending=!ascending;render()};render();</script></html>

代码参考

  • 资产配置数值为虚构数据。排序时资产颜色仍对应其类别含义;本文档不包含专有 MDS Vue 资源或 Intrinsic 字体。

完整的可排序表格,分母明确

Vue 3 表格采用原生语义,并使用上文所述的 MDS 视觉语言配置。排序会保留数值类型并报告排序方向。

vue
<!-- src/App.vue — native table styled with MDS constants, not MdsTable -->
<script setup>
import {computed,ref} from 'vue';
const ascending=ref(false);
const rows=[{name:'Sample Equity',allocation:55},{name:'Sample Bonds',allocation:35},{name:'Sample Cash',allocation:10}];
const sorted=computed(()=>[...rows].sort((a,b)=>ascending.value?a.allocation-b.allocation:b.allocation-a.allocation));
</script>
<template>
 <main><h1>Research notebook</h1><p>Fictional allocation; not an investment recommendation.</p>
 <table><caption>Sample allocation, total 100%</caption><thead><tr><th scope="col">Asset</th><th scope="col" class="numeric" :aria-sort="ascending?'ascending':'descending'"><button type="button" @click="ascending=!ascending">Allocation (%) {{ascending?'↑':'↓'}}</button></th></tr></thead>
 <tbody><tr v-for="row in sorted" :key="row.name"><th scope="row">{{row.name}}</th><td class="numeric">{{row.allocation.toFixed(1)}}%</td></tr></tbody></table>
 <p role="status">Sorted by allocation, {{ascending?'lowest first':'highest first'}}.</p></main>
</template>

代码参考

  • MDS 允许团队在不使用其 Vue 组件的情况下调整常量和视觉语言。
  • 本示例有意不虚构 MdsTable 导入项或未记录的排序事件。
  • 55/35/10 的资产配置为虚构数据,总和为 100,并非市场数据。

将字体排印尺度与语义标题层级分开

官方混入可以将 h1 设置为视觉上的二级标题尺度,同时不改变其文档语义。

scss
@use '@mds/constants-vue3' as *;
@use '@mds/typography-vue3' as *;
h1 { @include mds-level-2-heading($bold:true); color:$mds-text-color-primary; }
p { @include mds-body-text-m(); color:$mds-text-color-primary; }

代码参考

  • 字体排印混入不会设置文本颜色。
  • 为图表元素使用单独定义作用域的 MCE 常量,不要假设 MDS 覆盖设置会传播到图表中。
04

Morningstar 设计系统 AI Agent 配置

实现起点

供获授权团队使用的受限注册表配置。字体路径必须指向应用实际托管且已获许可的文件。请与下方的 App.vue 配合使用。这是基于常量的原生 HTML 表格,并不表示 MDS 软件包可公开获取,也不表示已验证原生编译。

Shell / JavaScript / SCSS
# Authorized Morningstar teams only: project .npmrc
@mds:registry=https://artifacts.morningstar.com/repository/npm-prod-group/
@mce:registry=https://artifacts.morningstar.com/repository/npm-prod-group/

# Within a Vite Vue 3 project with approved registry access
pnpm add @mds/constants-vue3 @mds/typography-vue3 @mds/fonts-vue3
pnpm add -D sass

// vite.config.js
import {defineConfig} from 'vite';
import vue from '@vitejs/plugin-vue';
export default defineConfig({
  plugins:[vue()],
  css:{modules:{generateScopedName:'[local]___researchNotebook'}}
});

// src/main.js
import {createApp} from 'vue';
import './main.scss';
import App from './App.vue';
createApp(App).mount('#app');

// src/main.scss — host licensed font files at this application path first
@use '@mds/fonts-vue3/scss/config' with ($font-path:'/fonts/morningstar-intrinsic');
@use '@mds/fonts-vue3';
@use '@mds/constants-vue3' as *;
@use '@mds/typography-vue3' as *;
h1 { @include mds-level-2-heading($bold:true); color:$mds-text-color-primary; }
p,td,th { @include mds-body-text-m(); color:$mds-text-color-primary; }
main { margin:$mds-space-4-x; }
table { width:100%;border-collapse:collapse; }
th,td { text-align:left; border-bottom:1px solid $mds-color-neutral-37; }
.numeric { text-align:right;font-variant-numeric:tabular-nums; }
button { font:inherit;cursor:pointer; }

适用于你项目的提示词

Agent 提示词
使用本指南中明确标注的版本边界,创建一个受 Morningstar 启发的研究笔记本。将精确的资产配置数值保留在语义表格中,并让颜色始终对应其资产含义。不要虚构评级,也不要将知识产权图标用作装饰。只有在获批访问权限的情况下,才能使用当前获授权的 Vue 3 常量和字体配置;否则,请明确标注为离线实现。
05

Morningstar 设计系统 来源与范围

独立的 OpenDesign 指南。资产配置示例均为虚构内容,不构成财务建议。历史数值常量均标明其来源版本;当前软件包和字体的访问权限仍由 Morningstar 控制。