政府与公共服务 · 新资源

Det Fælles Designsystem 设计系统.

通过完整的资源对比,探索丹麦 DKFDS 主题、实际 Sass 尺度和无障碍表格模式;其中包含数字排序、提交搜索和无结果状态恢复。

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

Det Fælles Designsystem 设计系统界面预览

比较五项原创规划资源,反转排序,并从无结果的查询中恢复。

对资源列表进行排序和搜索打开完整示例
使用已发布的 DKFDS 11.3.0 Borger.dk CSS 和本地字体;自定义数值/文本排序与提交式搜索。· 实现参考
02

Det Fælles Designsystem 设计系统设计参考

实际的 DKFDS 11.3.0 Borger.dk 主题、间距映射、字体映射和焦点变量。此处显示的名称是 Sass 源码引用。

Borger.dk 主题与焦点样式

来源
名称 / 规则值 / 配置用途
$borger-primary#44831E 实际的 11.3.0 Sass 配置;这些名称是源码变量,并非 CSS 自定义属性。
$borger-primary-dark#3C5C22 实际的 11.3.0 Sass 配置;这些名称是源码变量,并非 CSS 自定义属性。
$borger-primary-darker#233614 实际的 11.3.0 Sass 配置;这些名称是源码变量,并非 CSS 自定义属性。
$header-portal-background-color#f1f1f1 实际的 11.3.0 Sass 配置;这些名称是源码变量,并非 CSS 自定义属性。
$theme-focus-width3px实际的 11.3.0 Sass 配置;这些名称是源码变量,并非 CSS 自定义属性。
$theme-focus-offset1px实际的 11.3.0 Sass 配置;这些名称是源码变量,并非 CSS 自定义属性。
$theme-focus-stylesolid实际的 11.3.0 Sass 配置;这些名称是源码变量,并非 CSS 自定义属性。
$typography-text-max-width66ch实际的 11.3.0 Sass 配置;这些名称是源码变量,并非 CSS 自定义属性。
$typography-font-familyIBM Plex Sans, system-ui, system, sans-serif实际的 11.3.0 Sass 配置;这些名称是源码变量,并非 CSS 自定义属性。

间距映射键

来源
名称 / 规则值 / 配置用途
00px已发布的 $spacers 映射。305 和 405 等非连续键分别表示 12px 和 20px;不要将键值误解为像素尺寸。
12px已发布的 $spacers 映射。305 和 405 等非连续键分别表示 12px 和 20px;不要将键值误解为像素尺寸。
24px已发布的 $spacers 映射。305 和 405 等非连续键分别表示 12px 和 20px;不要将键值误解为像素尺寸。
38px已发布的 $spacers 映射。305 和 405 等非连续键分别表示 12px 和 20px;不要将键值误解为像素尺寸。
30512px已发布的 $spacers 映射。305 和 405 等非连续键分别表示 12px 和 20px;不要将键值误解为像素尺寸。
416px已发布的 $spacers 映射。305 和 405 等非连续键分别表示 12px 和 20px;不要将键值误解为像素尺寸。
40520px已发布的 $spacers 映射。305 和 405 等非连续键分别表示 12px 和 20px;不要将键值误解为像素尺寸。
524px已发布的 $spacers 映射。305 和 405 等非连续键分别表示 12px 和 20px;不要将键值误解为像素尺寸。
50528px已发布的 $spacers 映射。305 和 405 等非连续键分别表示 12px 和 20px;不要将键值误解为像素尺寸。
632px已发布的 $spacers 映射。305 和 405 等非连续键分别表示 12px 和 20px;不要将键值误解为像素尺寸。
740px已发布的 $spacers 映射。305 和 405 等非连续键分别表示 12px 和 20px;不要将键值误解为像素尺寸。
848px已发布的 $spacers 映射。305 和 405 等非连续键分别表示 12px 和 20px;不要将键值误解为像素尺寸。

字号映射

