flexdesk 0.6.3 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +326 -0
- package/css/base.css +333 -0
- package/css/flexdesk.css +333 -0
- package/dist/charts.js +2 -2
- package/dist/{chunk-WLASPRGP.js → chunk-JLCJWCRS.js} +1577 -56
- package/dist/chunk-JLCJWCRS.js.map +7 -0
- package/dist/{chunk-WAVLVXYV.js → chunk-WKTYKXWF.js} +2 -2
- package/dist/flexdesk.css +333 -0
- package/dist/flow.js +24 -8
- package/dist/flow.js.map +2 -2
- package/dist/tiles.js +2 -2
- package/dist/widgets.js +672 -1
- package/dist/widgets.js.map +4 -4
- package/package.json +1 -1
- package/src/flow/outline/editor.js +46 -8
- package/src/ui/components/data_table.js +1650 -66
- package/src/ui/components/fact_table.js +342 -0
- package/src/ui/components/record_list.js +594 -0
- package/src/ui/components/table_filter_chips.js +153 -0
- package/dist/chunk-WLASPRGP.js.map +0 -7
- /package/dist/{chunk-WAVLVXYV.js.map → chunk-WKTYKXWF.js.map} +0 -0
package/css/base.css
CHANGED
|
@@ -547,6 +547,18 @@ body.twm-dt-col-resizing {
|
|
|
547
547
|
.twm-preview-table.twm-dt-measuring .twm-data-table__filter-row {
|
|
548
548
|
display: none !important;
|
|
549
549
|
}
|
|
550
|
+
/* 0.7.0 `filterKinds`: a filter row holding a CONTROL stays in the measure,
|
|
551
|
+
* its text boxes out of it, and each control at its NARROWEST (the widest
|
|
552
|
+
* chip) — so a column is never narrower than one of its chips. */
|
|
553
|
+
.twm-preview-table.twm-dt-measuring .twm-data-table__filter-row.twm-data-table__filter-row--controls {
|
|
554
|
+
display: table-row !important;
|
|
555
|
+
}
|
|
556
|
+
.twm-preview-table.twm-dt-measuring .twm-data-table__filter-row--controls .twm-data-table__filter-wrapper {
|
|
557
|
+
display: none !important;
|
|
558
|
+
}
|
|
559
|
+
.twm-preview-table.twm-dt-measuring th.data-table__filter-cell--control > * {
|
|
560
|
+
width: min-content !important;
|
|
561
|
+
}
|
|
550
562
|
/* ── C10. The virtual window (`DataTable` with `virtualize`) ─────────────
|
|
551
563
|
* The column track is a `<colgroup>` (see `_createTable`), so it is the
|
|
552
564
|
* `<col>` widths the measuring pass has to lift — the same `!important` it
|
|
@@ -752,6 +764,145 @@ body.twm-dt-col-resizing {
|
|
|
752
764
|
font-size: 16px;
|
|
753
765
|
line-height: 1;
|
|
754
766
|
}
|
|
767
|
+
/* ── 0.7.0 DataTable options. Each rule below matches only a class a 0.7.0
|
|
768
|
+
* option sets, so a table that asks for none of them is styled exactly as in
|
|
769
|
+
* 0.6. ─────────────────────────────────────────────────────────────────── */
|
|
770
|
+
/* `rowDetail` — the toggle. Its chevron is drawn by CSS from the icon font
|
|
771
|
+
* (the button carries its class), so the cell's text, its clipped-cell
|
|
772
|
+
* tooltip and a copy stay the cell's own; turned down while open. Negative
|
|
773
|
+
* block margins on a line height of 1: it cannot make its row taller. */
|
|
774
|
+
.twm-preview-table td .twm-dt-detail-toggle {
|
|
775
|
+
display: inline-flex;
|
|
776
|
+
align-items: center;
|
|
777
|
+
justify-content: center;
|
|
778
|
+
width: 18px;
|
|
779
|
+
height: 18px;
|
|
780
|
+
margin: -2px 4px -2px -2px;
|
|
781
|
+
padding: 0;
|
|
782
|
+
border: 0;
|
|
783
|
+
border-radius: 3px;
|
|
784
|
+
background: transparent;
|
|
785
|
+
color: inherit;
|
|
786
|
+
font-size: 16px;
|
|
787
|
+
line-height: 1;
|
|
788
|
+
vertical-align: top;
|
|
789
|
+
cursor: pointer;
|
|
790
|
+
opacity: 0.75;
|
|
791
|
+
}
|
|
792
|
+
.twm-preview-table td .twm-dt-detail-toggle-gap {
|
|
793
|
+
display: inline-block;
|
|
794
|
+
width: 18px;
|
|
795
|
+
margin: 0 4px 0 -2px;
|
|
796
|
+
vertical-align: top;
|
|
797
|
+
}
|
|
798
|
+
.twm-preview-table td .twm-dt-detail-toggle::before {
|
|
799
|
+
content: 'chevron_right';
|
|
800
|
+
transition: transform 0.12s ease;
|
|
801
|
+
}
|
|
802
|
+
.twm-preview-table td .twm-dt-detail-toggle[aria-expanded="true"]::before {
|
|
803
|
+
transform: rotate(90deg);
|
|
804
|
+
}
|
|
805
|
+
.twm-preview-table td .twm-dt-detail-toggle:hover {
|
|
806
|
+
opacity: 1;
|
|
807
|
+
background: rgba(255, 255, 255, 0.08);
|
|
808
|
+
}
|
|
809
|
+
.twm-preview-table td .twm-dt-detail-toggle:focus-visible {
|
|
810
|
+
opacity: 1;
|
|
811
|
+
outline: 1px solid var(--accent-bright, #007acc);
|
|
812
|
+
}
|
|
813
|
+
/* The detail's row: one cell across every column. It is often the body's
|
|
814
|
+
* FIRST cell of its row, so the time column's rules reach it (see the note
|
|
815
|
+
* above the NULL rule) — hence (0,4,3): the wrapper and `tbody` in front. It
|
|
816
|
+
* wraps, it is not clipped, it is not a thing to press (a clickable table's
|
|
817
|
+
* pointer and hover stop at it), and its content does not set the columns'
|
|
818
|
+
* widths (`contain: inline-size`, and it is out of the measuring pass). */
|
|
819
|
+
.twm-data-table-component .twm-preview-table tbody tr.twm-dt-detail-row > td.twm-dt-detail-cell,
|
|
820
|
+
.twm-data-table-component .twm-preview-table tbody tr.twm-dt-detail-row:not(.twm-dt-spacer):not(.data-table__empty-row):hover > td.twm-dt-detail-cell {
|
|
821
|
+
width: auto;
|
|
822
|
+
min-width: 0;
|
|
823
|
+
max-width: none;
|
|
824
|
+
padding: 6px 10px 8px 28px;
|
|
825
|
+
white-space: normal;
|
|
826
|
+
overflow: visible;
|
|
827
|
+
text-overflow: clip;
|
|
828
|
+
font-family: inherit;
|
|
829
|
+
font-weight: normal;
|
|
830
|
+
color: inherit;
|
|
831
|
+
cursor: auto;
|
|
832
|
+
background: var(--twm-dt-detail-bg, rgba(255, 255, 255, 0.025));
|
|
833
|
+
}
|
|
834
|
+
.twm-dt-detail {
|
|
835
|
+
contain: inline-size;
|
|
836
|
+
overflow: auto;
|
|
837
|
+
user-select: text;
|
|
838
|
+
}
|
|
839
|
+
.twm-preview-table.twm-dt-measuring tr.twm-dt-detail-row {
|
|
840
|
+
display: none !important;
|
|
841
|
+
}
|
|
842
|
+
/* `follow` / `refresh()` — a row the last answer did not have, for a moment. */
|
|
843
|
+
@keyframes twm-dt-row-new {
|
|
844
|
+
from { background: var(--twm-dt-new-bg, rgba(0, 122, 204, 0.22)); }
|
|
845
|
+
to { background: transparent; }
|
|
846
|
+
}
|
|
847
|
+
.twm-preview-table tbody tr.twm-dt-row--new > td {
|
|
848
|
+
animation: twm-dt-row-new 1.6s ease-out;
|
|
849
|
+
}
|
|
850
|
+
/* `pagerLabels` — a pager button with its word beside its glyph. */
|
|
851
|
+
.twm-pagination-btn .twm-pagination-btn__label {
|
|
852
|
+
margin-left: 2px;
|
|
853
|
+
font-size: 10px;
|
|
854
|
+
white-space: nowrap;
|
|
855
|
+
}
|
|
856
|
+
/* `filterKinds` — a filter cell holding a control rather than the text box,
|
|
857
|
+
* and the built-in chips. Wraps rather than clipping its control. */
|
|
858
|
+
.twm-preview-table th.data-table__filter-cell--control {
|
|
859
|
+
white-space: normal;
|
|
860
|
+
overflow: visible;
|
|
861
|
+
}
|
|
862
|
+
.twm-dt-filter-chips {
|
|
863
|
+
display: flex;
|
|
864
|
+
flex-wrap: wrap;
|
|
865
|
+
align-items: center;
|
|
866
|
+
gap: 3px;
|
|
867
|
+
}
|
|
868
|
+
.twm-dt-filter-chip {
|
|
869
|
+
display: inline-flex;
|
|
870
|
+
align-items: center;
|
|
871
|
+
gap: 3px;
|
|
872
|
+
height: 20px;
|
|
873
|
+
padding: 0 7px 0 5px;
|
|
874
|
+
border: 1px solid var(--border-default, #3a3a3a);
|
|
875
|
+
border-radius: 10px;
|
|
876
|
+
background: transparent;
|
|
877
|
+
color: #aaa;
|
|
878
|
+
font: inherit;
|
|
879
|
+
font-size: 11px;
|
|
880
|
+
font-weight: normal;
|
|
881
|
+
line-height: 1;
|
|
882
|
+
cursor: pointer;
|
|
883
|
+
}
|
|
884
|
+
.twm-dt-filter-chip:hover {
|
|
885
|
+
background: rgba(255, 255, 255, 0.06);
|
|
886
|
+
}
|
|
887
|
+
.twm-dt-filter-chip:focus-visible {
|
|
888
|
+
outline: 1px solid var(--accent-bright, #007acc);
|
|
889
|
+
}
|
|
890
|
+
.twm-dt-filter-chip.twm-dt-filter-chip--on {
|
|
891
|
+
border-color: var(--accent-bright, #007acc);
|
|
892
|
+
background: rgba(0, 122, 204, 0.18);
|
|
893
|
+
color: #ddd;
|
|
894
|
+
}
|
|
895
|
+
.twm-dt-filter-chip.twm-dt-filter-chip--empty {
|
|
896
|
+
opacity: 0.5;
|
|
897
|
+
}
|
|
898
|
+
.twm-dt-filter-chip .twm-dt-filter-chip__icon {
|
|
899
|
+
font-size: 14px;
|
|
900
|
+
line-height: 1;
|
|
901
|
+
}
|
|
902
|
+
.twm-dt-filter-chip .twm-dt-filter-chip__count {
|
|
903
|
+
color: #888;
|
|
904
|
+
font-variant-numeric: tabular-nums;
|
|
905
|
+
}
|
|
755
906
|
/* Wizard mode: uniform column widths, no selection */
|
|
756
907
|
.twm-preview-table-wrap--wizard .twm-preview-table {
|
|
757
908
|
table-layout: auto;
|
|
@@ -5097,6 +5248,188 @@ button.twm-about-dialog__btn--close:focus {
|
|
|
5097
5248
|
}
|
|
5098
5249
|
|
|
5099
5250
|
|
|
5251
|
+
/* ══ RECORD LIST & FACT SHEET (0.7.0) ══════════════════════════════════
|
|
5252
|
+
* `createRecordList` (src/ui/components/record_list.js) and
|
|
5253
|
+
* `createFactTable` (src/ui/components/fact_table.js). Neither has a height
|
|
5254
|
+
* of its own: each is exactly as tall as its records, in any parent. */
|
|
5255
|
+
|
|
5256
|
+
/* ── the record list ── */
|
|
5257
|
+
.twm-record-list { display: block; min-width: 0; }
|
|
5258
|
+
.twm-record-list__items {
|
|
5259
|
+
list-style: none;
|
|
5260
|
+
margin: 0;
|
|
5261
|
+
padding: 0;
|
|
5262
|
+
display: flex;
|
|
5263
|
+
flex-direction: column;
|
|
5264
|
+
}
|
|
5265
|
+
/* A record is one flex row that WRAPS: on a narrow host the pills and verbs
|
|
5266
|
+
* go under the name rather than squeezing it to nothing. */
|
|
5267
|
+
.twm-record {
|
|
5268
|
+
display: flex;
|
|
5269
|
+
flex-wrap: wrap;
|
|
5270
|
+
align-items: center;
|
|
5271
|
+
gap: 4px 10px;
|
|
5272
|
+
padding: 7px 6px;
|
|
5273
|
+
border-bottom: 1px solid var(--border-subtle, #2a2a2a);
|
|
5274
|
+
min-width: 0;
|
|
5275
|
+
}
|
|
5276
|
+
.twm-record:last-child { border-bottom: none; }
|
|
5277
|
+
.twm-record__main {
|
|
5278
|
+
flex: 1 1 14em;
|
|
5279
|
+
min-width: 0;
|
|
5280
|
+
display: flex;
|
|
5281
|
+
flex-direction: column;
|
|
5282
|
+
gap: 2px;
|
|
5283
|
+
}
|
|
5284
|
+
.twm-record__name {
|
|
5285
|
+
color: var(--text-primary, #e0e0e0);
|
|
5286
|
+
overflow-wrap: anywhere;
|
|
5287
|
+
}
|
|
5288
|
+
.twm-record__name--mono { font-family: var(--font-family-mono, monospace); font-size: 0.95em; }
|
|
5289
|
+
/* The quiet line. It wraps by default; `facts: 'ellipsis'` keeps it to one
|
|
5290
|
+
* line and puts the whole of it on the line's title. */
|
|
5291
|
+
.twm-record__facts {
|
|
5292
|
+
color: var(--text-muted, #888);
|
|
5293
|
+
font-size: var(--ea-font-body, 11px);
|
|
5294
|
+
overflow-wrap: anywhere;
|
|
5295
|
+
}
|
|
5296
|
+
.twm-record-list--clip .twm-record__facts {
|
|
5297
|
+
white-space: nowrap;
|
|
5298
|
+
overflow: hidden;
|
|
5299
|
+
text-overflow: ellipsis;
|
|
5300
|
+
}
|
|
5301
|
+
.twm-record__error {
|
|
5302
|
+
color: var(--color-danger, #c74e4e);
|
|
5303
|
+
font-size: var(--ea-font-body, 11px);
|
|
5304
|
+
overflow-wrap: anywhere;
|
|
5305
|
+
}
|
|
5306
|
+
/* A refused verb's reason, ON the screen — never only on a tooltip. */
|
|
5307
|
+
.twm-record__refusals { display: flex; flex-direction: column; gap: 1px; }
|
|
5308
|
+
.twm-record__refusal {
|
|
5309
|
+
color: var(--color-warning, #ff9800);
|
|
5310
|
+
font-size: var(--ea-font-small, 10px);
|
|
5311
|
+
overflow-wrap: anywhere;
|
|
5312
|
+
}
|
|
5313
|
+
.twm-record__pills,
|
|
5314
|
+
.twm-record__verbs {
|
|
5315
|
+
flex: 0 0 auto;
|
|
5316
|
+
display: flex;
|
|
5317
|
+
flex-wrap: wrap;
|
|
5318
|
+
align-items: center;
|
|
5319
|
+
justify-content: flex-end;
|
|
5320
|
+
gap: 4px 6px;
|
|
5321
|
+
margin-left: auto;
|
|
5322
|
+
}
|
|
5323
|
+
.twm-record__pill {
|
|
5324
|
+
display: inline-block;
|
|
5325
|
+
padding: 1px 7px;
|
|
5326
|
+
border-radius: var(--radius-pill, 999px);
|
|
5327
|
+
background: var(--surface-3, #3c3c3c);
|
|
5328
|
+
color: var(--text-muted, #888);
|
|
5329
|
+
font-size: var(--ea-font-small, 10px);
|
|
5330
|
+
line-height: 16px;
|
|
5331
|
+
white-space: nowrap;
|
|
5332
|
+
}
|
|
5333
|
+
.twm-record__pill--info { background: rgba(33, 150, 243, 0.16); color: var(--color-info, #2196f3); }
|
|
5334
|
+
.twm-record__pill--success { background: rgba(63, 185, 80, 0.16); color: var(--color-success, #3fb950); }
|
|
5335
|
+
.twm-record__pill--warn { background: rgba(255, 152, 0, 0.16); color: var(--color-warning, #ff9800); }
|
|
5336
|
+
.twm-record__pill--danger { background: rgba(199, 78, 78, 0.18); color: var(--color-danger, #c74e4e); }
|
|
5337
|
+
.twm-record__pill--muted { background: transparent; color: var(--text-dim, #666); box-shadow: inset 0 0 0 1px var(--border-strong, #383838); }
|
|
5338
|
+
.twm-record__verb-icon.material-symbols-outlined { font-size: 14px; line-height: 1; }
|
|
5339
|
+
/* States. A paused or switched-off record dims its words and pills and NOT
|
|
5340
|
+
* its verbs: the verb that brings it back has to stay readable. A dead or
|
|
5341
|
+
* failing one carries the danger colour on its left edge. */
|
|
5342
|
+
.twm-record--state-paused > .twm-record__main,
|
|
5343
|
+
.twm-record--state-paused > .twm-record__pills,
|
|
5344
|
+
.twm-record--state-off > .twm-record__main,
|
|
5345
|
+
.twm-record--state-off > .twm-record__pills,
|
|
5346
|
+
.twm-record--state-dead > .twm-record__main,
|
|
5347
|
+
.twm-record--state-dead > .twm-record__pills { opacity: 0.55; }
|
|
5348
|
+
.twm-record--state-dead,
|
|
5349
|
+
.twm-record--state-error { box-shadow: inset 2px 0 0 0 var(--color-danger, #c74e4e); }
|
|
5350
|
+
/* `activeKey` — the record that is OPEN: the accent on the left edge, as
|
|
5351
|
+
* DataTable's `twm-dt-row--active`. It wins over a state's edge. */
|
|
5352
|
+
.twm-record.twm-record--active { box-shadow: inset 2px 0 0 0 var(--accent-bright, #007acc); }
|
|
5353
|
+
.twm-record-list--clickable .twm-record { cursor: pointer; }
|
|
5354
|
+
.twm-record-list--clickable .twm-record:hover { background: var(--state-hover, rgba(255, 255, 255, 0.05)); }
|
|
5355
|
+
.twm-record:focus { outline: none; }
|
|
5356
|
+
.twm-record:focus-visible {
|
|
5357
|
+
outline: 1px solid var(--accent-bright, #007acc);
|
|
5358
|
+
outline-offset: -1px;
|
|
5359
|
+
}
|
|
5360
|
+
.twm-record-list__empty {
|
|
5361
|
+
margin: 0;
|
|
5362
|
+
padding: 12px 6px;
|
|
5363
|
+
color: var(--text-muted, #888);
|
|
5364
|
+
font-size: var(--ea-font-body, 11px);
|
|
5365
|
+
}
|
|
5366
|
+
|
|
5367
|
+
/* ── the fact sheet ── */
|
|
5368
|
+
.twm-facts {
|
|
5369
|
+
width: 100%;
|
|
5370
|
+
border-collapse: collapse;
|
|
5371
|
+
table-layout: auto;
|
|
5372
|
+
font-size: var(--font-size-sm, 12px);
|
|
5373
|
+
}
|
|
5374
|
+
.twm-facts thead th {
|
|
5375
|
+
text-align: left;
|
|
5376
|
+
font-size: var(--ea-font-small, 10px);
|
|
5377
|
+
font-weight: 600;
|
|
5378
|
+
letter-spacing: 0.06em;
|
|
5379
|
+
text-transform: uppercase;
|
|
5380
|
+
color: var(--text-dim, #666);
|
|
5381
|
+
white-space: nowrap;
|
|
5382
|
+
border-bottom: 1px solid var(--border-default, #303030);
|
|
5383
|
+
padding: 0 12px 6px 0;
|
|
5384
|
+
}
|
|
5385
|
+
/* Every value WRAPS and keeps its own line breaks: nothing is cut off. */
|
|
5386
|
+
.twm-facts tbody td,
|
|
5387
|
+
.twm-facts tbody th {
|
|
5388
|
+
text-align: left;
|
|
5389
|
+
font-weight: normal;
|
|
5390
|
+
border-bottom: 1px solid var(--border-subtle, #2a2a2a);
|
|
5391
|
+
padding: 6px 12px 6px 0;
|
|
5392
|
+
color: var(--text-primary, #e0e0e0);
|
|
5393
|
+
vertical-align: top;
|
|
5394
|
+
white-space: pre-wrap;
|
|
5395
|
+
overflow-wrap: anywhere;
|
|
5396
|
+
}
|
|
5397
|
+
.twm-facts tbody tr:last-child > td,
|
|
5398
|
+
.twm-facts tbody tr:last-child > th { border-bottom: 0; }
|
|
5399
|
+
.twm-facts tbody th.twm-facts__label {
|
|
5400
|
+
color: var(--text-muted, #888);
|
|
5401
|
+
white-space: nowrap;
|
|
5402
|
+
}
|
|
5403
|
+
.twm-facts.twm-facts--wrap-labels tbody th.twm-facts__label { white-space: normal; }
|
|
5404
|
+
/* `wrap: 'words'` — a value wraps at spaces only, and a long word stays
|
|
5405
|
+
* whole: the sheet grows wider and a sideways scroller around it scrolls.
|
|
5406
|
+
* `wrap: 'none'` — a value keeps its own line breaks and no others. */
|
|
5407
|
+
.twm-facts.twm-facts--wrap-words tbody td,
|
|
5408
|
+
.twm-facts.twm-facts--wrap-words tbody th { overflow-wrap: normal; word-break: normal; }
|
|
5409
|
+
.twm-facts.twm-facts--wrap-none tbody td,
|
|
5410
|
+
.twm-facts.twm-facts--wrap-none tbody th { white-space: pre; overflow-wrap: normal; word-break: normal; }
|
|
5411
|
+
.twm-facts.twm-facts--mono tbody td.twm-facts__value,
|
|
5412
|
+
.twm-facts tbody td.twm-facts__mono { font-family: var(--font-family-mono, monospace); font-size: 0.95em; }
|
|
5413
|
+
.twm-facts .twm-facts__num { font-variant-numeric: tabular-nums; white-space: nowrap; }
|
|
5414
|
+
.twm-facts tbody td.twm-facts__null,
|
|
5415
|
+
.twm-facts tbody td.twm-facts__missing { color: var(--text-dim, #666); font-style: italic; }
|
|
5416
|
+
.twm-facts tbody td.twm-facts__arrow {
|
|
5417
|
+
color: var(--text-dim, #666);
|
|
5418
|
+
white-space: nowrap;
|
|
5419
|
+
width: 1%;
|
|
5420
|
+
}
|
|
5421
|
+
.twm-facts tbody tr.twm-facts__row--changed > td.twm-facts__before { color: var(--text-muted, #888); }
|
|
5422
|
+
.twm-facts tbody tr.twm-facts__row--changed > td.twm-facts__arrow { color: var(--color-warning, #ff9800); }
|
|
5423
|
+
.twm-facts tbody tr.twm-facts__row--same > td { color: var(--text-muted, #888); }
|
|
5424
|
+
.twm-facts tbody tr.twm-facts__row--added > td.twm-facts__after { color: var(--color-success, #3fb950); }
|
|
5425
|
+
.twm-facts tbody tr.twm-facts__row--removed > td.twm-facts__before { color: var(--color-danger, #c74e4e); }
|
|
5426
|
+
.twm-facts tbody td.twm-facts__empty {
|
|
5427
|
+
padding: 12px 0;
|
|
5428
|
+
color: var(--text-muted, #888);
|
|
5429
|
+
white-space: normal;
|
|
5430
|
+
}
|
|
5431
|
+
/* ══ end RECORD LIST & FACT SHEET ══ */
|
|
5432
|
+
|
|
5100
5433
|
/* ══ FLOW · KIT ═══════════════════════════════════════════════════════ */
|
|
5101
5434
|
/* The shared flow-editor kit (36 §3, §3.12): the settings panel and its
|
|
5102
5435
|
* fields, the generic widgets, reference chips and the chip input, the two
|
package/css/flexdesk.css
CHANGED
|
@@ -555,6 +555,18 @@ body.twm-dt-col-resizing {
|
|
|
555
555
|
.twm-preview-table.twm-dt-measuring .twm-data-table__filter-row {
|
|
556
556
|
display: none !important;
|
|
557
557
|
}
|
|
558
|
+
/* 0.7.0 `filterKinds`: a filter row holding a CONTROL stays in the measure,
|
|
559
|
+
* its text boxes out of it, and each control at its NARROWEST (the widest
|
|
560
|
+
* chip) — so a column is never narrower than one of its chips. */
|
|
561
|
+
.twm-preview-table.twm-dt-measuring .twm-data-table__filter-row.twm-data-table__filter-row--controls {
|
|
562
|
+
display: table-row !important;
|
|
563
|
+
}
|
|
564
|
+
.twm-preview-table.twm-dt-measuring .twm-data-table__filter-row--controls .twm-data-table__filter-wrapper {
|
|
565
|
+
display: none !important;
|
|
566
|
+
}
|
|
567
|
+
.twm-preview-table.twm-dt-measuring th.data-table__filter-cell--control > * {
|
|
568
|
+
width: min-content !important;
|
|
569
|
+
}
|
|
558
570
|
/* ── C10. The virtual window (`DataTable` with `virtualize`) ─────────────
|
|
559
571
|
* The column track is a `<colgroup>` (see `_createTable`), so it is the
|
|
560
572
|
* `<col>` widths the measuring pass has to lift — the same `!important` it
|
|
@@ -779,6 +791,145 @@ body.twm-dt-col-resizing {
|
|
|
779
791
|
font-size: 16px;
|
|
780
792
|
line-height: 1;
|
|
781
793
|
}
|
|
794
|
+
/* ── 0.7.0 DataTable options. Each rule below matches only a class a 0.7.0
|
|
795
|
+
* option sets, so a table that asks for none of them is styled exactly as in
|
|
796
|
+
* 0.6. ─────────────────────────────────────────────────────────────────── */
|
|
797
|
+
/* `rowDetail` — the toggle. Its chevron is drawn by CSS from the icon font
|
|
798
|
+
* (the button carries its class), so the cell's text, its clipped-cell
|
|
799
|
+
* tooltip and a copy stay the cell's own; turned down while open. Negative
|
|
800
|
+
* block margins on a line height of 1: it cannot make its row taller. */
|
|
801
|
+
.twm-preview-table td .twm-dt-detail-toggle {
|
|
802
|
+
display: inline-flex;
|
|
803
|
+
align-items: center;
|
|
804
|
+
justify-content: center;
|
|
805
|
+
width: 18px;
|
|
806
|
+
height: 18px;
|
|
807
|
+
margin: -2px 4px -2px -2px;
|
|
808
|
+
padding: 0;
|
|
809
|
+
border: 0;
|
|
810
|
+
border-radius: 3px;
|
|
811
|
+
background: transparent;
|
|
812
|
+
color: inherit;
|
|
813
|
+
font-size: 16px;
|
|
814
|
+
line-height: 1;
|
|
815
|
+
vertical-align: top;
|
|
816
|
+
cursor: pointer;
|
|
817
|
+
opacity: 0.75;
|
|
818
|
+
}
|
|
819
|
+
.twm-preview-table td .twm-dt-detail-toggle-gap {
|
|
820
|
+
display: inline-block;
|
|
821
|
+
width: 18px;
|
|
822
|
+
margin: 0 4px 0 -2px;
|
|
823
|
+
vertical-align: top;
|
|
824
|
+
}
|
|
825
|
+
.twm-preview-table td .twm-dt-detail-toggle::before {
|
|
826
|
+
content: 'chevron_right';
|
|
827
|
+
transition: transform 0.12s ease;
|
|
828
|
+
}
|
|
829
|
+
.twm-preview-table td .twm-dt-detail-toggle[aria-expanded="true"]::before {
|
|
830
|
+
transform: rotate(90deg);
|
|
831
|
+
}
|
|
832
|
+
.twm-preview-table td .twm-dt-detail-toggle:hover {
|
|
833
|
+
opacity: 1;
|
|
834
|
+
background: rgba(255, 255, 255, 0.08);
|
|
835
|
+
}
|
|
836
|
+
.twm-preview-table td .twm-dt-detail-toggle:focus-visible {
|
|
837
|
+
opacity: 1;
|
|
838
|
+
outline: 1px solid var(--accent-bright, #007acc);
|
|
839
|
+
}
|
|
840
|
+
/* The detail's row: one cell across every column. It is often the body's
|
|
841
|
+
* FIRST cell of its row, so the time column's rules reach it (see the note
|
|
842
|
+
* above the NULL rule) — hence (0,4,3): the wrapper and `tbody` in front. It
|
|
843
|
+
* wraps, it is not clipped, it is not a thing to press (a clickable table's
|
|
844
|
+
* pointer and hover stop at it), and its content does not set the columns'
|
|
845
|
+
* widths (`contain: inline-size`, and it is out of the measuring pass). */
|
|
846
|
+
.twm-data-table-component .twm-preview-table tbody tr.twm-dt-detail-row > td.twm-dt-detail-cell,
|
|
847
|
+
.twm-data-table-component .twm-preview-table tbody tr.twm-dt-detail-row:not(.twm-dt-spacer):not(.data-table__empty-row):hover > td.twm-dt-detail-cell {
|
|
848
|
+
width: auto;
|
|
849
|
+
min-width: 0;
|
|
850
|
+
max-width: none;
|
|
851
|
+
padding: 6px 10px 8px 28px;
|
|
852
|
+
white-space: normal;
|
|
853
|
+
overflow: visible;
|
|
854
|
+
text-overflow: clip;
|
|
855
|
+
font-family: inherit;
|
|
856
|
+
font-weight: normal;
|
|
857
|
+
color: inherit;
|
|
858
|
+
cursor: auto;
|
|
859
|
+
background: var(--twm-dt-detail-bg, rgba(255, 255, 255, 0.025));
|
|
860
|
+
}
|
|
861
|
+
.twm-dt-detail {
|
|
862
|
+
contain: inline-size;
|
|
863
|
+
overflow: auto;
|
|
864
|
+
user-select: text;
|
|
865
|
+
}
|
|
866
|
+
.twm-preview-table.twm-dt-measuring tr.twm-dt-detail-row {
|
|
867
|
+
display: none !important;
|
|
868
|
+
}
|
|
869
|
+
/* `follow` / `refresh()` — a row the last answer did not have, for a moment. */
|
|
870
|
+
@keyframes twm-dt-row-new {
|
|
871
|
+
from { background: var(--twm-dt-new-bg, rgba(0, 122, 204, 0.22)); }
|
|
872
|
+
to { background: transparent; }
|
|
873
|
+
}
|
|
874
|
+
.twm-preview-table tbody tr.twm-dt-row--new > td {
|
|
875
|
+
animation: twm-dt-row-new 1.6s ease-out;
|
|
876
|
+
}
|
|
877
|
+
/* `pagerLabels` — a pager button with its word beside its glyph. */
|
|
878
|
+
.twm-pagination-btn .twm-pagination-btn__label {
|
|
879
|
+
margin-left: 2px;
|
|
880
|
+
font-size: 10px;
|
|
881
|
+
white-space: nowrap;
|
|
882
|
+
}
|
|
883
|
+
/* `filterKinds` — a filter cell holding a control rather than the text box,
|
|
884
|
+
* and the built-in chips. Wraps rather than clipping its control. */
|
|
885
|
+
.twm-preview-table th.data-table__filter-cell--control {
|
|
886
|
+
white-space: normal;
|
|
887
|
+
overflow: visible;
|
|
888
|
+
}
|
|
889
|
+
.twm-dt-filter-chips {
|
|
890
|
+
display: flex;
|
|
891
|
+
flex-wrap: wrap;
|
|
892
|
+
align-items: center;
|
|
893
|
+
gap: 3px;
|
|
894
|
+
}
|
|
895
|
+
.twm-dt-filter-chip {
|
|
896
|
+
display: inline-flex;
|
|
897
|
+
align-items: center;
|
|
898
|
+
gap: 3px;
|
|
899
|
+
height: 20px;
|
|
900
|
+
padding: 0 7px 0 5px;
|
|
901
|
+
border: 1px solid var(--border-default, #3a3a3a);
|
|
902
|
+
border-radius: 10px;
|
|
903
|
+
background: transparent;
|
|
904
|
+
color: #aaa;
|
|
905
|
+
font: inherit;
|
|
906
|
+
font-size: 11px;
|
|
907
|
+
font-weight: normal;
|
|
908
|
+
line-height: 1;
|
|
909
|
+
cursor: pointer;
|
|
910
|
+
}
|
|
911
|
+
.twm-dt-filter-chip:hover {
|
|
912
|
+
background: rgba(255, 255, 255, 0.06);
|
|
913
|
+
}
|
|
914
|
+
.twm-dt-filter-chip:focus-visible {
|
|
915
|
+
outline: 1px solid var(--accent-bright, #007acc);
|
|
916
|
+
}
|
|
917
|
+
.twm-dt-filter-chip.twm-dt-filter-chip--on {
|
|
918
|
+
border-color: var(--accent-bright, #007acc);
|
|
919
|
+
background: rgba(0, 122, 204, 0.18);
|
|
920
|
+
color: #ddd;
|
|
921
|
+
}
|
|
922
|
+
.twm-dt-filter-chip.twm-dt-filter-chip--empty {
|
|
923
|
+
opacity: 0.5;
|
|
924
|
+
}
|
|
925
|
+
.twm-dt-filter-chip .twm-dt-filter-chip__icon {
|
|
926
|
+
font-size: 14px;
|
|
927
|
+
line-height: 1;
|
|
928
|
+
}
|
|
929
|
+
.twm-dt-filter-chip .twm-dt-filter-chip__count {
|
|
930
|
+
color: #888;
|
|
931
|
+
font-variant-numeric: tabular-nums;
|
|
932
|
+
}
|
|
782
933
|
/* Wizard mode: uniform column widths, no selection */
|
|
783
934
|
.twm-preview-table-wrap--wizard .twm-preview-table {
|
|
784
935
|
table-layout: auto;
|
|
@@ -7459,6 +7610,188 @@ tr:hover .twm-row-action { opacity: 1; }
|
|
|
7459
7610
|
}
|
|
7460
7611
|
|
|
7461
7612
|
|
|
7613
|
+
/* ══ RECORD LIST & FACT SHEET (0.7.0) ══════════════════════════════════
|
|
7614
|
+
* `createRecordList` (src/ui/components/record_list.js) and
|
|
7615
|
+
* `createFactTable` (src/ui/components/fact_table.js). Neither has a height
|
|
7616
|
+
* of its own: each is exactly as tall as its records, in any parent. */
|
|
7617
|
+
|
|
7618
|
+
/* ── the record list ── */
|
|
7619
|
+
.twm-record-list { display: block; min-width: 0; }
|
|
7620
|
+
.twm-record-list__items {
|
|
7621
|
+
list-style: none;
|
|
7622
|
+
margin: 0;
|
|
7623
|
+
padding: 0;
|
|
7624
|
+
display: flex;
|
|
7625
|
+
flex-direction: column;
|
|
7626
|
+
}
|
|
7627
|
+
/* A record is one flex row that WRAPS: on a narrow host the pills and verbs
|
|
7628
|
+
* go under the name rather than squeezing it to nothing. */
|
|
7629
|
+
.twm-record {
|
|
7630
|
+
display: flex;
|
|
7631
|
+
flex-wrap: wrap;
|
|
7632
|
+
align-items: center;
|
|
7633
|
+
gap: 4px 10px;
|
|
7634
|
+
padding: 7px 6px;
|
|
7635
|
+
border-bottom: 1px solid var(--border-subtle, #2a2a2a);
|
|
7636
|
+
min-width: 0;
|
|
7637
|
+
}
|
|
7638
|
+
.twm-record:last-child { border-bottom: none; }
|
|
7639
|
+
.twm-record__main {
|
|
7640
|
+
flex: 1 1 14em;
|
|
7641
|
+
min-width: 0;
|
|
7642
|
+
display: flex;
|
|
7643
|
+
flex-direction: column;
|
|
7644
|
+
gap: 2px;
|
|
7645
|
+
}
|
|
7646
|
+
.twm-record__name {
|
|
7647
|
+
color: var(--text-primary, #e0e0e0);
|
|
7648
|
+
overflow-wrap: anywhere;
|
|
7649
|
+
}
|
|
7650
|
+
.twm-record__name--mono { font-family: var(--font-family-mono, monospace); font-size: 0.95em; }
|
|
7651
|
+
/* The quiet line. It wraps by default; `facts: 'ellipsis'` keeps it to one
|
|
7652
|
+
* line and puts the whole of it on the line's title. */
|
|
7653
|
+
.twm-record__facts {
|
|
7654
|
+
color: var(--text-muted, #888);
|
|
7655
|
+
font-size: var(--ea-font-body, 11px);
|
|
7656
|
+
overflow-wrap: anywhere;
|
|
7657
|
+
}
|
|
7658
|
+
.twm-record-list--clip .twm-record__facts {
|
|
7659
|
+
white-space: nowrap;
|
|
7660
|
+
overflow: hidden;
|
|
7661
|
+
text-overflow: ellipsis;
|
|
7662
|
+
}
|
|
7663
|
+
.twm-record__error {
|
|
7664
|
+
color: var(--color-danger, #c74e4e);
|
|
7665
|
+
font-size: var(--ea-font-body, 11px);
|
|
7666
|
+
overflow-wrap: anywhere;
|
|
7667
|
+
}
|
|
7668
|
+
/* A refused verb's reason, ON the screen — never only on a tooltip. */
|
|
7669
|
+
.twm-record__refusals { display: flex; flex-direction: column; gap: 1px; }
|
|
7670
|
+
.twm-record__refusal {
|
|
7671
|
+
color: var(--color-warning, #ff9800);
|
|
7672
|
+
font-size: var(--ea-font-small, 10px);
|
|
7673
|
+
overflow-wrap: anywhere;
|
|
7674
|
+
}
|
|
7675
|
+
.twm-record__pills,
|
|
7676
|
+
.twm-record__verbs {
|
|
7677
|
+
flex: 0 0 auto;
|
|
7678
|
+
display: flex;
|
|
7679
|
+
flex-wrap: wrap;
|
|
7680
|
+
align-items: center;
|
|
7681
|
+
justify-content: flex-end;
|
|
7682
|
+
gap: 4px 6px;
|
|
7683
|
+
margin-left: auto;
|
|
7684
|
+
}
|
|
7685
|
+
.twm-record__pill {
|
|
7686
|
+
display: inline-block;
|
|
7687
|
+
padding: 1px 7px;
|
|
7688
|
+
border-radius: var(--radius-pill, 999px);
|
|
7689
|
+
background: var(--surface-3, #3c3c3c);
|
|
7690
|
+
color: var(--text-muted, #888);
|
|
7691
|
+
font-size: var(--ea-font-small, 10px);
|
|
7692
|
+
line-height: 16px;
|
|
7693
|
+
white-space: nowrap;
|
|
7694
|
+
}
|
|
7695
|
+
.twm-record__pill--info { background: rgba(33, 150, 243, 0.16); color: var(--color-info, #2196f3); }
|
|
7696
|
+
.twm-record__pill--success { background: rgba(63, 185, 80, 0.16); color: var(--color-success, #3fb950); }
|
|
7697
|
+
.twm-record__pill--warn { background: rgba(255, 152, 0, 0.16); color: var(--color-warning, #ff9800); }
|
|
7698
|
+
.twm-record__pill--danger { background: rgba(199, 78, 78, 0.18); color: var(--color-danger, #c74e4e); }
|
|
7699
|
+
.twm-record__pill--muted { background: transparent; color: var(--text-dim, #666); box-shadow: inset 0 0 0 1px var(--border-strong, #383838); }
|
|
7700
|
+
.twm-record__verb-icon.material-symbols-outlined { font-size: 14px; line-height: 1; }
|
|
7701
|
+
/* States. A paused or switched-off record dims its words and pills and NOT
|
|
7702
|
+
* its verbs: the verb that brings it back has to stay readable. A dead or
|
|
7703
|
+
* failing one carries the danger colour on its left edge. */
|
|
7704
|
+
.twm-record--state-paused > .twm-record__main,
|
|
7705
|
+
.twm-record--state-paused > .twm-record__pills,
|
|
7706
|
+
.twm-record--state-off > .twm-record__main,
|
|
7707
|
+
.twm-record--state-off > .twm-record__pills,
|
|
7708
|
+
.twm-record--state-dead > .twm-record__main,
|
|
7709
|
+
.twm-record--state-dead > .twm-record__pills { opacity: 0.55; }
|
|
7710
|
+
.twm-record--state-dead,
|
|
7711
|
+
.twm-record--state-error { box-shadow: inset 2px 0 0 0 var(--color-danger, #c74e4e); }
|
|
7712
|
+
/* `activeKey` — the record that is OPEN: the accent on the left edge, as
|
|
7713
|
+
* DataTable's `twm-dt-row--active`. It wins over a state's edge. */
|
|
7714
|
+
.twm-record.twm-record--active { box-shadow: inset 2px 0 0 0 var(--accent-bright, #007acc); }
|
|
7715
|
+
.twm-record-list--clickable .twm-record { cursor: pointer; }
|
|
7716
|
+
.twm-record-list--clickable .twm-record:hover { background: var(--state-hover, rgba(255, 255, 255, 0.05)); }
|
|
7717
|
+
.twm-record:focus { outline: none; }
|
|
7718
|
+
.twm-record:focus-visible {
|
|
7719
|
+
outline: 1px solid var(--accent-bright, #007acc);
|
|
7720
|
+
outline-offset: -1px;
|
|
7721
|
+
}
|
|
7722
|
+
.twm-record-list__empty {
|
|
7723
|
+
margin: 0;
|
|
7724
|
+
padding: 12px 6px;
|
|
7725
|
+
color: var(--text-muted, #888);
|
|
7726
|
+
font-size: var(--ea-font-body, 11px);
|
|
7727
|
+
}
|
|
7728
|
+
|
|
7729
|
+
/* ── the fact sheet ── */
|
|
7730
|
+
.twm-facts {
|
|
7731
|
+
width: 100%;
|
|
7732
|
+
border-collapse: collapse;
|
|
7733
|
+
table-layout: auto;
|
|
7734
|
+
font-size: var(--font-size-sm, 12px);
|
|
7735
|
+
}
|
|
7736
|
+
.twm-facts thead th {
|
|
7737
|
+
text-align: left;
|
|
7738
|
+
font-size: var(--ea-font-small, 10px);
|
|
7739
|
+
font-weight: 600;
|
|
7740
|
+
letter-spacing: 0.06em;
|
|
7741
|
+
text-transform: uppercase;
|
|
7742
|
+
color: var(--text-dim, #666);
|
|
7743
|
+
white-space: nowrap;
|
|
7744
|
+
border-bottom: 1px solid var(--border-default, #303030);
|
|
7745
|
+
padding: 0 12px 6px 0;
|
|
7746
|
+
}
|
|
7747
|
+
/* Every value WRAPS and keeps its own line breaks: nothing is cut off. */
|
|
7748
|
+
.twm-facts tbody td,
|
|
7749
|
+
.twm-facts tbody th {
|
|
7750
|
+
text-align: left;
|
|
7751
|
+
font-weight: normal;
|
|
7752
|
+
border-bottom: 1px solid var(--border-subtle, #2a2a2a);
|
|
7753
|
+
padding: 6px 12px 6px 0;
|
|
7754
|
+
color: var(--text-primary, #e0e0e0);
|
|
7755
|
+
vertical-align: top;
|
|
7756
|
+
white-space: pre-wrap;
|
|
7757
|
+
overflow-wrap: anywhere;
|
|
7758
|
+
}
|
|
7759
|
+
.twm-facts tbody tr:last-child > td,
|
|
7760
|
+
.twm-facts tbody tr:last-child > th { border-bottom: 0; }
|
|
7761
|
+
.twm-facts tbody th.twm-facts__label {
|
|
7762
|
+
color: var(--text-muted, #888);
|
|
7763
|
+
white-space: nowrap;
|
|
7764
|
+
}
|
|
7765
|
+
.twm-facts.twm-facts--wrap-labels tbody th.twm-facts__label { white-space: normal; }
|
|
7766
|
+
/* `wrap: 'words'` — a value wraps at spaces only, and a long word stays
|
|
7767
|
+
* whole: the sheet grows wider and a sideways scroller around it scrolls.
|
|
7768
|
+
* `wrap: 'none'` — a value keeps its own line breaks and no others. */
|
|
7769
|
+
.twm-facts.twm-facts--wrap-words tbody td,
|
|
7770
|
+
.twm-facts.twm-facts--wrap-words tbody th { overflow-wrap: normal; word-break: normal; }
|
|
7771
|
+
.twm-facts.twm-facts--wrap-none tbody td,
|
|
7772
|
+
.twm-facts.twm-facts--wrap-none tbody th { white-space: pre; overflow-wrap: normal; word-break: normal; }
|
|
7773
|
+
.twm-facts.twm-facts--mono tbody td.twm-facts__value,
|
|
7774
|
+
.twm-facts tbody td.twm-facts__mono { font-family: var(--font-family-mono, monospace); font-size: 0.95em; }
|
|
7775
|
+
.twm-facts .twm-facts__num { font-variant-numeric: tabular-nums; white-space: nowrap; }
|
|
7776
|
+
.twm-facts tbody td.twm-facts__null,
|
|
7777
|
+
.twm-facts tbody td.twm-facts__missing { color: var(--text-dim, #666); font-style: italic; }
|
|
7778
|
+
.twm-facts tbody td.twm-facts__arrow {
|
|
7779
|
+
color: var(--text-dim, #666);
|
|
7780
|
+
white-space: nowrap;
|
|
7781
|
+
width: 1%;
|
|
7782
|
+
}
|
|
7783
|
+
.twm-facts tbody tr.twm-facts__row--changed > td.twm-facts__before { color: var(--text-muted, #888); }
|
|
7784
|
+
.twm-facts tbody tr.twm-facts__row--changed > td.twm-facts__arrow { color: var(--color-warning, #ff9800); }
|
|
7785
|
+
.twm-facts tbody tr.twm-facts__row--same > td { color: var(--text-muted, #888); }
|
|
7786
|
+
.twm-facts tbody tr.twm-facts__row--added > td.twm-facts__after { color: var(--color-success, #3fb950); }
|
|
7787
|
+
.twm-facts tbody tr.twm-facts__row--removed > td.twm-facts__before { color: var(--color-danger, #c74e4e); }
|
|
7788
|
+
.twm-facts tbody td.twm-facts__empty {
|
|
7789
|
+
padding: 12px 0;
|
|
7790
|
+
color: var(--text-muted, #888);
|
|
7791
|
+
white-space: normal;
|
|
7792
|
+
}
|
|
7793
|
+
/* ══ end RECORD LIST & FACT SHEET ══ */
|
|
7794
|
+
|
|
7462
7795
|
/* ══ FLOW · KIT ═══════════════════════════════════════════════════════ */
|
|
7463
7796
|
/* The shared flow-editor kit (36 §3, §3.12): the settings panel and its
|
|
7464
7797
|
* fields, the generic widgets, reference chips and the chip input, the two
|