政府与公共服务 · 新资源

Scottish Government 设计系统.

通过原生字符计数字段应用苏格兰政府的响应式字号、间距和颜色语义;超出限制的文本仍会保留,并支持后续调整。

OpenDesign 指南8 个章节28 个参考条目原始应用指南
01

Scottish Government 设计系统 界面预览

试着输入一段较长的备注,在字数限制内调整后于本地预览、编辑并重置。

保留文本,并说明限制打开完整示例
原生 Scottish Government Design System 4.3.0 CharacterCount/CSS;原创工作坊内容与本地验证;回退字体为 Arial。 · 实现参考
02

Scottish Government 设计系统 设计参考

Scottish Government Design System 4.3.0 已发布的 CSS 和 JavaScript,以及最新的官方排版、颜色和网格指南。预览中运行原生 CharacterCount 和样式。独立示例明确使用 Arial 作为回退字体;苏格兰政府各局必须使用 Roboto。当前程序包资源与较早安装示例中的资源不同。

响应式字体

来源
名称 / 规则值 / 配置用途
Body16/24px small →19/32px largeRegular400;原生大号样式从 48rem 起启用。
H130/40px →44/56pxBold700。
H2 / H322/32 →30/40px;19/24 →22/32px使用语义化标题级别;ds_h3 可以改变外观,但不会改变标题级别。
H4 / H516/24 →19/32px;14/24 →16/24pxBold700。
Lead19/32px →24/40pxLight300;每页使用一段简短的引言。
FontRoboto苏格兰政府各局/政策领域必须使用;独立演示明确使用 Arial。

Sass 颜色角色

来源
名称 / 规则值 / 配置用途
$ds_colour__brand / __link#0065bd 主蓝色;链接悬停颜色为 #00437e。
$ds_colour__text#1a1a1a 次级文本 #5e5e5e。
$ds_colour__focus / --background#1a1a1a / #fdd522即使采用定制品牌主题,也要保留这些焦点颜色角色。
$ds_colour__state--negative#d32205 超限字段/错误消息。
$ds_colour__state--positive#1a7032 用于正向提示;不表示本地文本已提交。
$ds_colour__border#b3b3b3 强对比色 #1a1a1a 和浅淡色 #ebebeb。

响应式间距工具类

来源
名称 / 规则值 / 配置用途
ds_!_margin-bottom--1 / --2 / --38 /16 /24px在 48rem 处切换前保持不变。
ds_!_margin-bottom--424px →32px在 48rem 处由小切换为大。
ds_!_margin-bottom--5 / --632→40px /40→48px采用响应式间距,而非单一固定间距值。
ds_!_margin-bottom--7 / --8 / --940→56px /48→64px /56→72px用于较大的间隔;避免所有地方都采用最大间距。

网格与可用内容宽度

来源
名称 / 规则值 / 配置用途
Viewport thresholds480,768,992,1200px列数从 2 增至 6,再增至 12,之后保持 12 列。
Content width at medium/large/xl736 /928 /1120px已发布的网格内容宽度;与包装器盒宽度不同。
Native ds_wrapper box768 /960 /1152px在发布版 CSS 中,每侧包含 16px 内边距。
Gutter / side padding32px /16px小于 768px 时,包装器宽度自适应。
Reading width in specimen42rem maximum应用在原生包装器内的选择,并非适用于所有场景的官方令牌。

CharacterCount 约定

来源
名称 / 规则值 / 配置用途
Rootdata-module="ds-character-count"包含原生 input 或 textarea。
Limitmaxlength="200"初始化时会读取并移除此属性;超限文本仍可编辑。
Alternativedata-maxlength on root如果 JavaScript 不可用,则不会回退使用原生 maxlength。
Thresholddata-threshold="80"将限制值乘以 .8 后取整;限制为 200 时,会在 160 个字符处显示。
Error stateds_input--error;aria-invalid="true"计数为负数时应用此样式;需同时显示超出数量。
AnnouncementsSeparate hidden message;1000ms delayaria-describedby 会保留现有提示,并添加自动生成的消息 ID。
Counting unitJavaScript value.length按 UTF-16 代码单元计数;不要承诺按表情符号字素计数。
03

Scottish Government 设计系统 完整指南

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

DESIGN-scottish-government.md

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

下载指南

Scottish Government 设计系统 实用文本输入参考

确保用户的工作内容可恢复

此处的核心交互是提供非破坏性的长度提示。用户可以粘贴较长的无障碍需求说明,查看还需删改多少内容,并在精简时保留全部文本。原生字符计数器负责显示剩余字符数、超限样式,以及延迟发送给辅助技术的提示。应用则单独判断这段说明是否符合预览条件。

摘自本 OpenDesign 指南

