Back to index

SWOT Evidence

Matrix
Generates documents
SWOT Evidence

Seen as a design

Take it with you

Copy and paste, or save a file and hand it over. For a machine with no network, one “Everything” file is enough.

Everything

swot-evidence-everything.md

Everything in this panel, including the contents behind each URL, in one Markdown file

Prompt

1.6 KB
Build an HTML document with "SWOT Evidence". This layout runs, so there is no composition to rebuild — what it needs is content.

## What this layout does
SWOT Evidence with explicit source values and reading conditions.

## What you have to supply
- Provide the source values, labels and decision conditions described by the schema.

## The shape of the input
- `title` — string — 結論を伝える見出し
- `subtitle` — string? — 出典・時点・母集団や仮定
- `strengths` — array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) — 内部の強みと根拠
- `weaknesses` — array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13) — 内部の弱みと根拠
- `opportunities` — array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) — 外部の機会と根拠
- `threats` — array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13) — 外部の脅威と根拠
- `implication` — string — 4象限から導く検討事項

schema.ts holds the machine-checkable validation. Ask rather than guess when an input is missing.

## When not to use it
- Do not compare values with incompatible units, populations, or assumptions.

## How to build it
Put the input in a JSON file and run:

```bash
node scripts/render.mjs swot-evidence <input.json> --theme ink -o out.html
```

The output is one self-contained file and fetches nothing at render time.

## The source
- https://design-vault.pages.dev/designs/swot-evidence/source/template.tsx
- https://design-vault.pages.dev/designs/swot-evidence/source/schema.ts
- https://design-vault.pages.dev/designs/swot-evidence/source/sample-data.json
- https://design-vault.pages.dev/designs/swot-evidence/sample.html

Files

Template, input schema, sample data and metadata. This document was generated from those four. The generated document

template.tsx

6.5 KB

/designs/swot-evidence/source/template.tsx

Show contents
import type { ReactNode } from "react";
import type { Props } from "./schema";
function Notes({children}:{children:ReactNode}) { return <details><summary>データ・判断条件を確認</summary>{children}</details>; }

