Compare commits
6 commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0fa22b9f83 | |||
| 2b67a93ce3 | |||
| dcd7b41209 | |||
| 92b55e0155 | |||
| 4464f12144 | |||
| 3838d55990 |
4 changed files with 172 additions and 41 deletions
12
.gitignore
vendored
Normal file
12
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
|
||||
# --- session/local state (gitignored per ~/.claude polyrepo-konvensjon) ---
|
||||
STATE.md
|
||||
REMEMBER.md
|
||||
ROADMAP.md
|
||||
TODO.md
|
||||
NEXT-SESSION-PROMPT*.local.md
|
||||
*.local.md
|
||||
*.local.json
|
||||
*.local.sh
|
||||
.DS_Store
|
||||
.claude/
|
||||
21
LICENSE
Normal file
21
LICENSE
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2026 Kjell Tore Guttormsen
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
149
README.md
149
README.md
|
|
@ -1,8 +1,36 @@
|
|||
# Playground Design System
|
||||
# playground-design-system
|
||||
|
||||
A shared design system for plugin Playgrounds — visual self-service UIs that complement terminal slash-commands. Built for Norwegian public sector with WCAG 2.1 AA compliance, Aksel/Digdir-aligned aesthetics, and self-contained HTML deployment.
|
||||
Vendored, framework-free CSS design system for plugin playgrounds — design tokens, four component tiers, self-hosted fonts, and file:// operation with no build step.
|
||||
|
||||
**Version:** 0.1 (Phase 1 — 2026-05-02)
|
||||
Playgrounds are the visual self-service UIs that complement a plugin's terminal slash-commands. This system gives them one shared visual language: Aksel/Digdir-aligned aesthetics for Norwegian public-sector users, WCAG 2.1 AA contrast and focus handling, and pages that open straight from disk with no server.
|
||||
|
||||
**Version:** 0.6.0 — see [CHANGELOG.md](CHANGELOG.md).
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [Non-goals](#non-goals)
|
||||
- [Provenance](#provenance)
|
||||
- [Directory layout](#directory-layout)
|
||||
- [Quick start](#quick-start)
|
||||
- [Design principles](#design-principles)
|
||||
- [Token system](#token-system)
|
||||
- [Component reference](#component-reference)
|
||||
- [Schemas](#schemas)
|
||||
- [Theming](#theming)
|
||||
- [Print mode](#print-mode)
|
||||
- [Known limitations](#known-limitations)
|
||||
- [Self-hosted fonts](#self-hosted-fonts)
|
||||
- [Versioning](#versioning)
|
||||
- [License](#license)
|
||||
- [Contributing](#contributing)
|
||||
|
||||
## Non-goals
|
||||
|
||||
- **Not a JavaScript component library.** The system is CSS-only. Interactivity (tab state, sidepanel toggling, live-meter updates) is wired by each Playground in vanilla JS.
|
||||
- **Not a general-purpose web UI kit.** Scope is the Playgrounds in this marketplace; Aksel/Digdir conventions and domain visuals (NS 5814 matrices, EU AI Act tiers) are baked in rather than configurable.
|
||||
- **No build step, bundler or npm package.** Files are vendored and linked with plain `<link>` tags. Nothing is compiled, and nothing is published to a package registry.
|
||||
- **No icon set.** Iconography is left to each Playground so the shared system stays small.
|
||||
- **Not open to pull requests.** Solo project — see [Contributing](#contributing).
|
||||
|
||||
## Provenance
|
||||
|
||||
|
|
@ -13,35 +41,34 @@ Integration into the marketplace (file organization, path normalization, README
|
|||
## Directory layout
|
||||
|
||||
```
|
||||
shared/
|
||||
├── playground-design-system/ # The design system (this directory)
|
||||
│ ├── README.md # This file
|
||||
│ ├── tokens.css # CSS custom properties (Aksel/Digdir-aligned)
|
||||
│ ├── base.css # Reset, typography, primitives, focus, print
|
||||
│ ├── components.css # Tier 1: radar, matrix, findings-browser, critique-card, wizard, live-meter
|
||||
│ ├── components-tier2.css # Tier 2: decision-tree, traffic-lights, diff-review, treemap, distribution, command-pipeline, pyramide, pipeline-cockpit, verdict-pill+risk-meter, codepoint-reveal, small-multiples, OWASP badges
|
||||
│ ├── components-tier3.css # Tier 3 wave 1: pair-before-after, AI Act timeline, 3-track entry, FRIA rights-matrix, capability-matrix, parallel-agent-status, ErrorSummary, GuidePanel
|
||||
│ ├── components-tier3-supplement.css # Tier 3 wave 2 (12): toxic-flow, fleet-overview, kanban Keep/Review/Remove, maturity-ladder, classify-and-transform, cycle-ribbon, persistent-antipattern, suppressed-signals, ExpansionCard, ReadMore, FormProgress, Aspirational-vs-Committed
|
||||
│ ├── fonts.css # @font-face declarations for self-hosted fonts
|
||||
│ ├── fonts/ # Self-hosted woff2 + license attribution
|
||||
│ │ ├── Inter-{Regular,Medium,SemiBold,Bold}.woff2
|
||||
│ │ ├── JetBrainsMono-{Regular,Medium,SemiBold}.woff2
|
||||
│ │ ├── SourceSerif4-{Regular,Semibold}.woff2
|
||||
│ │ └── LICENSES.md # All three are SIL OFL 1.1
|
||||
│ ├── print.css # A4 print stylesheet with B/W severity patterns
|
||||
│ └── schemas/ # Cross-plugin JSON schemas
|
||||
│ ├── finding.schema.json # Used by llm-security, config-audit, ultraplan-review, ms-ai-review
|
||||
│ ├── okr-set.schema.json # Used by OKR plugin
|
||||
│ └── ros-threat.schema.json # Used by ms-ai-architect ROS workflow
|
||||
│
|
||||
└── playground-examples/ # Showcase + reference scenarios
|
||||
├── index.html # System showcase (browse all components)
|
||||
├── ros-lier-kommune.html # Scenario A — ms-ai-architect ROS report
|
||||
├── okr-baerum.html # Scenario B — OKR live writer
|
||||
├── security-direktorat.html # Scenario C — llm-security findings review
|
||||
├── templates.html # Skeleton + print-template demos
|
||||
├── tier3-preview.html # Tier 3 wave 1 visual preview
|
||||
├── components/ # Tier 3 wave 2 — 12 isolated demo pages
|
||||
playground-design-system/ # This repo
|
||||
├── README.md # This file
|
||||
├── tokens.css # CSS custom properties (Aksel/Digdir-aligned)
|
||||
├── base.css # Reset, typography, primitives, focus, print
|
||||
├── components.css # Tier 1: radar, matrix, findings-browser, critique-card, wizard, live-meter
|
||||
├── components-tier2.css # Tier 2: decision-tree, traffic-lights, diff-review, treemap, distribution, command-pipeline, pyramide, pipeline-cockpit, verdict-pill+risk-meter, codepoint-reveal, small-multiples, OWASP badges
|
||||
├── components-tier3.css # Tier 3 wave 1: pair-before-after, AI Act timeline, 3-track entry, FRIA rights-matrix, capability-matrix, parallel-agent-status, ErrorSummary, GuidePanel
|
||||
├── components-tier3-supplement.css # Tier 3 wave 2 (12): toxic-flow, fleet-overview, kanban Keep/Review/Remove, maturity-ladder, classify-and-transform, cycle-ribbon, persistent-antipattern, suppressed-signals, ExpansionCard, ReadMore, FormProgress, Aspirational-vs-Committed
|
||||
├── components-tier4-project-view.css # Tier 4: project-view arketype
|
||||
├── fonts.css # @font-face declarations for self-hosted fonts
|
||||
├── fonts/ # Self-hosted woff2 + license attribution
|
||||
│ ├── Inter-{Regular,Medium,SemiBold,Bold}.woff2
|
||||
│ ├── JetBrainsMono-{Regular,Medium,SemiBold}.woff2
|
||||
│ ├── SourceSerif4-{Regular,Semibold}.woff2
|
||||
│ └── LICENSES.md # All three are SIL OFL 1.1
|
||||
├── print.css # A4 print stylesheet with B/W severity patterns
|
||||
├── schemas/ # Cross-plugin JSON schemas
|
||||
│ ├── finding.schema.json # Used by llm-security, config-audit, ultraplan-review, ms-ai-review
|
||||
│ ├── okr-set.schema.json # Used by OKR plugin
|
||||
│ └── ros-threat.schema.json # Used by ms-ai-architect ROS workflow
|
||||
└── playground-examples/ # Showcase + reference scenarios (this repo's own demos)
|
||||
├── index.html # System showcase (browse all components)
|
||||
├── ros-lier-kommune.html # Scenario A — ms-ai-architect ROS report
|
||||
├── okr-baerum.html # Scenario B — OKR live writer
|
||||
├── security-direktorat.html # Scenario C — llm-security findings review
|
||||
├── templates.html # Skeleton + print-template demos
|
||||
├── tier3-preview.html # Tier 3 wave 1 visual preview
|
||||
├── components/ # Tier 3 wave 2 — 12 isolated demo pages
|
||||
│ ├── sankey-toxic-flow.html
|
||||
│ ├── fleet-overview.html
|
||||
│ ├── kanban.html
|
||||
|
|
@ -54,10 +81,14 @@ shared/
|
|||
│ ├── read-more.html
|
||||
│ ├── form-progress.html
|
||||
│ └── aspirational-committed.html
|
||||
├── ros-app.js # Scenario A interactivity
|
||||
└── ros-data.js # Scenario A mock data
|
||||
├── ros-app.js # Scenario A interactivity
|
||||
└── ros-data.js # Scenario A mock data
|
||||
```
|
||||
|
||||
Consumers vendor this repo (its CSS/fonts/schemas, not `playground-examples/`) into their own
|
||||
Playground at `<plugin>/playground/vendor/playground-design-system/` — copied in, not a git
|
||||
submodule or shared symlink. See [Quick start](#quick-start).
|
||||
|
||||
## Quick start
|
||||
|
||||
To use the design system from a plugin's Playground:
|
||||
|
|
@ -67,16 +98,41 @@ To use the design system from a plugin's Playground:
|
|||
<html lang="nb" data-theme="light">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<link rel="stylesheet" href="../../shared/playground-design-system/tokens.css">
|
||||
<link rel="stylesheet" href="../../shared/playground-design-system/base.css">
|
||||
<link rel="stylesheet" href="../../shared/playground-design-system/components.css">
|
||||
<link rel="stylesheet" href="../../shared/playground-design-system/components-tier2.css">
|
||||
|
||||
<!-- Theme bootstrap. Must run before the stylesheets parse to avoid a
|
||||
flash-of-wrong-theme (FOUC). Priority order:
|
||||
1) saved choice (localStorage '<plugin-name>-theme')
|
||||
2) OS preference via matchMedia('(prefers-color-scheme: dark)')
|
||||
3) the HTML attribute default ('light' above)
|
||||
Sets both data-theme + colorScheme for native form controls and scrollbars.
|
||||
Wrapped in try/catch — file:// + private mode can block localStorage. -->
|
||||
<script>
|
||||
(function () {
|
||||
var theme = null;
|
||||
try {
|
||||
var saved = localStorage.getItem('<plugin-name>-theme');
|
||||
if (saved === 'light' || saved === 'dark') theme = saved;
|
||||
} catch (e) { /* localStorage unavailable */ }
|
||||
if (!theme && window.matchMedia) {
|
||||
theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
||||
}
|
||||
if (!theme) theme = document.documentElement.getAttribute('data-theme') || 'light';
|
||||
document.documentElement.setAttribute('data-theme', theme);
|
||||
document.documentElement.style.colorScheme = theme;
|
||||
})();
|
||||
</script>
|
||||
|
||||
<link rel="stylesheet" href="vendor/playground-design-system/tokens.css">
|
||||
<link rel="stylesheet" href="vendor/playground-design-system/base.css">
|
||||
<link rel="stylesheet" href="vendor/playground-design-system/components.css">
|
||||
<link rel="stylesheet" href="vendor/playground-design-system/components-tier2.css">
|
||||
<!-- Optional: include components-tier3.css for Tier 3 wave 1 components -->
|
||||
<!-- Optional: include components-tier3-supplement.css for Tier 3 wave 2 (12 additional components) -->
|
||||
<!-- Optional: include components-tier4-project-view.css for the Tier 4 project-view arketype -->
|
||||
<!-- Optional: only include print.css if scenario produces a printable A4 report -->
|
||||
<link rel="stylesheet" href="../../shared/playground-design-system/print.css">
|
||||
<link rel="stylesheet" href="vendor/playground-design-system/print.css">
|
||||
<!-- Self-hosted fonts (no external requests) -->
|
||||
<link rel="stylesheet" href="../../shared/playground-design-system/fonts.css">
|
||||
<link rel="stylesheet" href="vendor/playground-design-system/fonts.css">
|
||||
</head>
|
||||
<body>
|
||||
<header class="app-header">
|
||||
|
|
@ -93,7 +149,18 @@ To use the design system from a plugin's Playground:
|
|||
</html>
|
||||
```
|
||||
|
||||
The relative path `../../shared/playground-design-system/` assumes the plugin's Playground lives at `plugins/{plugin-name}/playground/index.html`. Adjust the prefix to match your plugin's structure.
|
||||
The relative path `vendor/playground-design-system/` assumes the plugin's Playground HTML lives at
|
||||
`<plugin-name>/playground/<plugin-name>-playground.html`, with the design system vendored (copied
|
||||
in) at `<plugin-name>/playground/vendor/playground-design-system/`. Adjust the prefix to match your
|
||||
plugin's structure.
|
||||
|
||||
The theme-bootstrap script is not part of the vendored CSS — copy it into each Playground's own
|
||||
`<head>`, replacing `<plugin-name>-theme` with a key unique to that plugin (both `ms-ai-architect`
|
||||
and `llm-security` follow this pattern today). The `data-theme-toggle` button's own click handler
|
||||
(written per Playground, not vendored) is what writes that key via `localStorage.setItem` when the
|
||||
reader switches theme — the bootstrap script only reads it back on the next load. Without the
|
||||
bootstrap script, the page renders in the HTML attribute's default theme for one frame before
|
||||
JavaScript applies the saved/OS preference — the FOUC it exists to prevent.
|
||||
|
||||
## Design principles
|
||||
|
||||
|
|
|
|||
31
SECURITY.md
Normal file
31
SECURITY.md
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
# Security policy
|
||||
|
||||
## Reporting a vulnerability
|
||||
|
||||
Report privately to <security@fromaitochitta.com> - do not open a
|
||||
public issue.
|
||||
Canonical repository: https://git.fromaitochitta.com/open/playground-design-system
|
||||
|
||||
Please include the affected version or commit, a minimal reproduction,
|
||||
and the impact you see. We acknowledge every report within 5 working
|
||||
days, agree a fix and disclosure timeline with the reporter, and aim to
|
||||
disclose within 90 days of the initial report.
|
||||
|
||||
## Response process
|
||||
|
||||
1. Acknowledge within 5 working days.
|
||||
2. Triage and confirm severity within 10 working days.
|
||||
3. Develop and test a fix.
|
||||
4. Publish an advisory and credit the reporter unless they prefer
|
||||
to remain anonymous.
|
||||
|
||||
## Supported versions
|
||||
|
||||
This repository has not yet reached a 1.0 release. Only the latest
|
||||
tagged 0.x version (currently 0.6.0, see [CHANGELOG.md](CHANGELOG.md))
|
||||
is supported; security fixes land on `main` and are released as the
|
||||
next 0.x tag.
|
||||
|
||||
## Advisories
|
||||
|
||||
No advisories have been published for this repository to date.
|
||||
Loading…
Add table
Add a link
Reference in a new issue