政府与公共服务 · 新资源

NSW 设计系统.

通过完整的工作坊指南和独立的本地阅读清单,了解 NSW 设计令牌、Public Sans 字体排版,以及支持键盘操作的原生标签页。

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

NSW 设计系统 界面预览

使用鼠标或键盘切换标签页,同时保留本地阅读列表。

浏览各阶段并保存有用的提示打开完整示例
原生 NSW 3.27.0 Tabs 类和 CSS、Public Sans、自定义的已保存提示状态。· 实现参考
02

NSW 设计系统 设计参考

实际的 nsw-design-system 3.27.0 CSS 导出项与 Tabs 实现,搭配本地 Public Sans 字体。

品牌与中性色角色

来源
名称 / 规则值 / 配置用途
--nsw-brand-dark#002664 实际的 3.27.0 默认主题。Text-light 表示用于深色表面的浅色文字,并非白色背景上的弱化文字。
--nsw-brand-light#cbedfd 实际的 3.27.0 默认主题。Text-light 表示用于深色表面的浅色文字,并非白色背景上的弱化文字。
--nsw-brand-supplementary#146cfd 实际的 3.27.0 默认主题。Text-light 表示用于深色表面的浅色文字,并非白色背景上的弱化文字。
--nsw-brand-accent#d7153a 实际的 3.27.0 默认主题。Text-light 表示用于深色表面的浅色文字,并非白色背景上的弱化文字。
--nsw-brand-accent-light#ffe6ea 实际的 3.27.0 默认主题。Text-light 表示用于深色表面的浅色文字,并非白色背景上的弱化文字。
--nsw-grey-01#22272b 实际的 3.27.0 默认主题。Text-light 表示用于深色表面的浅色文字,并非白色背景上的弱化文字。
--nsw-grey-02#495054 实际的 3.27.0 默认主题。Text-light 表示用于深色表面的浅色文字,并非白色背景上的弱化文字。
--nsw-grey-03#cdd3d6 实际的 3.27.0 默认主题。Text-light 表示用于深色表面的浅色文字,并非白色背景上的弱化文字。
--nsw-grey-04#ebebeb 实际的 3.27.0 默认主题。Text-light 表示用于深色表面的浅色文字,并非白色背景上的弱化文字。
--nsw-off-white#f2f2f2 实际的 3.27.0 默认主题。Text-light 表示用于深色表面的浅色文字,并非白色背景上的弱化文字。
--nsw-text-dark#22272b 实际的 3.27.0 默认主题。Text-light 表示用于深色表面的浅色文字,并非白色背景上的弱化文字。
--nsw-text-light#fff实际的 3.27.0 默认主题。Text-light 表示用于深色表面的浅色文字,并非白色背景上的弱化文字。

状态配色组合

来源
名称 / 规则值 / 配置用途
--nsw-status-success#008a07 将有含义的状态颜色与其背景角色搭配,并提供易读的文字说明。
--nsw-status-success-bg#e5f6e6 将有含义的状态颜色与其背景角色搭配,并提供易读的文字说明。
--nsw-status-info#2e5299 将有含义的状态颜色与其背景角色搭配,并提供易读的文字说明。
--nsw-status-info-bg#eaedf4 将有含义的状态颜色与其背景角色搭配,并提供易读的文字说明。
--nsw-status-warning#c95000 将有含义的状态颜色与其背景角色搭配,并提供易读的文字说明。
--nsw-status-warning-bg#fbeee5 将有含义的状态颜色与其背景角色搭配,并提供易读的文字说明。
--nsw-status-error#b81237 将有含义的状态颜色与其背景角色搭配,并提供易读的文字说明。
--nsw-status-error-bg#f7e7eb 将有含义的状态颜色与其背景角色搭配,并提供易读的文字说明。

字体排版与圆角