const CSS = String.raw`
.asset{font-family:var(--font-sans);color:var(--color-primary);background:var(--color-surface);max-width:var(--container-slide);margin:auto;padding:3rem 2rem;line-height:1.6;font-size:var(--text-body-sm)}
.asset *{box-sizing:border-box}.asset header{margin-bottom:2rem}.asset .eyebrow{font-family:var(--font-mono);font-size:var(--text-label);letter-spacing:.08em;color:var(--color-secondary);margin-bottom:.75rem}.asset h1{font-size:var(--text-h1);font-weight:700;line-height:1.35;letter-spacing:-.025em;max-width:32em}.asset h2{font-size:var(--text-h3);font-weight:600;margin-bottom:.75rem}.asset h3{font-size:var(--text-body-md);font-weight:600}.asset .subtitle,.asset .muted{color:var(--color-secondary)}.asset .subtitle{margin-top:.75rem}.asset .number{font-variant-numeric:tabular-nums;font-family:var(--font-mono)}.asset .hero-number{font-size:var(--text-display);line-height:1.2;font-weight:700;letter-spacing:-.04em}.asset .callout{border-left:.25rem solid var(--color-tertiary);padding:1rem 1.5rem;background:var(--color-surface-subtle);margin-bottom:1.5rem}.asset .grid2{display:grid;grid-template-columns:1fr 1fr;gap:1.5rem}.asset .grid3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1.5rem}.asset .panel{padding:1.5rem;background:var(--color-surface-subtle);border-radius:var(--radius-md);min-width:0}.asset .rule{border-top:1px solid var(--color-outline);padding-top:1rem;margin-top:1rem}.asset .pill{display:inline-block;padding:.25rem .75rem;border:1px solid var(--color-outline);border-radius:var(--radius-full);font-size:var(--text-label)}.asset .focus{background:var(--color-tertiary-container);color:var(--color-on-tertiary-container)}.asset .dark{background:var(--color-primary);color:var(--color-on-primary)}.asset .dark .muted{color:var(--color-on-primary-container)}.asset .row{display:grid;grid-template-columns:12rem minmax(0,1fr) 6rem;gap:1rem;align-items:center;padding:.75rem 0;border-bottom:1px solid var(--color-outline)}.asset .row>*{min-width:0}.asset .track{height:1rem;position:relative;background:var(--color-neutral);border-radius:var(--radius-sm)}.asset .bar{height:100%;background:var(--color-tertiary);border-radius:var(--radius-sm)}.asset .track.tall{height:2rem}.asset .flex{display:flex;gap:1rem;align-items:center;justify-content:space-between;flex-wrap:wrap}.asset .stack>*+*{margin-top:1rem}.asset ul{list-style:disc;padding-left:1.25rem}.asset li+li{margin-top:.5rem}.asset .plot{display:block;width:100%;height:auto;overflow:visible}.asset .plot text{font-family:var(--font-sans);font-size:14px;fill:var(--color-secondary)}.asset .plot .ink{fill:var(--color-primary)}.asset .plot .axis{stroke:var(--color-outline);stroke-width:1}.asset .plot .accent{stroke:var(--color-tertiary);fill:none;stroke-width:3}.asset .legend{display:flex;gap:1.5rem;flex-wrap:wrap;font-size:var(--text-label);margin-bottom:1rem}.asset .legend b{display:inline-block;width:.75rem;height:.75rem;margin-right:.5rem}.asset .ledger{border-collapse:collapse;width:100%;font-variant-numeric:tabular-nums}.asset .ledger caption{text-align:left;font-weight:600;margin:1rem 0}.asset .ledger th{font-weight:600;color:var(--color-secondary);text-align:left}.asset .ledger th,.asset .ledger td{padding:.75rem 1rem;border-bottom:1px solid var(--color-outline);vertical-align:top;overflow-wrap:anywhere}.asset .ledger th:first-child,.asset .ledger td:first-child{padding-left:0}.asset .ledger th:last-child,.asset .ledger td:last-child{padding-right:0}.asset .ledger tbody tr:hover{background:var(--color-surface-subtle)}.asset details{border-top:1px solid var(--color-outline);margin-top:1.5rem;padding-top:1rem}.asset summary{cursor:pointer;color:var(--color-secondary);padding:.5rem 0;min-height:2.75rem}.asset summary:focus-visible{outline:2px solid var(--color-tertiary);outline-offset:.25rem}.asset .small{font-size:var(--text-label)}.asset .mobile-only{display:none}.asset .horizontal-list{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.asset .board-column{border-top:.25rem solid var(--color-primary);padding-top:1rem;min-width:0}.asset .board-item{padding:1rem 0;border-bottom:1px solid var(--color-outline)}.asset .board-item p{margin-top:.5rem}.asset .statement{font-size:var(--text-h2);line-height:1.5;font-weight:600}.asset .meta-line{margin-top:.75rem;font-size:var(--text-label);color:var(--color-secondary)}.asset pre{white-space:pre-wrap;overflow-wrap:anywhere}.asset footer{margin-top:2rem;font-size:var(--text-label);color:var(--color-secondary)}
@media(max-width:640px){.asset{padding:1.5rem 1rem}.asset h1{font-size:var(--text-h2)}.asset header{margin-bottom:1.5rem}.asset .grid2,.asset .grid3,.asset .horizontal-list{grid-template-columns:1fr}.asset .row{grid-template-columns:minmax(0,1fr) 5rem;gap:.5rem}.asset .row>:first-child{grid-column:1/-1}.asset .desktop-only{display:none!important}.asset .mobile-only{display:block}.asset .panel{padding:1rem}.asset .ledger,.asset .ledger tbody,.asset .ledger tr,.asset .ledger td{display:block}.asset .ledger thead{display:none}.asset .ledger tr{padding:.75rem 0;border-bottom:1px solid var(--color-outline)}.asset .ledger td{display:grid;grid-template-columns:7rem minmax(0,1fr);gap:.75rem;border:0;padding:.25rem 0!important}.asset .ledger td:before{content:attr(data-label);color:var(--color-secondary);font-size:var(--text-label)}.asset .hero-number{font-size:var(--text-h1)}}
@media print{.asset{max-width:none;padding:1rem}.asset details>*{display:block}.asset summary{display:none}}
`;

