政府与公共服务 · 新资源

Designsystemet 设计系统.

通过完整的任务说明编辑器,探索 Designsystemet 实际的主题角色、尺寸模式和原生字段行为,并查看字符数反馈及保留的呈现状态。

OpenDesign 指南6 个章节35 条参考条目原始应用指南
01

Designsystemet 设计系统界面预览

使用原生字符计数器,切换主题和尺寸,并根据内容的变化决定是否保留或使确认状态失效。

在不同尺寸和外观下查看简报打开完整示例
原生 Designsystemet 1.23.0 ds-field 行为、CSS 和使用本地 Inter 字体的默认主题。· 实现参考
02

Designsystemet 设计系统设计参考

@digdir/designsystemet-css/web 1.23.0 中的默认主题导出项和原生 ds-field 实现。颜色行明确记录浅色模式的取值。

默认浅色强调色用途

来源
名称 / 规则值 / 配置用途
--ds-color-accent-background-default#fff1.23.0 中的实际默认浅色主题用途。运行时的深色方案使用单独的用途值。
--ds-color-accent-background-tinted#eef4fa 1.23.0 中的实际默认浅色主题用途。运行时的深色方案使用单独的用途值。
--ds-color-accent-surface-tinted#ddeaf6 1.23.0 中的实际默认浅色主题用途。运行时的深色方案使用单独的用途值。
--ds-color-accent-surface-hover#c7ddf0 1.23.0 中的实际默认浅色主题用途。运行时的深色方案使用单独的用途值。
--ds-color-accent-border-subtle#99c0e3 1.23.0 中的实际默认浅色主题用途。运行时的深色方案使用单独的用途值。
--ds-color-accent-border-default#2a7cc5 1.23.0 中的实际默认浅色主题用途。运行时的深色方案使用单独的用途值。
--ds-color-accent-text-default#002c54 1.23.0 中的实际默认浅色主题用途。运行时的深色方案使用单独的用途值。
--ds-color-accent-base-default#0062ba 1.23.0 中的实际默认浅色主题用途。运行时的深色方案使用单独的用途值。
--ds-color-accent-base-hover#004f96 1.23.0 中的实际默认浅色主题用途。运行时的深色方案使用单独的用途值。
--ds-color-accent-base-active#003d75 1.23.0 中的实际默认浅色主题用途。运行时的深色方案使用单独的用途值。
--ds-color-accent-base-contrast-default#fff1.23.0 中的实际默认浅色主题用途。运行时的深色方案使用单独的用途值。

默认浅色中性色用途

来源
名称 / 规则值 / 配置用途
--ds-color-neutral-background-default#fff使用中性用途呈现辅助界面表面和文本,避免赋予不必要的状态含义。
--ds-color-neutral-background-tinted#f3f3f4 使用中性用途呈现辅助界面表面和文本,避免赋予不必要的状态含义。
--ds-color-neutral-surface-default#fff使用中性用途呈现辅助界面表面和文本,避免赋予不必要的状态含义。
--ds-color-neutral-surface-tinted#e8e8e9 使用中性用途呈现辅助界面表面和文本,避免赋予不必要的状态含义。
--ds-color-neutral-border-subtle#bbbcbd 使用中性用途呈现辅助界面表面和文本,避免赋予不必要的状态含义。
--ds-color-neutral-text-subtle#5b5d60 使用中性用途呈现辅助界面表面和文本,避免赋予不必要的状态含义。
--ds-color-neutral-text-default#292c30 使用中性用途呈现辅助界面表面和文本,避免赋予不必要的状态含义。
--ds-color-neutral-base-default#24272b 使用中性用途呈现辅助界面表面和文本,避免赋予不必要的状态含义。
--ds-color-neutral-base-contrast-default#fff使用中性用途呈现辅助界面表面和文本,避免赋予不必要的状态含义。

尺寸模式与字体基础