来源
名称 / 规则值 / 配置用途
--nsw-font-family"Public Sans",sans-serif已发布的响应式字体参考和通用圆角角色。移动端与桌面端的字体配对并非不同的字体系列。
--nsw-font-size16px已发布的响应式字体参考和通用圆角角色。移动端与桌面端的字体配对并非不同的字体系列。
--nsw-font-normal400已发布的响应式字体参考和通用圆角角色。移动端与桌面端的字体配对并非不同的字体系列。
--nsw-font-bold700已发布的响应式字体参考和通用圆角角色。移动端与桌面端的字体配对并非不同的字体系列。
--nsw-font-size-md-mobile1.125rem已发布的响应式字体参考和通用圆角角色。移动端与桌面端的字体配对并非不同的字体系列。
--nsw-font-size-md-desktop1.25rem已发布的响应式字体参考和通用圆角角色。移动端与桌面端的字体配对并非不同的字体系列。
--nsw-font-size-lg-mobile1.375rem已发布的响应式字体参考和通用圆角角色。移动端与桌面端的字体配对并非不同的字体系列。
--nsw-font-size-lg-desktop1.5rem已发布的响应式字体参考和通用圆角角色。移动端与桌面端的字体配对并非不同的字体系列。
--nsw-font-size-xl-mobile1.75rem已发布的响应式字体参考和通用圆角角色。移动端与桌面端的字体配对并非不同的字体系列。
--nsw-font-size-xl-desktop2rem已发布的响应式字体参考和通用圆角角色。移动端与桌面端的字体配对并非不同的字体系列。
--nsw-font-size-xxl-mobile2.25rem已发布的响应式字体参考和通用圆角角色。移动端与桌面端的字体配对并非不同的字体系列。
--nsw-font-size-xxl-desktop3rem已发布的响应式字体参考和通用圆角角色。移动端与桌面端的字体配对并非不同的字体系列。
--nsw-border-radius0.25rem已发布的响应式字体参考和通用圆角角色。移动端与桌面端的字体配对并非不同的字体系列。
03

NSW 设计系统 完整指南

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

DESIGN-nsw.md

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

下载指南

NSW 设计系统 固定运行时与主题

使用原生标签页实现

此示例运行 nsw-design-system 3.27.0。它导入软件包 CSS 和 Tabs 类,并在创建标记后初始化唯一的标签页组。此处采用针对性初始化,避免注册页面上不存在的其他组件。在线文档可能介绍较新的版本;此处可下载的代码和令牌值仍对应经验证的软件包版本。

摘自本 OpenDesign 指南

将组件与应用状态分开

原生 Tabs 类负责标签页选择、面板显示和键盘导航。应用则使用 Set 保存提示。因此,在不同阶段之间切换不会改变阅读列表。源码明确体现了这种职责划分:没有隐藏的全局存储、后端请求,也没有仿造政府账户。

NSW 设计系统 品牌角色与易读的界面表面

将深色与浅色角色配对使用

默认的深色品牌颜色为 #002664,浅色表面颜色为 #CBEDFD。提示面板使用浅色角色,操作按钮使用深色。当前标签页采用软件包的强调样式。这些是实际的主题角色,而不是为了营造公共部门网站观感而随意挑选的蓝色配色。此示例不使用官方政府徽标。

仔细理解令牌名称

text-light 令牌为白色。它适用于深色背景,不应被泛化为弱化文字的同义词。辅助阶段文字改用更深的中性色角色。参考资料包含状态前景色与背景色配对,但本指南不会为了展示每种可用颜色而凭空添加错误或成功提示。

NSW 设计系统 Public Sans 与响应式比例

检查布局前先加载字体

此示例在本地加载 Public Sans 400 和 700 字重。软件包分别定义了移动端和桌面端字号:中号文字从 1.125rem 增至 1.25rem,最大标题参考字号从 2.25rem 增至 3rem。这些配对有助于在可用宽度变化时保持阅读层级。

保持内容层级简洁

简短的阶段标签之后是描述性标题、简介、说明段落和一条已保存的提示。页面不会把每句话都做成卡片。在窄屏上,阅读列表会排在阶段面板之后;简短的三个标签页组成的导航条仍易于使用,不会挤压文字使其折成多行。

NSW 设计系统 标签页标记与键盘操作

让组件增强真实链接

