@yuneta/gobj-ui 7.23.93 → 7.23.95

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 CHANGED
@@ -2245,6 +2245,14 @@ against the scheme background, the raw tokens as ink are
2245
2245
  Bulma computes `-on-scheme` per scheme: the same hue, darkened on a light
2246
2246
  page (`warning` goes to 23% lightness), unchanged on a dark one.
2247
2247
 
2248
+ **Quiet text**: `.yui-text-quiet` (the text colour at 75%), never Bulma's
2249
+ `has-text-grey` — one mid grey for both schemes, 3.86:1 on the dark one, and
2250
+ what the library writes in grey is an empty state, a timestamp, a topic id, a
2251
+ notice's detail: text somebody has to read. And a **placeholder** is text
2252
+ too; the shell's stylesheet raises Bulma's 30% alpha to 70% (2.47:1 → 7.96 in
2253
+ dark) where Bulma declares the variable, since a `:root` override does not
2254
+ reach it.
2255
+
2248
2256
  ### i18n: a string must be able to CHANGE language, not just be translated once
2249
2257
 
2250
2258
  Passing a string through `t()` is **not** enough. `refresh_language()` only
@@ -4420,8 +4420,13 @@ function ensure_dock_style() {
4420
4420
  background: var(--bulma-scheme-main); color: var(--bulma-text); cursor: pointer; white-space: nowrap;
4421
4421
  }
4422
4422
  .yui-dock-chip:hover { border-color: var(--bulma-text-weak); }