来源
名称 / 规则值 / 配置用途
--ds-size-mode-font-size--sm1实际导出的标量值或表达式。请使用 data-size 模式,而不要将每个标量值都解释为像素值。
--ds-size-mode-font-size--md1.125实际导出的标量值或表达式。请使用 data-size 模式,而不要将每个标量值都解释为像素值。
--ds-size-mode-font-size--lg1.3125实际导出的标量值或表达式。请使用 data-size 模式,而不要将每个标量值都解释为像素值。
--ds-size-base18实际导出的标量值或表达式。请使用 data-size 模式,而不要将每个标量值都解释为像素值。
--ds-font-familyInter实际导出的标量值或表达式。请使用 data-size 模式,而不要将每个标量值都解释为像素值。
--ds-font-weight-regular400实际导出的标量值或表达式。请使用 data-size 模式,而不要将每个标量值都解释为像素值。
--ds-font-weight-medium500实际导出的标量值或表达式。请使用 data-size 模式,而不要将每个标量值都解释为像素值。
--ds-font-weight-semibold600实际导出的标量值或表达式。请使用 data-size 模式,而不要将每个标量值都解释为像素值。
--ds-line-height-sm1.3实际导出的标量值或表达式。请使用 data-size 模式,而不要将每个标量值都解释为像素值。
--ds-line-height-md1.5实际导出的标量值或表达式。请使用 data-size 模式,而不要将每个标量值都解释为像素值。
--ds-line-height-lg1.7实际导出的标量值或表达式。请使用 data-size 模式,而不要将每个标量值都解释为像素值。
--ds-border-radius-base0.25rem实际导出的标量值或表达式。请使用 data-size 模式,而不要将每个标量值都解释为像素值。
--ds-border-radius-smmin(.5 * var(--ds-border-radius-base), var(--ds-border-radius-scale))实际导出的标量值或表达式。请使用 data-size 模式,而不要将每个标量值都解释为像素值。
--ds-border-radius-mdmin(var(--ds-border-radius-base), 2 * var(--ds-border-radius-scale))实际导出的标量值或表达式。请使用 data-size 模式,而不要将每个标量值都解释为像素值。
--ds-border-radius-lgmin(2 * var(--ds-border-radius-base), 5 * var(--ds-border-radius-scale))实际导出的标量值或表达式。请使用 data-size 模式,而不要将每个标量值都解释为像素值。
03

Designsystemet 设计系统完整指南

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

DESIGN-digdir-designsystemet.md

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

下载指南

Designsystemet 设计系统行为、CSS 与主题包

按正确顺序加载这三个部分

Designsystemet 将与框架无关的行为、组件 CSS 和主题值分开。此示例将 designsystemet-web 和 designsystemet-css 固定在 1.23.0,先导入 CSS,再导入默认主题,并且只注册一次行为。只有样式、没有行为包的字段,与此处连接了行为的 ds-field 并非同一种实现。

摘自本 OpenDesign 指南

使用当前的原生-HTML契约

示例使用 ds-field 包裹普通的 input、textarea 和 select 元素,并为其添加 ds-input 类。这样既保留了原生表单控件,也能由软件包关联标签和描述。它没有复制较早的仅使用 React 的字段 API。完整源代码包含正确的软件包导入,以及原应用中的审核逻辑。

Designsystemet 设计系统配色方案与尺寸模式

通过数据属性更改外观

页面在根元素上将 data-color-scheme 设置为 light 或 dark。主题会提供相应的语义颜色,而表单值保持不变。参数表明确记录默认的浅色值,并未声称这些相同的十六进制颜色也适用于深色模式。次要外观按钮描述了接下来将执行的操作。

让尺寸模式影响整个系统

阅读尺寸控件会在 sm、md 和 lg 之间切换 data-size。这会更改主题的尺寸模式,而不是只缩放标题。已发布的模式系数为 1、1.125 和 1.3125;它们会参与设计令牌公式,并非要求将控件统一设为这些像素值。此示例还会在手机宽度下测试大尺寸模式。

Designsystemet 设计系统 Inter 与语义排版

包含预期字重

预览中包含 Inter 400、500 和 600 字重,并启用文档所述的 cv05 字体特性,以呈现小写字母 l 的字形。页面使用原生标题和段落类,使字重和行高遵循主题。固定为 14px 的注释是专门编写的辅助说明,明确位于主要交互尺寸体系之外。

将辅助内容放在对应控件旁边

标题提示说明标签的用途;结果提示说明预期内容的类型。它们会放在对应控件旁,并通过 ds-field 关联。辅助指南位于单独的卡片中,在窄屏上会排在表单之后。此布局不依赖悬停来显示说明。

Designsystemet 设计系统自动关联与字符反馈

让 ds-field 关联一个控件

