@mezzanine-stack/css 0.1.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 ADDED
@@ -0,0 +1,23 @@
1
+ # @mezzanine-stack/css
2
+
3
+ Mezzanine 共通スタイルレイヤを提供する CSS パッケージです。
4
+
5
+ ## 提供ファイル
6
+
7
+ - `@mezzanine-stack/css/index.css`
8
+ - `@mezzanine-stack/css/field-renderer.css`
9
+ - `@mezzanine-stack/css/markdown.css`
10
+
11
+ ## 依存関係
12
+
13
+ - `@mezzanine-stack/tokens` の CSS 変数を前提に設計
14
+
15
+ ## 利用例
16
+
17
+ ```css
18
+ @import "@mezzanine-stack/tokens/tokens.core.css";
19
+ @import "@mezzanine-stack/tokens/tokens.brand.defaults.css";
20
+ @import "@mezzanine-stack/css/index.css";
21
+ @import "@mezzanine-stack/css/markdown.css";
22
+ ```
23
+
@@ -0,0 +1,376 @@
1
+ /**
2
+ * Mezzanine Field Renderer CSS
3
+ * フィールドレンダラーコンポーネント用の独立したスタイル
4
+ */
5
+
6
+ /* 基本的なフィールドコンテナ */
7
+ .mz-field-text,
8
+ .mz-field-date,
9
+ .mz-field-boolean,
10
+ .mz-field-tags,
11
+ .mz-field-gallery,
12
+ .mz-field-sns,
13
+ .mz-field-unknown {
14
+ margin-bottom: 1rem;
15
+ }
16
+
17
+ /* フィールドラベルと値の共通スタイル */
18
+ .mz-field-label {
19
+ font-weight: bold;
20
+ margin-right: 0.5rem;
21
+ }
22
+
23
+ .mz-field-value {
24
+ color: #666;
25
+ }
26
+
27
+ /* テキストフィールド */
28
+ .mz-field-text {
29
+ line-height: 1.6;
30
+ }
31
+
32
+ .mz-field-title,
33
+ .mz-field-display-name {
34
+ margin: 0 0 1rem 0;
35
+ font-size: 2rem;
36
+ font-weight: bold;
37
+ line-height: 1.2;
38
+ }
39
+
40
+ .mz-field-other-text {
41
+ display: flex;
42
+ flex-wrap: wrap;
43
+ align-items: baseline;
44
+ gap: 0.25rem;
45
+ }
46
+
47
+ /* 本文フィールド */
48
+ .mz-field-body {
49
+ margin: 1.5rem 0;
50
+ line-height: 1.8;
51
+ font-size: 1rem;
52
+ color: #333;
53
+ }
54
+
55
+ .mz-field-body h1 {
56
+ font-size: 1.8rem;
57
+ font-weight: bold;
58
+ margin: 2rem 0 1rem 0;
59
+ line-height: 1.3;
60
+ color: #222;
61
+ }
62
+
63
+ .mz-field-body h2 {
64
+ font-size: 1.5rem;
65
+ font-weight: 600;
66
+ margin: 1.75rem 0 0.75rem 0;
67
+ line-height: 1.4;
68
+ color: #333;
69
+ }
70
+
71
+ .mz-field-body h3 {
72
+ font-size: 1.25rem;
73
+ font-weight: 600;
74
+ margin: 1.5rem 0 0.5rem 0;
75
+ line-height: 1.4;
76
+ color: #333;
77
+ }
78
+
79
+ .mz-field-body p {
80
+ margin-bottom: 1rem;
81
+ color: #444;
82
+ }
83
+
84
+ .mz-field-body ul,
85
+ .mz-field-body ol {
86
+ margin: 1rem 0;
87
+ padding-left: 1.5rem;
88
+ }
89
+
90
+ .mz-field-body li {
91
+ margin-bottom: 0.5rem;
92
+ line-height: 1.7;
93
+ }
94
+
95
+ .mz-field-body ul {
96
+ list-style-type: disc;
97
+ }
98
+
99
+ .mz-field-body ol {
100
+ list-style-type: decimal;
101
+ }
102
+
103
+ .mz-field-body blockquote {
104
+ border-left: 4px solid #007acc;
105
+ margin: 1.5rem 0;
106
+ padding: 1rem 1.5rem;
107
+ background: rgba(0, 122, 204, 0.05);
108
+ font-style: italic;
109
+ color: #555;
110
+ }
111
+
112
+ .mz-field-body code {
113
+ font-family: "Consolas", "Monaco", "Courier New", monospace;
114
+ font-size: 0.9em;
115
+ background: #f5f5f5;
116
+ color: #e83e8c;
117
+ border: 1px solid #e1e1e1;
118
+ border-radius: 3px;
119
+ padding: 0.2em 0.4em;
120
+ }
121
+
122
+ .mz-field-body pre {
123
+ background: #f8f8f8;
124
+ color: #333;
125
+ border: 1px solid #e1e1e1;
126
+ border-radius: 6px;
127
+ padding: 1rem;
128
+ margin: 1.5rem 0;
129
+ overflow-x: auto;
130
+ line-height: 1.5;
131
+ }
132
+
133
+ .mz-field-body pre code {
134
+ background: none;
135
+ border: none;
136
+ padding: 0;
137
+ font-size: 0.95em;
138
+ }
139
+
140
+ .mz-field-body a {
141
+ color: #007acc;
142
+ text-decoration: underline;
143
+ text-decoration-color: rgba(0, 122, 204, 0.4);
144
+ text-underline-offset: 0.2em;
145
+ transition: all 0.2s ease;
146
+ }
147
+
148
+ .mz-field-body a:hover {
149
+ text-decoration-color: #007acc;
150
+ color: #005999;
151
+ }
152
+
153
+ .mz-field-body img {
154
+ max-width: 100%;
155
+ height: auto;
156
+ border-radius: 6px;
157
+ margin: 1.5rem 0;
158
+ }
159
+
160
+ .mz-field-body hr {
161
+ border: none;
162
+ border-top: 1px solid #e1e1e1;
163
+ margin: 2rem 0;
164
+ }
165
+
166
+ .mz-field-body table {
167
+ width: 100%;
168
+ border-collapse: collapse;
169
+ margin: 1.5rem 0;
170
+ border: 1px solid #e1e1e1;
171
+ border-radius: 6px;
172
+ overflow: hidden;
173
+ }
174
+
175
+ .mz-field-body th,
176
+ .mz-field-body td {
177
+ padding: 0.75rem 1rem;
178
+ text-align: left;
179
+ border-bottom: 1px solid #e1e1e1;
180
+ }
181
+
182
+ .mz-field-body th {
183
+ background: #f8f9fa;
184
+ font-weight: 600;
185
+ color: #333;
186
+ }
187
+
188
+ .mz-field-body tr:last-child td {
189
+ border-bottom: none;
190
+ }
191
+
192
+ /* 画像フィールド */
193
+ .mz-field-hero-image {
194
+ max-width: 100%;
195
+ height: auto;
196
+ margin: 1rem 0;
197
+ border-radius: 8px;
198
+ }
199
+
200
+ .mz-field-avatar {
201
+ max-width: 200px;
202
+ border-radius: 50%;
203
+ display: block;
204
+ margin: 1rem 0;
205
+ }
206
+
207
+ /* 日付フィールド */
208
+ .mz-field-date {
209
+ color: #888;
210
+ font-style: italic;
211
+ display: block;
212
+ }
213
+
214
+ /* ブール値フィールド */
215
+ .mz-field-boolean {
216
+ padding: 0.5rem;
217
+ background: #f0f9ff;
218
+ border-left: 4px solid #0ea5e9;
219
+ border-radius: 4px;
220
+ }
221
+
222
+ /* タグフィールド */
223
+ .mz-field-tags {
224
+ margin: 10px 0;
225
+ }
226
+
227
+ .mz-tag {
228
+ display: inline-block;
229
+ background: #e0e0e0;
230
+ padding: 0.2rem 0.5rem;
231
+ margin: 0.2rem;
232
+ border-radius: 3px;
233
+ font-size: 0.8rem;
234
+ color: #333;
235
+ font-weight: 500;
236
+ }
237
+
238
+ .mz-tag:hover {
239
+ background: #d0d0d0;
240
+ }
241
+
242
+ /* ギャラリーフィールド */
243
+ .mz-field-gallery {
244
+ margin: 1.5rem 0;
245
+ }
246
+
247
+ .mz-field-gallery-title {
248
+ margin: 0 0 1rem 0;
249
+ font-size: 1.25rem;
250
+ font-weight: 600;
251
+ color: #333;
252
+ }
253
+
254
+ .mz-field-gallery-grid {
255
+ display: grid;
256
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
257
+ gap: 1rem;
258
+ margin-top: 1rem;
259
+ }
260
+
261
+ .mz-field-gallery-card {
262
+ border-radius: 8px;
263
+ max-width: 100%;
264
+ height: auto;
265
+ transition: transform 0.2s ease;
266
+ }
267
+
268
+ .mz-field-gallery-card:hover {
269
+ transform: scale(1.02);
270
+ }
271
+
272
+ /* SNSフィールド */
273
+ .mz-field-sns {
274
+ margin: 1.5rem 0;
275
+ }
276
+
277
+ .mz-field-sns-title {
278
+ margin: 0 0 1rem 0;
279
+ font-size: 1.25rem;
280
+ font-weight: 600;
281
+ color: #333;
282
+ }
283
+
284
+ .mz-field-sns-list {
285
+ list-style: none;
286
+ padding: 0;
287
+ margin: 0;
288
+ }
289
+
290
+ .mz-field-sns-item {
291
+ margin: 0.5rem 0;
292
+ }
293
+
294
+ .mz-field-sns-link {
295
+ color: #0066cc;
296
+ text-decoration: none;
297
+ font-weight: 500;
298
+ transition: color 0.2s ease;
299
+ }
300
+
301
+ .mz-field-sns-link:hover {
302
+ text-decoration: underline;
303
+ color: #0052a3;
304
+ }
305
+
306
+ /* 未対応フィールドタイプ */
307
+ .mz-field-unknown {
308
+ background: #f5f5f5;
309
+ padding: 0.5rem;
310
+ border-radius: 4px;
311
+ font-family: monospace;
312
+ border: 1px solid #ddd;
313
+ }
314
+
315
+ .mz-field-unknown .mz-field-label {
316
+ color: #666;
317
+ }
318
+
319
+ .mz-field-unknown .mz-field-value {
320
+ color: #333;
321
+ font-size: 0.9rem;
322
+ }
323
+
324
+ /* レスポンシブ対応 */
325
+ @media (max-width: 768px) {
326
+ .mz-field-title,
327
+ .mz-field-display-name {
328
+ font-size: 1.5rem;
329
+ }
330
+
331
+ .mz-field-body {
332
+ font-size: 0.95rem;
333
+ line-height: 1.7;
334
+ }
335
+
336
+ .mz-field-body h1 {
337
+ font-size: 1.5rem;
338
+ }
339
+
340
+ .mz-field-body h2 {
341
+ font-size: 1.3rem;
342
+ }
343
+
344
+ .mz-field-body h3 {
345
+ font-size: 1.1rem;
346
+ }
347
+
348
+ .mz-field-gallery-grid {
349
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
350
+ gap: 0.75rem;
351
+ }
352
+
353
+ .mz-field-hero-image {
354
+ margin: 0.5rem 0;
355
+ }
356
+
357
+ .mz-field-avatar {
358
+ max-width: 150px;
359
+ }
360
+ }
361
+
362
+ @media (max-width: 480px) {
363
+ .mz-field-other-text {
364
+ flex-direction: column;
365
+ align-items: flex-start;
366
+ }
367
+
368
+ .mz-field-gallery-grid {
369
+ grid-template-columns: 1fr;
370
+ }
371
+
372
+ .mz-tag {
373
+ font-size: 0.75rem;
374
+ padding: 0.15rem 0.4rem;
375
+ }
376
+ }
package/index.css ADDED
@@ -0,0 +1,867 @@
1
+ @layer reset, base, utilities, responsive,components;
2
+ @import url("./field-renderer.css");
3
+ @layer reset {
4
+ *,
5
+ *::before,
6
+ *::after {
7
+ box-sizing: border-box;
8
+ }
9
+ body {
10
+ margin: 0;
11
+ }
12
+ ul,
13
+ ol {
14
+ list-style: none;
15
+ padding-left: 0;
16
+ margin: 0;
17
+ }
18
+ img,
19
+ picture,
20
+ video,
21
+ canvas,
22
+ svg {
23
+ display: block;
24
+ max-width: 100%;
25
+ }
26
+ input,
27
+ button,
28
+ textarea,
29
+ select {
30
+ font: inherit;
31
+ }
32
+ }
33
+ @layer base {
34
+ body {
35
+ font-family: var(--font-sans);
36
+ color: var(--color-fg);
37
+ background: var(--color-bg);
38
+ }
39
+ :focus-visible {
40
+ outline: 3px solid var(--color-primary);
41
+ outline-offset: 2px;
42
+ }
43
+ :where(code):not(pre code) {
44
+ font-family: var(--code-font);
45
+ font-size: 0.95em;
46
+ background: var(--code-inline-bg);
47
+ color: var(--code-inline-fg);
48
+ border: 1px solid var(--code-inline-border);
49
+ border-radius: calc(var(--code-radius) - 2px);
50
+ padding: 0.1em 0.35em;
51
+ }
52
+ }
53
+ @layer utilities {
54
+ .container {
55
+ width: min(1100px, 92vw);
56
+ margin-inline: auto;
57
+ }
58
+ .stack > * + * {
59
+ margin-top: var(--space-4);
60
+ }
61
+ .grid {
62
+ display: grid;
63
+ gap: var(--space-6);
64
+ }
65
+
66
+ /* カラム数ユーティリティ */
67
+ .grid-2 {
68
+ grid-template-columns: repeat(2, 1fr);
69
+ }
70
+ .grid-3 {
71
+ grid-template-columns: repeat(3, 1fr);
72
+ }
73
+ .grid-4 {
74
+ grid-template-columns: repeat(4, 1fr);
75
+ }
76
+
77
+ /* 自動フィット(カードギャラリー向け) */
78
+ .grid-auto {
79
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
80
+ }
81
+ @media (max-width: 800px) {
82
+ .grid-3 {
83
+ grid-template-columns: 1fr;
84
+ }
85
+ }
86
+ .cluster {
87
+ display: flex;
88
+ align-items: center;
89
+ gap: var(--space-3);
90
+ flex-wrap: wrap;
91
+ }
92
+ .table-scroll {
93
+ overflow-x: auto;
94
+ -webkit-overflow-scrolling: touch;
95
+ }
96
+ }
97
+ @layer responsive {
98
+ /* --- (オプション) スコープ運用したい場合は .mz-theme を body/html に付けて下の :root を .mz-theme に置換 --- */
99
+ :root,
100
+ .mz-theme {
101
+ --page-max: 1100px;
102
+ --content-gutter: clamp(16px, 4vw, 40px);
103
+ --bleed-max: 1920px;
104
+ }
105
+
106
+ /* 読み幅コンテナ(既存 .container は変更しない) */
107
+ .mz-container {
108
+ max-inline-size: var(--page-max);
109
+ margin-inline: auto;
110
+ padding-inline: var(--content-gutter);
111
+ }
112
+
113
+ /* 端まで。100vw/dvw フォールバック順で記述(このクラスを付けた要素のみに適用) */
114
+ .mz-bleed {
115
+ margin-inline: calc(50% - 50vw);
116
+ inline-size: 100vw;
117
+ margin-inline: calc(50% - 50dvw);
118
+ inline-size: 100dvw;
119
+ }
120
+ .mz-bleed--capped {
121
+ max-inline-size: var(--bleed-max);
122
+ margin-inline: auto;
123
+ }
124
+
125
+ /* コンテナクエリ起点(これを付けた親の中だけで cq: 系が効く) */
126
+ .mz-cq {
127
+ container-type: inline-size;
128
+ container-name: layout;
129
+ }
130
+
131
+ /* Grid プリミティブ(変数ベース) */
132
+ .mz-grid {
133
+ display: grid;
134
+ gap: var(--mz-gap, 1rem);
135
+ grid-template-columns: repeat(var(--mz-cols, 1), minmax(0, 1fr));
136
+ }
137
+ .mz-cols-1 {
138
+ --mz-cols: 1;
139
+ }
140
+ .mz-cols-2 {
141
+ --mz-cols: 2;
142
+ }
143
+ .mz-cols-3 {
144
+ --mz-cols: 3;
145
+ }
146
+ .mz-cols-4 {
147
+ --mz-cols: 4;
148
+ }
149
+
150
+ .mz-gap-2 {
151
+ --mz-gap: var(--space-2);
152
+ }
153
+ .mz-gap-3 {
154
+ --mz-gap: var(--space-3);
155
+ }
156
+ .mz-gap-4 {
157
+ --mz-gap: var(--space-4);
158
+ }
159
+ .mz-gap-6 {
160
+ --mz-gap: var(--space-6);
161
+ }
162
+
163
+ /* Viewport 変種(既存を上書きしない:mz-* のみ) */
164
+ @media (min-width: 768px) {
165
+ .md\:mz-cols-1 {
166
+ --mz-cols: 1;
167
+ }
168
+ .md\:mz-cols-2 {
169
+ --mz-cols: 2;
170
+ }
171
+ .md\:mz-cols-3 {
172
+ --mz-cols: 3;
173
+ }
174
+ .md\:mz-cols-4 {
175
+ --mz-cols: 4;
176
+ }
177
+
178
+ .md\:mz-gap-2 {
179
+ --mz-gap: var(--space-2);
180
+ }
181
+ .md\:mz-gap-3 {
182
+ --mz-gap: var(--space-3);
183
+ }
184
+ .md\:mz-gap-4 {
185
+ --mz-gap: var(--space-4);
186
+ }
187
+ .md\:mz-gap-6 {
188
+ --mz-gap: var(--space-6);
189
+ }
190
+ }
191
+ @media (min-width: 1024px) {
192
+ .lg\:mz-cols-1 {
193
+ --mz-cols: 1;
194
+ }
195
+ .lg\:mz-cols-2 {
196
+ --mz-cols: 2;
197
+ }
198
+ .lg\:mz-cols-3 {
199
+ --mz-cols: 3;
200
+ }
201
+ .lg\:mz-cols-4 {
202
+ --mz-cols: 4;
203
+ }
204
+
205
+ .lg\:mz-gap-2 {
206
+ --mz-gap: var(--space-2);
207
+ }
208
+ .lg\:mz-gap-3 {
209
+ --mz-gap: var(--space-3);
210
+ }
211
+ .lg\:mz-gap-4 {
212
+ --mz-gap: var(--space-4);
213
+ }
214
+ .lg\:mz-gap-6 {
215
+ --mz-gap: var(--space-6);
216
+ }
217
+ }
218
+
219
+ /* Container 変種(親に .mz-cq がある場合のみ効く) */
220
+ @container layout (min-width: 640px) {
221
+ .cq\:mz-cols-1 {
222
+ --mz-cols: 1;
223
+ }
224
+ .cq\:mz-cols-2 {
225
+ --mz-cols: 2;
226
+ }
227
+ .cq\:mz-cols-3 {
228
+ --mz-cols: 3;
229
+ }
230
+ .cq\:mz-cols-4 {
231
+ --mz-cols: 4;
232
+ }
233
+
234
+ .cq\:mz-gap-2 {
235
+ --mz-gap: var(--space-2);
236
+ }
237
+ .cq\:mz-gap-3 {
238
+ --mz-gap: var(--space-3);
239
+ }
240
+ .cq\:mz-gap-4 {
241
+ --mz-gap: var(--space-4);
242
+ }
243
+ .cq\:mz-gap-6 {
244
+ --mz-gap: var(--space-6);
245
+ }
246
+ }
247
+ @container layout (min-width: 960px) {
248
+ .cq-lg\:mz-cols-3 {
249
+ --mz-cols: 3;
250
+ }
251
+ .cq-lg\:mz-cols-4 {
252
+ --mz-cols: 4;
253
+ }
254
+ .cq-lg\:mz-gap-6 {
255
+ --mz-gap: var(--space-6);
256
+ }
257
+ }
258
+
259
+ /* Flow(縦積み↔横並び) */
260
+ .mz-flow {
261
+ display: flex;
262
+ gap: var(--mz-gap, 1rem);
263
+ }
264
+ .mz-stack {
265
+ flex-direction: column;
266
+ }
267
+ .mz-inline {
268
+ flex-direction: row;
269
+ }
270
+
271
+ /* セクション間隔ユーティリティ */
272
+ .mz-section-gap {
273
+ display: flex;
274
+ flex-direction: column;
275
+ gap: var(--section-gap);
276
+ }
277
+ .mz-section-gap-sm {
278
+ display: flex;
279
+ flex-direction: column;
280
+ gap: var(--section-gap-sm);
281
+ }
282
+ .mz-section-gap-lg {
283
+ display: flex;
284
+ flex-direction: column;
285
+ gap: var(--section-gap-lg);
286
+ }
287
+
288
+ @media (min-width: 768px) {
289
+ .md\:mz-stack {
290
+ flex-direction: column;
291
+ }
292
+ .md\:mz-inline {
293
+ flex-direction: row;
294
+ }
295
+ }
296
+ @container layout (min-width: 640px) {
297
+ .cq\:mz-stack {
298
+ flex-direction: column;
299
+ }
300
+ .cq\:mz-inline {
301
+ flex-direction: row;
302
+ }
303
+ }
304
+ }
305
+ @layer components {
306
+ .mz-header {
307
+ border-bottom: 1px solid var(--color-border);
308
+ background: var(--color-bg);
309
+ padding-block: var(--space-3);
310
+ }
311
+
312
+ .mz-brand {
313
+ font-size: var(--text-lg);
314
+ font-weight: 700;
315
+ color: var(--color-fg);
316
+ text-decoration: none;
317
+ }
318
+ .mz-brand:hover {
319
+ color: var(--color-primary);
320
+ }
321
+
322
+ .mz-nav ul {
323
+ margin: 0;
324
+ padding: 0;
325
+ list-style: none;
326
+ }
327
+ .mz-nav a {
328
+ text-decoration: none;
329
+ color: var(--color-fg);
330
+ padding: 0.25rem 0.5rem;
331
+ border-radius: var(--radius-sm);
332
+ }
333
+ .mz-nav a:hover {
334
+ background: color-mix(in oklab, var(--color-primary) 15%, transparent);
335
+ color: var(--color-primary);
336
+ }
337
+
338
+ /* モバイルメニュー */
339
+ .mz-nav-mobile {
340
+ display: none;
341
+ }
342
+ .mz-nav-mobile summary {
343
+ cursor: pointer;
344
+ font-size: 1.5rem;
345
+ border-radius: var(--radius-sm);
346
+ padding: 0.25rem 0.5rem;
347
+ list-style: none;
348
+ }
349
+ .mz-nav-mobile summary::-webkit-details-marker {
350
+ display: none;
351
+ }
352
+ .mz-nav-mobile ul {
353
+ margin-top: var(--space-3);
354
+ list-style: none;
355
+ padding-left: 0;
356
+ }
357
+
358
+ @media (max-width: 768px) {
359
+ .mz-nav {
360
+ display: none;
361
+ }
362
+ .mz-nav-mobile {
363
+ display: block;
364
+ }
365
+ }
366
+ .mz-button {
367
+ display: inline-flex;
368
+ padding: 0.6em 0.9em;
369
+ border-radius: 8px;
370
+ font-weight: 600;
371
+ }
372
+ .mz-button.primary {
373
+ background: var(--color-primary);
374
+ color: #fff;
375
+ }
376
+ .mz-card {
377
+ border: 1px solid #e5e7eb;
378
+ border-radius: 12px;
379
+ padding: var(--space-6);
380
+ background: #fff;
381
+ }
382
+
383
+ .mz-card.stack > * + * {
384
+ margin-top: var(--space-4);
385
+ }
386
+ .mz-breadcrumb ol {
387
+ margin: 0;
388
+ padding: 0;
389
+ list-style: none;
390
+ display: flex;
391
+ flex-wrap: wrap;
392
+ gap: 0.5rem;
393
+ align-items: center;
394
+ }
395
+ .mz-breadcrumb li {
396
+ display: inline-flex;
397
+ align-items: center;
398
+ gap: 0.5rem;
399
+ }
400
+ .mz-breadcrumb li + li::before {
401
+ content: "/";
402
+ opacity: 0.6;
403
+ }
404
+ .mz-breadcrumb a {
405
+ color: var(--color-fg);
406
+ text-decoration: none;
407
+ padding: 0.1rem 0.25rem;
408
+ border-radius: var(--radius-sm);
409
+ }
410
+ .mz-breadcrumb a:hover {
411
+ background: color-mix(in oklab, var(--color-primary) 12%, transparent);
412
+ color: var(--color-primary);
413
+ }
414
+ .mz-breadcrumb [aria-current="page"] {
415
+ font-weight: 600;
416
+ }
417
+ .mz-pagination {
418
+ padding-block: var(--space-4);
419
+ }
420
+ .mz-pagination .mz-button {
421
+ min-width: 6rem;
422
+ text-align: center;
423
+ }
424
+ .mz-tag {
425
+ display: inline-block;
426
+ padding: 0.25em 0.75em;
427
+ border-radius: 999px;
428
+ font-size: var(--text-sm);
429
+ font-weight: 500;
430
+ background: #f3f4f6;
431
+ color: #374151;
432
+ text-decoration: none;
433
+ }
434
+ .mz-tag:hover {
435
+ background: #e5e7eb;
436
+ }
437
+ /* Field */
438
+ .mz-field .req {
439
+ color: var(--color-primary);
440
+ margin-left: 0.25em;
441
+ }
442
+ .mz-label {
443
+ font-weight: 600;
444
+ display: inline-block;
445
+ margin-bottom: 0.35rem;
446
+ }
447
+ .mz-help {
448
+ font-size: var(--text-sm);
449
+ opacity: 0.8;
450
+ margin: 0.35rem 0 0;
451
+ }
452
+ .mz-error {
453
+ font-size: var(--text-sm);
454
+ color: #ef4444;
455
+ margin: 0.35rem 0 0;
456
+ }
457
+
458
+ /* Controls */
459
+ .mz-input,
460
+ .mz-textarea,
461
+ .mz-select {
462
+ width: 100%;
463
+ padding: 0.6rem 0.75rem;
464
+ border: 1px solid var(--color-border);
465
+ border-radius: var(--radius-sm);
466
+ background: #fff;
467
+ color: var(--color-fg);
468
+ outline: none;
469
+ box-shadow: var(--shadow-1);
470
+ }
471
+ .mz-textarea {
472
+ resize: vertical;
473
+ }
474
+ .mz-input:focus,
475
+ .mz-textarea:focus,
476
+ .mz-select:focus {
477
+ outline: 3px solid
478
+ color-mix(in oklab, var(--color-primary) 40%, transparent);
479
+ outline-offset: 2px;
480
+ border-color: var(--color-primary);
481
+ }
482
+ [aria-invalid="true"].mz-input,
483
+ [aria-invalid="true"].mz-textarea,
484
+ [aria-invalid="true"].mz-select {
485
+ border-color: #ef4444;
486
+ box-shadow: 0 0 0 2px color-mix(in oklab, #ef4444 30%, transparent);
487
+ }
488
+
489
+ /* Checkbox / Radio */
490
+ .mz-check,
491
+ .mz-radio {
492
+ display: inline-flex;
493
+ gap: 0.5rem;
494
+ align-items: center;
495
+ }
496
+ .mz-check input,
497
+ .mz-radio input {
498
+ width: 1.1rem;
499
+ height: 1.1rem;
500
+ }
501
+
502
+ .catalog h2 + p {
503
+ margin-top: var(--space-2);
504
+ opacity: 0.8;
505
+ }
506
+ .stack > h2 + p {
507
+ margin-top: var(--space-2);
508
+ }
509
+ pre {
510
+ margin: 0;
511
+ }
512
+ pre:has(> code),
513
+ .codeblock {
514
+ /* .codeblock 単独でも使えるように */
515
+ background: var(--code-bg);
516
+ color: var(--code-fg);
517
+ border: 1px solid var(--code-border);
518
+ border-radius: var(--code-radius);
519
+ padding: 1rem 1.25rem;
520
+ overflow: auto;
521
+ box-shadow: var(--shadow-1);
522
+ }
523
+ pre > code,
524
+ .codeblock > code {
525
+ font-family: var(--code-font);
526
+ font-size: 0.92rem;
527
+ line-height: 1.6;
528
+ tab-size: 2;
529
+ white-space: pre; /* 長い行はスクロール */
530
+ }
531
+
532
+ /* オプション:行番号(.with-lines を pre に付与) */
533
+ .with-lines {
534
+ counter-reset: ln;
535
+ display: grid;
536
+ grid-template-columns: auto 1fr;
537
+ gap: 1rem;
538
+ }
539
+ .with-lines code {
540
+ display: block;
541
+ }
542
+ .with-lines code > span {
543
+ display: block;
544
+ counter-increment: ln;
545
+ }
546
+ .with-lines code > span::before {
547
+ content: counter(ln);
548
+ display: inline-block;
549
+ min-width: 2ch;
550
+ margin-right: 0.75rem;
551
+ opacity: 0.5;
552
+ text-align: right;
553
+ }
554
+
555
+ /* 簡易シンタックス色付け(手動クラス用) */
556
+ .tok-keyword {
557
+ color: var(--syn-keyword);
558
+ }
559
+ .tok-string {
560
+ color: var(--syn-string);
561
+ }
562
+ .tok-number {
563
+ color: var(--syn-number);
564
+ }
565
+ .tok-func {
566
+ color: var(--syn-func);
567
+ }
568
+ .tok-comment {
569
+ color: var(--syn-comment);
570
+ font-style: italic;
571
+ }
572
+
573
+ /* Tabs: 見た目 */
574
+ .mz-tablist ul {
575
+ margin: 0;
576
+ padding: 0;
577
+ list-style: none;
578
+ }
579
+ .mz-tablist a {
580
+ text-decoration: none;
581
+ color: var(--color-fg);
582
+ padding: 0.45rem 0.75rem;
583
+ border-radius: var(--radius-sm);
584
+ border: 1px solid transparent;
585
+ display: inline-block;
586
+ }
587
+ .mz-tablist a:hover {
588
+ background: color-mix(in oklab, var(--color-primary) 12%, transparent);
589
+ color: var(--color-primary);
590
+ }
591
+
592
+ /* Panels: デフォは非表示、:target だけ表示。
593
+ ハッシュが無いときは 1枚目を表示する */
594
+ .mz-tabpanel {
595
+ display: none;
596
+ padding: var(--space-4);
597
+ border: 1px solid var(--color-border);
598
+ border-radius: var(--radius-md);
599
+ background: #fff;
600
+ }
601
+ .mz-tabs:has(.mz-tabpanel:target) .mz-tabpanel {
602
+ display: none;
603
+ }
604
+ .mz-tabpanel:target {
605
+ display: block;
606
+ }
607
+ .mz-tabs:not(:has(.mz-tabpanel:target)) .mz-tabpanel[data-default="true"] {
608
+ display: block;
609
+ }
610
+
611
+ .mz-tablist ul {
612
+ margin: 0;
613
+ padding: 0;
614
+ list-style: none;
615
+ }
616
+ .mz-tablist a {
617
+ text-decoration: none;
618
+ color: var(--color-fg);
619
+ padding: 0.45rem 0.75rem;
620
+ border-radius: var(--radius-sm);
621
+ border: 1px solid transparent;
622
+ display: inline-block;
623
+ }
624
+ .mz-tablist a:hover {
625
+ background: color-mix(in oklab, var(--color-primary) 12%, transparent);
626
+ color: var(--color-primary);
627
+ }
628
+ .mz-tablist a[aria-selected="true"] {
629
+ background: color-mix(in oklab, var(--color-primary) 16%, transparent);
630
+ border-color: color-mix(in oklab, var(--color-primary) 30%, transparent);
631
+ color: var(--color-primary);
632
+ }
633
+
634
+ .mz-tabpanel {
635
+ padding: var(--space-4);
636
+ border: 1px solid var(--color-border);
637
+ border-radius: var(--radius-md);
638
+ background: #fff;
639
+ }
640
+ .mz-tabpanel[hidden] {
641
+ display: none;
642
+ }
643
+ /* Table */
644
+ .mz-table {
645
+ width: 100%;
646
+ border-collapse: separate;
647
+ border-spacing: 0;
648
+ background: #fff;
649
+ border: 1px solid var(--color-border);
650
+ border-radius: var(--radius-md);
651
+ overflow: hidden;
652
+ }
653
+ .mz-table caption {
654
+ text-align: left;
655
+ padding: 0.75rem 1rem;
656
+ font-weight: 600;
657
+ }
658
+ .mz-table th,
659
+ .mz-table td {
660
+ padding: 0.75rem 1rem;
661
+ border-top: 1px solid var(--color-border);
662
+ }
663
+ .mz-table thead th {
664
+ border-top: 0;
665
+ background: color-mix(in oklab, var(--color-primary) 6%, #fff);
666
+ text-align: left;
667
+ }
668
+ .mz-table.zebra tbody tr:nth-child(even) {
669
+ background: rgba(0, 0, 0, 0.025);
670
+ }
671
+ .mz-table.dense th,
672
+ .mz-table.dense td {
673
+ padding: 0.5rem 0.75rem;
674
+ }
675
+
676
+ /* Footer */
677
+ .mz-footer {
678
+ border-top: 1px solid var(--color-border);
679
+ padding-block: var(--space-4);
680
+ background: var(--color-bg);
681
+ }
682
+ .mz-footer a {
683
+ color: var(--color-fg);
684
+ text-decoration: none;
685
+ }
686
+ .mz-footer a:hover {
687
+ color: var(--color-primary);
688
+ }
689
+
690
+ /* Tooltip */
691
+ .mz-tooltip {
692
+ position: relative;
693
+ display: inline-flex;
694
+ align-items: center;
695
+ }
696
+ .mz-tooltip::after {
697
+ content: attr(aria-label);
698
+ position: absolute;
699
+ white-space: nowrap;
700
+ background: #111;
701
+ color: #fff;
702
+ font-size: var(--text-sm);
703
+ padding: 0.25rem 0.5rem;
704
+ border-radius: var(--radius-sm);
705
+ opacity: 0;
706
+ transform: translateY(-4px);
707
+ pointer-events: none;
708
+ transition:
709
+ opacity 0.15s ease,
710
+ transform 0.15s ease;
711
+ }
712
+ .mz-tooltip:hover::after,
713
+ .mz-tooltip:focus-within::after {
714
+ opacity: 1;
715
+ transform: translateY(0);
716
+ }
717
+ .mz-tooltip.top::after {
718
+ bottom: calc(100% + 6px);
719
+ left: 50%;
720
+ transform: translate(-50%, -4px);
721
+ }
722
+ .mz-tooltip.right::after {
723
+ left: calc(100% + 6px);
724
+ top: 50%;
725
+ transform: translate(0, -50%);
726
+ }
727
+ .mz-tooltip.bottom::after {
728
+ top: calc(100% + 6px);
729
+ left: 50%;
730
+ transform: translate(-50%, 4px);
731
+ }
732
+ .mz-tooltip.left::after {
733
+ right: calc(100% + 6px);
734
+ top: 50%;
735
+ transform: translate(0, -50%);
736
+ }
737
+ .mz-accordion {
738
+ border: 1px solid var(--color-border);
739
+ border-radius: var(--radius-md);
740
+ padding: 0.25rem 0.75rem;
741
+ background: #fff;
742
+ }
743
+ .mz-accordion > summary {
744
+ cursor: pointer;
745
+ padding: 0.5rem 0;
746
+ }
747
+ .mz-accordion[open] {
748
+ box-shadow: var(--shadow-1);
749
+ }
750
+ .mz-modal {
751
+ border: 1px solid var(--color-border);
752
+ border-radius: var(--radius-lg);
753
+ padding: var(--space-6);
754
+ }
755
+ .mz-modal::backdrop {
756
+ background: rgba(0, 0, 0, 0.4);
757
+ }
758
+
759
+ /* Toaster positioning */
760
+ .mz-toaster {
761
+ position: fixed;
762
+ z-index: 9999;
763
+ display: grid;
764
+ gap: var(--space-3);
765
+ max-width: min(420px, 92vw);
766
+ }
767
+ .mz-toaster.bottom-right {
768
+ right: var(--space-4);
769
+ bottom: var(--space-4);
770
+ }
771
+ .mz-toaster.bottom-left {
772
+ left: var(--space-4);
773
+ bottom: var(--space-4);
774
+ }
775
+ .mz-toaster.top-right {
776
+ right: var(--space-4);
777
+ top: var(--space-4);
778
+ }
779
+ .mz-toaster.top-left {
780
+ left: var(--space-4);
781
+ top: var(--space-4);
782
+ }
783
+
784
+ /* Toast card */
785
+ .mz-toast {
786
+ display: grid;
787
+ grid-template-columns: 1fr auto;
788
+ align-items: start;
789
+ gap: var(--space-3);
790
+ background: #fff;
791
+ color: var(--color-fg);
792
+ border: 1px solid var(--color-border);
793
+ border-radius: var(--radius-md);
794
+ box-shadow: var(--shadow-2);
795
+ padding: var(--space-4);
796
+ animation: mz-toast-in 0.18s ease-out both;
797
+ }
798
+ .mz-toast.leaving {
799
+ animation: mz-toast-out 0.16s ease-in both;
800
+ }
801
+ .mz-toast-title {
802
+ display: block;
803
+ margin-bottom: 0.25rem;
804
+ }
805
+ .mz-toast-body {
806
+ min-width: 0;
807
+ }
808
+ .mz-toast-message {
809
+ word-wrap: break-word;
810
+ overflow-wrap: anywhere;
811
+ }
812
+ .mz-toast-close {
813
+ appearance: none;
814
+ border: 0;
815
+ background: transparent;
816
+ color: inherit;
817
+ font-size: 1.1rem;
818
+ line-height: 1;
819
+ cursor: pointer;
820
+ padding: 0.25rem;
821
+ border-radius: var(--radius-sm);
822
+ }
823
+ .mz-toast-close:hover {
824
+ background: color-mix(in oklab, var(--color-primary) 12%, transparent);
825
+ }
826
+
827
+ /* Variants */
828
+ .mz-toast.info {
829
+ border-color: color-mix(in oklab, var(--color-primary) 40%, transparent);
830
+ }
831
+ .mz-toast.success {
832
+ border-color: #16a34a33;
833
+ }
834
+ .mz-toast.warning {
835
+ border-color: #f59e0b55;
836
+ }
837
+ .mz-toast.danger {
838
+ border-color: #ef444466;
839
+ }
840
+
841
+ /* Animations */
842
+ @keyframes mz-toast-in {
843
+ from {
844
+ opacity: 0;
845
+ transform: translateY(8px);
846
+ }
847
+ to {
848
+ opacity: 1;
849
+ transform: translateY(0);
850
+ }
851
+ }
852
+ @keyframes mz-toast-out {
853
+ from {
854
+ opacity: 1;
855
+ transform: translateY(0);
856
+ }
857
+ to {
858
+ opacity: 0;
859
+ transform: translateY(6px);
860
+ }
861
+ }
862
+
863
+ /* ダーク(背景のみ少し暗めに) */
864
+ :root[data-theme="dark"] .mz-toast {
865
+ background: #0f141a;
866
+ }
867
+ }
package/markdown.css ADDED
@@ -0,0 +1,169 @@
1
+ /* Markdownコンテンツ専用スタイル */
2
+
3
+ .markdown-content {
4
+ /* リセットを避けるためのベーススタイル */
5
+ line-height: var(--leading);
6
+ color: var(--color-fg);
7
+ }
8
+
9
+ .markdown-content h1,
10
+ .markdown-content h2,
11
+ .markdown-content h3,
12
+ .markdown-content h4,
13
+ .markdown-content h5,
14
+ .markdown-content h6 {
15
+ margin-top: 2rem;
16
+ margin-bottom: 1rem;
17
+ line-height: 1.3;
18
+ font-weight: 600;
19
+ }
20
+
21
+ .markdown-content h1:first-child,
22
+ .markdown-content h2:first-child,
23
+ .markdown-content h3:first-child {
24
+ margin-top: 0;
25
+ }
26
+
27
+ .markdown-content h1 {
28
+ font-size: var(--text-xl);
29
+ font-weight: 700;
30
+ border-bottom: 1px solid var(--color-border);
31
+ padding-bottom: 0.5rem;
32
+ }
33
+
34
+ .markdown-content h2 {
35
+ font-size: var(--text-lg);
36
+ }
37
+
38
+ .markdown-content h3 {
39
+ font-size: var(--text-md);
40
+ }
41
+
42
+ .markdown-content p {
43
+ margin-bottom: 1rem;
44
+ }
45
+
46
+ .markdown-content ul,
47
+ .markdown-content ol {
48
+ margin: 1rem 0;
49
+ padding-left: 1.5rem;
50
+ }
51
+
52
+ .markdown-content ul {
53
+ list-style-type: disc;
54
+ }
55
+
56
+ .markdown-content ol {
57
+ list-style-type: decimal;
58
+ }
59
+
60
+ .markdown-content li {
61
+ margin-bottom: 0.5rem;
62
+ }
63
+
64
+ .markdown-content blockquote {
65
+ border-left: 4px solid var(--color-primary);
66
+ margin: 1.5rem 0;
67
+ padding: 1rem 1.5rem;
68
+ background: color-mix(in oklab, var(--color-primary) 5%, transparent);
69
+ font-style: italic;
70
+ }
71
+
72
+ .markdown-content code {
73
+ font-family: var(--code-font);
74
+ font-size: 0.9em;
75
+ background: var(--code-inline-bg);
76
+ color: var(--code-inline-fg);
77
+ border: 1px solid var(--code-inline-border);
78
+ border-radius: var(--radius-sm);
79
+ padding: 0.2em 0.4em;
80
+ }
81
+
82
+ .markdown-content pre {
83
+ background: var(--code-bg);
84
+ color: var(--code-fg);
85
+ border: 1px solid var(--code-border);
86
+ border-radius: var(--radius-md);
87
+ padding: 1rem;
88
+ margin: 1.5rem 0;
89
+ overflow-x: auto;
90
+ line-height: 1.5;
91
+ }
92
+
93
+ .markdown-content pre code {
94
+ background: none;
95
+ border: none;
96
+ padding: 0;
97
+ font-size: 0.95em;
98
+ }
99
+
100
+ .markdown-content a {
101
+ color: var(--color-primary);
102
+ text-decoration: underline;
103
+ text-decoration-color: color-mix(
104
+ in oklab,
105
+ var(--color-primary) 40%,
106
+ transparent
107
+ );
108
+ text-underline-offset: 0.2em;
109
+ transition: all 0.2s ease;
110
+ }
111
+
112
+ .markdown-content a:hover {
113
+ text-decoration-color: var(--color-primary);
114
+ }
115
+
116
+ .markdown-content img {
117
+ max-width: 100%;
118
+ height: auto;
119
+ border-radius: var(--radius-md);
120
+ margin: 1.5rem 0;
121
+ }
122
+
123
+ .markdown-content hr {
124
+ border: none;
125
+ border-top: 1px solid var(--color-border);
126
+ margin: 2rem 0;
127
+ }
128
+
129
+ .markdown-content table {
130
+ width: 100%;
131
+ border-collapse: collapse;
132
+ margin: 1.5rem 0;
133
+ border: 1px solid var(--color-border);
134
+ border-radius: var(--radius-md);
135
+ overflow: hidden;
136
+ }
137
+
138
+ .markdown-content th,
139
+ .markdown-content td {
140
+ padding: 0.75rem 1rem;
141
+ text-align: left;
142
+ border-bottom: 1px solid var(--color-border);
143
+ }
144
+
145
+ .markdown-content th {
146
+ background: color-mix(in oklab, var(--color-fg) 5%, transparent);
147
+ font-weight: 600;
148
+ }
149
+
150
+ .markdown-content tr:last-child td {
151
+ border-bottom: none;
152
+ }
153
+
154
+ /* コレクション別スタイル拡張 */
155
+ .markdown-content.works-style h1 {
156
+ color: var(--color-primary);
157
+ border-bottom-color: var(--color-primary);
158
+ border-bottom-width: 2px;
159
+ }
160
+
161
+ .markdown-content.blog-style {
162
+ font-size: var(--text-md);
163
+ line-height: 1.7;
164
+ }
165
+
166
+ .markdown-content.blog-style h1 {
167
+ text-align: center;
168
+ margin-bottom: 2rem;
169
+ }
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@mezzanine-stack/css",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "license": "MIT",
9
+ "files": [
10
+ "index.css",
11
+ "field-renderer.css",
12
+ "markdown.css"
13
+ ],
14
+ "exports": {
15
+ "./index.css": "./index.css",
16
+ "./field-renderer.css": "./field-renderer.css",
17
+ "./markdown.css": "./markdown.css"
18
+ },
19
+ "sideEffects": [
20
+ "*.css"
21
+ ],
22
+ "devDependencies": {
23
+ "@mezzanine-stack/tokens": "0.1.0"
24
+ }
25
+ }