4423
- .yui-dock-chip.is-active { border-color: #2563eb; color: #2563eb; background: rgba(37,99,235,0.10); font-weight: 600; }
4424
- .yui-dock-chip.is-min { opacity: 0.65; }
4423
+ /* The BORDER says active, not the text: blue ink on a blue tint is
4424
+ * the same hue on itself -- 4.49:1 on the light chip, under the 4.5
4425
+ * its 12px label needs. The label takes the text colour (11:1). */
4426
+ .yui-dock-chip.is-active { border-color: #2563eb; color: var(--bulma-text, #2e333d); background: rgba(37,99,235,0.10); font-weight: 600; }
4427
+ /* A minimised window is quieter, not unreadable: 0.65 is 4.3:1 on the
4428
+ * light scheme for a 12px label. */
4429
+ .yui-dock-chip.is-min { opacity: 0.7; }
4425
4430
  .yui-dock-dot { width: 8px; height: 8px; border-radius: 50%; background: #22c55e; flex: 0 0 auto; }
4426
4431
  .yui-dock-chip.is-min .yui-dock-dot { background: var(--bulma-text-weak); }
4427
4432
  .yui-dock-icon { display: inline-flex; align-items: center; justify-content: center; width: 15px; height: 15px; font-size: 14px; flex: 0 0 auto; }
@@ -4439,7 +4444,7 @@ function ensure_dock_style() {
4439
4444
  }
4440
4445
  .yui-dock-close:hover { background: #e0364a; color: #fff; }
4441
4446
  .yui-dock-close svg { width: 11px; height: 11px; display: block; }
4442
- :root[data-theme="dark"] .yui-dock-chip.is-active { border-color: #60a5fa; color: #93c5fd; background: rgba(96,165,250,0.16); }
4447
+ :root[data-theme="dark"] .yui-dock-chip.is-active { border-color: #60a5fa; color: var(--bulma-text, #ebecf0); background: rgba(96,165,250,0.16); }
4443
4448
  `;
4444
4449
  let $style = document.createElement("style");
4445
4450
  $style.id = "yui-dock-style";
@@ -10651,7 +10656,7 @@ function yui_graph_camera_items(gobj, graph, wide) {
10651
10656
  [
10652
10657
  "span",
10653
10658
  {
10654
- class: "GRAPH_ZOOM_LEVEL is-flex is-align-items-center px-2 has-text-grey",
10659
+ class: "GRAPH_ZOOM_LEVEL is-flex is-align-items-center px-2 yui-text-quiet",
10655
10660
  style: "font-size:.85rem; min-width:3.5em; justify-content:center;",
10656
10661
  title: (0, i18next.t)("zoom level"),
10657
10662
  "data-i18n-title": "zoom level"
@@ -13427,7 +13432,7 @@ function render_graph(gobj) {
13427
13432
  $graph.appendChild((0, _yuneta_gobj_js.createElement2)([
13428
13433
  "div",
13429
13434
  {
13430
- class: "JSON_EMPTY has-text-grey p-3",
13435
+ class: "JSON_EMPTY yui-text-quiet p-3",
13431
13436
  "data-i18n": "no data"
13432
13437
  },
13433
13438
  "no data"
@@ -13496,7 +13501,7 @@ function render_text(gobj) {
13496
13501
  $text.appendChild((0, _yuneta_gobj_js.createElement2)([
13497
13502
  "div",
13498
13503
  {
13499
- class: "JSON_EMPTY has-text-grey p-3",
13504
+ class: "JSON_EMPTY yui-text-quiet p-3",
13500
13505
  "data-i18n": "no data"
13501
13506
  },
13502
13507
  "no data"
@@ -13540,7 +13545,7 @@ function render_tree(gobj) {
13540
13545
  $tree.appendChild((0, _yuneta_gobj_js.createElement2)([
13541
13546
  "div",
13542
13547
  {
13543
- class: "JSON_EMPTY has-text-grey p-3",
13548
+ class: "JSON_EMPTY yui-text-quiet p-3",
13544
13549
  "data-i18n": "no data"
13545
13550
  },
13546
13551
  "no data"
@@ -13716,7 +13721,7 @@ function toggle_row(gobj, key, size, is_object, depth, path, open, value) {
13716
13721
  }
13717
13722
  body.push([
13718
13723
  "span",
13719
- { class: "JSON_SUMMARY has-text-grey" },
13724
+ { class: "JSON_SUMMARY yui-text-quiet" },
13720
13725
  summary
13721
13726
  ]);
13722
13727
  let label = container_label(value, MAX_LABEL_CHARS);
@@ -13786,7 +13791,7 @@ function leaf_row(key, value, depth) {
13786
13791
  let wall = format_epoch(value);
13787
13792
  if (wall) body.push([
13788
13793
  "span",
13789
- { class: "JSON_TIME is-size-7 has-text-grey ml-2" },
13794
+ { class: "JSON_TIME is-size-7 yui-text-quiet ml-2" },
13790
13795
  wall
13791
13796
  ]);
13792
13797
  }
@@ -15723,7 +15728,7 @@ function render_raw(gobj) {
15723
15728
  $raw.appendChild((0, _yuneta_gobj_js.createElement2)([
15724
15729
  "div",
15725
15730
  {
15726
- class: "GCLASS_EMPTY p-4 has-text-grey",
15731
+ class: "GCLASS_EMPTY p-4 yui-text-quiet",
15727
15732
  i18n: "no data"
15728
15733
  },
15729
15734
  (0, i18next.t)("no data")
@@ -15739,7 +15744,7 @@ function render_raw(gobj) {
15739
15744
  if (dump.capped) children.push([
15740
15745
  "div",
15741
15746
  {
15742
- class: "GCLASS_RAW_CAPPED has-text-grey is-size-7 p-2",
15747
+ class: "GCLASS_RAW_CAPPED yui-text-quiet is-size-7 p-2",
15743
15748
  i18n: "text truncated"
15744
15749
  },
15745
15750
  (0, i18next.t)("text truncated")
@@ -15772,7 +15777,7 @@ function render_zones(gobj) {
15772
15777
  $zones.appendChild((0, _yuneta_gobj_js.createElement2)([
15773
15778
  "div",
15774
15779
  {
15775
- class: "GCLASS_EMPTY p-4 has-text-grey",
15780
+ class: "GCLASS_EMPTY p-4 yui-text-quiet",
15776
15781
  i18n: "no data"
15777
15782
  },
15778
15783
  (0, i18next.t)("no data")
@@ -20959,7 +20964,7 @@ function build_body(shell, t) {
20959
20964
  ]);
20960
20965
  let $count = (0, _yuneta_gobj_js.createElement2)([
20961
20966
  "span",
20962
- { class: "ROUTEMAP_COUNT is-size-7 has-text-grey is-hidden" },
20967
+ { class: "ROUTEMAP_COUNT is-size-7 yui-text-quiet is-hidden" },
20963
20968
  [$count_n]
20964
20969
  ]);
20965
20970
  let $refs_input = (0, _yuneta_gobj_js.createElement2)(["input", {
@@ -24751,7 +24756,7 @@ function create_tabulator(gobj) {
24751
24756
  index: pkey,
24752
24757
  columns,
24753
24758
  selectableRows: selectable,
24754
- footerElement: "<span class='yui-tabulator-rowcount' style='display:block;text-align:right;font-size:0.8rem;color:#6b7280;padding:0 0.6rem;'></span>"
24759
+ footerElement: "<span class='yui-tabulator-rowcount yui-text-quiet' style='display:block;text-align:right;font-size:0.8rem;padding:0 0.6rem;'></span>"
24755
24760
  });
24756
24761
  let $view_container = (0, _yuneta_gobj_js.gobj_read_attr)(gobj, "$container");
24757
24762
  let $table_el = $view_container ? $view_container.querySelector(`#${table_id}`) : null;
@@ -24911,7 +24916,7 @@ function icon_formatter(cell) {
24911
24916
  if (!/^[a-z0-9-]+$/.test(name) || !yui_icon_is_defined(name)) return (0, _yuneta_gobj_js.createElement2)([
24912
24917
  "span",
24913
24918
  {
24914
- class: "ICON_CELL_UNKNOWN is-size-7 has-text-grey",
24919
+ class: "ICON_CELL_UNKNOWN is-size-7 yui-text-quiet",
24915
24920
  title: name
24916
24921
  },
24917
24922
  name
@@ -64451,7 +64456,7 @@ function build_graph(gobj) {
64451
64456
  let $empty = (0, _yuneta_gobj_js.createElement2)([
64452
64457
  "div",
64453
64458
  {
64454
- class: "TREEDB_SCHEMA_EMPTY p-4 has-text-grey",
64459
+ class: "TREEDB_SCHEMA_EMPTY p-4 yui-text-quiet",
64455
64460
  i18n: "no topics"
64456
64461
  },
64457
64462
  (0, i18next.t)("no topics", { defaultValue: "No topics" })
@@ -66525,7 +66530,7 @@ function build_ui$1(gobj) {
66525
66530
  ],
66526
66531
  [
66527
66532
  "div",
66528
- { class: "SCHEMA_NOTICE p-4 has-text-grey is-hidden" },
66533
+ { class: "SCHEMA_NOTICE p-4 yui-text-quiet is-hidden" },
66529
66534
  []
66530
66535
  ],
66531
66536
  [
@@ -66825,7 +66830,7 @@ function show_notice(gobj, key, detail) {
66825
66830
  ]));
66826
66831
  if (detail) $notice.appendChild((0, _yuneta_gobj_js.createElement2)([
66827
66832
  "span",
66828
- { class: "SCHEMA_NOTICE_DETAIL has-text-grey ml-2" },
66833
+ { class: "SCHEMA_NOTICE_DETAIL yui-text-quiet ml-2" },
66829
66834
  `${detail}`
66830
66835
  ]));
66831
66836
  }
@@ -66947,7 +66952,7 @@ function render_toolbar(gobj) {
66947
66952
  }
66948
66953
  $left.push([
66949
66954
  "nav",
66950
- { class: "SCHEMA_CRUMBS is-size-7 has-text-grey ml-1" },
66955
+ { class: "SCHEMA_CRUMBS is-size-7 yui-text-quiet ml-1" },
66951
66956
  $trail
66952
66957
  ]);
66953
66958
  let $right = [];
@@ -67203,7 +67208,7 @@ function render_topics(gobj, $body) {
67203
67208
  ],
67204
67209
  ambiguous ? [
67205
67210
  "div",
67206
- { class: "SCHEMA_TOPIC_ID is-size-7 has-text-grey" },
67211
+ { class: "SCHEMA_TOPIC_ID is-size-7 yui-text-quiet" },
67207
67212
  [[
67208
67213
  "code",
67209
67214
  {},
@@ -67454,7 +67459,7 @@ function render_columns(gobj, $body) {
67454
67459
  if (topic.cols.length === 0) $wrap.appendChild((0, _yuneta_gobj_js.createElement2)([
67455
67460
  "p",
67456
67461
  {
67457
- class: "SCHEMA_COLUMNS_EMPTY has-text-grey p-3",
67462
+ class: "SCHEMA_COLUMNS_EMPTY yui-text-quiet p-3",
67458
67463
  i18n: "this topic has no column"
67459
67464
  },
67460
67465
  (0, i18next.t)("this topic has no column")
@@ -67566,7 +67571,7 @@ function column_row(gobj, topic, col, index, readonly, twice) {
67566
67571
  { class: "SCHEMA_COL_HANDLE" },
67567
67572
  readonly ? [] : [[
67568
67573
  "span",
67569
- { class: "icon has-text-grey" },
67574
+ { class: "icon yui-text-quiet" },
67570
67575
  [["i", { class: "yi-grip-vertical" }]]
67571
67576
  ]]
67572
67577
  ],
@@ -67581,7 +67586,7 @@ function column_row(gobj, topic, col, index, readonly, twice) {
67581
67586
  ],
67582
67587
  ambiguous ? [
67583
67588
  "span",
67584
- { class: "SCHEMA_COL_ID is-size-7 has-text-grey ml-2" },
67589
+ { class: "SCHEMA_COL_ID is-size-7 yui-text-quiet ml-2" },
67585
67590
  [[
67586
67591
  "code",
67587
67592
  {},
@@ -67923,7 +67928,7 @@ function flags_field(gobj, type, current) {
67923
67928
  return [
67924
67929
  "label",
67925
67930
  el_attrs({
67926
- class: "SCHEMA_FLAG checkbox " + (flag.meaningful ? "" : "SCHEMA_FLAG_DIM has-text-grey-light"),
67931
+ class: "SCHEMA_FLAG checkbox " + (flag.meaningful ? "" : "SCHEMA_FLAG_DIM yui-text-quiet-light"),
67927
67932
  title: flag.desc ? (0, i18next.t)(flag.desc) : "",
67928
67933
  "data-i18n-title": flag.desc || void 0
67929
67934
  }),
@@ -67945,7 +67950,7 @@ function flags_field(gobj, type, current) {
67945
67950
  [[
67946
67951
  "p",
67947
67952
  {
67948
- class: "SCHEMA_FLAG_GROUP_NAME has-text-weight-semibold has-text-grey",
67953
+ class: "SCHEMA_FLAG_GROUP_NAME has-text-weight-semibold yui-text-quiet",
67949
67954
  i18n: group.group
67950
67955
  },
67951
67956
  (0, i18next.t)(group.group)
@@ -68639,7 +68644,7 @@ function render_import_plan(gobj, plan) {
68639
68644
  { class: "SCHEMA_IMPORT_SUMMARY" },
68640
68645
  [[
68641
68646
  "p",
68642
- { class: "SCHEMA_IMPORT_COUNT is-size-7 has-text-grey mb-2" },
68647
+ { class: "SCHEMA_IMPORT_COUNT is-size-7 yui-text-quiet mb-2" },
68643
68648
  [
68644
68649
  [
68645
68650
  "span",
@@ -71174,7 +71179,7 @@ function build_days_grid(gobj, view, locale) {
71174
71179
  let d = new Date(start.getFullYear(), start.getMonth(), start.getDate() + i);
71175
71180
  $dow.push([
71176
71181
  "div",
71177
- { class: "has-text-centered is-size-7 has-text-grey YUI_PERIOD_CAL_DOW" },
71182
+ { class: "has-text-centered is-size-7 yui-text-quiet YUI_PERIOD_CAL_DOW" },
71178
71183
  new Intl.DateTimeFormat(locale, { weekday: "narrow" }).format(d)
71179
71184
  ]);
71180
71185
  }
@@ -71200,7 +71205,7 @@ function build_days_grid(gobj, view, locale) {
71200
71205
  let $wk = (0, _yuneta_gobj_js.createElement2)([
71201
71206
  "button",
71202
71207
  {
71203
- class: "button is-small is-ghost is-size-7 has-text-grey YUI_PERIOD_CAL_WEEKNUM",
71208
+ class: "button is-small is-ghost is-size-7 yui-text-quiet YUI_PERIOD_CAL_WEEKNUM",
71204
71209
  type: "button",
71205
71210
  style: "width:100%;",
71206
71211
  title: wk_name,
@@ -71218,7 +71223,7 @@ function build_days_grid(gobj, view, locale) {
71218
71223
  let ts = d.getTime();
71219
71224
  let selected = ts >= sel.from && ts <= sel.to;
71220
71225
  let $btn = cell_button(gobj, d.getDate(), ts, selected, "YUI_PERIOD_CAL_DAY", day_name.format(d));
71221
- if (d.getMonth() !== view.getMonth()) $btn.classList.add("has-text-grey-light");
71226
+ if (d.getMonth() !== view.getMonth()) $btn.classList.add("yui-text-quiet-light");
71222
71227
  if (day_number(d) === today) $btn.classList.add("has-text-weight-bold", "YUI_PERIOD_CAL_TODAY_CELL");
71223
71228
  cells.push({
71224
71229
  ts,
@@ -4415,8 +4415,13 @@ function ensure_dock_style() {
4415
4415
  background: var(--bulma-scheme-main); color: var(--bulma-text); cursor: pointer; white-space: nowrap;
4416
4416
  }
4417
4417
  .yui-dock-chip:hover { border-color: var(--bulma-text-weak); }
4418
- .yui-dock-chip.is-active { border-color: #2563eb; color: #2563eb; background: rgba(37,99,235,0.10); font-weight: 600; }
4419
- .yui-dock-chip.is-min { opacity: 0.65; }
4418
+ /* The BORDER says active, not the text: blue ink on a blue tint is
4419
+ * the same hue on itself -- 4.49:1 on the light chip, under the 4.5
4420
+ * its 12px label needs. The label takes the text colour (11:1). */
4421
+ .yui-dock-chip.is-active { border-color: #2563eb; color: var(--bulma-text, #2e333d); background: rgba(37,99,235,0.10); font-weight: 600; }
4422
+ /* A minimised window is quieter, not unreadable: 0.65 is 4.3:1 on the
4423
+ * light scheme for a 12px label. */
4424
+ .yui-dock-chip.is-min { opacity: 0.7; }
4420
4425
  .yui-dock-dot { width: 8px; height: 8px; border-radius: 50%; background: #22c55e; flex: 0 0 auto; }
4421
4426
  .yui-dock-chip.is-min .yui-dock-dot { background: var(--bulma-text-weak); }
4422
4427
  .yui-dock-icon { display: inline-flex; align-items: center; justify-content: center; width: 15px; height: 15px; font-size: 14px; flex: 0 0 auto; }
@@ -4434,7 +4439,7 @@ function ensure_dock_style() {
4434
4439
  }
4435
4440
  .yui-dock-close:hover { background: #e0364a; color: #fff; }
4436
4441
  .yui-dock-close svg { width: 11px; height: 11px; display: block; }
4437
- :root[data-theme="dark"] .yui-dock-chip.is-active { border-color: #60a5fa; color: #93c5fd; background: rgba(96,165,250,0.16); }
4442
+ :root[data-theme="dark"] .yui-dock-chip.is-active { border-color: #60a5fa; color: var(--bulma-text, #ebecf0); background: rgba(96,165,250,0.16); }
4438
4443
  `;
4439
4444
  let $style = document.createElement("style");
4440
4445
  $style.id = "yui-dock-style";
@@ -10646,7 +10651,7 @@ function yui_graph_camera_items(gobj, graph, wide) {
10646
10651
  [
10647
10652
  "span",
10648
10653
  {
10649
- class: "GRAPH_ZOOM_LEVEL is-flex is-align-items-center px-2 has-text-grey",
10654
+ class: "GRAPH_ZOOM_LEVEL is-flex is-align-items-center px-2 yui-text-quiet",
10650
10655
  style: "font-size:.85rem; min-width:3.5em; justify-content:center;",
10651
10656
  title: t("zoom level"),
10652
10657
  "data-i18n-title": "zoom level"
@@ -13422,7 +13427,7 @@ function render_graph(gobj) {
13422
13427
  $graph.appendChild(createElement2([
13423
13428
  "div",
13424
13429
  {
13425
- class: "JSON_EMPTY has-text-grey p-3",
13430
+ class: "JSON_EMPTY yui-text-quiet p-3",
13426
13431
  "data-i18n": "no data"
13427
13432
  },
13428
13433
  "no data"
@@ -13491,7 +13496,7 @@ function render_text(gobj) {
13491
13496
  $text.appendChild(createElement2([
13492
13497
  "div",
13493
13498
  {
13494
- class: "JSON_EMPTY has-text-grey p-3",
13499
+ class: "JSON_EMPTY yui-text-quiet p-3",
13495
13500
  "data-i18n": "no data"
13496
13501
  },
13497
13502
  "no data"
@@ -13535,7 +13540,7 @@ function render_tree(gobj) {
13535
13540
  $tree.appendChild(createElement2([
13536
13541
  "div",
13537
13542
  {
13538
- class: "JSON_EMPTY has-text-grey p-3",
13543
+ class: "JSON_EMPTY yui-text-quiet p-3",
13539
13544
  "data-i18n": "no data"
13540
13545
  },
13541
13546
  "no data"
@@ -13711,7 +13716,7 @@ function toggle_row(gobj, key, size, is_object, depth, path, open, value) {
13711
13716
  }
13712
13717
  body.push([
13713
13718
  "span",
13714
- { class: "JSON_SUMMARY has-text-grey" },
13719
+ { class: "JSON_SUMMARY yui-text-quiet" },
13715
13720
  summary
13716
13721
  ]);
13717
13722
  let label = container_label(value, MAX_LABEL_CHARS);
@@ -13781,7 +13786,7 @@ function leaf_row(key, value, depth) {
13781
13786
  let wall = format_epoch(value);
13782
13787
  if (wall) body.push([
13783
13788
  "span",
13784
- { class: "JSON_TIME is-size-7 has-text-grey ml-2" },
13789
+ { class: "JSON_TIME is-size-7 yui-text-quiet ml-2" },
13785
13790
  wall
13786
13791
  ]);
13787
13792
  }
@@ -15718,7 +15723,7 @@ function render_raw(gobj) {
15718
15723
  $raw.appendChild(createElement2([
15719
15724
  "div",
15720
15725
  {
15721
- class: "GCLASS_EMPTY p-4 has-text-grey",
15726
+ class: "GCLASS_EMPTY p-4 yui-text-quiet",
15722
15727
  i18n: "no data"
15723
15728
  },
15724
15729
  t("no data")
@@ -15734,7 +15739,7 @@ function render_raw(gobj) {
15734
15739
  if (dump.capped) children.push([
15735
15740
  "div",
15736
15741
  {
15737
- class: "GCLASS_RAW_CAPPED has-text-grey is-size-7 p-2",
15742
+ class: "GCLASS_RAW_CAPPED yui-text-quiet is-size-7 p-2",
15738
15743
  i18n: "text truncated"
15739
15744
  },
15740
15745
  t("text truncated")
@@ -15767,7 +15772,7 @@ function render_zones(gobj) {
15767
15772
  $zones.appendChild(createElement2([
15768
15773
  "div",
15769
15774
  {
15770
- class: "GCLASS_EMPTY p-4 has-text-grey",
15775
+ class: "GCLASS_EMPTY p-4 yui-text-quiet",
15771
15776
  i18n: "no data"
15772
15777
  },
15773
15778
  t("no data")
@@ -20954,7 +20959,7 @@ function build_body(shell, t) {
20954
20959
  ]);
20955
20960
  let $count = createElement2([
20956
20961
  "span",
20957
- { class: "ROUTEMAP_COUNT is-size-7 has-text-grey is-hidden" },
20962
+ { class: "ROUTEMAP_COUNT is-size-7 yui-text-quiet is-hidden" },
20958
20963
  [$count_n]
20959
20964
  ]);
20960
20965
  let $refs_input = createElement2(["input", {
@@ -24746,7 +24751,7 @@ function create_tabulator(gobj) {
24746
24751
  index: pkey,
24747
24752
  columns,
24748
24753
  selectableRows: selectable,
24749
- footerElement: "<span class='yui-tabulator-rowcount' style='display:block;text-align:right;font-size:0.8rem;color:#6b7280;padding:0 0.6rem;'></span>"
24754
+ footerElement: "<span class='yui-tabulator-rowcount yui-text-quiet' style='display:block;text-align:right;font-size:0.8rem;padding:0 0.6rem;'></span>"
24750
24755
  });
24751
24756
  let $view_container = gobj_read_attr(gobj, "$container");
24752
24757
  let $table_el = $view_container ? $view_container.querySelector(`#${table_id}`) : null;
@@ -24906,7 +24911,7 @@ function icon_formatter(cell) {
24906
24911
  if (!/^[a-z0-9-]+$/.test(name) || !yui_icon_is_defined(name)) return createElement2([
24907
24912
  "span",
24908
24913
  {
24909
- class: "ICON_CELL_UNKNOWN is-size-7 has-text-grey",
24914
+ class: "ICON_CELL_UNKNOWN is-size-7 yui-text-quiet",
24910
24915
  title: name
24911
24916
  },
24912
24917
  name
@@ -64446,7 +64451,7 @@ function build_graph(gobj) {
64446
64451
  let $empty = createElement2([
64447
64452
  "div",
64448
64453
  {
64449
- class: "TREEDB_SCHEMA_EMPTY p-4 has-text-grey",
64454
+ class: "TREEDB_SCHEMA_EMPTY p-4 yui-text-quiet",
64450
64455
  i18n: "no topics"
64451
64456
  },
64452
64457
  t("no topics", { defaultValue: "No topics" })
@@ -66520,7 +66525,7 @@ function build_ui$1(gobj) {
66520
66525
  ],
66521
66526
  [
66522
66527
  "div",
66523
- { class: "SCHEMA_NOTICE p-4 has-text-grey is-hidden" },
66528
+ { class: "SCHEMA_NOTICE p-4 yui-text-quiet is-hidden" },
66524
66529
  []
66525
66530
  ],
66526
66531
  [
@@ -66820,7 +66825,7 @@ function show_notice(gobj, key, detail) {
66820
66825
  ]));
66821
66826
  if (detail) $notice.appendChild(createElement2([
66822
66827
  "span",
66823
- { class: "SCHEMA_NOTICE_DETAIL has-text-grey ml-2" },
66828
+ { class: "SCHEMA_NOTICE_DETAIL yui-text-quiet ml-2" },
66824
66829
  `${detail}`
66825
66830
  ]));
66826
66831
  }
@@ -66942,7 +66947,7 @@ function render_toolbar(gobj) {
66942
66947
  }
66943
66948
  $left.push([
66944
66949
  "nav",
66945
- { class: "SCHEMA_CRUMBS is-size-7 has-text-grey ml-1" },
66950
+ { class: "SCHEMA_CRUMBS is-size-7 yui-text-quiet ml-1" },
66946
66951
  $trail
66947
66952
  ]);
66948
66953
  let $right = [];
@@ -67198,7 +67203,7 @@ function render_topics(gobj, $body) {
67198
67203
  ],
67199
67204
  ambiguous ? [
67200
67205
  "div",
67201
- { class: "SCHEMA_TOPIC_ID is-size-7 has-text-grey" },
67206
+ { class: "SCHEMA_TOPIC_ID is-size-7 yui-text-quiet" },
67202
67207
  [[
67203
67208
  "code",
67204
67209
  {},
@@ -67449,7 +67454,7 @@ function render_columns(gobj, $body) {
67449
67454
  if (topic.cols.length === 0) $wrap.appendChild(createElement2([
67450
67455
  "p",
67451
67456
  {
67452
- class: "SCHEMA_COLUMNS_EMPTY has-text-grey p-3",
67457
+ class: "SCHEMA_COLUMNS_EMPTY yui-text-quiet p-3",
67453
67458
  i18n: "this topic has no column"
67454
67459
  },
67455
67460
  t("this topic has no column")
@@ -67561,7 +67566,7 @@ function column_row(gobj, topic, col, index, readonly, twice) {
67561
67566
  { class: "SCHEMA_COL_HANDLE" },
67562
67567
  readonly ? [] : [[
67563
67568
  "span",
67564
- { class: "icon has-text-grey" },
67569
+ { class: "icon yui-text-quiet" },
67565
67570
  [["i", { class: "yi-grip-vertical" }]]
67566
67571
  ]]
67567
67572
  ],
@@ -67576,7 +67581,7 @@ function column_row(gobj, topic, col, index, readonly, twice) {
67576
67581
  ],
67577
67582
  ambiguous ? [
67578
67583
  "span",
67579
- { class: "SCHEMA_COL_ID is-size-7 has-text-grey ml-2" },
67584
+ { class: "SCHEMA_COL_ID is-size-7 yui-text-quiet ml-2" },
67580
67585
  [[
67581
67586
  "code",
67582
67587
  {},
@@ -67918,7 +67923,7 @@ function flags_field(gobj, type, current) {
67918
67923
  return [
67919
67924
  "label",
67920
67925
  el_attrs({
67921
- class: "SCHEMA_FLAG checkbox " + (flag.meaningful ? "" : "SCHEMA_FLAG_DIM has-text-grey-light"),
67926
+ class: "SCHEMA_FLAG checkbox " + (flag.meaningful ? "" : "SCHEMA_FLAG_DIM yui-text-quiet-light"),
67922
67927
  title: flag.desc ? t(flag.desc) : "",
67923
67928
  "data-i18n-title": flag.desc || void 0
67924
67929
  }),
@@ -67940,7 +67945,7 @@ function flags_field(gobj, type, current) {
67940
67945
  [[
67941
67946
  "p",
67942
67947
  {
67943
- class: "SCHEMA_FLAG_GROUP_NAME has-text-weight-semibold has-text-grey",
67948
+ class: "SCHEMA_FLAG_GROUP_NAME has-text-weight-semibold yui-text-quiet",
67944
67949
  i18n: group.group
67945
67950
  },
67946
67951
  t(group.group)
@@ -68634,7 +68639,7 @@ function render_import_plan(gobj, plan) {
68634
68639
  { class: "SCHEMA_IMPORT_SUMMARY" },
68635
68640
  [[
68636
68641
  "p",
68637
- { class: "SCHEMA_IMPORT_COUNT is-size-7 has-text-grey mb-2" },
68642
+ { class: "SCHEMA_IMPORT_COUNT is-size-7 yui-text-quiet mb-2" },
68638
68643
  [
68639
68644
  [
68640
68645
  "span",
@@ -71169,7 +71174,7 @@ function build_days_grid(gobj, view, locale) {
71169
71174
  let d = new Date(start.getFullYear(), start.getMonth(), start.getDate() + i);
71170
71175
  $dow.push([
71171
71176
  "div",
71172
- { class: "has-text-centered is-size-7 has-text-grey YUI_PERIOD_CAL_DOW" },
71177
+ { class: "has-text-centered is-size-7 yui-text-quiet YUI_PERIOD_CAL_DOW" },
71173
71178
  new Intl.DateTimeFormat(locale, { weekday: "narrow" }).format(d)
71174
71179
  ]);
71175
71180
  }
@@ -71195,7 +71200,7 @@ function build_days_grid(gobj, view, locale) {
71195
71200
  let $wk = createElement2([
71196
71201
  "button",
71197
71202
  {
71198
- class: "button is-small is-ghost is-size-7 has-text-grey YUI_PERIOD_CAL_WEEKNUM",
71203
+ class: "button is-small is-ghost is-size-7 yui-text-quiet YUI_PERIOD_CAL_WEEKNUM",
71199
71204
  type: "button",
71200
71205
  style: "width:100%;",
71201
71206
  title: wk_name,
@@ -71213,7 +71218,7 @@ function build_days_grid(gobj, view, locale) {
71213
71218
  let ts = d.getTime();
71214
71219
  let selected = ts >= sel.from && ts <= sel.to;
71215
71220
  let $btn = cell_button(gobj, d.getDate(), ts, selected, "YUI_PERIOD_CAL_DAY", day_name.format(d));
71216
- if (d.getMonth() !== view.getMonth()) $btn.classList.add("has-text-grey-light");
71221
+ if (d.getMonth() !== view.getMonth()) $btn.classList.add("yui-text-quiet-light");
71217
71222
  if (day_number(d) === today) $btn.classList.add("has-text-weight-bold", "YUI_PERIOD_CAL_TODAY_CELL");
71218
71223
  cells.push({
71219
71224
  ts,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yuneta/gobj-ui",
3
- "version": "7.23.93",
3
+ "version": "7.23.95",
4
4
  "type": "module",
5
5
  "main": "dist/gobj-ui.cjs.js",
6
6
  "module": "dist/gobj-ui.es.js",
@@ -42,9 +42,13 @@
42
42
  }
43
43
 
44
44
  /*--- readonly fields (e.g. the pkey in update mode) look readonly ---*/
45
+ /* The BACKGROUND and the cursor are what say "not editable"; the text
46
+ * is not dimmed for it. `--bulma-text-weak` on that background reads
47
+ * 4.07:1 in dark, under the 4.5 of small text -- and a value you may
48
+ * read but not change is exactly a value you have to be able to read. */
45
49
  .C_YUI_FORM input.input[readonly] {
46
50
  background-color: var(--bulma-background, #f5f5f5);
47
- color: var(--bulma-text-weak, #7a7a7a);
51
+ color: var(--bulma-text, #2e333d);
48
52
  border-color: var(--bulma-border, #dbdbdb);
49
53
  cursor: default;
50
54
  }
@@ -439,7 +439,7 @@ function render_raw(gobj)
439
439
  let description = gobj_read_attr(gobj, "description");
440
440
  if(description === null || description === undefined) {
441
441
  $raw.appendChild(createElement2(
442
- ['div', {class: 'GCLASS_EMPTY p-4 has-text-grey',
442
+ ['div', {class: 'GCLASS_EMPTY p-4 yui-text-quiet',
443
443
  i18n: 'no data'}, t("no data")]));
444
444
  return;
445
445
  }
@@ -450,7 +450,7 @@ function render_raw(gobj)
450
450
  ];
451
451
  if(dump.capped) {
452
452
  children.push(
453
- ['div', {class: 'GCLASS_RAW_CAPPED has-text-grey is-size-7 p-2',
453
+ ['div', {class: 'GCLASS_RAW_CAPPED yui-text-quiet is-size-7 p-2',
454
454
  i18n: 'text truncated'}, t("text truncated")]);
455
455
  }
456
456
  if(dump.error) {
@@ -484,7 +484,7 @@ function render_zones(gobj)
484
484
  let model = priv.model;
485
485
  if(!model) {
486
486
  $zones.appendChild(createElement2(
487
- ['div', {class: 'GCLASS_EMPTY p-4 has-text-grey',
487
+ ['div', {class: 'GCLASS_EMPTY p-4 yui-text-quiet',
488
488
  i18n: 'no data'}, t("no data")]));
489
489
  return;
490
490
  }
package/src/c_yui_json.js CHANGED
@@ -597,7 +597,7 @@ function render_graph(gobj)
597
597
  teardown_graph_child(gobj);
598
598
  $graph.textContent = "";
599
599
  $graph.appendChild(createElement2(
600
- ['div', {class: 'JSON_EMPTY has-text-grey p-3', 'data-i18n': 'no data'}, 'no data']
600
+ ['div', {class: 'JSON_EMPTY yui-text-quiet p-3', 'data-i18n': 'no data'}, 'no data']
601
601
  ));
602
602
  refresh_language($graph, t);
603
603
  return;
@@ -687,7 +687,7 @@ function render_text(gobj)
687
687
 
688
688
  if(priv.root === null || priv.root === undefined) {
689
689
  $text.appendChild(createElement2(
690
- ['div', {class: 'JSON_EMPTY has-text-grey p-3', 'data-i18n': 'no data'}, 'no data']
690
+ ['div', {class: 'JSON_EMPTY yui-text-quiet p-3', 'data-i18n': 'no data'}, 'no data']
691
691
  ));
692
692
  return;
693
693
  }
@@ -736,7 +736,7 @@ function render_tree(gobj)
736
736
 
737
737
  if(priv.root === null || priv.root === undefined) {
738
738
  $tree.appendChild(createElement2(
739
- ['div', {class: 'JSON_EMPTY has-text-grey p-3', 'data-i18n': 'no data'}, 'no data']
739
+ ['div', {class: 'JSON_EMPTY yui-text-quiet p-3', 'data-i18n': 'no data'}, 'no data']
740
740
  ));
741
741
  return;
742
742
  }
@@ -915,7 +915,7 @@ function toggle_row(gobj, key, size, is_object, depth, path, open, value)
915
915
  body.push(['span', {class: 'JSON_KEY'}, String(key)]);
916
916
  body.push(['span', {class: 'JSON_PUNCT'}, ': ']);
917
917
  }
918
- body.push(['span', {class: 'JSON_SUMMARY has-text-grey'}, summary]);
918
+ body.push(['span', {class: 'JSON_SUMMARY yui-text-quiet'}, summary]);
919
919
 
920
920
  /*
921
921
  * A dict that carries an id says WHICH one it is, right here.
@@ -977,7 +977,7 @@ function leaf_row(key, value, depth)
977
977
  if(key !== null && is_time_field(String(key))) {
978
978
  let wall = format_epoch(value);
979
979
  if(wall) {
980
- body.push(['span', {class: 'JSON_TIME is-size-7 has-text-grey ml-2'}, wall]);
980
+ body.push(['span', {class: 'JSON_TIME is-size-7 yui-text-quiet ml-2'}, wall]);
981
981
  }
982
982
  }
983
983
 
@@ -1055,7 +1055,7 @@ function build_days_grid(gobj, view, locale)
1055
1055
  }
1056
1056
  for(let i = 0; i < 7; i++) {
1057
1057
  let d = new Date(start.getFullYear(), start.getMonth(), start.getDate() + i);
1058
- $dow.push(["div", {class: "has-text-centered is-size-7 has-text-grey YUI_PERIOD_CAL_DOW"},
1058
+ $dow.push(["div", {class: "has-text-centered is-size-7 yui-text-quiet YUI_PERIOD_CAL_DOW"},
1059
1059
  new Intl.DateTimeFormat(locale, {weekday: "narrow"}).format(d)]);
1060
1060
  }
1061
1061
  $rows.push(["div", {class: "YUI_PERIOD_CAL_WEEK",
@@ -1073,7 +1073,7 @@ function build_days_grid(gobj, view, locale)
1073
1073
  let wk = iso_week(monday).week;
1074
1074
  let wk_name = t("week {{n}}", {n: wk});
1075
1075
  let $wk = createElement2(
1076
- ["button", {class: "button is-small is-ghost is-size-7 has-text-grey " +
1076
+ ["button", {class: "button is-small is-ghost is-size-7 yui-text-quiet " +
1077
1077
  "YUI_PERIOD_CAL_WEEKNUM",
1078
1078
  type: "button", style: "width:100%;",
1079
1079
  title: wk_name, "aria-label": wk_name}, String(wk)]);
@@ -1093,7 +1093,7 @@ function build_days_grid(gobj, view, locale)
1093
1093
  let $btn = cell_button(gobj, d.getDate(), ts, selected, "YUI_PERIOD_CAL_DAY",
1094
1094
  day_name.format(d));
1095
1095
  if(d.getMonth() !== view.getMonth()) {
1096
- $btn.classList.add("has-text-grey-light");
1096
+ $btn.classList.add("yui-text-quiet-light");
1097
1097
  }
1098
1098
  if(day_number(d) === today) {
1099
1099
  $btn.classList.add("has-text-weight-bold", "YUI_PERIOD_CAL_TODAY_CELL");
@@ -319,7 +319,7 @@ function build_ui(gobj)
319
319
  style: "height:100%; display:flex; flex-direction:column; min-height:0;"}, [
320
320
  ["div", {class: "SCHEMA_TOOLBAR is-flex is-align-items-center",
321
321
  style: "gap:.25rem; padding:.25rem;"}, []],
322
- ["div", {class: "SCHEMA_NOTICE p-4 has-text-grey is-hidden"}, []],
322
+ ["div", {class: "SCHEMA_NOTICE p-4 yui-text-quiet is-hidden"}, []],
323
323
  ["div", {class: "SCHEMA_BODY", style: "flex:1 1 auto; min-height:0; overflow:auto;"}, []]
324
324
  ]]
325
325
  );
@@ -721,7 +721,7 @@ function show_notice(gobj, key, detail)
721
721
  ));
722
722
  if(detail) {
723
723
  $notice.appendChild(createElement2(
724
- ["span", {class: "SCHEMA_NOTICE_DETAIL has-text-grey ml-2"}, `${detail}`]
724
+ ["span", {class: "SCHEMA_NOTICE_DETAIL yui-text-quiet ml-2"}, `${detail}`]
725
725
  ));
726
726
  }
727
727
  }
@@ -800,7 +800,7 @@ function render_toolbar(gobj)
800
800
  $trail.push(["span", {class: "SCHEMA_CRUMB_SEP"}, "/"]);
801
801
  $trail.push(["span", {class: "SCHEMA_CRUMB_DIAGRAM", i18n: "diagram"}, t("diagram")]);
802
802
  }
803
- $left.push(["nav", {class: "SCHEMA_CRUMBS is-size-7 has-text-grey ml-1"}, $trail]);
803
+ $left.push(["nav", {class: "SCHEMA_CRUMBS is-size-7 yui-text-quiet ml-1"}, $trail]);
804
804
 
805
805
  /*----------------------------------------------*
806
806
  * Right: what is legal HERE. A button that is not
@@ -1061,7 +1061,7 @@ function render_topics(gobj, $body)
1061
1061
  i18n: "system"}, t("system")]
1062
1062
  : ["span", {}, ""],
1063
1063
  ambiguous
1064
- ? ["div", {class: "SCHEMA_TOPIC_ID is-size-7 has-text-grey"},
1064
+ ? ["div", {class: "SCHEMA_TOPIC_ID is-size-7 yui-text-quiet"},
1065
1065
  [["code", {}, `${topic.id}`]]]
1066
1066
  : ["span", {}, ""]
1067
1067
  ]],
@@ -1215,7 +1215,7 @@ function render_columns(gobj, $body)
1215
1215
 
1216
1216
  if(topic.cols.length === 0) {
1217
1217
  $wrap.appendChild(createElement2(
1218
- ["p", {class: "SCHEMA_COLUMNS_EMPTY has-text-grey p-3",
1218
+ ["p", {class: "SCHEMA_COLUMNS_EMPTY yui-text-quiet p-3",
1219
1219
  i18n: "this topic has no column"}, t("this topic has no column")]
1220
1220
  ));
1221
1221
  }
@@ -1320,12 +1320,12 @@ function column_row(gobj, topic, col, index, readonly, twice)
1320
1320
  ["tr", {class: "SCHEMA_COL_ROW", "data-index": `${index}`,
1321
1321
  draggable: readonly ? "false" : "true"}, [
1322
1322
  ["td", {class: "SCHEMA_COL_HANDLE"},
1323
- readonly ? [] : [["span", {class: "icon has-text-grey"},
1323
+ readonly ? [] : [["span", {class: "icon yui-text-quiet"},
1324
1324
  [["i", {class: "yi-grip-vertical"}]]]]],
1325
1325
  ["td", {class: "SCHEMA_COL_NAME"}, [
1326
1326
  ["code", {}, `${col.name}`],
1327
1327
  ambiguous
1328
- ? ["span", {class: "SCHEMA_COL_ID is-size-7 has-text-grey ml-2"},
1328
+ ? ["span", {class: "SCHEMA_COL_ID is-size-7 yui-text-quiet ml-2"},
1329
1329
  [["code", {}, `${col.id}`]]]
1330
1330
  : ["span", {}, ""],
1331
1331
  is_pkey
@@ -1640,7 +1640,7 @@ function flags_field(gobj, type, current)
1640
1640
  for(let group of grouped_flags(type, current)) {
1641
1641
  let $boxes = group.flags.map((flag) => {
1642
1642
  return ["label", el_attrs({class: "SCHEMA_FLAG checkbox " +
1643
- (flag.meaningful ? "" : "SCHEMA_FLAG_DIM has-text-grey-light"),
1643
+ (flag.meaningful ? "" : "SCHEMA_FLAG_DIM yui-text-quiet-light"),
1644
1644
  title: flag.desc ? t(flag.desc) : "",
1645
1645
  "data-i18n-title": flag.desc || undefined}), [
1646
1646
  ["input", el_attrs({type: "checkbox", class: "SCHEMA_FLAG_BOX",
@@ -1651,7 +1651,7 @@ function flags_field(gobj, type, current)
1651
1651
  });
1652
1652
 
1653
1653
  $groups.push(["div", {class: "SCHEMA_FLAG_GROUP mb-2"}, [
1654
- ["p", {class: "SCHEMA_FLAG_GROUP_NAME has-text-weight-semibold has-text-grey",
1654
+ ["p", {class: "SCHEMA_FLAG_GROUP_NAME has-text-weight-semibold yui-text-quiet",
1655
1655
  i18n: group.group}, t(group.group)],
1656
1656
  ["div", {class: "SCHEMA_FLAG_LIST"}, $boxes]
1657
1657
  ]]);
@@ -2109,7 +2109,7 @@ function render_import_plan(gobj, plan)
2109
2109
 
2110
2110
  $pane.appendChild(createElement2(
2111
2111
  ["div", {class: "SCHEMA_IMPORT_SUMMARY"}, [
2112
- ["p", {class: "SCHEMA_IMPORT_COUNT is-size-7 has-text-grey mb-2"}, [
2112
+ ["p", {class: "SCHEMA_IMPORT_COUNT is-size-7 yui-text-quiet mb-2"}, [
2113
2113
  ["span", {i18n: "writes"}, t("writes")],
2114
2114
  ["span", {class: "ml-1"}, `${plan.writes.length}`],
2115
2115
  ["span", {class: "ml-3", i18n: "deletions"}, t("deletions")],
@@ -269,8 +269,13 @@
269
269
  .yui-nav-cards .yui-nav-card.is-active {
270
270
  border-color: var(--bulma-link-on-scheme, var(--bulma-link, #485fc7));
271
271
  }
272
+ /* Dimmed, not erased. WCAG exempts a DISABLED control from its
273
+ * contrast minimum, and half opacity is 2.85:1 in light -- but a nav
274
+ * entry you cannot reach is one you still have to be able to READ, or
275
+ * it is a door with no sign. 0.7 is 4.96 and still plainly quieter
276
+ * than a live card at 12.67. */
272
277
  .yui-nav-cards .yui-nav-card[data-disabled="1"] {
273
- opacity: 0.5;
278
+ opacity: 0.7;
274
279
  }
275
280
 
276
281
  /*--- breadcrumb: the path as one line (C_YUI_NODE's `projection.path`) ---*/
@@ -521,6 +526,46 @@
521
526
  white-space: nowrap;
522
527
  }
523
528
 
529
+ /*============================================================
530
+ * Legibility: two rules the whole library leans on
531
+ *
532
+ * A PLACEHOLDER is text, and Bulma paints it with the text
533
+ * colour at 30% alpha: 2.47:1 on the dark scheme, 1.79 on
534
+ * the light one. It is what says what a box is FOR -- the
535
+ * graph's `search`, a form's hint -- so it is written at
536
+ * 70%: 7.96 and 4.95, and plainly still secondary. The
537
+ * `opacity: 1` is for Firefox, which dims a placeholder
538
+ * again on top of its colour.
539
+ *
540
+ * And `.yui-text-quiet` is what the library uses where it
541
+ * used to say `has-text-grey`: Bulma's grey is ONE mid tone
542
+ * for both schemes (3.86:1 on the dark one), and every use
543
+ * of it in here is text somebody has to read -- an empty
544
+ * state, a timestamp, a topic id, the detail of a notice.
545
+ * The text colour at 75% is the same intent, legible.
546
+ *============================================================*/
547
+ /* Bulma declares `--bulma-input-placeholder-color` INSIDE the
548
+ * `.input, .textarea, .select` block (its `.input::placeholder` rule
549
+ * reads it there), so a `:root` override never reaches it and a bare
550
+ * `input::placeholder` loses to Bulma's class selector. The variable
551
+ * is redefined where Bulma defines it, with the alpha it should have
552
+ * had: same hue, same lightness, 0.7 instead of 0.3. */
553
+ .input,
554
+ .textarea,
555
+ .select select {
556
+ --bulma-input-placeholder-color:
557
+ hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-strong-l), 0.7);
558
+ }
559
+
560
+ input::placeholder,
561
+ textarea::placeholder {
562
+ opacity: 1; /* Firefox dims a placeholder again, on top of its colour */
563
+ }
564
+
565
+ .yui-text-quiet {
566
+ opacity: 0.75;
567
+ }
568
+
524
569
  /*============================================================
525
570
  * Toolbar — type:"avatar"
526
571
  * Circular badge populated by the host-registered provider
@@ -547,7 +547,7 @@ function build_graph(gobj)
547
547
  let data = schema_to_graph(gobj);
548
548
  if(data.nodes.length === 0) {
549
549
  let $empty = createElement2(
550
- ['div', {class: 'TREEDB_SCHEMA_EMPTY p-4 has-text-grey',
550
+ ['div', {class: 'TREEDB_SCHEMA_EMPTY p-4 yui-text-quiet',
551
551
  i18n: 'no topics'}, t('no topics', {defaultValue: 'No topics'})]
552
552
  );
553
553
  $container.appendChild($empty);
@@ -1503,9 +1503,13 @@ function create_tabulator(gobj)
1503
1503
  columns: columns,
1504
1504
  selectableRows: selectable,
1505
1505
  /* Row-count footer (updated on every data change below). */
1506
- footerElement: "<span class='yui-tabulator-rowcount' " +
1506
+ /* No colour of its own: `#6b7280` was one grey written into
1507
+ * the html for both schemes, and on the dark footer it read
1508
+ * 3.29:1. It inherits the footer's, which tabulator.css
1509
+ * themes. */
1510
+ footerElement: "<span class='yui-tabulator-rowcount yui-text-quiet' " +
1507
1511
  "style='display:block;text-align:right;font-size:0.8rem;" +
1508
- "color:#6b7280;padding:0 0.6rem;'></span>",
1512
+ "padding:0 0.6rem;'></span>",
1509
1513
  });
1510
1514
 
1511
1515
  /*
@@ -1799,7 +1803,7 @@ function icon_formatter(cell)
1799
1803
  * that mounts this table. */
1800
1804
  return createElement2([
1801
1805
  "span",
1802
- {class: "ICON_CELL_UNKNOWN is-size-7 has-text-grey", title: name},
1806
+ {class: "ICON_CELL_UNKNOWN is-size-7 yui-text-quiet", title: name},
1803
1807
  name
1804
1808
  ]);
1805
1809
  }
@@ -197,8 +197,13 @@ function ensure_dock_style()
197
197
  background: var(--bulma-scheme-main); color: var(--bulma-text); cursor: pointer; white-space: nowrap;
198
198
  }
199
199
  .yui-dock-chip:hover { border-color: var(--bulma-text-weak); }
200
- .yui-dock-chip.is-active { border-color: #2563eb; color: #2563eb; background: rgba(37,99,235,0.10); font-weight: 600; }
201
- .yui-dock-chip.is-min { opacity: 0.65; }
200
+ /* The BORDER says active, not the text: blue ink on a blue tint is
201
+ * the same hue on itself -- 4.49:1 on the light chip, under the 4.5
202
+ * its 12px label needs. The label takes the text colour (11:1). */
203
+ .yui-dock-chip.is-active { border-color: #2563eb; color: var(--bulma-text, #2e333d); background: rgba(37,99,235,0.10); font-weight: 600; }
204
+ /* A minimised window is quieter, not unreadable: 0.65 is 4.3:1 on the
205
+ * light scheme for a 12px label. */
206
+ .yui-dock-chip.is-min { opacity: 0.7; }
202
207
  .yui-dock-dot { width: 8px; height: 8px; border-radius: 50%; background: #22c55e; flex: 0 0 auto; }
203
208
  .yui-dock-chip.is-min .yui-dock-dot { background: var(--bulma-text-weak); }
204
209
  .yui-dock-icon { display: inline-flex; align-items: center; justify-content: center; width: 15px; height: 15px; font-size: 14px; flex: 0 0 auto; }
@@ -216,7 +221,7 @@ function ensure_dock_style()
216
221
  }
217
222
  .yui-dock-close:hover { background: #e0364a; color: #fff; }
218
223
  .yui-dock-close svg { width: 11px; height: 11px; display: block; }
219
- :root[data-theme="dark"] .yui-dock-chip.is-active { border-color: #60a5fa; color: #93c5fd; background: rgba(96,165,250,0.16); }
224
+ :root[data-theme="dark"] .yui-dock-chip.is-active { border-color: #60a5fa; color: var(--bulma-text, #ebecf0); background: rgba(96,165,250,0.16); }
220
225
  `;
221
226
  let $style = document.createElement('style');
222
227
  $style.id = 'yui-dock-style';
@@ -177,6 +177,17 @@ a.ROUTEMAP_LINK .ROUTEMAP_NAME {
177
177
  background: rgba(120, 150, 255, 0.16) !important;
178
178
  outline-color: rgba(120, 150, 255, 0.55);
179
179
  }
180
+ /* On the row you are ON, the route leaves the blue.
181
+ *
182
+ * The tint that marks the row and the ink of a route are the SAME
183
+ * HUE, so the ink lands on its own colour: 3.95:1 in light (the row
184
+ * is a saturated `--bulma-link-light`) and 4.42 in dark. The row is
185
+ * already marked by that tint and its outline, so the blue says
186
+ * nothing there -- and the NAME beside it has always been written
187
+ * in the text colour, at 5.89 and 6.59. The route joins it. */
188
+ .ROUTEMAP_CURRENT .ROUTEMAP_ROUTE {
189
+ color: var(--bulma-text, #2e333d);
190
+ }
180
191
  /*--- reference row: this route's subtree is drawn where the nav owns
181
192
  * it, so the copy reachable from a drawer or the account menu is a
182
193
  * live link without the repeated branch. Quiet on purpose: it is a
@@ -268,7 +268,7 @@ function build_body(shell, t)
268
268
  * every keystroke, is what repaints it. */
269
269
  let $count_n = createElement2(["span", {class: "ROUTEMAP_COUNT_N"}, ""]);
270
270
  let $count = createElement2(
271
- ["span", {class: "ROUTEMAP_COUNT is-size-7 has-text-grey is-hidden"},
271
+ ["span", {class: "ROUTEMAP_COUNT is-size-7 yui-text-quiet is-hidden"},
272
272
  [$count_n]]
273
273
  );
274
274
  /* References are hidden by default and revealed by this toggle.
package/src/tabulator.css CHANGED
@@ -227,9 +227,16 @@
227
227
  border-color: var(--bulma-link-on-scheme, var(--bulma-link, #4a9eff));
228
228
  }
229
229
 
230
- [data-theme=dark] .tabulator-row .tabulator-cell.tabulator-editing input::placeholder,
231
- [data-theme=dark] .tabulator .tabulator-header .tabulator-header-filter input::placeholder {
232
- color: var(--bulma-text-weak, #8a8f98);
230
+ /* Tabulator's inputs are bare `input`s, so Bulma's placeholder colour
231
+ * never reaches them: in the light scheme they were left at the
232
+ * BROWSER's default (3.09:1) and in the dark one they were painted
233
+ * with `--bulma-text-weak` (4.07). One rule for every scheme, the same
234
+ * 70% of the text colour the rest of the library uses -- `filter
235
+ * column…` is what says what that box does. */
236
+ .tabulator-row .tabulator-cell.tabulator-editing input::placeholder,
237
+ .tabulator .tabulator-header .tabulator-header-filter input::placeholder {
238
+ color: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-strong-l), 0.7);
239
+ opacity: 1;
233
240
  }
234
241
 
235
242
  /* ====================================================================
@@ -375,10 +382,6 @@
375
382
  caret-color: var(--bulma-text-strong, #f5f6f7);
376
383
  border-color: var(--bulma-link-on-scheme, var(--bulma-link, #4a9eff));
377
384
  }
378
- [data-theme=system] .tabulator-row .tabulator-cell.tabulator-editing input::placeholder,
379
- [data-theme=system] .tabulator .tabulator-header .tabulator-header-filter input::placeholder {
380
- color: var(--bulma-text-weak, #8a8f98);
381
- }
382
385
  /* same furniture-not-editor rule as [data-theme=dark] above */
383
386
  [data-theme=system] .tabulator .tabulator-header .tabulator-col .tabulator-header-filter input,
384
387
  [data-theme=system] .tabulator .tabulator-header .tabulator-col .tabulator-header-filter select {
@@ -110,7 +110,7 @@ export function yui_graph_camera_items(gobj, graph, wide)
110
110
  return [
111
111
  camera_button(gobj, "yi-magnifying-glass-plus", "EV_ZOOM_IN", "zoom in", wide),
112
112
  camera_button(gobj, "yi-magnifying-glass-minus", "EV_ZOOM_OUT", "zoom out", wide),
113
- ['span', {class: 'GRAPH_ZOOM_LEVEL is-flex is-align-items-center px-2 has-text-grey',
113
+ ['span', {class: 'GRAPH_ZOOM_LEVEL is-flex is-align-items-center px-2 yui-text-quiet',
114
114
  style: 'font-size:.85rem; min-width:3.5em; justify-content:center;',
115
115
  title: t('zoom level'), 'data-i18n-title': 'zoom level'},
116
116
  yui_graph_zoom_text(graph)],