每个 ds-field 都包含一个类似输入框的控件、它的标签,以及可选的 data-field 描述。软件包会分配 ID,并建立标签与描述之间的关联。将互不相关的控件分组放入同一个 ds-field,会使这项自动关联契约变得模糊。应使用 fieldset 对一组控件进行分组,而不要将此包装器视为通用表单容器。

  • 每个 ds-field 中只放一个类似输入框的控件。
  • 使用 data-field 描述来呈现相关辅助内容。
  • 让原生观察器维护 ID 和 described-by 关联。

了解计数器的计数方式

Designsystemet 设计系统应用验证与审核状态

单独验证用户填写的任务内容

应用要求任务标题和结果均不能为空,并拒绝超过示例限制的结果。显示可执行的提示后,它会将焦点移至相应字段。原生计数器用于说明长度,而提交处理程序负责执行本地审核规则。不会通过 maxlength 静默截断粘贴的文本。

更改呈现方式时保留数据

审核成功后,会以文本形式显示当前标题和结果。编辑任一字段都会清除审核结果;更改外观或尺寸则会保留结果,因为这些控件不会更改任务说明。这一区别是有意为之,并经过验证。数据不会发送到项目管理服务,预览也绝不会声称已创建外部任务。

Designsystemet 设计系统完整原生字段实现

复现指定版本的示例

创建一个 Vite vanilla 项目,安装两个固定版本的 Designsystemet 软件包和 Inter,然后保存完整的入口文件和 digdir.css。保留根挂载元素。源代码包含注册逻辑、主题加载顺序、计数器标记、呈现方式控件,以及所有审核验证状态转换。本地预览使用同一个原生字段观察器,而不是手工绘制的仿制版本。

  1. 只导入一次行为,然后导入组件 CSS 和默认主题。
  2. 加载 Inter 400、500 和 600,并保存完整的入口文件/CSS。
  3. 测试超限计数器,并修正结果内容。
  4. 执行审核,切换尺寸和外观,然后编辑文本以清除结果。

测试超限和恢复行为

将 150 个普通字符粘贴到结果字段,并确认提示超出限制 10 个字符。审核必须拒绝该内容。将文本替换为简短结果,成功通过审核,然后切换深色模式和阅读尺寸,确认结果仍然保留。编辑标题并确认旧审核结果已清除。在每种视口宽度下检查焦点可见性和文本换行。

Designsystemet 设计系统组件示例

main.js — 完整的原生字段与主题示例

完整编辑器、真实计数器标记、外观和尺寸控件,以及本地审核验证。