来源
名称 / 规则值 / 配置用途
2xs1.2rem已发布的 $fds-font-sizes 条目。默认根字号为 62.5%,并遵循浏览器字体偏好;在浏览器默认字号为 16px 时,1.6rem 即为 16px。
xs1.4rem已发布的 $fds-font-sizes 条目。默认根字号为 62.5%,并遵循浏览器字体偏好;在浏览器默认字号为 16px 时,1.6rem 即为 16px。
sm1.6rem已发布的 $fds-font-sizes 条目。默认根字号为 62.5%,并遵循浏览器字体偏好;在浏览器默认字号为 16px 时,1.6rem 即为 16px。
md1.8rem已发布的 $fds-font-sizes 条目。默认根字号为 62.5%,并遵循浏览器字体偏好;在浏览器默认字号为 16px 时,1.6rem 即为 16px。
lg2.0rem已发布的 $fds-font-sizes 条目。默认根字号为 62.5%,并遵循浏览器字体偏好;在浏览器默认字号为 16px 时,1.6rem 即为 16px。
xl2.1rem已发布的 $fds-font-sizes 条目。默认根字号为 62.5%,并遵循浏览器字体偏好;在浏览器默认字号为 16px 时,1.6rem 即为 16px。
2xl2.2rem已发布的 $fds-font-sizes 条目。默认根字号为 62.5%,并遵循浏览器字体偏好;在浏览器默认字号为 16px 时,1.6rem 即为 16px。
3xl2.4rem已发布的 $fds-font-sizes 条目。默认根字号为 62.5%,并遵循浏览器字体偏好;在浏览器默认字号为 16px 时,1.6rem 即为 16px。
4xl2.8rem已发布的 $fds-font-sizes 条目。默认根字号为 62.5%,并遵循浏览器字体偏好;在浏览器默认字号为 16px 时,1.6rem 即为 16px。
5xl3.2rem已发布的 $fds-font-sizes 条目。默认根字号为 62.5%,并遵循浏览器字体偏好;在浏览器默认字号为 16px 时,1.6rem 即为 16px。
6xl4.0rem已发布的 $fds-font-sizes 条目。默认根字号为 62.5%,并遵循浏览器字体偏好;在浏览器默认字号为 16px 时,1.6rem 即为 16px。
7xl4.8rem已发布的 $fds-font-sizes 条目。默认根字号为 62.5%,并遵循浏览器字体偏好;在浏览器默认字号为 16px 时,1.6rem 即为 16px。
03

Det Fælles Designsystem 设计系统完整指南

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

DESIGN-denmark-fds.md

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

下载指南

Det Fælles Designsystem 设计系统 DKFDS 主题与实现范围

有意选择 Borger.dk 或 Virk

Det Fælles Designsystem 提供适用于 Borger.dk 和 Virk 的独立样式表。此示例固定使用 dkfds 11.3.0,并加载 Borger.dk 样式表,因此呈现其典型的绿色主控件和 IBM Plex Sans 字体。不能只更改一个按钮的颜色,就称其为完整的主题切换。选择其他主题时,应将其作为明确的实现决策来加载。

摘自本 OpenDesign 指南

不要将自定义排序归功于库

已发布的表格指南提供了表格标记和样式,但明确指出排序和搜索行为应由应用负责。此预览完整实现了这两项自定义功能。区分这一点很重要:仅导入 DKFDS JavaScript 并不会让任意表格自动变成可搜索、可排序的数据视图。

Det Fælles Designsystem 设计系统 Sass 值与基础节奏

按源码映射表的方式解读源码映射表

本文参考实际 Sass 值,而非虚构的 --token 名称。间距映射以 8px 为基准,其中 305 表示 12px,405 表示 20px。开发者应使用库提供的辅助函数或相应的工具类约定,而不要把这些数字当作像素值。参数表清晰展示了这种对应关系。

遵循根字号约定

根字号默认为 62.5%,同时遵循浏览器的字体偏好。因此,在常见的浏览器默认设置下,源码字号映射中的标准小号/正文步长为 1.6rem。在根字号不同的环境中直接复制 rem 值,可能会导致结果差异很大。本示例加载实际样式表,以保持字体和间距上下文一致。

Det Fælles Designsystem 设计系统语义化表格结构

使用说明性标题和清晰的列角色

资源对比表包含说明性标题、列标题和普通数据单元格。标题、格式、数字形式的分钟数和用途分别放在不同列中,便于用户比较这些属性。阅读时间是编写时提供的示例估算值,并非实测的流量或性能统计数据。说明性标题明确了这一点,同时不改变表格结构。

  • 提供有用的说明性标题和列标题。
  • 在应用程序模型中将数值数据保留为数字。
  • 为窄屏上的可聚焦滚动区域添加标签。

将移动端滚动限制在表格内部

可排序表格位于可聚焦的响应式滚动区域中。最小宽度可确保列内容易于阅读,同时外层页面始终保持在视口范围内。本示例不会在窄屏下将排序表格改成无关的卡片布局,因为那需要采用另一套导航和排序控件约定。键盘用户可以聚焦滚动区域。