初始标签页列表由指向唯一内容 ID 的链接组成。初始化后,组件会添加 tablist/tab/tabpanel 语义、管理选择状态并设置可聚焦的标签页。必须确保 href 目标正确,以便组件找到对应面板。页面中放置多个标签页组时,请勿重复使用 ID。

  • 确保每个标签页链接都对应一个面板 ID。
  • 插入标记后再初始化标签页组。
  • 由原生组件管理选择状态和键盘焦点。

检查键盘选择操作以及鼠标点击操作

NSW 设计系统 已保存的提示词与如实反馈

让已保存状态独立于当前可见标签

每个阶段的操作都会在 Set 中切换对应提示词的保存状态、更新 aria-pressed,并将标签从“保存”改为“移除”。阅读列表中的数量和条目均由该 Set 派生。返回已保存的阶段时,其选中状态会正确显示。“清空阅读列表”会移除所有已保存项,并在无内容可清除时禁用。

说明持久化的边界

阅读列表属于页面本地状态,刷新后会消失。界面会明确说明这一点。要实现真正的持久化列表,需要明确的存储模型和恢复行为;本示例并未暗示具备这些能力。内容是原创的设计讨论示例,不是服务资格指南,也不声称复现了新南威尔士州(NSW)的官方工作流程。

NSW 设计系统 完整实现与审查

安装依赖并复现源代码

创建一个 Vite 原生项目,安装 nsw-design-system 3.27.0 和 Public Sans,然后保存提供的入口文件和 nsw.css。保留根挂载元素。示例包含完整的三个阶段内容、原创提示词、原生 Tabs 初始化代码和阅读列表事件处理逻辑。保存与重置行为均由完整实现代码完成,不以伪代码代替。

  1. 安装固定版本的 NSW 软件包和 Public Sans 字体文件。
  2. 保存完整入口文件和 nsw.css,并保留根挂载元素。
  3. 在两个不同的标签页保存提示词,并检查状态是否保留。
  4. 使用 ArrowRight,清空列表并检查空状态。

将标签页导航与已保存内容分开管理

仅在链接目标和面板都已存在后,才初始化原生 Tabs 类。匹配的片段 ID 构成增强功能的契约:即使标签看起来仍然正常,只要更改面板 ID 而不相应更改 href,两者的关联就会失效。如果页面上有多个标签组,请为每组使用不同的 ID。

将阅读列表作为标签页实例之外的应用状态管理。切换面板后,提示词的已保存状态必须保留;返回该面板时,aria-pressed 也必须反映此状态。对于读者可能反复查看的同级内容,应使用标签页;要求按顺序完成步骤的表单则需要采用其他导航模式。若要实现持久化,还需要明确的存储与恢复策略,而不能悄悄改变这个仅限页面状态的示例。

NSW 设计系统组件示例

main.js — 完整的原生标签页与阅读列表示例

包含所有原创阶段内容、标签页初始化,以及完整的保存、移除和重置逻辑。