javascript
import '@digdir/designsystemet-web';
import '@digdir/designsystemet-css';
import '@digdir/designsystemet-css/theme';
import '@fontsource/inter/latin-400.css';
import '@fontsource/inter/latin-500.css';
import '@fontsource/inter/latin-600.css';
import './digdir.css';
document.documentElement.dataset.colorScheme='light';document.documentElement.dataset.size='md';document.getElementById('root').innerHTML=`<main><header><div><p class="eyebrow">DESIGNSYSTEMET / NATIVE FIELD STUDY</p><h1 class="ds-heading" data-size="lg">Write a useful task brief</h1></div><button id="theme" class="ds-button" data-variant="secondary" aria-pressed="false">Dark appearance</button></header><p class="ds-paragraph lead">Describe one outcome clearly. The native field connects its label, hint and character feedback while the theme controls size and appearance.</p><div class="layout"><form id="brief-form" novalidate><ds-field class="ds-field"><label>Task title</label><input id="title" class="ds-input" type="text" value="Review the navigation"/><p data-field="description">Use a short label that identifies the work.</p></ds-field><ds-field class="ds-field"><label>Desired outcome</label><textarea id="outcome" class="ds-input" rows="4">Make the main sections easier to find without changing the accepted content.</textarea><p data-field="description">Describe the result, not a list of implementation instructions.</p><p data-field="counter" data-limit="140" data-over="%d characters over the sample limit" data-under="%d characters remaining"></p></ds-field><p id="error" class="ds-validation-message" hidden role="alert"></p><button class="ds-button" type="submit">Review brief</button></form><aside class="ds-card" data-color="neutral"><h2 class="ds-heading" data-size="sm">Reading size</h2><p class="ds-paragraph">The theme changes the complete size mode rather than scaling only a heading.</p><ds-field class="ds-field"><label for="size">Component size</label><select class="ds-input" id="size"><option value="sm">Small</option><option value="md" selected>Medium</option><option value="lg">Large</option></select></ds-field><h3 class="ds-heading" data-size="xs">A clear brief contains</h3><ul><li>One concrete outcome.</li><li>Constraints that must remain true.</li><li>A way to check the result.</li></ul><p class="small">Default theme and web behavior 1.23.0. Original local application; no task is created elsewhere.</p></aside></div><section id="review" class="ds-card" data-color="success" hidden tabindex="-1"><h2 class="ds-heading" data-size="sm">Local brief review</h2><h3 id="review-title" class="ds-heading" data-size="xs"></h3><p id="review-body" class="ds-paragraph"></p><p class="small">Editing a field clears this review. Appearance and reading size preserve it.</p></section></main>`;const $=id=>document.getElementById(id);function edit(){$('review').hidden=true;$('error').hidden=true}['title','outcome'].forEach(id=>$(id).addEventListener('input',edit));$('theme').addEventListener('click',()=>{const dark=document.documentElement.dataset.colorScheme!=='dark';document.documentElement.dataset.colorScheme=dark?'dark':'light';$('theme').setAttribute('aria-pressed',String(dark));$('theme').textContent=dark?'Light appearance':'Dark appearance'});$('size').addEventListener('change',e=>document.documentElement.dataset.size=e.target.value);$('brief-form').addEventListener('submit',e=>{e.preventDefault();let message='',focus='outcome';if(!$('title').value.trim()){message='Enter a task title.';focus='title'}else if(!$('outcome').value.trim())message='Describe the desired outcome.';else if($('outcome').value.length>140)message='Shorten the outcome to 140 characters or fewer.';if(message){$('error').textContent=message;$('error').hidden=false;$(focus).focus();return}$('review-title').textContent=$('title').value.trim();$('review-body').textContent=$('outcome').value.trim();$('review').hidden=false;$('review').focus()});

代码参考

  • Select 在 ds-field 中使用当前的 ds-input 样式。计数器反馈由原生观察器管理。

digdir.css — 原始响应式布局

围绕原生主题构建的布局,包含 Inter 字体特性设置。

css
body{margin:0;font-family:Inter,sans-serif;font-feature-settings:"cv05" 1}main{max-width:1160px;margin:auto;padding:32px}header{display:flex;gap:24px;justify-content:space-between;align-items:start}.eyebrow{font-size:13px;letter-spacing:.04em;font-weight:600}.lead{max-width:65ch;margin-top:24px}.layout{display:grid;grid-template-columns:1.6fr 1fr;gap:40px;margin-top:32px}form{display:grid;gap:24px;align-content:start}form button{justify-self:start}aside{padding:24px;align-self:start}aside h3{margin-top:32px}aside select{margin-top:8px}aside li{margin:12px 0}.small{font-size:14px;line-height:1.6}#review{padding:24px;margin-top:32px}#review h3{margin-top:16px}[hidden]{display:none!important}@media(max-width:760px){main{padding:20px}.layout{grid-template-columns:1fr;gap:24px}header{flex-direction:column}}

代码参考

  • 更改主题和尺寸会保留原有值;只有编辑内容才会使审核失效。
04

Designsystemet 设计系统 Agent 设置

实现起点

已在真实浏览器中测试原生标签关联、计数器状态、验证错误恢复,以及明暗主题下的尺寸变化。

sh
npm create vite@latest ds-brief -- --template vanilla
cd ds-brief
npm install
npm install @digdir/[email protected] @digdir/[email protected] @fontsource/inter
# Replace src/main.js and add src/digdir.css. Keep <div id="root"></div>.
npm run dev

适用于你项目的提示词

Agent 提示词
按照正确顺序,使用 Designsystemet 1.23.0 的行为、CSS 和默认主题构建简报编辑器。使用 ds-field、一个原生控件、实际的 data-field 计数器属性和 Inter 字重。更改外观和尺寸时保留审核状态,编辑内容后清除审核状态,并严格执行原有的 140 字符限制,不截断粘贴的输入。
05

Designsystemet 设计系统来源与范围

由 OpenDesign 编写的本地编辑器,使用 Designsystemet CSS 和 1.23.0 版 Web 行为。默认主题和字段观察器均为原生功能;简报内容、140 字符限制和审核流程为自定义内容。