@yuneta/gobj-ui 7.23.52 → 7.23.54

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.
@@ -6356,6 +6356,7 @@ var attrs_table$16 = [
6356
6356
  (0, _yuneta_gobj_js.SDATA)(_yuneta_gobj_js.data_type_t.DTP_STRING, "pkey", 0, "id", "Primary key field name, used by form_mode"),
6357
6357
  (0, _yuneta_gobj_js.SDATA)(_yuneta_gobj_js.data_type_t.DTP_STRING, "topic_name", 0, "", "Treedb topic name: labels use the i18n cascade '<topic>.<col>' -> '<col>' -> header (like table headers)"),
6358
6358
  (0, _yuneta_gobj_js.SDATA)(_yuneta_gobj_js.data_type_t.DTP_BOOLEAN, "editable", 0, false, "Default is editable, set false to readonly"),
6359
+ (0, _yuneta_gobj_js.SDATA)(_yuneta_gobj_js.data_type_t.DTP_BOOLEAN, "readonly", 0, false, "Show EVERY field read-only, whatever its schema says: a record being LOOKED at, not edited. Independent of `editable`, which drives the TABLE rendering; this one drives the FORM"),
6359
6360
  (0, _yuneta_gobj_js.SDATA)(_yuneta_gobj_js.data_type_t.DTP_BOOLEAN, "selectable", 0, true, "Rows selectable with 'click' (BAD with editable=true)"),
6360
6361
  (0, _yuneta_gobj_js.SDATA)(_yuneta_gobj_js.data_type_t.DTP_BOOLEAN, "with_checkbox", 0, false, "Show a first column with checkbox to select rows"),
6361
6362
  (0, _yuneta_gobj_js.SDATA)(_yuneta_gobj_js.data_type_t.DTP_BOOLEAN, "with_rownum", 0, false, "Print first column with row number"),
@@ -6759,7 +6760,7 @@ function build_form_field_conf(gobj, field_desc) {
6759
6760
  placeholder: "",
6760
6761
  options: [],
6761
6762
  extras: {},
6762
- readonly: !field_desc.is_writable,
6763
+ readonly: (0, _yuneta_gobj_js.gobj_read_bool_attr)(gobj, "readonly") || !field_desc.is_writable,
6763
6764
  required: field_desc.is_required,
6764
6765
  hidden: field_desc.is_hidden,
6765
6766
  default_value: field_desc.default_value
@@ -6811,6 +6812,7 @@ function build_form_field_conf(gobj, field_desc) {
6811
6812
  field_conf.options = get_fkey_select_options(gobj, field_desc);
6812
6813
  break;
6813
6814
  case "image":
6815
+ case "icon":
6814
6816
  case "string":
6815
6817
  field_conf.tag = "input";
6816
6818
  field_conf.inputType = "text";
@@ -7728,6 +7730,7 @@ function template2columns(gobj, columns, template, sub_elements) {
7728
7730
  case "hook": break;
7729
7731
  case "fkey": break;
7730
7732
  case "image":
7733
+ case "icon":
7731
7734
  case "string":
7732
7735
  column.editor = "input";
7733
7736
  column.editorParams = {
@@ -8166,6 +8169,7 @@ function treedb_value_2_form_value(gobj, field_desc, value) {
8166
8169
  case "date":
8167
8170
  case "color":
8168
8171
  case "image":
8172
+ case "icon":
8169
8173
  case "tel":
8170
8174
  case "template":
8171
8175
  case "table":
@@ -8258,6 +8262,7 @@ function form_value_2_treedb_value(gobj, field_desc, value) {
8258
8262
  case "date":
8259
8263
  case "color":
8260
8264
  case "image":
8265
+ case "icon":
8261
8266
  case "tel": break;
8262
8267
  case "template":
8263
8268
  if ((0, _yuneta_gobj_js.is_string)(value)) try {
@@ -22658,6 +22663,182 @@ function yui_table_filter_clear(table) {
22658
22663
  });
22659
22664
  }
22660
22665
  //#endregion
22666
+ //#region src/lib_icons.js
22667
+ /*********************************************************
22668
+ * lib_icons.js
22669
+ *
22670
+ * Two icon systems are managed here:
22671
+ *
22672
+ * 1. FA-style CSS icons (yui_icons.css)
22673
+ * Usage: <i class="yi-save"></i>
22674
+ * Color: inherits currentColor from parent via CSS mask.
22675
+ *
22676
+ * 2. SVG symbol icons for G6 toolbar (and any other component
22677
+ * that uses <use xlink:href="#id">).
22678
+ * Symbols are injected once into the DOM.
22679
+ * All symbol ids are prefixed with "g6-icon-" to avoid
22680
+ * conflicts with other DOM elements.
22681
+ * Icon paths come from:
22682
+ * fontawesome-free-7.1.0-web/sprites/solid.svg
22683
+ *
22684
+ * G6 toolbar items are managed via CSS class names (className
22685
+ * field in getItems()) using YuiToolbar in c_g6_nodes_tree.js.
22686
+ * This lets lib_graph.js state functions (set_submit_state,
22687
+ * disableElements, …) work on toolbar icons exactly like on
22688
+ * regular Bulma/FA buttons — no icon-specific helpers needed.
22689
+ *
22690
+ * Copyright (c) 2025-2026, ArtGins.
22691
+ * All Rights Reserved.
22692
+ *********************************************************/
22693
+ var CUSTOM_SVG_ICONS_ID = "g6-custom-svgicons";
22694
+ var ICONS = `<svg xmlns="http://www.w3.org/2000/svg">
22695
+ <!-- magnifying-glass-plus -->
22696
+ <symbol id="g6-icon-zoom-in" viewBox="0 0 512 512">
22697
+ <path fill="currentColor" d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376C296.3 401.1 253.9 416 208 416 93.1 416 0 322.9 0 208S93.1 0 208 0 416 93.1 416 208zM208 112c-13.3 0-24 10.7-24 24l0 48-48 0c-13.3 0-24 10.7-24 24s10.7 24 24 24l48 0 0 48c0 13.3 10.7 24 24 24s24-10.7 24-24l0-48 48 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-48 0 0-48c0-13.3-10.7-24-24-24z"/>
22698
+ </symbol>
22699
+ <!-- magnifying-glass-minus -->
22700
+ <symbol id="g6-icon-zoom-out" viewBox="0 0 512 512">
22701
+ <path fill="currentColor" d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376C296.3 401.1 253.9 416 208 416 93.1 416 0 322.9 0 208S93.1 0 208 0 416 93.1 416 208zM136 184c-13.3 0-24 10.7-24 24s10.7 24 24 24l144 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-144 0z"/>
22702
+ </symbol>
22703
+ <!-- house (reset zoom: back to original 100% view) -->
22704
+ <symbol id="g6-icon-home" viewBox="0 0 512 512">
22705
+ <path fill="currentColor" d="M277.8 8.6c-12.3-11.4-31.3-11.4-43.5 0l-224 208c-9.6 9-12.8 22.9-8 35.1S18.8 272 32 272l16 0 0 176c0 35.3 28.7 64 64 64l288 0c35.3 0 64-28.7 64-64l0-176 16 0c13.2 0 25-8.1 29.8-20.3s1.6-26.2-8-35.1l-224-208zM240 320l32 0c26.5 0 48 21.5 48 48l0 96-128 0 0-96c0-26.5 21.5-48 48-48z"/>
22706
+ </symbol>
22707
+ <!-- expand (zoom to fit) -->
22708
+ <symbol id="g6-icon-fit" viewBox="0 0 448 512">
22709
+ <path fill="currentColor" d="M32 32C14.3 32 0 46.3 0 64l0 96c0 17.7 14.3 32 32 32s32-14.3 32-32l0-64 64 0c17.7 0 32-14.3 32-32s-14.3-32-32-32L32 32zM64 352c0-17.7-14.3-32-32-32S0 334.3 0 352l0 96c0 17.7 14.3 32 32 32l96 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-64 0 0-64zM320 32c-17.7 0-32 14.3-32 32s14.3 32 32 32l64 0 0 64c0 17.7 14.3 32 32 32s32-14.3 32-32l0-96c0-17.7-14.3-32-32-32l-96 0zM448 352c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 64-64 0c-17.7 0-32 14.3-32 32s14.3 32 32 32l96 0c17.7 0 32-14.3 32-32l0-96z"/>
22710
+ </symbol>
22711
+ <!-- fit to selection: the same corner brackets as the fit icon,
22712
+ around a marked object. The two sit side by side in the
22713
+ toolbar and have to read as a family, which a borrowed glyph
22714
+ would not. (No backticks in here: the sprite lives inside a
22715
+ template literal.) -->
22716
+ <symbol id="g6-icon-fit-selection" viewBox="0 0 448 512">
22717
+ <path fill="currentColor" d="M32 32C14.3 32 0 46.3 0 64l0 96c0 17.7 14.3 32 32 32s32-14.3 32-32l0-64 64 0c17.7 0 32-14.3 32-32s-14.3-32-32-32L32 32zM64 352c0-17.7-14.3-32-32-32S0 334.3 0 352l0 96c0 17.7 14.3 32 32 32l96 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-64 0 0-64zM320 32c-17.7 0-32 14.3-32 32s14.3 32 32 32l64 0 0 64c0 17.7 14.3 32 32 32s32-14.3 32-32l0-96c0-17.7-14.3-32-32-32l-96 0zM448 352c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 64-64 0c-17.7 0-32 14.3-32 32s14.3 32 32 32l96 0c17.7 0 32-14.3 32-32l0-96z"/>
22718
+ <rect fill="currentColor" x="144" y="176" width="160" height="160" rx="24"/>
22719
+ </symbol>
22720
+ <!-- crosshairs (center) -->
22721
+ <symbol id="g6-icon-center" viewBox="0 0 576 512">
22722
+ <path fill="currentColor" d="M288-16c17.7 0 32 14.3 32 32l0 18.3c98.1 14 175.7 91.6 189.7 189.7l18.3 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-18.3 0c-14 98.1-91.6 175.7-189.7 189.7l0 18.3c0 17.7-14.3 32-32 32s-32-14.3-32-32l0-18.3C157.9 463.7 80.3 386.1 66.3 288L48 288c-17.7 0-32-14.3-32-32s14.3-32 32-32l18.3 0C80.3 125.9 157.9 48.3 256 34.3L256 16c0-17.7 14.3-32 32-32zM131.2 288c12.7 62.7 62.1 112.1 124.8 124.8l0-12.8c0-17.7 14.3-32 32-32s32 14.3 32 32l0 12.8c62.7-12.7 112.1-62.1 124.8-124.8L432 288c-17.7 0-32-14.3-32-32s14.3-32 32-32l12.8 0C432.1 161.3 382.7 111.9 320 99.2l0 12.8c0 17.7-14.3 32-32 32s-32-14.3-32-32l0-12.8C193.3 111.9 143.9 161.3 131.2 224l12.8 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-12.8 0zM288 208a48 48 0 1 1 0 96 48 48 0 1 1 0-96z"/>
22723
+ </symbol>
22724
+ <!-- up-right-and-down-left-from-center (enter fullscreen) -->
22725
+ <symbol id="g6-icon-fullscreen" viewBox="0 0 512 512">
22726
+ <path fill="currentColor" d="M344 0L488 0c13.3 0 24 10.7 24 24l0 144c0 9.7-5.8 18.5-14.8 22.2s-19.3 1.7-26.2-5.2l-39-39-87 87c-9.4 9.4-24.6 9.4-33.9 0l-32-32c-9.4-9.4-9.4-24.6 0-33.9l87-87-39-39c-6.9-6.9-8.9-17.2-5.2-26.2S334.3 0 344 0zM168 512L24 512c-13.3 0-24-10.7-24-24L0 344c0-9.7 5.8-18.5 14.8-22.2S34.1 320.2 41 327l39 39 87-87c9.4-9.4 24.6-9.4 33.9 0l32 32c9.4 9.4 9.4 24.6 0 33.9l-87 87 39 39c6.9 6.9 8.9 17.2 5.2 26.2S177.7 512 168 512z"/>
22727
+ </symbol>
22728
+ <!-- down-left-and-up-right-to-center (exit fullscreen) -->
22729
+ <symbol id="g6-icon-fullscreen-exit" viewBox="0 0 512 512">
22730
+ <path fill="currentColor" d="M439.5 7c9.4-9.4 24.6-9.4 33.9 0l32 32c9.4 9.4 9.4 24.6 0 33.9l-87 87 39 39c6.9 6.9 8.9 17.2 5.2 26.2S450.2 240 440.5 240l-144 0c-13.3 0-24-10.7-24-24l0-144c0-9.7 5.8-18.5 14.8-22.2s19.3-1.7 26.2 5.2l39 39 87-87zM72.5 272l144 0c13.3 0 24 10.7 24 24l0 144c0 9.7-5.8 18.5-14.8 22.2s-19.3 1.7-26.2-5.2l-39-39-87 87c-9.4 9.4-24.6 9.4-33.9 0l-32-32c-9.4-9.4-9.4-24.6 0-33.9l87-87-39-39c-6.9-6.9-8.9-17.2-5.2-26.2S62.8 272 72.5 272z"/>
22731
+ </symbol>
22732
+ <!-- arrow-rotate-left (undo) -->
22733
+ <symbol id="g6-icon-undo" viewBox="0 0 512 512">
22734
+ <path fill="currentColor" d="M256 64c-56.8 0-107.9 24.7-143.1 64l47.1 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 192c-17.7 0-32-14.3-32-32L0 32C0 14.3 14.3 0 32 0S64 14.3 64 32l0 54.7C110.9 33.6 179.5 0 256 0 397.4 0 512 114.6 512 256S397.4 512 256 512c-87 0-163.9-43.4-210.1-109.7-10.1-14.5-6.6-34.4 7.9-44.6s34.4-6.6 44.6 7.9c34.8 49.8 92.4 82.3 157.6 82.3 106 0 192-86 192-192S362 64 256 64z"/>
22735
+ </symbol>
22736
+ <!-- arrow-rotate-right (redo) -->
22737
+ <symbol id="g6-icon-redo" viewBox="0 0 512 512">
22738
+ <path fill="currentColor" d="M436.7 74.7L448 85.4 448 32c0-17.7 14.3-32 32-32s32 14.3 32 32l0 128c0 17.7-14.3 32-32 32l-128 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l47.9 0-7.6-7.2c-.2-.2-.4-.4-.6-.6-75-75-196.5-75-271.5 0s-75 196.5 0 271.5 196.5 75 271.5 0c8.2-8.2 15.5-16.9 21.9-26.1 10.1-14.5 30.1-18 44.6-7.9s18 30.1 7.9 44.6c-8.5 12.2-18.2 23.8-29.1 34.7-100 100-262.1 100-362 0S-25 175 75 75c99.9-99.9 261.7-100 361.7-.3z"/>
22739
+ </symbol>
22740
+ <!-- pen (edit node) -->
22741
+ <symbol id="g6-icon-edit" viewBox="0 0 512 512">
22742
+ <path fill="currentColor" d="M352.9 21.2L308 66.1 445.9 204 490.8 159.1C504.4 145.6 512 127.2 512 108s-7.6-37.6-21.2-51.1L455.1 21.2C441.6 7.6 423.2 0 404 0s-37.6 7.6-51.1 21.2zM274.1 100L58.9 315.1c-10.7 10.7-18.5 24.1-22.6 38.7L.9 481.6c-2.3 8.3 0 17.3 6.2 23.4s15.1 8.5 23.4 6.2l127.8-35.5c14.6-4.1 27.9-11.8 38.7-22.6L412 237.9 274.1 100z"/>
22743
+ </symbol>
22744
+ <!-- trash-can (delete) -->
22745
+ <symbol id="g6-icon-delete" viewBox="0 0 448 512">
22746
+ <path fill="currentColor" d="M136.7 5.9C141.1-7.2 153.3-16 167.1-16l113.9 0c13.8 0 26 8.8 30.4 21.9L320 32 416 32c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 96C14.3 96 0 81.7 0 64S14.3 32 32 32l96 0 8.7-26.1zM32 144l384 0 0 304c0 35.3-28.7 64-64 64L96 512c-35.3 0-64-28.7-64-64l0-304zm88 64c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24zm104 0c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24zm104 0c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24z"/>
22747
+ </symbol>
22748
+ <!-- link (link nodes) -->
22749
+ <symbol id="g6-icon-link" viewBox="0 0 576 512">
22750
+ <path fill="currentColor" d="M419.5 96c-16.6 0-32.7 4.5-46.8 12.7-15.8-16-34.2-29.4-54.5-39.5 28.2-24 64.1-37.2 101.3-37.2 86.4 0 156.5 70 156.5 156.5 0 41.5-16.5 81.3-45.8 110.6l-71.1 71.1c-29.3 29.3-69.1 45.8-110.6 45.8-86.4 0-156.5-70-156.5-156.5 0-1.5 0-3 .1-4.5 .5-17.7 15.2-31.6 32.9-31.1s31.6 15.2 31.1 32.9c0 .9 0 1.8 0 2.6 0 51.1 41.4 92.5 92.5 92.5 24.5 0 48-9.7 65.4-27.1l71.1-71.1c17.3-17.3 27.1-40.9 27.1-65.4 0-51.1-41.4-92.5-92.5-92.5zM275.2 173.3c-1.9-.8-3.8-1.9-5.5-3.1-12.6-6.5-27-10.2-42.1-10.2-24.5 0-48 9.7-65.4 27.1L91.1 258.2c-17.3 17.3-27.1 40.9-27.1 65.4 0 51.1 41.4 92.5 92.5 92.5 16.5 0 32.6-4.4 46.7-12.6 15.8 16 34.2 29.4 54.6 39.5-28.2 23.9-64 37.2-101.3 37.2-86.4 0-156.5-70-156.5-156.5 0-41.5 16.5-81.3 45.8-110.6l71.1-71.1c29.3-29.3 69.1-45.8 110.6-45.8 86.6 0 156.5 70.6 156.5 156.9 0 1.3 0 2.6 0 3.9-.4 17.7-15.1 31.6-32.8 31.2s-31.6-15.1-31.2-32.8c0-.8 0-1.5 0-2.3 0-33.7-18-63.3-44.8-79.6z"/>
22751
+ </symbol>
22752
+ <!-- link-slash (unlink) -->
22753
+ <symbol id="g6-icon-unlink" viewBox="0 0 576 512">
22754
+ <path fill="currentColor" d="M41-24.9c-9.4-9.4-24.6-9.4-33.9 0S-2.3-.3 7 9.1l528 528c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-122-122c4.2-3.4 8.3-7.1 12.1-10.9l71.1-71.1c29.3-29.3 45.8-69.1 45.8-110.6 0-86.4-70-156.5-156.5-156.5-37.3 0-73.1 13.3-101.3 37.2 20.3 10.1 38.7 23.5 54.5 39.5 14.1-8.3 30.2-12.7 46.8-12.7 51.1 0 92.5 41.4 92.5 92.5 0 24.5-9.7 48-27.1 65.4l-71.1 71.1c-3.9 3.9-8.1 7.4-12.6 10.5l-47.5-47.5c16.5-.9 29.7-14.4 30.2-31.1 0-1.3 0-2.6 0-3.9 0-86.3-69.9-156.9-156.5-156.9-19.2 0-37.9 3.5-55.5 10.2L41-24.9zM225.9 160c.6 0 1.1 0 1.7 0 15.1 0 29.5 3.7 42.1 10.2 1.8 1.2 3.6 2.3 5.5 3.1 26.8 16.3 44.8 45.9 44.8 79.6 0 .4 0 .8 0 1.2L225.9 160zM346.2 416L192 261.8c1.2 84.6 69.6 152.9 154.1 154.1zM139.7 209.5l-45.3-45.3-48.6 48.6c-29.3 29.3-45.8 69.1-45.8 110.6 0 86.4 70 156.5 156.5 156.5 37.2 0 73.1-13.3 101.3-37.2-20.3-10.1-38.8-23.5-54.6-39.5-14 8.2-30.1 12.6-46.7 12.6-51.1 0-92.5-41.4-92.5-92.5 0-24.5 9.7-48 27.1-65.4l48.6-48.6z"/>
22755
+ </symbol>
22756
+ <!-- play (run node) -->
22757
+ <symbol id="g6-icon-run" viewBox="0 0 448 512">
22758
+ <path fill="currentColor" d="M91.2 36.9c-12.4-6.8-27.4-6.5-39.6 .7S32 57.9 32 72l0 368c0 14.1 7.5 27.2 19.6 34.4s27.2 7.5 39.6 .7l336-184c12.8-7 20.8-20.5 20.8-35.1s-8-28.1-20.8-35.1l-336-184z"/>
22759
+ </symbol>
22760
+ <!-- clone (copy size to other nodes/ports) -->
22761
+ <symbol id="g6-icon-resize" viewBox="0 0 512 512">
22762
+ <path fill="currentColor" d="M288 448l-224 0 0-224 48 0 0-64-48 0c-35.3 0-64 28.7-64 64L0 448c0 35.3 28.7 64 64 64l224 0c35.3 0 64-28.7 64-64l0-48-64 0 0 48zm-64-96l224 0c35.3 0 64-28.7 64-64l0-224c0-35.3-28.7-64-64-64L224 0c-35.3 0-64 28.7-64 64l0 224c0 35.3 28.7 64 64 64z"/>
22763
+ </symbol>
22764
+ <!-- plus (create node). Deliberately NOT the FA7 solid plus:
22765
+ its arms are ~14% of the width and read thin next to the
22766
+ other solid glyphs. Bold geometric plus (~23% arm
22767
+ thickness) with long arms (32..480) so it reads as a "+",
22768
+ not a stubby Red-Cross square. -->
22769
+ <symbol id="g6-icon-plus" viewBox="0 0 512 512">
22770
+ <path fill="currentColor" d="M316 32 L316 196 L480 196 L480 316 L316 316 L316 480 L196 480 L196 316 L32 316 L32 196 L196 196 L196 32 Z"/>
22771
+ </symbol>
22772
+ <!-- ellipsis-vertical (unfold the floating toolbar).
22773
+ The strip it stands for is a vertical stack, and a vertical
22774
+ ellipsis is what "there is more of this here" is drawn as
22775
+ everywhere else. -->
22776
+ <symbol id="g6-icon-toolbar-show" viewBox="0 0 128 512">
22777
+ <path fill="currentColor" d="M64 360a56 56 0 1 0 0 112 56 56 0 1 0 0-112zm0-160a56 56 0 1 0 0 112 56 56 0 1 0 0-112zM120 96A56 56 0 1 0 8 96a56 56 0 1 0 112 0z"/>
22778
+ </symbol>
22779
+ <!-- xmark (fold the floating toolbar away).
22780
+ Not a chevron: the two toolbars sit on OPPOSITE edges, so a
22781
+ direction would point the wrong way on one of them. What the
22782
+ button does is close an overlay, and that is an x. -->
22783
+ <symbol id="g6-icon-toolbar-hide" viewBox="0 0 384 512">
22784
+ <path fill="currentColor" d="M342.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 210.7 86.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L146.7 256 41.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192 301.3 297.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.3 256 342.6 150.6z"/>
22785
+ </symbol>
22786
+ <!-- dashed marquee (selection mode).
22787
+ The band ITSELF, because that is what the button turns on: a
22788
+ drag on the canvas draws one and a tap picks a card. Not the
22789
+ fit-to-selection glyph next to it in the other toolbar -- that
22790
+ one is solid brackets around a solid object and means "put the
22791
+ camera on what is picked", which is the opposite end of the
22792
+ gesture. Dashes: 16 segments of 59 with gaps of 36 over a
22793
+ perimeter of 1520, so they land on the corners. -->
22794
+ <symbol id="g6-icon-select-mode" viewBox="0 0 512 512">
22795
+ <rect x="46" y="86" width="420" height="340" fill="none"
22796
+ stroke="currentColor" stroke-width="40"
22797
+ stroke-dasharray="59 36"/>
22798
+ </symbol>
22799
+ <!-- location-crosshairs (anchor the camera on one element).
22800
+ The SAME path as the DOM toolbars and their yi-location-crosshairs
22801
+ mask: the two toolbars sit in one console, and a control that
22802
+ does one thing has to be drawn one way. -->
22803
+ <symbol id="g6-icon-anchor" viewBox="0 0 576 512">
22804
+ <path fill="currentColor" d="M288-16c17.7 0 32 14.3 32 32l0 18.3c98.1 14 175.7 91.6 189.7 189.7l18.3 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-18.3 0c-14 98.1-91.6 175.7-189.7 189.7l0 18.3c0 17.7-14.3 32-32 32s-32-14.3-32-32l0-18.3C157.9 463.7 80.3 386.1 66.3 288L48 288c-17.7 0-32-14.3-32-32s14.3-32 32-32l18.3 0C80.3 125.9 157.9 48.3 256 34.3L256 16c0-17.7 14.3-32 32-32zM128 256a160 160 0 1 0 320 0 160 160 0 1 0 -320 0zm160-96a96 96 0 1 1 0 192 96 96 0 1 1 0-192z"/>
22805
+ </symbol>
22806
+ <!-- floppy-disk (save) -->
22807
+ <symbol id="g6-icon-save" viewBox="0 0 448 512">
22808
+ <path fill="currentColor" d="M64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-242.7c0-17-6.7-33.3-18.7-45.3L352 50.7C340 38.7 323.7 32 306.7 32L64 32zm32 96c0-17.7 14.3-32 32-32l160 0c17.7 0 32 14.3 32 32l0 64c0 17.7-14.3 32-32 32l-160 0c-17.7 0-32-14.3-32-32l0-64zM224 288a64 64 0 1 1 0 128 64 64 0 1 1 0-128z"/>
22809
+ </symbol>
22810
+ </svg>`;
22811
+ function inject_svg_icons() {
22812
+ if (document.getElementById(CUSTOM_SVG_ICONS_ID)) return;
22813
+ const div = document.createElement("div");
22814
+ div.id = CUSTOM_SVG_ICONS_ID;
22815
+ div.style.display = "none";
22816
+ div.innerHTML = ICONS;
22817
+ document.body.appendChild(div);
22818
+ }
22819
+ var __icon_defined__ = {};
22820
+ function yui_icon_is_defined(name) {
22821
+ if (!name || typeof name !== "string") return false;
22822
+ if (__icon_defined__[name] !== void 0) return __icon_defined__[name];
22823
+ let defined = false;
22824
+ try {
22825
+ const el = document.createElement("i");
22826
+ el.className = name;
22827
+ el.style.position = "absolute";
22828
+ el.style.visibility = "hidden";
22829
+ el.style.pointerEvents = "none";
22830
+ document.body.appendChild(el);
22831
+ const st = window.getComputedStyle(el, "::before");
22832
+ const mask = st.maskImage || st.webkitMaskImage || "";
22833
+ defined = !!mask && mask !== "none";
22834
+ document.body.removeChild(el);
22835
+ } catch (e) {
22836
+ defined = false;
22837
+ }
22838
+ __icon_defined__[name] = defined;
22839
+ return defined;
22840
+ }
22841
+ //#endregion
22661
22842
  //#region src/yui_row_search.js
22662
22843
  /***********************************************************************
22663
22844
  * yui_row_search.js
@@ -23738,6 +23919,11 @@ function create_tabulator(gobj) {
23738
23919
  hozAlign = "center";
23739
23920
  colFormatter = "color";
23740
23921
  break;
23922
+ case "icon":
23923
+ hozAlign = "center";
23924
+ vertAlign = "middle";
23925
+ colFormatter = icon_formatter;
23926
+ break;
23741
23927
  case "object":
23742
23928
  case "dict":
23743
23929
  case "template":
@@ -23941,6 +24127,13 @@ function create_tabulator(gobj) {
23941
24127
  tabulator.on("dataFiltered", function(filters, rows) {
23942
24128
  update_rowcount(Array.isArray(rows) ? rows.length : void 0);
23943
24129
  });
24130
+ tabulator.on("rowClick", function(e, row) {
24131
+ if ((0, _yuneta_gobj_js.gobj_read_bool_attr)(gobj, "editable")) return;
24132
+ let $cell = e.target ? e.target.closest(".tabulator-cell") : null;
24133
+ let field = $cell ? $cell.getAttribute("tabulator-field") : null;
24134
+ if (field && cell_has_its_own_action(gobj, field)) return;
24135
+ (0, _yuneta_gobj_js.gobj_send_event)(gobj, "EV_SHOW_RECORD", { index: row.getPosition() }, gobj);
24136
+ });
23944
24137
  tabulator.on("rowSelected", function(row) {
23945
24138
  (0, _yuneta_gobj_js.gobj_send_event)(gobj, "EV_SELECT_ROWS", { rows: [row.getData()] }, gobj);
23946
24139
  });
@@ -23961,6 +24154,39 @@ function table__destroy(gobj) {
23961
24154
  }
23962
24155
  }
23963
24156
  /************************************************************
24157
+ * Cell of a col flagged `icon`: the value is the NAME of an
24158
+ * icon of the app's set ("yi-bolt"), so it is DRAWN.
24159
+ *
24160
+ * Built as a DOM node and not as an HTML string: the value is
24161
+ * raw record data and must never be parsed as markup -- and
24162
+ * here it also becomes a CSS class, so it is filtered to the
24163
+ * shape of a class name before it gets near one.
24164
+ *
24165
+ * A name the set does not carry falls back to the TEXT of it.
24166
+ * The catch-all rule `[class^="yi-"]::before` paints a
24167
+ * currentColor box for any name, so drawing it anyway would
24168
+ * render a solid square -- a glyph nobody recognises rather
24169
+ * than a mistake somebody can fix.
24170
+ ************************************************************/
24171
+ function icon_formatter(cell) {
24172
+ let name = cell.getValue();
24173
+ if (!(0, _yuneta_gobj_js.is_string)(name) || (0, _yuneta_gobj_js.empty_string)(name)) return "";
24174
+ name = name.trim();
24175
+ if (!/^[a-z0-9-]+$/.test(name) || !yui_icon_is_defined(name)) return (0, _yuneta_gobj_js.createElement2)([
24176
+ "span",
24177
+ {
24178
+ class: "ICON_CELL_UNKNOWN is-size-7 has-text-grey",
24179
+ title: name
24180
+ },
24181
+ name
24182
+ ]);
24183
+ return (0, _yuneta_gobj_js.createElement2)(["span", {
24184
+ class: `ICON_CELL ${name}`,
24185
+ title: name,
24186
+ "aria-label": name
24187
+ }]);
24188
+ }
24189
+ /************************************************************
23964
24190
  * Cell of a col holding a JSON document (dict/list/blob/
23965
24191
  * template/coordinates/…): a one-line truncated preview,
23966
24192
  * marked as a link because the click opens the whole value
@@ -24072,6 +24298,7 @@ function transform__treedb_value_2_table_value(gobj, col, value, row, field) {
24072
24298
  }
24073
24299
  break;
24074
24300
  case "color": break;
24301
+ case "icon": break;
24075
24302
  case "image": break;
24076
24303
  default: (0, _yuneta_gobj_js.log_error)(`transform__treedb_value_2_table_value() unhandled type '${field_desc.type}' (real_type='${field_desc.real_type}') for field '${field}', topic ${priv.topic_name}`);
24077
24304
  }
@@ -24082,10 +24309,25 @@ function transform__treedb_value_2_table_value(gobj, col, value, row, field) {
24082
24309
  return value;
24083
24310
  }
24084
24311
  /************************************************************
24085
- * Build the form template from desc.cols: only user-editable
24086
- * fields reach the form — writable cols, fkeys (linkable) and
24087
- * the pkey (the hosted C_YUI_FORM's form_mode drives the
24088
- * pkey's readonly/required state).
24312
+ * Build the form template from desc.cols: EVERY field of the
24313
+ * record, the ones that cannot be written included.
24314
+ *
24315
+ * They used to be dropped, and a record was then shown as the
24316
+ * handful of its fields somebody may type: an asset opened as
24317
+ * its id alone, with its type, its size, its date and where it
24318
+ * came from -- everything a person opens an asset to read --
24319
+ * nowhere on screen. What a form is for is READING a record;
24320
+ * writing it is one of the two things you can do next.
24321
+ *
24322
+ * C_YUI_FORM renders a col that is not `writable` read-only on
24323
+ * its own (`build_form_field_conf`), so this is the whole of
24324
+ * it. What must NOT follow is sending them back:
24325
+ * `transform__form_record_2_treedb_record()` drops them, and
24326
+ * the reason is written there.
24327
+ *
24328
+ * Still out: hooks (a hook is not a field of the record, it is
24329
+ * the children hanging off it), hidden cols, and the `_`
24330
+ * scaffolding the table adds.
24089
24331
  ************************************************************/
24090
24332
  function build_form_template(gobj) {
24091
24333
  let desc = (0, _yuneta_gobj_js.gobj_read_attr)(gobj, "desc");
@@ -24095,7 +24337,6 @@ function build_form_template(gobj) {
24095
24337
  const field_desc = (0, _yuneta_gobj_js.treedb_get_field_desc)(col);
24096
24338
  if (field_desc.is_hidden) continue;
24097
24339
  if (field_desc.type === "hook") continue;
24098
- if (!field_desc.is_writable && field_desc.type !== "fkey" && col.id !== desc.pkey) continue;
24099
24340
  template.push(col);
24100
24341
  }
24101
24342
  return template;
@@ -24143,6 +24384,8 @@ function open_form_dialog(gobj, mode, record) {
24143
24384
  let rid = record ? String(record[pkey] ?? "") : "";
24144
24385
  title = (0, i18next.t)(topic_name) + ((0, _yuneta_gobj_js.empty_string)(rid) ? "" : " — " + rid);
24145
24386
  }
24387
+ let view_only = mode === "view";
24388
+ let form_mode = view_only ? "update" : mode;
24146
24389
  let $body = (0, _yuneta_gobj_js.createElement2)([
24147
24390
  "div",
24148
24391
  {
@@ -24156,12 +24399,13 @@ function open_form_dialog(gobj, mode, record) {
24156
24399
  template: build_form_template(gobj),
24157
24400
  record,
24158
24401
  fkey_options: build_fkey_options(gobj),
24159
- form_mode: mode,
24160
- ...form_plan.form_toolbar ? { toolbar: form_plan.form_toolbar } : {},
24402
+ form_mode,
24403
+ readonly: view_only,
24404
+ ...(view_only ? READONLY_FORM_TOOLBAR : form_plan.form_toolbar) ? { toolbar: view_only ? READONLY_FORM_TOOLBAR.slice() : form_plan.form_toolbar } : {},
24161
24405
  render_mode: "edit",
24162
24406
  pkey: desc.pkey || "id",
24163
24407
  topic_name,
24164
- editable: !form_plan.readonly,
24408
+ editable: !form_plan.readonly && !view_only,
24165
24409
  $parent: $body
24166
24410
  }, gobj);
24167
24411
  priv.form = form;
@@ -24446,6 +24690,39 @@ function show_edit_form(gobj, row, index) {
24446
24690
  open_form_dialog(gobj, pkey_is_rowid(gobj) ? "create" : "update", row);
24447
24691
  }
24448
24692
  /************************************************************
24693
+ * Does a click on this column already mean something else?
24694
+ *
24695
+ * The `_` columns are the table's own scaffolding (the selection
24696
+ * checkbox, the Op buttons); a hook opens its children and a col
24697
+ * holding a json document opens it in a viewer. Anything else is
24698
+ * plain data, and a click on it means "show me this record".
24699
+ ************************************************************/
24700
+ var CELL_WITH_ACTION = [
24701
+ "hook",
24702
+ "object",
24703
+ "dict",
24704
+ "template",
24705
+ "array",
24706
+ "list",
24707
+ "coordinates",
24708
+ "blob",
24709
+ "gbuffer"
24710
+ ];
24711
+ function cell_has_its_own_action(gobj, field) {
24712
+ if (!field || field.charAt(0) === "_") return true;
24713
+ let col = get_schema_col(gobj, field);
24714
+ if (!col) return false;
24715
+ const field_desc = (0, _yuneta_gobj_js.treedb_get_field_desc)(col);
24716
+ return CELL_WITH_ACTION.includes(field_desc.type) || CELL_WITH_ACTION.includes(field_desc.real_type);
24717
+ }
24718
+ /************************************************************
24719
+ * Show a record to be READ: every field, none of them editable.
24720
+ * What a row click opens while the table is not in edition mode.
24721
+ ************************************************************/
24722
+ function show_view_form(gobj, row) {
24723
+ open_form_dialog(gobj, "view", row);
24724
+ }
24725
+ /************************************************************
24449
24726
  * Show the edit "create" form to a new record
24450
24727
  * internally called from the top toolbar +New button
24451
24728
  ************************************************************/
@@ -24468,14 +24745,16 @@ function get_schema_col(gobj, id) {
24468
24745
  * operation: "create" "update"
24469
24746
  ************************************************************/
24470
24747
  function transform__form_record_2_treedb_record(gobj, kw, operation) {
24748
+ let pkey = (0, _yuneta_gobj_js.gobj_read_attr)(gobj, "desc").pkey || "id";
24471
24749
  let row = {};
24472
24750
  for (let field_name of Object.keys(kw)) {
24473
24751
  if ((0, _yuneta_gobj_js.empty_string)(field_name)) continue;
24474
24752
  let col = get_schema_col(gobj, field_name);
24475
- if (col) {
24476
- let value = kw[field_name];
24477
- row[field_name] = transform__form_value_2_treedb_value(gobj, col, value, operation);
24478
- }
24753
+ if (!col) continue;
24754
+ const field_desc = (0, _yuneta_gobj_js.treedb_get_field_desc)(col);
24755
+ if (!field_desc.is_writable && field_desc.type !== "fkey" && col.id !== pkey) continue;
24756
+ let value = kw[field_name];
24757
+ row[field_name] = transform__form_value_2_treedb_value(gobj, col, value, operation);
24479
24758
  }
24480
24759
  return row;
24481
24760
  }
@@ -25374,6 +25653,24 @@ function ac_open_columns(gobj, event, kw, src) {
25374
25653
  return 0;
25375
25654
  }
25376
25655
  /************************************************************
25656
+ * A row was clicked outside edition mode: open the record to be read.
25657
+ ************************************************************/
25658
+ function ac_show_record(gobj, event, kw, src) {
25659
+ let tabulator = (0, _yuneta_gobj_js.gobj_read_attr)(gobj, "tabulator");
25660
+ let index = kw ? kw.index : void 0;
25661
+ if (!tabulator || typeof index !== "number") {
25662
+ (0, _yuneta_gobj_js.log_error)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: no row ${index} to show`);
25663
+ return -1;
25664
+ }
25665
+ let row = tabulator.getRowFromPosition(index);
25666
+ if (!row) {
25667
+ (0, _yuneta_gobj_js.log_error)(`${(0, _yuneta_gobj_js.gobj_short_name)(gobj)}: row ${index} is gone`);
25668
+ return -1;
25669
+ }
25670
+ show_view_form(gobj, row.getData());
25671
+ return 0;
25672
+ }
25673
+ /************************************************************
25377
25674
  * The reader picked another page size: remember it, so coming back to
25378
25675
  * this topic opens where they left it instead of at 200.
25379
25676
  ************************************************************/
@@ -25598,6 +25895,11 @@ function create_gclass$5(gclass_name) {
25598
25895
  ac_page_size_changed,
25599
25896
  null
25600
25897
  ],
25898
+ [
25899
+ "EV_SHOW_RECORD",
25900
+ ac_show_record,
25901
+ null
25902
+ ],
25601
25903
  [
25602
25904
  "EV_TOGGLE_COLUMN",
25603
25905
  ac_toggle_column,
@@ -25649,6 +25951,7 @@ function create_gclass$5(gclass_name) {
25649
25951
  ["EV_SEARCH", 0],
25650
25952
  ["EV_OPEN_COLUMNS", 0],
25651
25953
  ["EV_PAGE_SIZE_CHANGED", 0],
25954
+ ["EV_SHOW_RECORD", 0],
25652
25955
  ["EV_TOGGLE_COLUMN", 0],
25653
25956
  ["EV_EXPORT_TABLE", 0],
25654
25957
  ["EV_CREATE_RECORD", _yuneta_gobj_js.event_flag_t.EVF_OUTPUT_EVENT],
@@ -52405,160 +52708,6 @@ Sector.PARSED_STYLE_LIST = new Set([].concat(_toConsumableArray(Path.PARSED_STYL
52405
52708
  "endAngle"
52406
52709
  ]));
52407
52710
  //#endregion
52408
- //#region src/lib_icons.js
52409
- /*********************************************************
52410
- * lib_icons.js
52411
- *
52412
- * Two icon systems are managed here:
52413
- *
52414
- * 1. FA-style CSS icons (yui_icons.css)
52415
- * Usage: <i class="yi-save"></i>
52416
- * Color: inherits currentColor from parent via CSS mask.
52417
- *
52418
- * 2. SVG symbol icons for G6 toolbar (and any other component
52419
- * that uses <use xlink:href="#id">).
52420
- * Symbols are injected once into the DOM.
52421
- * All symbol ids are prefixed with "g6-icon-" to avoid
52422
- * conflicts with other DOM elements.
52423
- * Icon paths come from:
52424
- * fontawesome-free-7.1.0-web/sprites/solid.svg
52425
- *
52426
- * G6 toolbar items are managed via CSS class names (className
52427
- * field in getItems()) using YuiToolbar in c_g6_nodes_tree.js.
52428
- * This lets lib_graph.js state functions (set_submit_state,
52429
- * disableElements, …) work on toolbar icons exactly like on
52430
- * regular Bulma/FA buttons — no icon-specific helpers needed.
52431
- *
52432
- * Copyright (c) 2025-2026, ArtGins.
52433
- * All Rights Reserved.
52434
- *********************************************************/
52435
- var CUSTOM_SVG_ICONS_ID = "g6-custom-svgicons";
52436
- var ICONS = `<svg xmlns="http://www.w3.org/2000/svg">
52437
- <!-- magnifying-glass-plus -->
52438
- <symbol id="g6-icon-zoom-in" viewBox="0 0 512 512">
52439
- <path fill="currentColor" d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376C296.3 401.1 253.9 416 208 416 93.1 416 0 322.9 0 208S93.1 0 208 0 416 93.1 416 208zM208 112c-13.3 0-24 10.7-24 24l0 48-48 0c-13.3 0-24 10.7-24 24s10.7 24 24 24l48 0 0 48c0 13.3 10.7 24 24 24s24-10.7 24-24l0-48 48 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-48 0 0-48c0-13.3-10.7-24-24-24z"/>
52440
- </symbol>
52441
- <!-- magnifying-glass-minus -->
52442
- <symbol id="g6-icon-zoom-out" viewBox="0 0 512 512">
52443
- <path fill="currentColor" d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376C296.3 401.1 253.9 416 208 416 93.1 416 0 322.9 0 208S93.1 0 208 0 416 93.1 416 208zM136 184c-13.3 0-24 10.7-24 24s10.7 24 24 24l144 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-144 0z"/>
52444
- </symbol>
52445
- <!-- house (reset zoom: back to original 100% view) -->
52446
- <symbol id="g6-icon-home" viewBox="0 0 512 512">
52447
- <path fill="currentColor" d="M277.8 8.6c-12.3-11.4-31.3-11.4-43.5 0l-224 208c-9.6 9-12.8 22.9-8 35.1S18.8 272 32 272l16 0 0 176c0 35.3 28.7 64 64 64l288 0c35.3 0 64-28.7 64-64l0-176 16 0c13.2 0 25-8.1 29.8-20.3s1.6-26.2-8-35.1l-224-208zM240 320l32 0c26.5 0 48 21.5 48 48l0 96-128 0 0-96c0-26.5 21.5-48 48-48z"/>
52448
- </symbol>
52449
- <!-- expand (zoom to fit) -->
52450
- <symbol id="g6-icon-fit" viewBox="0 0 448 512">
52451
- <path fill="currentColor" d="M32 32C14.3 32 0 46.3 0 64l0 96c0 17.7 14.3 32 32 32s32-14.3 32-32l0-64 64 0c17.7 0 32-14.3 32-32s-14.3-32-32-32L32 32zM64 352c0-17.7-14.3-32-32-32S0 334.3 0 352l0 96c0 17.7 14.3 32 32 32l96 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-64 0 0-64zM320 32c-17.7 0-32 14.3-32 32s14.3 32 32 32l64 0 0 64c0 17.7 14.3 32 32 32s32-14.3 32-32l0-96c0-17.7-14.3-32-32-32l-96 0zM448 352c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 64-64 0c-17.7 0-32 14.3-32 32s14.3 32 32 32l96 0c17.7 0 32-14.3 32-32l0-96z"/>
52452
- </symbol>
52453
- <!-- fit to selection: the same corner brackets as the fit icon,
52454
- around a marked object. The two sit side by side in the
52455
- toolbar and have to read as a family, which a borrowed glyph
52456
- would not. (No backticks in here: the sprite lives inside a
52457
- template literal.) -->
52458
- <symbol id="g6-icon-fit-selection" viewBox="0 0 448 512">
52459
- <path fill="currentColor" d="M32 32C14.3 32 0 46.3 0 64l0 96c0 17.7 14.3 32 32 32s32-14.3 32-32l0-64 64 0c17.7 0 32-14.3 32-32s-14.3-32-32-32L32 32zM64 352c0-17.7-14.3-32-32-32S0 334.3 0 352l0 96c0 17.7 14.3 32 32 32l96 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-64 0 0-64zM320 32c-17.7 0-32 14.3-32 32s14.3 32 32 32l64 0 0 64c0 17.7 14.3 32 32 32s32-14.3 32-32l0-96c0-17.7-14.3-32-32-32l-96 0zM448 352c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 64-64 0c-17.7 0-32 14.3-32 32s14.3 32 32 32l96 0c17.7 0 32-14.3 32-32l0-96z"/>
52460
- <rect fill="currentColor" x="144" y="176" width="160" height="160" rx="24"/>
52461
- </symbol>
52462
- <!-- crosshairs (center) -->
52463
- <symbol id="g6-icon-center" viewBox="0 0 576 512">
52464
- <path fill="currentColor" d="M288-16c17.7 0 32 14.3 32 32l0 18.3c98.1 14 175.7 91.6 189.7 189.7l18.3 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-18.3 0c-14 98.1-91.6 175.7-189.7 189.7l0 18.3c0 17.7-14.3 32-32 32s-32-14.3-32-32l0-18.3C157.9 463.7 80.3 386.1 66.3 288L48 288c-17.7 0-32-14.3-32-32s14.3-32 32-32l18.3 0C80.3 125.9 157.9 48.3 256 34.3L256 16c0-17.7 14.3-32 32-32zM131.2 288c12.7 62.7 62.1 112.1 124.8 124.8l0-12.8c0-17.7 14.3-32 32-32s32 14.3 32 32l0 12.8c62.7-12.7 112.1-62.1 124.8-124.8L432 288c-17.7 0-32-14.3-32-32s14.3-32 32-32l12.8 0C432.1 161.3 382.7 111.9 320 99.2l0 12.8c0 17.7-14.3 32-32 32s-32-14.3-32-32l0-12.8C193.3 111.9 143.9 161.3 131.2 224l12.8 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-12.8 0zM288 208a48 48 0 1 1 0 96 48 48 0 1 1 0-96z"/>
52465
- </symbol>
52466
- <!-- up-right-and-down-left-from-center (enter fullscreen) -->
52467
- <symbol id="g6-icon-fullscreen" viewBox="0 0 512 512">
52468
- <path fill="currentColor" d="M344 0L488 0c13.3 0 24 10.7 24 24l0 144c0 9.7-5.8 18.5-14.8 22.2s-19.3 1.7-26.2-5.2l-39-39-87 87c-9.4 9.4-24.6 9.4-33.9 0l-32-32c-9.4-9.4-9.4-24.6 0-33.9l87-87-39-39c-6.9-6.9-8.9-17.2-5.2-26.2S334.3 0 344 0zM168 512L24 512c-13.3 0-24-10.7-24-24L0 344c0-9.7 5.8-18.5 14.8-22.2S34.1 320.2 41 327l39 39 87-87c9.4-9.4 24.6-9.4 33.9 0l32 32c9.4 9.4 9.4 24.6 0 33.9l-87 87 39 39c6.9 6.9 8.9 17.2 5.2 26.2S177.7 512 168 512z"/>
52469
- </symbol>
52470
- <!-- down-left-and-up-right-to-center (exit fullscreen) -->
52471
- <symbol id="g6-icon-fullscreen-exit" viewBox="0 0 512 512">
52472
- <path fill="currentColor" d="M439.5 7c9.4-9.4 24.6-9.4 33.9 0l32 32c9.4 9.4 9.4 24.6 0 33.9l-87 87 39 39c6.9 6.9 8.9 17.2 5.2 26.2S450.2 240 440.5 240l-144 0c-13.3 0-24-10.7-24-24l0-144c0-9.7 5.8-18.5 14.8-22.2s19.3-1.7 26.2 5.2l39 39 87-87zM72.5 272l144 0c13.3 0 24 10.7 24 24l0 144c0 9.7-5.8 18.5-14.8 22.2s-19.3 1.7-26.2-5.2l-39-39-87 87c-9.4 9.4-24.6 9.4-33.9 0l-32-32c-9.4-9.4-9.4-24.6 0-33.9l87-87-39-39c-6.9-6.9-8.9-17.2-5.2-26.2S62.8 272 72.5 272z"/>
52473
- </symbol>
52474
- <!-- arrow-rotate-left (undo) -->
52475
- <symbol id="g6-icon-undo" viewBox="0 0 512 512">
52476
- <path fill="currentColor" d="M256 64c-56.8 0-107.9 24.7-143.1 64l47.1 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 192c-17.7 0-32-14.3-32-32L0 32C0 14.3 14.3 0 32 0S64 14.3 64 32l0 54.7C110.9 33.6 179.5 0 256 0 397.4 0 512 114.6 512 256S397.4 512 256 512c-87 0-163.9-43.4-210.1-109.7-10.1-14.5-6.6-34.4 7.9-44.6s34.4-6.6 44.6 7.9c34.8 49.8 92.4 82.3 157.6 82.3 106 0 192-86 192-192S362 64 256 64z"/>
52477
- </symbol>
52478
- <!-- arrow-rotate-right (redo) -->
52479
- <symbol id="g6-icon-redo" viewBox="0 0 512 512">
52480
- <path fill="currentColor" d="M436.7 74.7L448 85.4 448 32c0-17.7 14.3-32 32-32s32 14.3 32 32l0 128c0 17.7-14.3 32-32 32l-128 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l47.9 0-7.6-7.2c-.2-.2-.4-.4-.6-.6-75-75-196.5-75-271.5 0s-75 196.5 0 271.5 196.5 75 271.5 0c8.2-8.2 15.5-16.9 21.9-26.1 10.1-14.5 30.1-18 44.6-7.9s18 30.1 7.9 44.6c-8.5 12.2-18.2 23.8-29.1 34.7-100 100-262.1 100-362 0S-25 175 75 75c99.9-99.9 261.7-100 361.7-.3z"/>
52481
- </symbol>
52482
- <!-- pen (edit node) -->
52483
- <symbol id="g6-icon-edit" viewBox="0 0 512 512">
52484
- <path fill="currentColor" d="M352.9 21.2L308 66.1 445.9 204 490.8 159.1C504.4 145.6 512 127.2 512 108s-7.6-37.6-21.2-51.1L455.1 21.2C441.6 7.6 423.2 0 404 0s-37.6 7.6-51.1 21.2zM274.1 100L58.9 315.1c-10.7 10.7-18.5 24.1-22.6 38.7L.9 481.6c-2.3 8.3 0 17.3 6.2 23.4s15.1 8.5 23.4 6.2l127.8-35.5c14.6-4.1 27.9-11.8 38.7-22.6L412 237.9 274.1 100z"/>
52485
- </symbol>
52486
- <!-- trash-can (delete) -->
52487
- <symbol id="g6-icon-delete" viewBox="0 0 448 512">
52488
- <path fill="currentColor" d="M136.7 5.9C141.1-7.2 153.3-16 167.1-16l113.9 0c13.8 0 26 8.8 30.4 21.9L320 32 416 32c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 96C14.3 96 0 81.7 0 64S14.3 32 32 32l96 0 8.7-26.1zM32 144l384 0 0 304c0 35.3-28.7 64-64 64L96 512c-35.3 0-64-28.7-64-64l0-304zm88 64c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24zm104 0c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24zm104 0c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24z"/>
52489
- </symbol>
52490
- <!-- link (link nodes) -->
52491
- <symbol id="g6-icon-link" viewBox="0 0 576 512">
52492
- <path fill="currentColor" d="M419.5 96c-16.6 0-32.7 4.5-46.8 12.7-15.8-16-34.2-29.4-54.5-39.5 28.2-24 64.1-37.2 101.3-37.2 86.4 0 156.5 70 156.5 156.5 0 41.5-16.5 81.3-45.8 110.6l-71.1 71.1c-29.3 29.3-69.1 45.8-110.6 45.8-86.4 0-156.5-70-156.5-156.5 0-1.5 0-3 .1-4.5 .5-17.7 15.2-31.6 32.9-31.1s31.6 15.2 31.1 32.9c0 .9 0 1.8 0 2.6 0 51.1 41.4 92.5 92.5 92.5 24.5 0 48-9.7 65.4-27.1l71.1-71.1c17.3-17.3 27.1-40.9 27.1-65.4 0-51.1-41.4-92.5-92.5-92.5zM275.2 173.3c-1.9-.8-3.8-1.9-5.5-3.1-12.6-6.5-27-10.2-42.1-10.2-24.5 0-48 9.7-65.4 27.1L91.1 258.2c-17.3 17.3-27.1 40.9-27.1 65.4 0 51.1 41.4 92.5 92.5 92.5 16.5 0 32.6-4.4 46.7-12.6 15.8 16 34.2 29.4 54.6 39.5-28.2 23.9-64 37.2-101.3 37.2-86.4 0-156.5-70-156.5-156.5 0-41.5 16.5-81.3 45.8-110.6l71.1-71.1c29.3-29.3 69.1-45.8 110.6-45.8 86.6 0 156.5 70.6 156.5 156.9 0 1.3 0 2.6 0 3.9-.4 17.7-15.1 31.6-32.8 31.2s-31.6-15.1-31.2-32.8c0-.8 0-1.5 0-2.3 0-33.7-18-63.3-44.8-79.6z"/>
52493
- </symbol>
52494
- <!-- link-slash (unlink) -->
52495
- <symbol id="g6-icon-unlink" viewBox="0 0 576 512">
52496
- <path fill="currentColor" d="M41-24.9c-9.4-9.4-24.6-9.4-33.9 0S-2.3-.3 7 9.1l528 528c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-122-122c4.2-3.4 8.3-7.1 12.1-10.9l71.1-71.1c29.3-29.3 45.8-69.1 45.8-110.6 0-86.4-70-156.5-156.5-156.5-37.3 0-73.1 13.3-101.3 37.2 20.3 10.1 38.7 23.5 54.5 39.5 14.1-8.3 30.2-12.7 46.8-12.7 51.1 0 92.5 41.4 92.5 92.5 0 24.5-9.7 48-27.1 65.4l-71.1 71.1c-3.9 3.9-8.1 7.4-12.6 10.5l-47.5-47.5c16.5-.9 29.7-14.4 30.2-31.1 0-1.3 0-2.6 0-3.9 0-86.3-69.9-156.9-156.5-156.9-19.2 0-37.9 3.5-55.5 10.2L41-24.9zM225.9 160c.6 0 1.1 0 1.7 0 15.1 0 29.5 3.7 42.1 10.2 1.8 1.2 3.6 2.3 5.5 3.1 26.8 16.3 44.8 45.9 44.8 79.6 0 .4 0 .8 0 1.2L225.9 160zM346.2 416L192 261.8c1.2 84.6 69.6 152.9 154.1 154.1zM139.7 209.5l-45.3-45.3-48.6 48.6c-29.3 29.3-45.8 69.1-45.8 110.6 0 86.4 70 156.5 156.5 156.5 37.2 0 73.1-13.3 101.3-37.2-20.3-10.1-38.8-23.5-54.6-39.5-14 8.2-30.1 12.6-46.7 12.6-51.1 0-92.5-41.4-92.5-92.5 0-24.5 9.7-48 27.1-65.4l48.6-48.6z"/>
52497
- </symbol>
52498
- <!-- play (run node) -->
52499
- <symbol id="g6-icon-run" viewBox="0 0 448 512">
52500
- <path fill="currentColor" d="M91.2 36.9c-12.4-6.8-27.4-6.5-39.6 .7S32 57.9 32 72l0 368c0 14.1 7.5 27.2 19.6 34.4s27.2 7.5 39.6 .7l336-184c12.8-7 20.8-20.5 20.8-35.1s-8-28.1-20.8-35.1l-336-184z"/>
52501
- </symbol>
52502
- <!-- clone (copy size to other nodes/ports) -->
52503
- <symbol id="g6-icon-resize" viewBox="0 0 512 512">
52504
- <path fill="currentColor" d="M288 448l-224 0 0-224 48 0 0-64-48 0c-35.3 0-64 28.7-64 64L0 448c0 35.3 28.7 64 64 64l224 0c35.3 0 64-28.7 64-64l0-48-64 0 0 48zm-64-96l224 0c35.3 0 64-28.7 64-64l0-224c0-35.3-28.7-64-64-64L224 0c-35.3 0-64 28.7-64 64l0 224c0 35.3 28.7 64 64 64z"/>
52505
- </symbol>
52506
- <!-- plus (create node). Deliberately NOT the FA7 solid plus:
52507
- its arms are ~14% of the width and read thin next to the
52508
- other solid glyphs. Bold geometric plus (~23% arm
52509
- thickness) with long arms (32..480) so it reads as a "+",
52510
- not a stubby Red-Cross square. -->
52511
- <symbol id="g6-icon-plus" viewBox="0 0 512 512">
52512
- <path fill="currentColor" d="M316 32 L316 196 L480 196 L480 316 L316 316 L316 480 L196 480 L196 316 L32 316 L32 196 L196 196 L196 32 Z"/>
52513
- </symbol>
52514
- <!-- ellipsis-vertical (unfold the floating toolbar).
52515
- The strip it stands for is a vertical stack, and a vertical
52516
- ellipsis is what "there is more of this here" is drawn as
52517
- everywhere else. -->
52518
- <symbol id="g6-icon-toolbar-show" viewBox="0 0 128 512">
52519
- <path fill="currentColor" d="M64 360a56 56 0 1 0 0 112 56 56 0 1 0 0-112zm0-160a56 56 0 1 0 0 112 56 56 0 1 0 0-112zM120 96A56 56 0 1 0 8 96a56 56 0 1 0 112 0z"/>
52520
- </symbol>
52521
- <!-- xmark (fold the floating toolbar away).
52522
- Not a chevron: the two toolbars sit on OPPOSITE edges, so a
52523
- direction would point the wrong way on one of them. What the
52524
- button does is close an overlay, and that is an x. -->
52525
- <symbol id="g6-icon-toolbar-hide" viewBox="0 0 384 512">
52526
- <path fill="currentColor" d="M342.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 210.7 86.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L146.7 256 41.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192 301.3 297.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.3 256 342.6 150.6z"/>
52527
- </symbol>
52528
- <!-- dashed marquee (selection mode).
52529
- The band ITSELF, because that is what the button turns on: a
52530
- drag on the canvas draws one and a tap picks a card. Not the
52531
- fit-to-selection glyph next to it in the other toolbar -- that
52532
- one is solid brackets around a solid object and means "put the
52533
- camera on what is picked", which is the opposite end of the
52534
- gesture. Dashes: 16 segments of 59 with gaps of 36 over a
52535
- perimeter of 1520, so they land on the corners. -->
52536
- <symbol id="g6-icon-select-mode" viewBox="0 0 512 512">
52537
- <rect x="46" y="86" width="420" height="340" fill="none"
52538
- stroke="currentColor" stroke-width="40"
52539
- stroke-dasharray="59 36"/>
52540
- </symbol>
52541
- <!-- location-crosshairs (anchor the camera on one element).
52542
- The SAME path as the DOM toolbars and their yi-location-crosshairs
52543
- mask: the two toolbars sit in one console, and a control that
52544
- does one thing has to be drawn one way. -->
52545
- <symbol id="g6-icon-anchor" viewBox="0 0 576 512">
52546
- <path fill="currentColor" d="M288-16c17.7 0 32 14.3 32 32l0 18.3c98.1 14 175.7 91.6 189.7 189.7l18.3 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-18.3 0c-14 98.1-91.6 175.7-189.7 189.7l0 18.3c0 17.7-14.3 32-32 32s-32-14.3-32-32l0-18.3C157.9 463.7 80.3 386.1 66.3 288L48 288c-17.7 0-32-14.3-32-32s14.3-32 32-32l18.3 0C80.3 125.9 157.9 48.3 256 34.3L256 16c0-17.7 14.3-32 32-32zM128 256a160 160 0 1 0 320 0 160 160 0 1 0 -320 0zm160-96a96 96 0 1 1 0 192 96 96 0 1 1 0-192z"/>
52547
- </symbol>
52548
- <!-- floppy-disk (save) -->
52549
- <symbol id="g6-icon-save" viewBox="0 0 448 512">
52550
- <path fill="currentColor" d="M64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-242.7c0-17-6.7-33.3-18.7-45.3L352 50.7C340 38.7 323.7 32 306.7 32L64 32zm32 96c0-17.7 14.3-32 32-32l160 0c17.7 0 32 14.3 32 32l0 64c0 17.7-14.3 32-32 32l-160 0c-17.7 0-32-14.3-32-32l0-64zM224 288a64 64 0 1 1 0 128 64 64 0 1 1 0-128z"/>
52551
- </symbol>
52552
- </svg>`;
52553
- function inject_svg_icons() {
52554
- if (document.getElementById(CUSTOM_SVG_ICONS_ID)) return;
52555
- const div = document.createElement("div");
52556
- div.id = CUSTOM_SVG_ICONS_ID;
52557
- div.style.display = "none";
52558
- div.innerHTML = ICONS;
52559
- document.body.appendChild(div);
52560
- }
52561
- //#endregion
52562
52711
  //#region src/g6_brush_select_owned.js
52563
52712
  /***********************************************************************
52564
52713
  * g6_brush_select_owned.js