javascript
import Tabs from 'nsw-design-system/src/components/tabs/tabs.js';
import 'nsw-design-system/css';
import '@fontsource/public-sans/latin-400.css';
import '@fontsource/public-sans/latin-700.css';
import './nsw.css';
const sessions=[['Prepare','Choose one question to explore','Start with a clear outcome rather than a long list of activities.','Write a one-sentence purpose. Identify the people who can answer the question and the evidence you already have.'],['Discuss','Make room for different views','Use a short, structured discussion to compare observations.','Ask participants to describe what they noticed before proposing solutions. Keep a separate record of assumptions that need evidence.'],['Review','Turn observations into a next step','End with an action that has an owner and a clear reason.','Choose one improvement to investigate. Record what would count as success and when the group will review the result.']];
document.getElementById('root').innerHTML=`<main><p class="eyebrow">NSW DESIGN SYSTEM / ORIGINAL WORKSHOP STUDY</p><h1>Plan a focused discussion</h1><p class="nsw-intro">Move between three stages and save useful prompts to a local reading list.</p><div class="layout"><section class="nsw-tabs js-tabs"><ul class="nsw-tabs__list">${sessions.map(([name],i)=>`<li><a href="#session-${i}">${name}</a></li>`).join('')}</ul>${sessions.map(([name,title,lead,body],i)=>`<section id="session-${i}" class="nsw-tabs__content"><p class="step">STAGE ${i+1} / 3</p><h2>${title}</h2><p class="nsw-intro">${lead}</p><p>${body}</p><div class="prompt"><h3>Prompt to keep</h3><blockquote>${['What do we need to understand before choosing a solution?','Which observations are shared, and where do they differ?','What is the smallest next step that would reduce uncertainty?'][i]}</blockquote><button class="nsw-button nsw-button--dark save" data-index="${i}" aria-pressed="false">Save this prompt</button></div></section>`).join('')}</section><aside><h2>Your reading list</h2><p id="count" role="status">0 prompts saved</p><ul id="saved"></ul><p id="empty">Save a prompt from any stage. Changing tabs keeps your selection.</p><button class="nsw-button nsw-button--white" id="clear" disabled>Clear reading list</button><p class="note">This is an original local study using NSW 3.27.0 tabs and CSS. Nothing is stored after reloading.</p></aside></div></main>`;
new Tabs(document.querySelector('.js-tabs')).init();const saved=new Set();const $=id=>document.getElementById(id);function render(){$('count').textContent=saved.size+' prompt'+(saved.size===1?'':'s')+' saved';$('saved').replaceChildren(...[...saved].sort().map(i=>{const li=document.createElement('li');li.textContent=sessions[i][0]+': '+sessions[i][1];return li}));$('empty').hidden=saved.size>0;$('clear').disabled=!saved.size;document.querySelectorAll('.save').forEach(b=>{const yes=saved.has(Number(b.dataset.index));b.setAttribute('aria-pressed',String(yes));b.textContent=yes?'Remove saved prompt':'Save this prompt'})}document.querySelectorAll('.save').forEach(b=>b.addEventListener('click',()=>{const i=Number(b.dataset.index);saved.has(i)?saved.delete(i):saved.add(i);render()}));$('clear').addEventListener('click',()=>{saved.clear();render()});

代码参考

  • 标签页由 NSW 类管理;原创阅读列表由 Set 管理。

nsw.css — 原创响应式布局

使用已发布的语义主题角色设置布局和提示词界面表面。

css
body{margin:0}main{max-width:1240px;padding:32px;margin:auto}.eyebrow,.step{font-size:14px;letter-spacing:.05em;font-weight:700}.eyebrow{color:var(--nsw-brand-dark)}h1{max-width:24ch}.layout{display:grid;grid-template-columns:1.8fr 1fr;gap:32px;margin-top:40px}.nsw-tabs__content{min-height:0}.prompt{margin-top:32px;padding:24px;background:var(--nsw-brand-light)}.prompt h3{margin-top:0}.prompt blockquote{margin:16px 0 24px;padding:0;border:0;font-size:20px;line-height:1.5}.step{margin-top:0;color:var(--nsw-grey-02)}aside{padding:24px;border-top:4px solid var(--nsw-brand-dark);background:var(--nsw-off-white);align-self:start}aside h2{font-size:24px;margin-top:0}aside li{margin:16px 0}aside ul{padding-left:24px}.note{font-size:14px;margin-top:24px}button:disabled{opacity:.5;cursor:not-allowed}[hidden]{display:none!important}@media(max-width:760px){main{padding:20px}.layout{grid-template-columns:1fr}h1{font-size:36px}.prompt{padding:20px}}

代码参考

  • 辅助阶段标签使用深色中性色;--nsw-text-light 为白色。
04

NSW 设计系统 Agent 设置

实现起点

已在本地测试原生标签页点击和方向键操作、已保存状态保留、清空功能及响应式布局。

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

适用于你项目的提示词

Agent 提示词
使用 3.27.0 版原生 Tabs、Public Sans 和实际语义角色,构建 NSW 工作坊指南。确保面板 ID 唯一、支持键盘选择、独立管理已保存提示词状态,并提供实用的空阅读列表状态。明确说明数据仅在本地保存,避免声称提供官方服务。
05

NSW 设计系统 来源与适用范围

由 OpenDesign 编写、使用 NSW Design System 3.27.0 的工作坊示例。原生标签页行为真实可用;内容和已保存提示词工作流则是原创的本地应用逻辑。