@insession/design-system 1.4.1 → 1.5.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/CHANGELOG.md +20 -0
- package/README.md +17 -2
- package/dist/styles.css +32 -0
- package/package.json +1 -1
- package/theme.css +97 -10
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @insession/design-system
|
|
2
2
|
|
|
3
|
+
## 1.5.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 76bc475: ライトテーマを DS に取り込んだ。`<html data-theme="light">` だけでライトになる。
|
|
8
|
+
|
|
9
|
+
これまで `theme.css` はダーク単一トーンで、ライトは**消費側が自前でオーバーレイを持つ**契約だった。結果として同じライト値が insession-app(`apps/web`)と loophub(`apps/web` / `apps/lp`)に重複し、DS の README にも「値は揃えて保守する」と書かれた三重管理になっていた。ここへ一本化した。
|
|
10
|
+
|
|
11
|
+
移設前に 3 者の値を突き合わせ、**loophub の 17 トークンは insession-app の 30 トークンの部分集合で、値も完全に一致**していることを確認している。insession-app 固有で DS が持たない 3 つ(`--color-visibility-public` / `-followers` / `-community`)は移していない。
|
|
12
|
+
|
|
13
|
+
**設計:**
|
|
14
|
+
|
|
15
|
+
- **ダークが既定。** `@theme` の値がそのままダークのトーンで、ライトのオーバーレイは `data-theme="light"` が付くまで不活性。**ダーク固定のプロダクトは何も意識しなくてよい。**
|
|
16
|
+
- **ダーク側(`[data-theme="dark"]`)の再宣言は置かない。** 移設元には 25 トークン分あったが、全て `@theme` の既定値と完全一致だったため、持ち込むと同じ値の二重管理が DS 側に移るだけになる。属性なしと `"dark"` はどちらも `:root` の値で成立する。
|
|
17
|
+
- オーバーレイは**どの `@layer` にも属さない**ので `@theme` の出力(theme レイヤー)より必ず強い。詳細度でも `:root[data-theme="light"]`(0,2,0) > `:root`(0,1,0) なので、消費側の取り込み方に依らず効く。
|
|
18
|
+
- 上書きするのは**参照元の生値だけ**(27 トークン)。ティント面とセマンティック面は `color-mix(…, var(--color-bg))` の合成なので追従する。
|
|
19
|
+
- セレクタは `:root[…]` で html 要素だけに効く。要素単位の部分切替が必要なプロダクトは自分側で足す。
|
|
20
|
+
|
|
21
|
+
**Storybook にツールバーの Theme トグルを追加した。** これが無いとライト値を目視検証できなかった。`scripts/check-styles.mjs` にもオーバーレイの回帰検査を足した(存在すること・レイヤー外にあること・面やティントを二重に書いていないこと・ダーク側の再宣言が無いこと)。
|
|
22
|
+
|
|
3
23
|
## 1.4.1
|
|
4
24
|
|
|
5
25
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -95,9 +95,24 @@ minimumReleaseAgeExclude:
|
|
|
95
95
|
|
|
96
96
|
> 除外するのは**自分たちが publish する first-party パッケージだけ**にすること。サードパーティへの待機は攻撃対策として意味があるので外さない。
|
|
97
97
|
|
|
98
|
-
###
|
|
98
|
+
### テーマ(ライト / ダーク)
|
|
99
99
|
|
|
100
|
-
|
|
100
|
+
**ダークが既定。ライトは `<html data-theme="light">` のときだけ効く。**
|
|
101
|
+
|
|
102
|
+
```html
|
|
103
|
+
<html data-theme="light"> <!-- ライト -->
|
|
104
|
+
<html data-theme="dark"> <!-- ダーク -->
|
|
105
|
+
<html> <!-- ダーク(属性なしでも既定はダーク) -->
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
- **ダーク固定のプロダクトは何もしなくてよい。** ライトのオーバーレイは属性が付くまで不活性。
|
|
109
|
+
- **切り替えるプロダクトは html の `data-theme` を書き換えるだけ。** トークンを自分で持つ必要はない。
|
|
110
|
+
- 切り替え対象は**参照元の生値だけ**。ティント面(`--color-tint-*`)とセマンティック面(`--color-*-surface`)は `color-mix(…, var(--color-bg))` の合成なので `--color-bg` の変化に自動追従する。リンク色と `--color-accent` も `--color-mint` / `--color-mint-soft` の参照なので追従する。
|
|
111
|
+
- 要素単位で部分的に切り替えたい場合は、`:root[…]` ではなく `[data-theme="light"]` 版を自分側で足す(DS のセレクタは html 要素だけに効く)。
|
|
112
|
+
|
|
113
|
+
Storybook のツールバーに Theme トグルがあり、カタログ上でライト/ダークを見比べられる。
|
|
114
|
+
|
|
115
|
+
> 📌 1.4.x までは `theme.css` がダーク単一トーンで、ライトは**消費側が自前で持つ**契約だった。その結果、同じライト値が insession-app(`apps/web`)と loophub(`apps/web` / `apps/lp`)に重複していた。1.5.0 でここへ一本化した(移設前に3者の値を突き合わせ、**loophub の17トークンは insession-app の30トークンの部分集合で値も完全一致**であることを確認している)。
|
|
101
116
|
|
|
102
117
|
## 開発
|
|
103
118
|
|
package/dist/styles.css
CHANGED
|
@@ -1638,6 +1638,38 @@
|
|
|
1638
1638
|
--elev-popover: 0 16px 30px -16px rgba(0, 0, 0, 0.7);
|
|
1639
1639
|
--elev-overlay: 0 26px 64px -32px rgba(0, 0, 0, 0.85);
|
|
1640
1640
|
}
|
|
1641
|
+
:root[data-theme="light"] {
|
|
1642
|
+
--color-bg: #e9e9e6;
|
|
1643
|
+
--color-bg-elevated: #f4f1e9;
|
|
1644
|
+
--color-surface: #ffffff;
|
|
1645
|
+
--color-surface-2: rgba(244, 241, 233, 0.96);
|
|
1646
|
+
--color-surface-3: #ebe7dc;
|
|
1647
|
+
--color-surface-hover: #f1ede3;
|
|
1648
|
+
--color-border: #e2ded3;
|
|
1649
|
+
--color-border-strong: #d6d2c6;
|
|
1650
|
+
--color-text: #17160f;
|
|
1651
|
+
--color-text-dim: #5c5b52;
|
|
1652
|
+
--color-text-faint: #a3a197;
|
|
1653
|
+
--color-fill: #17160f;
|
|
1654
|
+
--color-on-fill: #f1eee6;
|
|
1655
|
+
--color-mint: #ff5a36;
|
|
1656
|
+
--color-mint-soft: #c8431f;
|
|
1657
|
+
--color-cyan: #3b6fe0;
|
|
1658
|
+
--color-violet: #1fa463;
|
|
1659
|
+
--color-success: #1fa463;
|
|
1660
|
+
--color-warning: #e0930f;
|
|
1661
|
+
--color-danger: #d8433d;
|
|
1662
|
+
--color-info: #3b6fe0;
|
|
1663
|
+
--color-shadow: #b4afa0;
|
|
1664
|
+
--color-snackbar-danger: var(--color-danger);
|
|
1665
|
+
--color-snackbar-danger-border: color-mix(in srgb, #ff6b6b 30%, transparent);
|
|
1666
|
+
@supports (color: color-mix(in lab, red, red)) {
|
|
1667
|
+
--color-snackbar-danger-border: color-mix(in srgb, var(--color-danger) 30%, transparent);
|
|
1668
|
+
}
|
|
1669
|
+
--elev-soft: 0 2px 6px -2px rgba(20, 20, 26, 0.12);
|
|
1670
|
+
--elev-popover: 0 12px 24px -14px rgba(20, 20, 26, 0.4);
|
|
1671
|
+
--elev-overlay: 0 20px 46px -28px rgba(20, 20, 26, 0.42);
|
|
1672
|
+
}
|
|
1641
1673
|
@layer base {
|
|
1642
1674
|
*, ::before, ::after, ::backdrop {
|
|
1643
1675
|
box-sizing: border-box;
|
package/package.json
CHANGED
package/theme.css
CHANGED
|
@@ -23,15 +23,16 @@
|
|
|
23
23
|
* (アプリのソースには書かれていないもの。例 bg-accent / rounded-card)が
|
|
24
24
|
* 入っているかを確かめれば機械的に防げる。
|
|
25
25
|
*
|
|
26
|
-
* ──
|
|
27
|
-
*
|
|
28
|
-
*
|
|
26
|
+
* ── ライト/ダークについて ───────────────────────────────
|
|
27
|
+
* **ダークが既定**で、下の @theme の値がそのままダークのトーン。ライトは
|
|
28
|
+
* `<html data-theme="light">` のときだけ効くオーバーレイ(ファイル末尾)で与える。
|
|
29
|
+
* したがって:
|
|
30
|
+
* - ダーク固定のプロダクトは何もしなくてよい(オーバーレイは不活性)
|
|
31
|
+
* - ライト/ダークを切り替えるプロダクトは html の data-theme を書き換えるだけ
|
|
32
|
+
* - `data-theme="dark"` と「属性なし」はどちらもダークになる(:root の @theme 値)
|
|
29
33
|
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* src/style.css にインラインで持ち、このファイルを import しない。両者の値は
|
|
33
|
-
* 揃えて保守する(insession-app 側が増やしたトークンのうち、このパッケージの
|
|
34
|
-
* コンポーネントが参照しないものはここに持ち込まない)。
|
|
34
|
+
* ⚠ ダーク側の再宣言は**置かない**。@theme の値が既定として効くので、同じ値を
|
|
35
|
+
* `[data-theme="dark"]` にも書くと保守箇所が二重になるだけで、得るものが無い。
|
|
35
36
|
*/
|
|
36
37
|
|
|
37
38
|
@theme {
|
|
@@ -328,10 +329,96 @@
|
|
|
328
329
|
/* エレベーションの実値(#950)。上の @theme 内コメントのとおり、Tailwind v4 が --shadow-* を
|
|
329
330
|
ビルド時にリテラル展開するため実値はここ(@theme の外・unlayered な素の :root)に置き、
|
|
330
331
|
@theme 側は var() 参照だけを持つ(insession-app の apps/web/src/style.css の #867 対応と同じ形)。
|
|
331
|
-
|
|
332
|
-
書かれていたものをそのまま移設しただけで変更なし。 */
|
|
332
|
+
ここはダーク(既定)値。ライト値は下のオーバーレイで上書きする。 */
|
|
333
333
|
:root {
|
|
334
334
|
--elev-soft: 0 2px 6px -2px rgba(0, 0, 0, 0.5);
|
|
335
335
|
--elev-popover: 0 16px 30px -16px rgba(0, 0, 0, 0.7);
|
|
336
336
|
--elev-overlay: 0 26px 64px -32px rgba(0, 0, 0, 0.85);
|
|
337
337
|
}
|
|
338
|
+
|
|
339
|
+
/* ── ライトテーマのオーバーレイ ─────────────────────────────
|
|
340
|
+
*
|
|
341
|
+
* `<html data-theme="light">` のときだけ効く。属性が無いか "dark" のときは
|
|
342
|
+
* 上の @theme / :root の値(= ダーク)がそのまま使われるので、**ダーク固定の
|
|
343
|
+
* プロダクトはこのブロックを意識しなくてよい**(不活性なまま)。
|
|
344
|
+
*
|
|
345
|
+
* ── なぜセレクタで上書きできるのか ────────────────────────
|
|
346
|
+
* @theme の出力は静的な CSS 変数宣言に過ぎず、生成後は普通の CSS 変数として
|
|
347
|
+
* 通常の cascade に従う。加えて:
|
|
348
|
+
* - このブロックは **unlayered**(どの @layer にも属さない)ので、@theme の出力が
|
|
349
|
+
* 乗る theme レイヤーより必ず強い
|
|
350
|
+
* - セレクタの詳細度も `:root[data-theme="light"]`(0,2,0) > `:root`(0,1,0)
|
|
351
|
+
* どちらの理由でも勝つので、消費側の取り込み方(レイヤー付き import か否か)に
|
|
352
|
+
* 依らず効く。
|
|
353
|
+
*
|
|
354
|
+
* ── 上書きしなくてよいトークン ──────────────────────────
|
|
355
|
+
* ティント面(--color-tint-*)とセマンティック面(--color-*-surface / *-surface-strong)は
|
|
356
|
+
* `color-mix(… , var(--color-bg))` の合成で定義してあるので、ここで --color-bg が
|
|
357
|
+
* 変わればそのまま追従する。リンク色(--color-link / --color-link-hover)と
|
|
358
|
+
* --color-accent も --color-mint / --color-mint-soft の var() 参照なので追従する。
|
|
359
|
+
* したがってここに書くのは**参照元の生値だけ**。
|
|
360
|
+
*
|
|
361
|
+
* ── 値の出自 ──────────────────────────────────────
|
|
362
|
+
* insession-app(apps/web)と loophub(apps/web / apps/lp)が各自の style.css に持って
|
|
363
|
+
* いた `[data-theme="light"]` オーバーレイを、ここへ一本化したもの。移設前に3者の値を
|
|
364
|
+
* 突き合わせ、**loophub の17トークンは insession-app の30トークンの部分集合で値も完全一致**
|
|
365
|
+
* であることを確認している。insession-app 固有で DS が持たない3つ
|
|
366
|
+
* (--color-visibility-public / -followers / -community)は移していない。
|
|
367
|
+
*
|
|
368
|
+
* ⚠ ダーク側(`[data-theme="dark"]`)の再宣言は置かない。@theme の値が既定として効くため
|
|
369
|
+
* 同じ値の二重管理になるだけ。移設元にはあったが、意図的に持ち込んでいない。
|
|
370
|
+
*
|
|
371
|
+
* ⚠ セレクタは `:root[...]` なので html 要素だけに効く。要素単位で部分的にテーマを
|
|
372
|
+
* 切り替えたいプロダクトは、自分側で `[data-theme="light"]` 版を足すこと。
|
|
373
|
+
*/
|
|
374
|
+
:root[data-theme="light"] {
|
|
375
|
+
/* 背景面(奥 → 手前)。ダークの3段ランプに対応する明るいトーン。 */
|
|
376
|
+
--color-bg: #e9e9e6;
|
|
377
|
+
--color-bg-elevated: #f4f1e9;
|
|
378
|
+
--color-surface: #ffffff;
|
|
379
|
+
--color-surface-2: rgba(244, 241, 233, 0.96);
|
|
380
|
+
--color-surface-3: #ebe7dc;
|
|
381
|
+
--color-surface-hover: #f1ede3;
|
|
382
|
+
|
|
383
|
+
/* 境界。 */
|
|
384
|
+
--color-border: #e2ded3;
|
|
385
|
+
--color-border-strong: #d6d2c6;
|
|
386
|
+
|
|
387
|
+
/* テキスト階層。ダークと明暗を反転させる。 */
|
|
388
|
+
--color-text: #17160f;
|
|
389
|
+
--color-text-dim: #5c5b52;
|
|
390
|
+
--color-text-faint: #a3a197;
|
|
391
|
+
|
|
392
|
+
/* 中立塗り(Primary ボタン等)。ダークでは明色 + 暗い文字、ライトでは逆になる。 */
|
|
393
|
+
--color-fill: #17160f;
|
|
394
|
+
--color-on-fill: #f1eee6;
|
|
395
|
+
|
|
396
|
+
/* ブランドパレット。白背景でのコントラスト確保のため、ダークより濃い値にする。
|
|
397
|
+
mint-soft はダークでは「淡いコーラル」だが、ライトでは白地に載るため
|
|
398
|
+
逆に濃いコーラルになる(テキスト/リンクの静止色に使うため)。 */
|
|
399
|
+
--color-mint: #ff5a36;
|
|
400
|
+
--color-mint-soft: #c8431f;
|
|
401
|
+
--color-cyan: #3b6fe0;
|
|
402
|
+
--color-violet: #1fa463;
|
|
403
|
+
|
|
404
|
+
/* セマンティック(状態表現)の地の色。白背景での可読性のため少し濃くする。
|
|
405
|
+
対応する *-surface / *-border はこれらの var() 合成なので追従する。 */
|
|
406
|
+
--color-success: #1fa463;
|
|
407
|
+
--color-warning: #e0930f;
|
|
408
|
+
--color-danger: #d8433d;
|
|
409
|
+
--color-info: #3b6fe0;
|
|
410
|
+
|
|
411
|
+
/* 影の色。ダークは黒だが、ライトで黒を使うと濁るのでウォームグレーにする。 */
|
|
412
|
+
--color-shadow: #b4afa0;
|
|
413
|
+
|
|
414
|
+
/* スナックバー。面(--color-snackbar-surface)は**ライトでも暗いまま**にする
|
|
415
|
+
(操作フィードバックは前面に浮く別レイヤーという扱いで、意図的にテーマへ追従させない)。
|
|
416
|
+
文字色系だけライトの danger に合わせる。 */
|
|
417
|
+
--color-snackbar-danger: var(--color-danger);
|
|
418
|
+
--color-snackbar-danger-border: color-mix(in srgb, var(--color-danger) 30%, transparent);
|
|
419
|
+
|
|
420
|
+
/* エレベーション。ライトでは黒の落ち影が強すぎるため、青みを含むグレーで薄く出す。 */
|
|
421
|
+
--elev-soft: 0 2px 6px -2px rgba(20, 20, 26, 0.12);
|
|
422
|
+
--elev-popover: 0 12px 24px -14px rgba(20, 20, 26, 0.4);
|
|
423
|
+
--elev-overlay: 0 20px 46px -28px rgba(20, 20, 26, 0.42);
|
|
424
|
+
}
|