required-doc 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +298 -0
- package/dist/index.js +1758 -0
- package/package.json +34 -0
- package/style.css +51 -0
- package/types.d.ts +51 -0
package/README.md
ADDED
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
# spec-viewer
|
|
2
|
+
|
|
3
|
+
要件書(仕様モック)ビューアのフレームワーク。
|
|
4
|
+
**部品(component)/ 画面(page)のモックと自然言語の要件を左右に並べて表示**し、端末(PC / Tablet / Phone)切替・縮尺プレビュー・ダーク/ライト・カラー一覧をまとめて提供します。
|
|
5
|
+
|
|
6
|
+
- ビューア本体は **Vue 3 + Vue Router** 製(利用側に `npm i vue vue-router` が必要)。
|
|
7
|
+
- ただし**モックの中身は素の HTML 文字列でOK**(Vue に依存させない)。動的にしたい部品だけ Vue コンポーネントにもできる。
|
|
8
|
+
- スタイルは **Tailwind CSS v4**。ユーティリティは「利用側の Tailwind」が生成する(後述)。
|
|
9
|
+
|
|
10
|
+
このリポジトリでは、利用側の実例が `../requirements` にあります。**迷ったら `requirements` を写経**すれば動きます。
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 全体像
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
npm_pack/ ← このパッケージ(ビューア本体)。基本さわらない
|
|
18
|
+
requirements/ ← 利用側。ここに「要件の中身」を書く
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
- **ビューア(npm_pack)**: 額縁・ルーティング・端末枠・プレビュー・カラーページなど共通の仕組み。
|
|
22
|
+
- **中身(requirements)**: `components` / `pages` / `colors` と、それらを `createSpecViewer()` に渡す `main.ts`。
|
|
23
|
+
|
|
24
|
+
中身は「部品」と「画面」に分かれ、画面は部品のマークアップを組み合わせて作る(パズルのイメージ)。
|
|
25
|
+
それぞれ **バージョン(v1, v2, …)単位**で管理する。
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## クイックスタート(利用側を新規に作る場合)
|
|
30
|
+
|
|
31
|
+
### 1. 依存を入れる
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm i vue vue-router
|
|
35
|
+
npm i -D vite @vitejs/plugin-vue tailwindcss @tailwindcss/vite typescript vue-tsc
|
|
36
|
+
# spec-viewer はローカル参照(このリポジトリ構成の場合)
|
|
37
|
+
npm i spec-viewer@file:../npm_pack
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
`package.json`(利用側)の要点:
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"type": "module",
|
|
45
|
+
"scripts": { "dev": "vite", "build": "vue-tsc -b && vite build" },
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"spec-viewer": "file:../npm_pack",
|
|
48
|
+
"vue": "^3.5.34",
|
|
49
|
+
"vue-router": "^4.6.4"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
> `spec-viewer` は **ビルド済み成果物(dist)**を読みます。npm_pack 側を編集したら `cd npm_pack && npm run build` が必要(中身=requirements 側の編集は HMR で即反映)。
|
|
55
|
+
|
|
56
|
+
### 2. Vite 設定(利用側 `vite.config.ts`)
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
import { defineConfig } from 'vite'
|
|
60
|
+
import vue from '@vitejs/plugin-vue'
|
|
61
|
+
import tailwindcss from '@tailwindcss/vite'
|
|
62
|
+
import { fileURLToPath, URL } from 'node:url'
|
|
63
|
+
|
|
64
|
+
export default defineConfig({
|
|
65
|
+
plugins: [vue(), tailwindcss()],
|
|
66
|
+
resolve: {
|
|
67
|
+
alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) },
|
|
68
|
+
},
|
|
69
|
+
})
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 3. CSS(利用側 `src/style.css`)
|
|
73
|
+
|
|
74
|
+
Tailwind は **利用側で 1 回だけ**走らせ、`@source` で spec-viewer のクラスも生成対象に含める(これでビューア本体+自分のモック両方のクラスが出る/preflight も 1 回だけ)。
|
|
75
|
+
|
|
76
|
+
```css
|
|
77
|
+
@import "tailwindcss";
|
|
78
|
+
|
|
79
|
+
/* dark: を .dark クラス基準で効かせる(手動トグル用) */
|
|
80
|
+
@custom-variant dark (&:where(.dark, .dark *));
|
|
81
|
+
|
|
82
|
+
/* spec-viewer 本体が使う Tailwind クラスも生成対象にする */
|
|
83
|
+
@source "../node_modules/spec-viewer/dist";
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 4. エントリ(利用側 `src/main.ts`)
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
import { createSpecViewer } from 'spec-viewer'
|
|
90
|
+
import 'spec-viewer/style.css' // ビューアの独自 CSS(req-md など)
|
|
91
|
+
import './style.css' // Tailwind ユーティリティ
|
|
92
|
+
|
|
93
|
+
import Input from './components/Input/meta'
|
|
94
|
+
import Button from './components/Button/meta'
|
|
95
|
+
import loginPage from './pages/loginPage/meta'
|
|
96
|
+
import { colors } from './colors/colors'
|
|
97
|
+
|
|
98
|
+
createSpecViewer({
|
|
99
|
+
components: [Input, Button],
|
|
100
|
+
pages: [loginPage],
|
|
101
|
+
colors,
|
|
102
|
+
}).mount('#app')
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
`index.html` には `<div id="app"></div>` と `<script type="module" src="/src/main.ts">` を置く。
|
|
106
|
+
|
|
107
|
+
### 5. 起動
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
npm run dev # 開発サーバ
|
|
111
|
+
npm run build # 型チェック + 本番ビルド
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
`/catalog`(一覧)→ 各部品/画面、`/colors`(カラー一覧)へ遷移できる。
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## 中身の書き方
|
|
119
|
+
|
|
120
|
+
### ディレクトリ構成
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
src/
|
|
124
|
+
components/
|
|
125
|
+
Input/
|
|
126
|
+
meta.ts ← この部品のメタ(一覧/ルーティング用)
|
|
127
|
+
v1/
|
|
128
|
+
Input.demo.html ← モック(素の HTML)
|
|
129
|
+
Input.req.md ← 要件(Markdown)
|
|
130
|
+
pages/
|
|
131
|
+
loginPage/
|
|
132
|
+
meta.ts
|
|
133
|
+
v1/
|
|
134
|
+
LoginPage.mock.html
|
|
135
|
+
LoginPage.req.md
|
|
136
|
+
colors/
|
|
137
|
+
colors.ts ← 色定義(任意の色トークン)
|
|
138
|
+
main.ts
|
|
139
|
+
style.css
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### meta.ts(部品でも画面でも同じ形)
|
|
143
|
+
|
|
144
|
+
```ts
|
|
145
|
+
import type { ItemMeta } from 'spec-viewer'
|
|
146
|
+
import InputV1Demo from './v1/Input.demo.html?raw' // ← 素の HTML を文字列で読む
|
|
147
|
+
import InputV1Req from './v1/Input.req.md?raw'
|
|
148
|
+
|
|
149
|
+
const meta: ItemMeta = {
|
|
150
|
+
name: 'Input', // URL に使う識別子
|
|
151
|
+
kind: 'component', // 'component' | 'page'
|
|
152
|
+
title: 'Input(入力欄)', // 一覧/ヘッダの見出し
|
|
153
|
+
desc: 'メール・パスワード等で使う単一行入力',
|
|
154
|
+
latest: 'v1', // 既定で表示するバージョン
|
|
155
|
+
versions: {
|
|
156
|
+
v1: { view: InputV1Demo, req: InputV1Req },
|
|
157
|
+
},
|
|
158
|
+
}
|
|
159
|
+
export default meta
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
- `view`: モックの表示物。**素の HTML 文字列(`?raw`)** または Vue コンポーネント。
|
|
163
|
+
- `req`: 要件の Markdown 文字列(`?raw`)。
|
|
164
|
+
|
|
165
|
+
作ったら `main.ts` の `components` / `pages` 配列に 1 行足す。
|
|
166
|
+
|
|
167
|
+
### モック(素の HTML)
|
|
168
|
+
|
|
169
|
+
Tailwind のクラスをそのまま書ける(利用側 Tailwind が拾う)。状態違いを並べて見せると要件が伝わりやすい。
|
|
170
|
+
|
|
171
|
+
```html
|
|
172
|
+
<!-- Input.demo.html -->
|
|
173
|
+
<div class="space-y-4">
|
|
174
|
+
<label class="block">
|
|
175
|
+
<span class="mb-1 block text-sm font-bold text-gray-700 dark:text-gray-200">通常</span>
|
|
176
|
+
<input class="w-full rounded-md border px-3 py-2 border-gray-300 bg-white dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100" />
|
|
177
|
+
</label>
|
|
178
|
+
</div>
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
> 素の HTML なので `v-model` 等の動的挙動はない(静的モック)。動的にしたい部品だけ、`view` に Vue コンポーネントを渡せる(`view: string | Component`)。
|
|
182
|
+
|
|
183
|
+
### 要件(Markdown)
|
|
184
|
+
|
|
185
|
+
`*.req.md` に自然言語で表示条件・活性条件などを書く。右ペインに描画される(GFM 対応:表・リスト・見出しなど)。
|
|
186
|
+
|
|
187
|
+
### バージョン運用
|
|
188
|
+
|
|
189
|
+
- 仕様を変えるときは `v2/` を足し、`meta.ts` の `versions` に `v2` を追加、`latest` を更新する。
|
|
190
|
+
- 画面が部品の特定版を使う場合は、その版のマークアップを画面側 HTML に取り込む形で「ピン留め」する(古い版の画面要件が将来の変更で崩れない)。
|
|
191
|
+
- ヘッダのドロップダウンでバージョンを切替表示できる。
|
|
192
|
+
|
|
193
|
+
### 色定義(colors.ts)
|
|
194
|
+
|
|
195
|
+
```ts
|
|
196
|
+
import type { ColorToken } from 'spec-viewer'
|
|
197
|
+
|
|
198
|
+
export const colors: ColorToken[] = [
|
|
199
|
+
{ name: 'accentColor', light: '#005AFF', dark: '#75AEFE', desc: 'メインのアクセント色' },
|
|
200
|
+
// baseBg / baseFont は options.baseColors から自動表示されるのでここには書かない
|
|
201
|
+
]
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
`/colors` でライト/ダーク両方の値をスウォッチ付きで一覧表示する。
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## オプション(`createSpecViewer({ ..., options })`)
|
|
209
|
+
|
|
210
|
+
すべて**任意**。省略すればデフォルトが使われる(書くのは変えたい項目だけでOK)。
|
|
211
|
+
|
|
212
|
+
```ts
|
|
213
|
+
createSpecViewer({
|
|
214
|
+
components, pages, colors,
|
|
215
|
+
options: {
|
|
216
|
+
showThemeToggle: true, // ダーク/ライト切替ボタンの表示(既定 true)
|
|
217
|
+
devices: [ // mock の端末タブ(既定 PC / Phone)
|
|
218
|
+
{ id: 'pc', label: 'PC', frame: 'pc', width: 1024 },
|
|
219
|
+
{ id: 'tablet', label: 'Tablet', frame: 'tablet', width: 768 },
|
|
220
|
+
{ id: 'phone', label: 'Phone', frame: 'phone', width: 360 },
|
|
221
|
+
],
|
|
222
|
+
baseColors: { // モック画面の基本色(既定は下記の値)
|
|
223
|
+
light: { bg: '#f5f6f8', font: '#1f2937' },
|
|
224
|
+
dark: { bg: '#131313', font: '#f3f3f3' },
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
})
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### showThemeToggle
|
|
231
|
+
|
|
232
|
+
`false` にすると、全画面からダーク/ライト切替ボタンが消える。
|
|
233
|
+
|
|
234
|
+
### devices
|
|
235
|
+
|
|
236
|
+
mock 上部のタブに出る端末リスト。
|
|
237
|
+
|
|
238
|
+
| フィールド | 説明 |
|
|
239
|
+
| --- | --- |
|
|
240
|
+
| `id` | タブ識別子(例 `'pc'`) |
|
|
241
|
+
| `label` | タブ表示名(例 `'PC'`) |
|
|
242
|
+
| `frame` | 枠の見た目。`'pc'`=ブラウザ風 / `'phone'`=ノッチ付き / `'tablet'`=ノッチなしベゼル |
|
|
243
|
+
| `width` | 画面幅(**px・必須**) |
|
|
244
|
+
|
|
245
|
+
- 配列を 1 件だけ(例: PC のみ)にすると端末タブ自体が消える。
|
|
246
|
+
- `width` は**デザインの実寸**。ペースに収まらなければ縮めず、**全体を縮尺(最大 1x、はみ出す分だけ縮小)**して表示する。
|
|
247
|
+
|
|
248
|
+
### baseColors
|
|
249
|
+
|
|
250
|
+
モック画面(PC/Tablet/Phone の画面・全画面プレビュー)の**背景色と基本文字色**を、ライト/ダークごとに指定する。
|
|
251
|
+
ここで指定した値は `/colors` の一覧に `baseBg` / `baseFont` として自動表示される(情報源が二重化しない)。
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## プレビューモード
|
|
256
|
+
|
|
257
|
+
- ヘッダの「プレビュー」ボタンで、**要件パネルを隠し画面そのものだけを全画面表示**する。
|
|
258
|
+
- 余計な枠・ヘッダ・ラベルは出さず、選択中端末の `width` で実寸レイアウト → ビューポートに合わせて縮尺表示。
|
|
259
|
+
- 退室は **`Esc`** または右上の「閉じる」ボタン。
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## 仕組み(内部メモ)
|
|
264
|
+
|
|
265
|
+
- `createSpecViewer(config)` が `config` を `registryStore` に注入し、ルータ付き Vue アプリを返す。
|
|
266
|
+
- ルート: `/catalog`, `/components/:name/:ver?`, `/pages/:name/:ver?`, `/colors`。
|
|
267
|
+
- `ReqScreen.vue` が額縁(ヘッダ / 左モック / 右要件)と端末枠・縮尺・プレビューを担当。
|
|
268
|
+
- Tailwind ユーティリティはパッケージに同梱せず、**利用側の `@source` 経由で生成**(`dist/index.js` 内のクラス文字列を走査)。パッケージ同梱の `style.css` は req-md 等の独自スタイルのみ。
|
|
269
|
+
|
|
270
|
+
### 公開 API / 型
|
|
271
|
+
|
|
272
|
+
```ts
|
|
273
|
+
import {
|
|
274
|
+
createSpecViewer,
|
|
275
|
+
type SpecViewerConfig,
|
|
276
|
+
type SpecViewerOptions,
|
|
277
|
+
type ItemMeta,
|
|
278
|
+
type ItemKind,
|
|
279
|
+
type VersionEntry,
|
|
280
|
+
type DeviceConfig,
|
|
281
|
+
type ColorToken,
|
|
282
|
+
} from 'spec-viewer'
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## よくある操作
|
|
288
|
+
|
|
289
|
+
| やりたいこと | 操作 |
|
|
290
|
+
| --- | --- |
|
|
291
|
+
| 部品/画面を追加 | `meta.ts` + `v1/*.html` + `v1/*.req.md` を作り、`main.ts` の配列に追加 |
|
|
292
|
+
| バージョンを増やす | `v2/` を足して `meta.ts` の `versions` と `latest` を更新 |
|
|
293
|
+
| 端末を変える | `options.devices` を編集(PC のみ・Tablet 追加など) |
|
|
294
|
+
| 端末の幅を変える | 各 device の `width`(px) |
|
|
295
|
+
| ダーク切替を隠す | `options.showThemeToggle: false` |
|
|
296
|
+
| モックの基本色を変える | `options.baseColors`(`/colors` にも反映) |
|
|
297
|
+
| ビューア本体を直した | `cd npm_pack && npm run build` で再ビルド |
|
|
298
|
+
```
|