这是一个原创的研讨会笔记示例,并非苏格兰政府服务,也不用于收集医疗信息。它不包含身份标识图形、存储或提交功能。字段提示要求填写实际的无障碍需求,并提醒用户避免提供私人信息,让任务清晰易懂,同时不借用任何官方事务办理流程。

阅读配套规范

Scottish Government 设计系统 Roboto 与响应式层级

保留已发布的度量值

苏格兰政府系统要求各政府部门和政策领域使用 Roboto。其他采用该系统的组织可以使用其他易读字体,但应保留字号和行高规则,并对实际效果进行测试。此独立示例明确注明 Arial 是备用字体;它并未声称缺失的网页字体就是 Roboto。

正文从 16/24px 调整为 19/32px,主标题则从 30/40px 调整为 44/56px。这两项调整均由原生的大屏样式表实现。ds_h 3 类可改变视觉字号,而无需使用三级语义标题。当短表单需要较小的分区标题、但不应在文档大纲中人为增加层级时,这一区别尤为重要。

阅读配套规范

Scottish Government 设计系统 独立的焦点样式

区分焦点、错误与完成状态

蓝色用于主品牌和链接,黑色用于文本,黄色用于焦点。这些是命名的 Sass 设置,并非虚构的 CSS 自定义属性。品牌适配应在通过系统的设置模块加载系统之前完成。即使更改其他品牌颜色,官方指南仍要求保留焦点配色。

只有在超过允许长度时,字符计数器才会显示负向红色。第二种由应用层触发的空字段错误也可以使用相同的负向颜色,但错误消息必须说明缺少答案,而不是误报字符数问题。预览不会使用正向绿色暗示远程提交已成功。

  • 在文本区域和操作按钮上保留清晰可见的键盘焦点轮廓。
  • 用文本说明长度超限,不要只依赖红色边框。
  • 让错误摘要和字段提示关联到稳定的字段 ID。

阅读配套规范

Scottish Government 设计系统 包装器宽度与间距

避免混淆外部宽度与内部宽度

官方网格表列出了中、大和超大断点下的内部内容宽度,分别为 736、928 和 1120px。对应的原生包装器框宽度则分别为 768、960 和 1152px,因为每个框都包含两侧各 16px 的内边距。明确这一区别可以避免采用者将两种宽度嵌套使用,导致布局被重复收窄。

预览在原生容器内设置了一个 42rem 宽的阅读栏。这个最大宽度是适合短表单的应用层选择,并非新增的系统设置。宽度低于 768px 时,容器会变为流式布局,左右两侧仍保留 16px 间距,避免文本区域贴近屏幕边缘。

间距工具类支持响应式布局。例如,ds_!_margin-bottom--4 会在 48rem 断点处从 24px 增至 32px;更大的级别也会相应增加。参考资料同时列出了两个数值,避免误将桌面端截图中的间距当作固定不变的通用值。

阅读配套规范

Scottish Government 设计系统 原生字符计数字段

从真正的文本区域开始

ds_question 根元素包含 data-module 和可选的百分比阈值。与之关联的标签和提示是普通的可访问 HTML。带有 maxlength 的 textarea 可提供实用的无 JavaScript 后备方案。增强功能启用后,组件会读取该值并移除硬性长度限制,避免粘贴内容被悄然截断。

对于 200 个字符的字段,若阈值为 80%,计数会在达到 160 个字符时显示。组件公开页面中的示例文案和 250 字符的代码示例使用的数值并不一致,因此此示例统一使用一个限制值。没有 JavaScript 时,可见提示仍会说明限制,并由原生 maxlength 属性生效。

html
<div class="ds_question" data-threshold="80" data-module="ds-character-count">
  <label class="ds_label" for="access-note">What would help you take part?</label>
  <p class="ds_hint-text" id="access-hint">Describe an access need for this practice workshop. Do not include medical or contact details.</p>
  <textarea maxlength="200" class="ds_input" rows="5" id="access-note"
    name="access-note" aria-describedby="access-hint"></textarea>
</div>

代码参考

阅读配套规范

Scottish Government 设计系统 原生组件负责的内容

消息、时序与计数

此版本的实现会创建一条带有 aria-hidden 的可见消息,以及一条供辅助技术使用的独立隐藏消息。它会将相关 ID 添加到现有的 aria-describedby 中,而不会丢弃作者编写的提示。实现会等待 1000ms 再更新隐藏公告,让用户先完成输入反馈。

实际长度取自 JavaScript string.value.length:它统计的是 UTF-16 代码单元。基本多文种平面之外的符号可能占用两个代码单元,组合表情符号则可能占用更多。如果服务需要采用不同的字符计数规则,就必须让计数器与服务器端验证保持一致,而不能指望此组件按用户感知到的字符数进行计数。