Det Fælles Designsystem 设计系统排序状态与数值比较

始终只保留一个当前排序条件

标题列默认按升序排列。再次激活同一列标题会反转排序方向;选择分钟列时则从升序开始。只有当前激活的列标题会设置 aria-sort,每个按钮的隐藏说明都会描述下一步操作。可见箭头与同一状态同步,而不是独立的装饰元素。

按数值比较数字

Det Fælles Designsystem 设计系统完整集成示例

保留分发资源的原始路径

11.3.0 软件包的导出映射仅公开其 JavaScript 入口,不支持任意的 CSS 深层导入。此设置会将分发文件复制到 public/dkfds,并从 index.html 引用样式表,从而保留字体和图片的相对路径。将提供的 main.js 和 denmark.css 与该页面框架放在一起保存。本地预览会嵌入相同资源,便于可靠检查。

  1. 安装 dkfds 11.3.0,并将其分发文件复制到 public/dkfds。
  2. 使用提供的 HTML 页面框架加载 Borger.dk 样式表。
  3. 保存完整入口文件和 CSS,然后运行本地应用。
  4. 验证数值排序、提交式搜索、重置和移动端内部滚动。

检查完整的对比流程

分别按分钟列的两个方向排序,提交一个没有匹配结果的查询,然后重置。搜索 Template,确认只剩下两条模板行,同时当前排序顺序保持不变。在手机屏幕宽度下,滚动表格内部内容,并确认页面本身不会溢出。检查还会确认所有随附资源均已加载,且浏览器没有报错。

Det Fælles Designsystem 设计系统组件示例

main.js — 完整的对比交互逻辑

包含完整的原始数据、数值/文本排序、提交式筛选和重置。

javascript
// index.html loads /dkfds/css/dkfds-borgerdk.css from the copied distribution.
import './denmark.css';
const rows=[{name:'Content inventory',type:'Worksheet',minutes:25,note:'Map the purpose and owner of each section.'},{name:'Accessibility review',type:'Checklist',minutes:30,note:'Inspect keyboard use, reading order and clear labels.'},{name:'Research questions',type:'Template',minutes:15,note:'Separate assumptions from questions that need evidence.'},{name:'Decision summary',type:'Template',minutes:10,note:'Record a choice, its reason and what remains uncertain.'},{name:'Prototype walkthrough',type:'Guide',minutes:20,note:'Walk through one realistic task and note friction.'}];let key='name',direction=1,query='';document.getElementById('root').innerHTML=`<main><p class="eyebrow">DET FÆLLES DESIGNSYSTEM / ORIGINAL TABLE STUDY</p><h1>Find a planning resource</h1><p class="lead">Compare five authored resources. Search the full table or sort by title and estimated reading time.</p><form id="search-form"><label class="form-label" for="search">Search sample resources</label><div class="search-controls"><input class="form-input" id="search" type="search"><button class="button button-primary" type="submit">Search</button><button class="button button-secondary" id="reset" type="button">Reset</button></div></form><p id="count" role="status"></p><div class="table--responsive-scroll" tabindex="0" role="region" aria-label="Resource comparison table"><table class="table" id="resource-table"><caption>Original resource comparison; reading times are sample estimates</caption><thead><tr><th scope="col" id="name-head" aria-sort="ascending"><button class="button button-unstyled sort" data-key="name">Resource title <span class="arrow" aria-hidden="true">↑</span><span class="sr-only"> — sort descending</span></button></th><th scope="col">Format</th><th scope="col" id="minutes-head"><button class="button button-unstyled sort" data-key="minutes">Minutes <span class="arrow" aria-hidden="true">↕</span><span class="sr-only"> — sort ascending</span></button></th><th scope="col">Purpose</th></tr></thead><tbody id="rows"></tbody></table></div><section id="empty" hidden><h2>No matching resource</h2><p>Try a shorter word, a format such as Template, or reset the search.</p></section><aside><h2>About this table</h2><p>The Borger.dk theme and table styling are from DKFDS 11.3.0. Search and sorting are complete original JavaScript: the published table component does not implement them for you.</p><ul><li>Search is applied when you submit the form.</li><li>A selected column always has an active sort order.</li><li>On a narrow screen, scroll the table without moving the whole page.</li></ul></aside></main>`;const $=id=>document.getElementById(id);function render(){const list=rows.filter(r=>Object.values(r).join(' ').toLowerCase().includes(query)).sort((a,b)=>direction*(key==='minutes'?a.minutes-b.minutes:a.name.localeCompare(b.name)));$('rows').replaceChildren(...list.map(r=>{const tr=document.createElement('tr');[r.name,r.type,String(r.minutes),r.note].forEach(value=>{const td=document.createElement('td');td.textContent=value;tr.append(td)});return tr}));$('count').textContent=list.length+' of '+rows.length+' resources · sorted by '+(key==='name'?'title':'minutes')+' '+(direction===1?'ascending':'descending');$('empty').hidden=!!list.length;document.querySelectorAll('.sort').forEach(b=>{const active=b.dataset.key===key;active?b.parentElement.setAttribute('aria-sort',direction===1?'ascending':'descending'):b.parentElement.removeAttribute('aria-sort');b.querySelector('.arrow').textContent=active?(direction===1?'↑':'↓'):'↕';b.querySelector('.sr-only').textContent=' — sort '+(active&&direction===1?'descending':'ascending')})}$('search-form').addEventListener('submit',e=>{e.preventDefault();query=$('search').value.trim().toLowerCase();render()});$('reset').addEventListener('click',()=>{$('search').value='';query='';render();$('search').focus()});document.querySelectorAll('.sort').forEach(b=>b.addEventListener('click',()=>{direction=key===b.dataset.key?-direction:1;key=b.dataset.key;render()}));render();