export default function Template(d: Props) {
const groups=[{label:"強み",code:"S",items:d.strengths},{label:"弱み",code:"W",items:d.weaknesses},{label:"機会",code:"O",items:d.opportunities},{label:"脅威",code:"T",items:d.threats}];
return <section className="asset asset-swot-evidence"><style>{CSS}</style><header><p className="eyebrow">SWOT EVIDENCE</p><h1>{d.title}</h1>{d.subtitle && <p className="subtitle">{d.subtitle}</p>}</header>
<div className="grid2">{groups.map((g,i)=><article className="panel" key={g.code}><div className="flex"><h2>{g.label}</h2><span className="hero-number muted">{g.code}</span></div><ul>{g.items.map((s,j)=><li key={j}>{s}</li>)}</ul><p className="meta-line">{i<2?"内部要因":"外部要因"}</p></article>)}</div><Notes><p><strong>次の検討:</strong>{d.implication}</p></Notes>
<footer>観察と解釈を分ける。SWOTだけで優先順位を確定しない。</footer></section>;
}

schema.ts

735 B

/designs/swot-evidence/source/schema.ts

Show contents
import { z } from "zod";
const text = z.string().trim().min(1).max(160);
const value = z.number().finite();
const positive = value.positive();

export const schema = z.object({
  title: text.describe("結論を伝える見出し"),
  subtitle: text.optional().describe("出典・時点・母集団や仮定"),
  strengths:z.array(text).min(1).max(4).describe("内部の強みと根拠"),weaknesses:z.array(text).min(1).max(4).describe("内部の弱みと根拠"),opportunities:z.array(text).min(1).max(4).describe("外部の機会と根拠"),threats:z.array(text).min(1).max(4).describe("外部の脅威と根拠"), implication:text.describe("4象限から導く検討事項"),
}).strict();
export type Props = z.infer<typeof schema>;

meta.yaml

1.6 KB

/designs/swot-evidence/source/meta.yaml

Show contents
id: swot-evidence
name:
  ja: 根拠を持つSWOT
  en: SWOT Evidence
purpose:
  ja: 内部・外部、好影響・悪影響の4象限に、根拠付きの観察を整理する。
  en: SWOT Evidence with explicit source values and reading conditions.
status: published
still: ./still.png
category: decision
catalogOrder: 460
jobs:
  - prioritize-diagnose
useCases:
  - problem-solution
layoutKinds:
  - matrix
tags:
  - swot-evidence
  - decision
  - offline
  - responsive
whenToUse:
  - ja: 内部・外部、好影響・悪影響の4象限に、根拠付きの観察を整理する。
    en: Use to communicate swot evidence.
avoidWhen:
  - ja: 同じ条件・単位で比較できないデータには使わない
    en: Do not compare values with incompatible units, populations, or assumptions.
requiredInputs:
  - ja: 観察と解釈を分ける。SWOTだけで優先順位を確定しない。
    en: Provide the source values, labels and decision conditions described by the schema.
relatedLayouts:
  - matrix-2x2
  - assumption-evidence
dataSchema:
  title: string — 結論を伝える見出し
  subtitle: string? — 出典・時点・母集団や仮定
  strengths: array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) — 内部の強みと根拠
  weaknesses: array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13) — 内部の弱みと根拠
  opportunities: array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) — 外部の機会と根拠
  threats: array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13) — 外部の脅威と根拠
  implication: string — 4象限から導く検討事項
sources: []

sample-data.json

719 B

/designs/swot-evidence/source/sample-data.json

Show contents
{
  "title": "既存顧客との接点を活かし、導入支援を強化する",
  "subtitle": "架空サンプル|レイアウトの使用例",
  "strengths": [
    "長期契約の顧客が60%を占める",
    "導入支援の担当者を各地域に配置"
  ],
  "weaknesses": [
    "小規模案件の導入に平均8週間",
    "ヘルプ記事の更新が四半期ごと"
  ],
  "opportunities": [
    "既存顧客から追加部門への展開相談",
    "電子手続きの導入希望が増加"
  ],
  "threats": [
    "価格を下げた競合プランが登場",
    "顧客側の担当者不足で導入延期"
  ],
  "implication": "支援工数を下げる標準導入パックを検証する"
}