组件会监听 input 事件。如果应用以编程方式填入示例内容或清空字段,也必须触发 input 事件。演示中的示例填充和重置操作都会这样做。源码中的一条注释提到语音识别轮询,但检查过的实现并未设置轮询间隔;因此,本指南不会声称组件支持此行为。

阅读配套规范

Scottish Government 设计系统 使用当前版本的资源路径

模块加载与按需初始化

当前软件包为 @scottish-government/design-system。4.3.0 版本将编译后的样式表放在 dist/css/design-system.min.css,而较早的安装说明仍引用 dist/styles/main.css。本方案使用实际发布的资源。其脚本导出了 ES 模块,因此应使用 type="module" 导入,而不是使用普通的经典脚本标签。

为此字段创建一个 CharacterCount 实例并调用 init。对于包含多个组件的页面,也可以使用 DS.initAll,但此示例只初始化所需的计数器。这里未配置额外的分析服务。服务器端验证仍由库之外的应用单独负责:计数器是实用的编辑辅助工具,不是强制执行的边界。

  1. 安装固定为 4.3.0 版本的软件包,并将编译后的 CSS 和模块复制到本地资源目录。
  2. 在导入模块之前,先将完整的标签、提示和 textarea 结构放入页面。
  3. 初始化一次计数器,然后通过常规 input 事件连接应用的预览和重置操作。

阅读配套规范

Scottish Government 设计系统 测试超限后的恢复

不要只测试空字段

先输入少于阈值的内容,再超过 160 个字符,然后粘贴超过 200 个字符的内容。文本区域中必须保留完整内容,同时显示“内容过多”消息并将 aria-invalid 设为 true。将内容减少到限制以下,并确认错误类和无效状态都会恢复。

应用的“预览”操作会通过关联的错误消息拦截空白或超限的备注。有效备注会使用 textContent 显示在本地预览中,因此用户输入的标记会作为文本显示,而不会被解析。点击“编辑备注”会返回同一文本区域,并保留原有内容。“重置”会通过 input 事件清空内容,因此原生计数也会重置。

在 390px 宽度下,检查标题换行、全宽文本域、按钮换行和错误摘要。在更宽的视口中,正文阅读栏也不应变成过宽的段落。这些检查仅用于验证本示例;实际服务仍需在最终使用场景中开展用户研究、字体测试和辅助技术审查。

阅读配套规范

Scottish Government 设计系统组件示例

非破坏性的字符数限制

标签、提示、文本域和 80% 阈值,并采用渐进增强。

html
<div class="ds_question" data-threshold="80" data-module="ds-character-count">
  <label class="ds_label" for="access-note">What would help you take part?</label>
  <p class="ds_hint-text" id="access-hint">Describe an access need for this practice workshop. Do not include medical or contact details.</p>
  <textarea maxlength="200" class="ds_input" rows="5" id="access-note"
    name="access-note" aria-describedby="access-hint"></textarea>
</div>

代码参考

当前 4.3.0 编译资源

经版本验证的 CSS 路径和 ES 模块初始化。

bash / html
npm install --save-exact @scottish-government/[email protected]
mkdir -p public/vendor/scot
cp node_modules/@scottish-government/design-system/dist/css/design-system.min.css public/vendor/scot/
cp node_modules/@scottish-government/design-system/dist/scripts/design-system.js public/vendor/scot/

<link rel="stylesheet" href="/vendor/scot/design-system.min.css">
<script type="module">
  import DS from '/vendor/scot/design-system.js';
  const root = document.querySelector('[data-module="ds-character-count"]');
  new DS.components.CharacterCount(root).init();
  // Or DS.initAll() when the page uses multiple DS components.
</script>

代码参考

完整的独立示例

完整文档包含其布局、控件与初始化。解压所链接的示例归档,即可获得完全一致的相对 vendor 资源,然后通过 HTTP 提供服务。

