@aiquants/spreadsheet 0.15.0 → 0.16.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.
@@ -16,25 +16,82 @@
16
16
  box-sizing: border-box;
17
17
  }
18
18
 
19
+ /*
20
+ * 色と文字の設計の値 (ホストの上書きの口)。公開の変数 `--aqsp-*` はパッケージが宣言せずに読むだけの入力で、
21
+ * 各値はここの別名 `--_aqsp-*` の中で 1 度だけ読み、明るい既定を 1 度だけ書く — ホストはルートでも祖先 (:root やダークの
22
+ * クラス) でも公開の変数を置けば、グリッドが塗る全ての色が従う。文字と背景の対はどれも 7:1 以上 (WCAG 1.4.6)、値は
23
+ * styles/designTokens.spec.ts が CSS の文字から計算して固定する。
24
+ */
19
25
  .aqsp-root {
20
- --aqsp-row-header-width: 64px; /* 7 桁行番号 (1,000,000) が 13px tabular-nums で収まる幅 */
21
- --aqsp-col-header-height: 24px;
22
- /* v0.8 強調帯の既定パレット (計画 §1.9)。単一書き手は overlay の layout effect (highlightColors prop) —
23
- 能力なしはこの既定が効く。毎フレームの repaint は変数を書かない */
24
- --aqsp-band-row: #0084ff;
25
- --aqsp-band-column: #42ff4f;
26
- --aqsp-band-intersection: #e1ff00;
27
- --aqsp-band-opacity: 0.2;
26
+ /* 帯の寸法 (TS の SPREADSHEET_ROW_HEADER_WIDTH_PX / SPREADSHEET_COLUMN_HEADER_HEIGHT_PX と同値。上書きするホストは箱の計算も揃える) */
27
+ --_aqsp-row-header-width: var(--aqsp-row-header-width, 64px); /* 7 桁行番号 (1,000,000) が 13px tabular-nums で収まる幅 */
28
+ --_aqsp-col-header-height: var(--aqsp-col-header-height, 24px);
29
+ /* 文字の大きさの 1 つの基準 (既定 13px)。ほかの大きさはこの比で導く */
30
+ --_aqsp-font-size: var(--aqsp-font-size, 0.8125rem);
31
+ --_aqsp-font-size-small: calc(var(--_aqsp-font-size) * 12 / 13);
32
+ --_aqsp-font-size-x-small: calc(var(--_aqsp-font-size) * 11 / 13);
33
+ --_aqsp-font-size-glyph: calc(var(--_aqsp-font-size) * 16 / 13);
34
+ --_aqsp-editor-font-size: var(--_aqsp-font-size);
35
+ --_aqsp-surface: var(--aqsp-surface, #ffffff);
36
+ --_aqsp-text: var(--aqsp-text, #1f2937);
37
+ --_aqsp-grid-line: var(--aqsp-grid-line, #e5e7eb);
38
+ --_aqsp-border: var(--aqsp-border, #d1d5db);
39
+ --_aqsp-input-border: var(--aqsp-input-border, #8b95a4);
40
+ --_aqsp-accent: var(--aqsp-accent, #2563eb);
41
+ --_aqsp-header-surface: var(--aqsp-header-surface, #f3f4f6);
42
+ --_aqsp-header-text: var(--aqsp-header-text, #4a5361);
43
+ --_aqsp-header-selected-surface: var(--aqsp-header-selected-surface, #dbeafe);
44
+ --_aqsp-header-selected-text: var(--aqsp-header-selected-text, #1841b4);
45
+ --_aqsp-header-row-surface: var(--aqsp-header-row-surface, #f3f4f6);
46
+ --_aqsp-header-row-text: var(--aqsp-header-row-text, #1f2937);
47
+ --_aqsp-header-row-font-weight: var(--aqsp-header-row-font-weight, 700);
48
+ --_aqsp-link: var(--aqsp-link, #163ba5);
49
+ --_aqsp-note-marker: var(--aqsp-note-marker, #4b5563);
50
+ --_aqsp-comment-marker: var(--aqsp-comment-marker, #eb6406);
51
+ --_aqsp-danger: var(--aqsp-danger, #dc2626);
52
+ --_aqsp-danger-fill: var(--aqsp-danger-fill, rgb(220 38 38 / 0.08));
53
+ --_aqsp-danger-text: var(--aqsp-danger-text, #a41919);
54
+ --_aqsp-danger-surface: var(--aqsp-danger-surface, #fef2f2);
55
+ --_aqsp-selection-fill: var(--aqsp-selection-fill, rgb(59 130 246 / 0.18));
56
+ --_aqsp-selection-border: var(--aqsp-selection-border, rgb(37 99 235 / 0.85));
57
+ --_aqsp-drag-fill: var(--aqsp-drag-fill, rgb(59 130 246 / 0.1));
58
+ --_aqsp-reference: var(--aqsp-reference, #16a24a);
59
+ --_aqsp-reference-fill: var(--aqsp-reference-fill, rgb(22 163 74 / 0.08));
60
+ --_aqsp-fill-preview: var(--aqsp-fill-preview, #16a24a);
61
+ --_aqsp-divider-color: var(--aqsp-divider-color, #858e9d);
62
+ --_aqsp-popover-shadow: var(--aqsp-popover-shadow, 0 1px 2px rgb(0 0 0 / 0.08), 0 8px 24px rgb(0 0 0 / 0.14));
63
+ --_aqsp-note-tip-surface: var(--aqsp-note-tip-surface, #fffbeb);
64
+ --_aqsp-note-tip-border: var(--aqsp-note-tip-border, #f59e0b);
65
+ --_aqsp-note-tip-shadow: var(--aqsp-note-tip-shadow, 0 2px 8px rgb(0 0 0 / 0.12));
66
+ --_aqsp-title-text: var(--aqsp-title-text, #374151);
67
+ --_aqsp-muted-text: var(--aqsp-muted-text, #4e535e);
68
+ --_aqsp-strong-text: var(--aqsp-strong-text, #111827);
69
+ --_aqsp-separator: var(--aqsp-separator, #f3f4f6);
70
+ --_aqsp-button-surface: var(--aqsp-button-surface, #f9fafb);
71
+ --_aqsp-hover-surface: var(--aqsp-hover-surface, #f3f4f6);
72
+ --_aqsp-hover-border: var(--aqsp-hover-border, #9ca3af);
73
+ --_aqsp-primary-surface: var(--aqsp-primary-surface, #134dce);
74
+ --_aqsp-primary-hover-surface: var(--aqsp-primary-hover-surface, #173faf);
75
+ --_aqsp-primary-text: var(--aqsp-primary-text, #ffffff);
76
+ --_aqsp-option-selected-surface: var(--aqsp-option-selected-surface, #dbeafe);
77
+ --_aqsp-option-selected-text: var(--aqsp-option-selected-text, #1e3a8a);
28
78
  position: relative;
29
79
  width: 100%;
30
80
  height: 100%;
31
81
  overflow: hidden;
32
- background: #ffffff;
33
- color: #1f2937;
34
- font-size: 13px;
82
+ background: var(--_aqsp-surface);
83
+ color: var(--_aqsp-text);
84
+ font-size: var(--_aqsp-font-size);
35
85
  line-height: 1;
36
86
  }
37
87
 
88
+ /* 粗いポインタ (タッチ) の編集は 16 CSS px 以上 — iOS は 16px 未満の入力にフォーカスするとページを拡大する */
89
+ @media (pointer: coarse) {
90
+ .aqsp-root {
91
+ --_aqsp-editor-font-size: max(1rem, 16px);
92
+ }
93
+ }
94
+
38
95
  /*
39
96
  * ズームラッパー (v0.3): grid レイアウトの実体。視覚は transform: scale(z)、レイアウトは
40
97
  * 100%/z (インライン上書き — z=1 は無スタイルで v0.2 幾何と同一)。origin 0 0 で左上アンカー。
@@ -48,9 +105,9 @@
48
105
  */
49
106
  .aqsp-zoom {
50
107
  display: grid;
51
- grid-template-columns: var(--aqsp-row-header-width) minmax(0, 1fr);
108
+ grid-template-columns: var(--_aqsp-row-header-width) minmax(0, 1fr);
52
109
  /* 横バー行は無い — v0.4 から横バーは VirtualGrid 内在 (§7-1。v0.3 の第 3 行 auto は退役) */
53
- grid-template-rows: var(--aqsp-col-header-height) minmax(0, 1fr);
110
+ grid-template-rows: var(--_aqsp-col-header-height) minmax(0, 1fr);
54
111
  width: 100%;
55
112
  height: 100%;
56
113
  transform-origin: 0 0;
@@ -59,9 +116,9 @@
59
116
  .aqsp-corner {
60
117
  grid-column: 1;
61
118
  grid-row: 1;
62
- border-right: 1px solid #d1d5db;
63
- border-bottom: 1px solid #d1d5db;
64
- background: #f3f4f6;
119
+ border-right: 1px solid var(--_aqsp-border);
120
+ border-bottom: 1px solid var(--_aqsp-border);
121
+ background: var(--_aqsp-header-surface);
65
122
  }
66
123
 
67
124
  .aqsp-col-header {
@@ -69,8 +126,8 @@
69
126
  grid-row: 1;
70
127
  position: relative;
71
128
  overflow: hidden;
72
- border-bottom: 1px solid #d1d5db;
73
- background: #f3f4f6;
129
+ border-bottom: 1px solid var(--_aqsp-border);
130
+ background: var(--_aqsp-header-surface);
74
131
  user-select: none;
75
132
  }
76
133
 
@@ -108,10 +165,10 @@
108
165
  display: flex;
109
166
  align-items: center;
110
167
  justify-content: center;
111
- border-right: 1px solid #e5e7eb;
168
+ border-right: 1px solid var(--_aqsp-grid-line);
112
169
  overflow: hidden;
113
170
  white-space: nowrap;
114
- color: #4b5563;
171
+ color: var(--_aqsp-header-text);
115
172
  }
116
173
 
117
174
  .aqsp-row-header {
@@ -121,8 +178,8 @@
121
178
  overflow: hidden;
122
179
  /* 下端の横バー帯ぶんの margin-bottom は RowHeader.tsx が SPREADSHEET_SCROLLBAR_SIZE_PX (src/view.ts) からインライン
123
180
  指定する (TS 定数の単一 SSOT — SelectionOverlay の right / bottom と同方式) */
124
- border-right: 1px solid #d1d5db;
125
- background: #f3f4f6;
181
+ border-right: 1px solid var(--_aqsp-border);
182
+ background: var(--_aqsp-header-surface);
126
183
  user-select: none;
127
184
  }
128
185
 
@@ -143,10 +200,10 @@
143
200
  align-items: center;
144
201
  justify-content: flex-end;
145
202
  padding-right: 6px;
146
- border-bottom: 1px solid #e5e7eb;
203
+ border-bottom: 1px solid var(--_aqsp-grid-line);
147
204
  overflow: hidden;
148
205
  white-space: nowrap;
149
- color: #4b5563;
206
+ color: var(--_aqsp-header-text);
150
207
  font-variant-numeric: tabular-nums;
151
208
  }
152
209
 
@@ -178,10 +235,18 @@
178
235
  display: flex;
179
236
  align-items: center;
180
237
  padding: 0 4px;
181
- border-right: 1px solid #e5e7eb;
182
- border-bottom: 1px solid #e5e7eb;
238
+ border-right: 1px solid var(--_aqsp-grid-line);
239
+ border-bottom: 1px solid var(--_aqsp-grid-line);
183
240
  white-space: nowrap;
184
- background: #ffffff;
241
+ background: var(--_aqsp-surface);
242
+ }
243
+
244
+ /* 見出しの行 (headerRows — role="columnheader") の塗り。書式のインライン style が勝つ (インライン > クラス)。
245
+ リンクの色は後置の [data-aqsp-link] 規則が勝つ (同じ詳細度は出現順) */
246
+ .aqsp-cell[data-aqsp-header-row] {
247
+ background: var(--_aqsp-header-row-surface);
248
+ color: var(--_aqsp-header-row-text);
249
+ font-weight: var(--_aqsp-header-row-font-weight);
185
250
  }
186
251
 
187
252
  /*
@@ -217,14 +282,14 @@
217
282
  width: 0;
218
283
  height: 0;
219
284
  border: 5px solid transparent;
220
- border-top-color: #4b5563;
221
- border-right-color: #4b5563;
285
+ border-top-color: var(--_aqsp-note-marker);
286
+ border-right-color: var(--_aqsp-note-marker);
222
287
  pointer-events: none;
223
288
  }
224
289
 
225
290
  .aqsp-cell[data-aqsp-comment]::after {
226
- border-top-color: #f97316;
227
- border-right-color: #f97316;
291
+ border-top-color: var(--_aqsp-comment-marker);
292
+ border-right-color: var(--_aqsp-comment-marker);
228
293
  }
229
294
 
230
295
  .aqsp-cell[data-aqsp-invalid]::before {
@@ -235,15 +300,15 @@
235
300
  width: 0;
236
301
  height: 0;
237
302
  border: 5px solid transparent;
238
- border-bottom-color: #dc2626;
239
- border-left-color: #dc2626;
303
+ border-bottom-color: var(--_aqsp-danger);
304
+ border-left-color: var(--_aqsp-danger);
240
305
  pointer-events: none;
241
306
  }
242
307
 
243
308
  /* リンクセル — 書式の color インライン指定が優先する (インライン > クラス) */
244
309
  .aqsp-cell[data-aqsp-link] {
245
310
  text-decoration: underline;
246
- color: #1d4ed8;
311
+ color: var(--_aqsp-link);
247
312
  }
248
313
 
249
314
  /*
@@ -263,6 +328,12 @@
263
328
  * (実測済みの既知事故類型)。右オフセット (縦バー幅) は JSX インラインが SSOT (§6.7.2-1)。
264
329
  */
265
330
  .aqsp-overlay {
331
+ /* 強調帯の既定パレット (計画 §1.9)。highlightColors prop の layout effect がこの要素へ公開の名前をインラインで書く
332
+ (要素自身の宣言なので祖先の値に勝つ)。書かれていなければ祖先 (ホスト) の値、無ければ既定。毎フレームの repaint は書かない */
333
+ --_aqsp-band-row: var(--aqsp-band-row, #0084ff);
334
+ --_aqsp-band-column: var(--aqsp-band-column, #42ff4f);
335
+ --_aqsp-band-intersection: var(--aqsp-band-intersection, #e1ff00);
336
+ --_aqsp-band-opacity: var(--aqsp-band-opacity, 0.2);
266
337
  position: absolute;
267
338
  inset: 0;
268
339
  overflow: hidden;
@@ -289,8 +360,8 @@
289
360
  position: absolute;
290
361
  top: 0;
291
362
  left: 0;
292
- background: rgb(59 130 246 / 0.18);
293
- border: 1px solid rgb(37 99 235 / 0.85);
363
+ background: var(--_aqsp-selection-fill);
364
+ border: 1px solid var(--_aqsp-selection-border);
294
365
  mix-blend-mode: multiply;
295
366
  }
296
367
 
@@ -298,7 +369,7 @@
298
369
  position: absolute;
299
370
  top: 0;
300
371
  left: 0;
301
- border: 2px solid #2563eb;
372
+ border: 2px solid var(--_aqsp-accent);
302
373
  box-sizing: border-box;
303
374
  }
304
375
 
@@ -306,20 +377,20 @@
306
377
  position: absolute;
307
378
  top: 0;
308
379
  left: 0;
309
- border: 1px solid #2563eb;
310
- background: rgb(59 130 246 / 0.1);
380
+ border: 1px solid var(--_aqsp-accent);
381
+ background: var(--_aqsp-drag-fill);
311
382
  }
312
383
 
313
384
  /* 減算ドラッグ (§3.2): writeDragFrame が data-aqsp-drag-mode を set / clear する */
314
385
  .aqsp-drag-rect[data-aqsp-drag-mode="subtract"] {
315
- border: 1px dashed #dc2626;
316
- background: rgb(220 38 38 / 0.08);
386
+ border: 1px dashed var(--_aqsp-danger);
387
+ background: var(--_aqsp-danger-fill);
317
388
  }
318
389
 
319
390
  /* 参照ドラッグ (v0.8 ポインティング): 数式へ挿入するレンジの矩形 — 緑の破線 */
320
391
  .aqsp-drag-rect[data-aqsp-drag-mode="point"] {
321
- border: 1px dashed #16a34a;
322
- background: rgb(22 163 74 / 0.08);
392
+ border: 1px dashed var(--_aqsp-reference);
393
+ background: var(--_aqsp-reference-fill);
323
394
  }
324
395
 
325
396
  /*
@@ -331,20 +402,20 @@
331
402
  position: absolute;
332
403
  top: 0;
333
404
  left: 0;
334
- opacity: var(--aqsp-band-opacity);
405
+ opacity: var(--_aqsp-band-opacity);
335
406
  pointer-events: none;
336
407
  }
337
408
 
338
409
  .aqsp-band[data-aqsp-band="row"] {
339
- background: var(--aqsp-band-row);
410
+ background: var(--_aqsp-band-row);
340
411
  }
341
412
 
342
413
  .aqsp-band[data-aqsp-band="column"] {
343
- background: var(--aqsp-band-column);
414
+ background: var(--_aqsp-band-column);
344
415
  }
345
416
 
346
417
  .aqsp-band[data-aqsp-band="intersection"] {
347
- background: var(--aqsp-band-intersection);
418
+ background: var(--_aqsp-band-intersection);
348
419
  }
349
420
 
350
421
  /*
@@ -378,7 +449,9 @@
378
449
  left: var(--aqsp-clip-outset-left, -3px);
379
450
  /* 二色 (青 / 白 — Excel 同型): 透明コマだと下地が青リング / 青塗りのとき「青一色の実線」に
380
451
  化けてアンツが知覚不能になる (R2(H) 画素実測)。白コマはどの下地でも必ず対比を作る */
381
- background-image: linear-gradient(90deg, #2563eb 50%, #ffffff 50%), linear-gradient(90deg, #2563eb 50%, #ffffff 50%), linear-gradient(0deg, #2563eb 50%, #ffffff 50%), linear-gradient(0deg, #2563eb 50%, #ffffff 50%);
452
+ background-image:
453
+ linear-gradient(90deg, var(--_aqsp-accent) 50%, var(--_aqsp-surface) 50%), linear-gradient(90deg, var(--_aqsp-accent) 50%, var(--_aqsp-surface) 50%), linear-gradient(0deg, var(--_aqsp-accent) 50%, var(--_aqsp-surface) 50%),
454
+ linear-gradient(0deg, var(--_aqsp-accent) 50%, var(--_aqsp-surface) 50%);
382
455
  background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
383
456
  background-size:
384
457
  8px 2px,
@@ -430,8 +503,7 @@
430
503
  top: 0;
431
504
  height: 100%;
432
505
  cursor: col-resize;
433
- background: repeating-linear-gradient(90deg, #2563eb 0 1px, transparent 1px 3px);
434
- opacity: 0.7;
506
+ background: repeating-linear-gradient(90deg, var(--_aqsp-accent) 0 1px, transparent 1px 3px);
435
507
  }
436
508
 
437
509
  .aqsp-row-header .aqsp-unhide-marker {
@@ -439,8 +511,7 @@
439
511
  left: 0;
440
512
  right: 0;
441
513
  cursor: row-resize;
442
- background: repeating-linear-gradient(180deg, #2563eb 0 1px, transparent 1px 3px);
443
- opacity: 0.7;
514
+ background: repeating-linear-gradient(180deg, var(--_aqsp-accent) 0 1px, transparent 1px 3px);
444
515
  }
445
516
 
446
517
  /* §7.2 リサイズガイドライン (overlay 常設ノード — writer が寸法 / 位置を直書き) */
@@ -448,7 +519,7 @@
448
519
  position: absolute;
449
520
  top: 0;
450
521
  left: 0;
451
- background: #2563eb;
522
+ background: var(--_aqsp-accent);
452
523
  pointer-events: none;
453
524
  }
454
525
 
@@ -459,8 +530,8 @@
459
530
  left: 0;
460
531
  width: 6px;
461
532
  height: 6px;
462
- background: #2563eb;
463
- border: 1px solid #fff;
533
+ background: var(--_aqsp-accent);
534
+ border: 1px solid var(--_aqsp-surface);
464
535
  box-sizing: content-box;
465
536
  pointer-events: auto;
466
537
  cursor: crosshair;
@@ -471,7 +542,7 @@
471
542
  position: absolute;
472
543
  top: 0;
473
544
  left: 0;
474
- border: 1px dashed #16a34a;
545
+ border: 1px dashed var(--_aqsp-fill-preview);
475
546
  }
476
547
 
477
548
  /*
@@ -518,8 +589,8 @@
518
589
  /* ヘッダー強調 (§6.8-4 — ドラッグ中は凍結 = 既知特性) */
519
590
  .aqsp-col-header-cell[data-aqsp-in-selection],
520
591
  .aqsp-row-header-cell[data-aqsp-in-selection] {
521
- background: #dbeafe;
522
- color: #1d4ed8;
592
+ background: var(--_aqsp-header-selected-surface);
593
+ color: var(--_aqsp-header-selected-text);
523
594
  font-weight: 600;
524
595
  }
525
596
 
@@ -567,15 +638,15 @@
567
638
  z-index: 1;
568
639
  box-sizing: border-box;
569
640
  padding: 0 4px; /* 上パディングはオーバーレイが行高から動的直書き — セル flex 中央と一致 */
570
- background: #ffffff;
571
- color: #1f2937;
572
- caret-color: #1f2937;
641
+ background: var(--_aqsp-surface);
642
+ color: var(--_aqsp-text);
643
+ caret-color: var(--_aqsp-text);
573
644
  font-family: inherit;
574
- font-size: 13px;
645
+ font-size: var(--_aqsp-editor-font-size);
575
646
  line-height: 1;
576
647
  white-space: pre;
577
648
  overflow: hidden;
578
- outline: 2px solid #2563eb;
649
+ outline: 2px solid var(--_aqsp-accent);
579
650
  outline-offset: -2px;
580
651
  /* 編集中だけキャレット (I ビーム) — 編集セルの文字上でキャレットを出す (利用者要望)。非編集は
581
652
  .aqsp-row / 待機シンクとも既定矢印なので、カーソル値が変わるのは編集開始の 1 回のみ。旧
@@ -590,7 +661,7 @@
590
661
  * エディタが input / 処理済みキー / selectionchange で書く (漸進的・非依存)。遷移は書かない
591
662
  */
592
663
  .aqsp-sink[data-aqsp-pointing] {
593
- caret-color: #16a34a;
664
+ caret-color: var(--_aqsp-reference);
594
665
  }
595
666
 
596
667
  /*
@@ -640,15 +711,13 @@
640
711
  width: 320px;
641
712
  max-width: 320px;
642
713
  overflow: hidden;
643
- border: 1px solid #d1d5db;
714
+ border: 1px solid var(--_aqsp-border);
644
715
  border-radius: 8px;
645
- background: #ffffff;
646
- color: #1f2937;
647
- box-shadow:
648
- 0 1px 2px rgb(0 0 0 / 0.08),
649
- 0 8px 24px rgb(0 0 0 / 0.14);
716
+ background: var(--_aqsp-surface);
717
+ color: var(--_aqsp-text);
718
+ box-shadow: var(--_aqsp-popover-shadow);
650
719
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans JP", sans-serif;
651
- font-size: 13px;
720
+ font-size: var(--_aqsp-font-size);
652
721
  line-height: 1.4;
653
722
  text-align: start;
654
723
  white-space: normal;
@@ -658,15 +727,15 @@
658
727
 
659
728
  /* 消費者レンダラ (autofocus 対象なし) はフレーム自体が焦点着地点 — 内側リングで所在を示す */
660
729
  .aqsp-popover:focus-visible {
661
- outline: 2px solid #2563eb;
730
+ outline: 2px solid var(--_aqsp-accent);
662
731
  outline-offset: -2px;
663
732
  }
664
733
 
665
734
  /* ホバー tip のフレーム (kind はフレームの data-aqsp-popover-frame、中身の data-aqsp-popover は部品側のフック) */
666
735
  .aqsp-popover[data-aqsp-popover-frame="note-tip"] {
667
- border-color: #f59e0b;
668
- background: #fffbeb;
669
- box-shadow: 0 2px 8px rgb(0 0 0 / 0.12);
736
+ border-color: var(--_aqsp-note-tip-border);
737
+ background: var(--_aqsp-note-tip-surface);
738
+ box-shadow: var(--_aqsp-note-tip-shadow);
670
739
  }
671
740
 
672
741
  /*
@@ -706,7 +775,7 @@
706
775
  * 下書きが跳ねる)。forced-colors では border が CanvasText へ再着色されて太い縦線として残る
707
776
  */
708
777
  [data-aqsp-popover][data-aqsp-popover-rejected] {
709
- border-inline-start: 3px solid #dc2626;
778
+ border-inline-start: 3px solid var(--_aqsp-danger);
710
779
  padding-inline-start: 9px;
711
780
  }
712
781
 
@@ -715,14 +784,14 @@
715
784
  align-items: baseline;
716
785
  gap: 6px;
717
786
  margin: 0 0 6px;
718
- font-size: 12px;
787
+ font-size: var(--_aqsp-font-size-small);
719
788
  font-weight: 600;
720
- color: #374151;
789
+ color: var(--_aqsp-title-text);
721
790
  }
722
791
 
723
792
  .aqsp-popover-count {
724
793
  font-weight: 400;
725
- color: #6b7280;
794
+ color: var(--_aqsp-muted-text);
726
795
  }
727
796
 
728
797
  /*
@@ -736,9 +805,10 @@
736
805
  width: 100%;
737
806
  margin: 0;
738
807
  padding: 5px 8px;
739
- border: 1px solid #d1d5db;
808
+ /* 入力欄の境界は欄を見分ける唯一の手がかり — 3:1 (WCAG 1.4.11) の専用の値 */
809
+ border: 1px solid var(--_aqsp-input-border);
740
810
  border-radius: 6px;
741
- background: #ffffff;
811
+ background: var(--_aqsp-surface);
742
812
  color: inherit;
743
813
  font: inherit;
744
814
  line-height: 1.4;
@@ -770,31 +840,31 @@
770
840
 
771
841
  .aqsp-popover-textarea:focus-visible,
772
842
  .aqsp-popover-input:focus-visible {
773
- border-color: #2563eb;
774
- outline: 2px solid #2563eb;
843
+ border-color: var(--_aqsp-accent);
844
+ outline: 2px solid var(--_aqsp-accent);
775
845
  outline-offset: -1px;
776
846
  }
777
847
 
778
848
  .aqsp-popover-textarea[aria-invalid="true"],
779
849
  .aqsp-popover-input[aria-invalid="true"] {
780
- border-color: #dc2626;
850
+ border-color: var(--_aqsp-danger);
781
851
  }
782
852
 
783
853
  .aqsp-popover-textarea[aria-invalid="true"]:focus-visible,
784
854
  .aqsp-popover-input[aria-invalid="true"]:focus-visible {
785
- border-color: #dc2626;
786
- outline-color: #dc2626;
855
+ border-color: var(--_aqsp-danger);
856
+ outline-color: var(--_aqsp-danger);
787
857
  }
788
858
 
789
859
  /* ヒント (Escape の挙動 / 拒否の再試行案内) — 12px の控えめ色、拒否時は赤 */
790
860
  .aqsp-popover-hint {
791
861
  margin: 4px 0 0;
792
- font-size: 12px;
793
- color: #6b7280;
862
+ font-size: var(--_aqsp-font-size-small);
863
+ color: var(--_aqsp-muted-text);
794
864
  }
795
865
 
796
866
  [data-aqsp-popover-rejected] .aqsp-popover-hint {
797
- color: #b91c1c;
867
+ color: var(--_aqsp-danger-text);
798
868
  }
799
869
 
800
870
  /* リンク編集の欄 (ラベル + 入力) */
@@ -807,8 +877,8 @@
807
877
  }
808
878
 
809
879
  .aqsp-popover-field-label {
810
- font-size: 12px;
811
- color: #6b7280;
880
+ font-size: var(--_aqsp-font-size-small);
881
+ color: var(--_aqsp-muted-text);
812
882
  }
813
883
 
814
884
  /* 操作列: 主操作が先頭、閉じる (×) は margin-inline-start: auto で終端へ */
@@ -828,24 +898,24 @@
828
898
  height: 26px;
829
899
  margin: 0;
830
900
  padding: 0 10px;
831
- border: 1px solid #d1d5db;
901
+ border: 1px solid var(--_aqsp-border);
832
902
  border-radius: 6px;
833
- background: #f9fafb;
834
- color: #1f2937;
903
+ background: var(--_aqsp-button-surface);
904
+ color: var(--_aqsp-text);
835
905
  font: inherit;
836
- font-size: 12px;
906
+ font-size: var(--_aqsp-font-size-small);
837
907
  font-weight: 500;
838
908
  line-height: 1;
839
909
  cursor: pointer;
840
910
  }
841
911
 
842
912
  .aqsp-popover-button:not(:disabled):hover {
843
- border-color: #9ca3af;
844
- background: #f3f4f6;
913
+ border-color: var(--_aqsp-hover-border);
914
+ background: var(--_aqsp-hover-surface);
845
915
  }
846
916
 
847
917
  .aqsp-popover-button:focus-visible {
848
- outline: 2px solid #2563eb;
918
+ outline: 2px solid var(--_aqsp-accent);
849
919
  outline-offset: 1px;
850
920
  }
851
921
 
@@ -857,15 +927,15 @@
857
927
  /* 主操作 (保存 / 投稿 — 部品の役割属性で判別) */
858
928
  .aqsp-popover-button[data-aqsp-popover-save],
859
929
  .aqsp-popover-button[data-aqsp-popover-post] {
860
- border-color: #2563eb;
861
- background: #2563eb;
862
- color: #ffffff;
930
+ border-color: var(--_aqsp-primary-surface);
931
+ background: var(--_aqsp-primary-surface);
932
+ color: var(--_aqsp-primary-text);
863
933
  }
864
934
 
865
935
  .aqsp-popover-button[data-aqsp-popover-save]:not(:disabled):hover,
866
936
  .aqsp-popover-button[data-aqsp-popover-post]:not(:disabled):hover {
867
- border-color: #1d4ed8;
868
- background: #1d4ed8;
937
+ border-color: var(--_aqsp-primary-hover-surface);
938
+ background: var(--_aqsp-primary-hover-surface);
869
939
  }
870
940
 
871
941
  /* 閉じる (×): 終端のゴースト正方形 */
@@ -876,15 +946,15 @@
876
946
  padding: 0;
877
947
  border-color: transparent;
878
948
  background: transparent;
879
- color: #6b7280;
880
- font-size: 16px;
949
+ color: var(--_aqsp-muted-text);
950
+ font-size: var(--_aqsp-font-size-glyph);
881
951
  font-weight: 400;
882
952
  }
883
953
 
884
954
  .aqsp-popover-button[data-aqsp-popover-close]:not(:disabled):hover {
885
955
  border-color: transparent;
886
- background: #f3f4f6;
887
- color: #1f2937;
956
+ background: var(--_aqsp-hover-surface);
957
+ color: var(--_aqsp-text);
888
958
  }
889
959
 
890
960
  /* コメントスレッド: 可変領域 (縮んでスクロール)。項目は薄い区切り線、先頭は線なし */
@@ -901,7 +971,7 @@
901
971
 
902
972
  .aqsp-popover-comment-item {
903
973
  padding: 6px 0;
904
- border-top: 1px solid #f3f4f6;
974
+ border-top: 1px solid var(--_aqsp-separator);
905
975
  }
906
976
 
907
977
  .aqsp-popover-comment-item:first-child {
@@ -910,15 +980,15 @@
910
980
  }
911
981
 
912
982
  .aqsp-popover-comment-author {
913
- font-size: 12px;
983
+ font-size: var(--_aqsp-font-size-small);
914
984
  font-weight: 600;
915
- color: #111827;
985
+ color: var(--_aqsp-strong-text);
916
986
  }
917
987
 
918
988
  .aqsp-popover-comment-time {
919
989
  margin-inline-start: 6px;
920
- font-size: 11px;
921
- color: #6b7280;
990
+ font-size: var(--_aqsp-font-size-x-small);
991
+ color: var(--_aqsp-muted-text);
922
992
  font-variant-numeric: tabular-nums;
923
993
  }
924
994
 
@@ -951,23 +1021,23 @@
951
1021
  }
952
1022
 
953
1023
  .aqsp-popover-option:hover {
954
- background: #f3f4f6;
1024
+ background: var(--_aqsp-hover-surface);
955
1025
  }
956
1026
 
957
1027
  .aqsp-popover-option[aria-selected="true"] {
958
- background: #dbeafe;
959
- color: #1e3a8a;
1028
+ background: var(--_aqsp-option-selected-surface);
1029
+ color: var(--_aqsp-option-selected-text);
960
1030
  }
961
1031
 
962
1032
  .aqsp-popover-option:focus-visible {
963
- outline: 2px solid #2563eb;
1033
+ outline: 2px solid var(--_aqsp-accent);
964
1034
  outline-offset: -2px;
965
1035
  }
966
1036
 
967
1037
  .aqsp-popover-empty {
968
1038
  padding: 6px 8px;
969
- font-size: 12px;
970
- color: #6b7280;
1039
+ font-size: var(--_aqsp-font-size-small);
1040
+ color: var(--_aqsp-muted-text);
971
1041
  }
972
1042
 
973
1043
  /* 検証メッセージ (受動 — role="status"): 閉じるボタンは右上へ絶対配置、本文はその幅を空ける */
@@ -994,11 +1064,11 @@
994
1064
 
995
1065
  /* 拒否メッセージ (strict 検証の拒否再提示): 淡い赤地 + 赤い見出し (アクセント線は共通規則) */
996
1066
  .aqsp-popover-message[data-aqsp-popover-rejected] {
997
- background: #fef2f2;
1067
+ background: var(--_aqsp-danger-surface);
998
1068
  }
999
1069
 
1000
1070
  .aqsp-popover-message[data-aqsp-popover-rejected] .aqsp-popover-title {
1001
- color: #b91c1c;
1071
+ color: var(--_aqsp-danger-text);
1002
1072
  }
1003
1073
 
1004
1074
  /*
@@ -1031,15 +1101,15 @@
1031
1101
  /*
1032
1102
  * v0.9 凍結分割線 (計画 §2.4 — ADR-20 / ADR-24): 全凍結境界の強い Excel / Sheets 風の線。
1033
1103
  * consumer 面は CSS 変数 2 つだけ (--aqsp-divider-color / --aqsp-divider-width — パッケージは
1034
- * 読むだけで書き手は consumer スタイルシート単独)。既定は 2px の #9ca3af (gray-400 — 既存全
1035
- * 罫線より 1 段濃い)。width 0px は逃げ道 — 象限別 fill 断片の継ぎ目が再露出し forced-colors も
1104
+ * 読むだけで書き手は consumer スタイルシート単独。色の既定は .aqsp-root の別名 --_aqsp-divider-color が 1 度だけ書く)。
1105
+ * 既定は 2px の #9ca3af (gray-400 — 既存全罫線より 1 段濃い)。width 0px は逃げ道 — 象限別 fill 断片の継ぎ目が再露出し forced-colors も
1036
1106
  * 無描画 (意図的、README / 分冊 05 §8 登記)。位置 (leading 縁 0 / trailing 縁 0) と長さは
1037
1107
  * 各セグメントの静的インライン幾何 + ホストクリップが供給し、このブロックは太さと色だけを持つ。
1038
1108
  * pointer-events: none — バーは不活性で、リサイズの operand は帯側隣接ストリップ (ADR-20)。
1039
1109
  */
1040
1110
  .aqsp-freeze-divider {
1041
1111
  position: absolute;
1042
- background: var(--aqsp-divider-color, #9ca3af);
1112
+ background: var(--_aqsp-divider-color);
1043
1113
  pointer-events: none;
1044
1114
  }
1045
1115