代码参考

  • 根据已发布的表格集成边界要求,排序和搜索由原始应用代码实现。

denmark.css — 原始页面布局

响应式搜索控件,以及支持键盘聚焦的表格滚动区域。

css
body{margin:0}main{max-width:1160px;padding:32px;margin:auto}.eyebrow{font-size:14px;font-weight:600;letter-spacing:.04em}.lead{max-width:66ch}#search-form{margin:32px 0}.search-controls{display:flex;gap:16px;align-items:center;flex-wrap:wrap}.search-controls input{flex:1;min-width:180px;max-width:480px}#count{font-weight:600}.table--responsive-scroll{position:relative;max-width:100%;overflow:auto}.table{min-width:720px;width:100%}.table caption{text-align:left;font-weight:600;margin-bottom:16px}.table th:nth-child(1){width:25%}.table th:nth-child(2){width:15%}.table th:nth-child(3){width:16%}.arrow{margin-left:8px}.sort{white-space:nowrap}aside,#empty{padding:24px;margin-top:32px;background:#f1f1f1;border-left:4px solid #44831e}aside h2,#empty h2{margin-top:0}aside li{margin:8px 0}[hidden]{display:none!important}@media(max-width:760px){main{padding:20px}.search-controls{gap:12px}.search-controls input{flex-basis:100%;max-width:none}h1{font-size:34px}}

@media(max-width:480px){.search-controls input{min-width:0;width:100%}.search-controls .button{max-width:100%;white-space:normal}h1{overflow-wrap:anywhere}}

代码参考

  • 在窄屏下,表格仍在滚动区域中保留列布局。

index.html — 完整的分发资源页面框架

加载已发布的样式表,并保留其相对资源路径。

html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Planning resource comparison</title>
<link rel="stylesheet" href="/dkfds/css/dkfds-borgerdk.css">
</head>
<body><div id="root"></div><script type="module" src="/src/main.js"></script></body>
</html>

代码参考

  • 用此页面框架替换 Vite 根目录中的 index.html。
04

Det Fælles Designsystem 设计系统 AI Agent 设置

实现起点

官方样式表和字体可在本地运行。排序和筛选由应用负责;此静态表格样式无需调用 DKFDS.init。

sh
npm create vite@latest dkfds-table -- --template vanilla
cd dkfds-table
npm install
npm install [email protected]
mkdir -p public/dkfds
cp -R node_modules/dkfds/dist/. public/dkfds/
# Replace index.html, src/main.js and src/denmark.css with the supplied examples.
npm run dev

适用于你项目的提示词

Agent 提示词
使用真实的 11.3.0 Borger.dk 分发文件和字体上下文,构建 DKFDS 资源对比表。实现完整的原始数值和标题排序、唯一的 aria-sort 列标题、提交式搜索、条目数量反馈,以及保留排序的重置功能。让表格在其自身可通过键盘操作的区域内水平滚动。
05

Det Fælles Designsystem 设计系统来源与范围

使用 DKFDS 11.3.0 Borger.dk 样式和字体的 OpenDesign 原创对比示例。排序、搜索和示例数据均由完整的原创应用代码实现,并非 DKFDS 内置的表格功能。