html
<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Scottish design system character count specimen</title><link rel="stylesheet" href="vendor/scot-4.3.0/dist/css/design-system.min.css"><style>body,button,input,textarea{font-family:Arial,sans-serif!important}body{margin:0}main{padding-top:32px;padding-bottom:32px}.reading{max-width:42rem}.eyebrow{border-top:4px solid #0065bd;padding-top:16px;color:#5e5e5e}.actions{display:flex;flex-wrap:wrap;gap:16px}.actions .ds_button{margin:0}.preview-text{white-space:pre-wrap;overflow-wrap:anywhere;border-left:4px solid #b3b3b3;padding-left:24px}[hidden]{display:none!important}</style><main class="ds_wrapper"><div class="reading"><p class="ds_small eyebrow">Independent specimen · Workshop access note</p><section id="entry"><h1>Tell us what would help</h1><p>Practice a short access note for a community workshop. This page does not save or send your text.</p><div id="error" class="ds_error-summary" tabindex="-1" hidden><h2 class="ds_error-summary__title">There is a problem</h2><p><a href="#access-note" id="error-link"></a></p></div><form id="form" novalidate><div class="ds_question" data-threshold="80" data-module="ds-character-count">
  <label class="ds_label" for="access-note">What would help you take part?</label>
  <p class="ds_hint-text" id="access-hint">Describe an access need for this practice workshop. Do not include medical or contact details.</p>
  <textarea maxlength="200" class="ds_input" rows="5" id="access-note"
    name="access-note" aria-describedby="access-hint"></textarea>
</div><p class="ds_small">Use up to 200 characters. The count appears after 160.</p><div class="actions"><button class="ds_button" type="submit">Preview note</button><button class="ds_button ds_button--secondary" id="sample" type="button">Try a long example</button><button class="ds_button ds_button--secondary" id="reset" type="button">Reset</button></div></form></section><section id="preview" hidden><h1 tabindex="-1">Your note preview</h1><p id="result" class="preview-text"></p><p>No note has been sent. You can return to edit it.</p><button id="edit" class="ds_button ds_button--secondary">Edit note</button></section></div></main><script type="module">import DS from './vendor/scot-4.3.0/dist/scripts/design-system.js';const field=document.querySelector('[data-module="ds-character-count"]');new DS.components.CharacterCount(field).init();const input=document.querySelector('#access-note'),entry=document.querySelector('#entry'),preview=document.querySelector('#preview'),error=document.querySelector('#error');function setValue(value){input.value=value;input.dispatchEvent(new Event('input',{bubbles:true}));input.focus()}document.querySelector('#sample').onclick=()=>setValue('A clear route from the entrance to the workshop room would help me take part. Please describe where the quiet seating area is and whether instructions will be available in writing. I would also appreciate knowing where to find the nearest accessible entrance.');document.querySelector('#reset').onclick=()=>{setValue('');error.hidden=true};document.querySelector('#form').onsubmit=e=>{e.preventDefault();let message=!input.value.trim()?'Enter a short access note.':input.value.length>200?'Shorten your note to 200 characters or fewer.':'';if(message){document.querySelector('#error-link').textContent=message;error.hidden=false;error.focus();return}error.hidden=true;document.querySelector('#result').textContent=input.value;entry.hidden=true;preview.hidden=false;preview.querySelector('h1').focus()};document.querySelector('#edit').onclick=()=>{entry.hidden=false;preview.hidden=true;input.focus()};window.demoReady=true;</script></html>

代码参考

  • 从“来源”一节下载完整示例。其 README 给出了确切的本地启动命令。
  • 保持 vendor 路径相对于本文档;该归档包含此预览所使用的全部资源。
04

Scottish Government 设计系统 Agent 设置

实现起点

本地演示使用真实的 4.3.0 CSS 和 CharacterCount 模块。明确指定了备用字体;未使用安装页面中较旧的 dist/styles 路径。Sources 中的完整可运行示例 ZIP 还提供了准确的预览依赖项和完整文档。解压后,在该目录运行 python3 -m http.server 8080,然后打开 http://localhost:8080/scottish-government.html。请勿通过 file:// 打开基于模块的示例。

bash / html
npm install --save-exact @scottish-government/[email protected]
mkdir -p public/vendor/scot
cp node_modules/@scottish-government/design-system/dist/css/design-system.min.css public/vendor/scot/
cp node_modules/@scottish-government/design-system/dist/scripts/design-system.js public/vendor/scot/

<link rel="stylesheet" href="/vendor/scot/design-system.min.css">
<script type="module">
  import DS from '/vendor/scot/design-system.js';
  const root = document.querySelector('[data-module="ds-character-count"]');
  new DS.components.CharacterCount(root).init();
  // Or DS.initAll() when the page uses multiple DS components.
</script>

适用于你项目的提示词

Agent 提示词
在独立的访问需求备注表单中,使用真实的苏格兰政府设计系统 4.3.0 CharacterCount 组件。固定使用经验证的 dist/css/design-system.min.css 和 ES 模块 dist/scripts/design-system.js 路径。提供带有 80% 阈值的 200 字符文本域、关联提示和限定作用域的组件初始化。保留超出限制的粘贴文本,将原生计数和 ARIA 更新交由库处理,并另行添加本地验证以及纯文本安全预览、编辑和重置功能。通过程序填入示例文本或重置时,必须触发 input 事件。使用已发布的响应式字号和间距,明确字体选择,不使用官方标识,也不模拟提交功能。
05

Scottish Government 设计系统 来源与范围

独立实现参考。苏格兰政府各部门必须使用 Roboto;本示例不带品牌标识,并明确使用 Arial 作为备用字体。文本为原创,不会保存或提交,也不代表官方立场。代码许可与政府图形资产的使用权限需分别处理。