flexdesk 0.11.1 → 0.12.1

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
@@ -130,6 +130,28 @@ await createShell({
130
130
  });
131
131
  ```
132
132
 
133
+ ### A pane that names what it shows: `ctx.setTitle` (0.12.1)
134
+
135
+ A content factory receives `(hostEl, props, ctx)`, and `ctx` carries, per pane,
136
+ `setTitle(text)`. It renames the pane's chrome title, at mount or any time
137
+ after, and the title survives repaints — including a panel's, whose tree title
138
+ the shell resets to Navigator / Inspector / Console on every layout pass:
139
+
140
+ ```js
141
+ content: {
142
+ 'panel:bottom': (hostEl, props, ctx) => {
143
+ // …a panel with tabs of its own…
144
+ const show = (tab) => { /* swap the body */ ctx.setTitle(tab.label); };
145
+ show(tabs[0]);
146
+ return { destroy() {} };
147
+ },
148
+ },
149
+ ```
150
+
151
+ `setTitle(null)` or `''` gives the title back to the tree. It changes what the
152
+ chrome shows only — the tree, the tab labels and the saved layout are left
153
+ alone — and a call from content whose pane has since been rebuilt does nothing.
154
+
133
155
  ### Your desktops beside the app's (0.10.0)
134
156
 
135
157
  Pass `chrome.desktops` and the shell paints a desktop bar: a chip per desktop
@@ -885,6 +907,39 @@ list.setColumnVisible(3, true);
885
907
  A column sorted on and then hidden keeps the order; its arrow comes back with
886
908
  the column.
887
909
 
910
+ ### DataTable: a select mode (0.12.0)
911
+
912
+ A list whose click opens a row can still let people pick many rows: a toggle
913
+ in the table's own header turns on a select mode, with a checkbox per row and
914
+ a click that ticks instead of opening. A table that sets none of these options
915
+ draws and behaves as in 0.11.
916
+
917
+ ```js
918
+ const list = DataTable.mount(host, {
919
+ headers, rows,
920
+ getRowKey: (row) => row[0], // keeps the ticks across new rows
921
+ onRowActivate: (i, row) => open(row), // not called while selecting
922
+ selectToggle: true,
923
+ onSelectModeChange: (on) => bar.hidden = !on,
924
+ onSelectionChange: (ticked) => bar.count = ticked.length,
925
+ });
926
+ list.setSelectMode(true);
927
+ ```
928
+
929
+ | Option | What it does |
930
+ |---|---|
931
+ | `selectToggle: true` | Draws a narrow leading column whose header holds a toggle button. While the mode is on, every row shows a checkbox and the header a select-all box. Needs a multi-row `selectable` (on `false` or `'single'` it is ignored, with a console warning). |
932
+ | `selectMode: true` | Starts in the mode. Draws the column even without `selectToggle`; the consumer then leaves the mode with `setSelectMode(false)`. |
933
+ | `setSelectMode(on)` / `isSelectMode()` | Turns the mode on or off from code (returns whether it changed), and says whether it is on. The selection is kept either way. |
934
+ | `onSelectModeChange(on)` | Called after every change of the mode: the toggle, Escape, `setSelectMode`. |
935
+ | In the mode | A plain click or Space ticks or unticks one row; Shift-click adds the range from the last row ticked. The arrows move a cursor without changing the ticks (Shift ticks the rows passed). A right-click keeps the ticks. Escape clears them, and a second Escape leaves the mode. Nothing opens a row: `onRowActivate` is not called (`onRowClick` still is, so a consumer that opens rows from it checks `isSelectMode()`). New rows (`setData`) keep the ticks by `getRowKey`. |
936
+ | Select-all | Ticks every row the filters let through, on every page; when all are ticked it clears them. It shows checked, mixed or clear. |
937
+
938
+ The select column is not a data column: it is not in a copy, a CSV,
939
+ `ctx.colIdx` or `hiddenColumns`, and it cannot be resized. It is drawn for the
940
+ table's whole life, so remembered widths stay on their columns when the mode
941
+ flips, and widths saved by a table without it land on the same columns.
942
+
888
943
  ### Scrollbars
889
944
 
890
945
  `installAutoScrollbars(root)` (from `@flexdesk/widgets`) replaces the browser's
package/css/flexdesk.css CHANGED
@@ -706,6 +706,82 @@ body.twm-dt-col-resizing {
706
706
  .twm-preview-table tbody tr.twm-dt-row--active > td:first-child {
707
707
  box-shadow: inset 2px 0 0 0 var(--accent-bright, #007acc);
708
708
  }
709
+ /* STORY-0016 `selectToggle` / `selectMode` — the select column. Narrow, never
710
+ * the time column (it is the first child, so the time rules reach it: (0,3,2)
711
+ * here beats them), and the time styling moves to the first column after it,
712
+ * so a table looks as it did before the column was added. Its boxes show only
713
+ * in select mode; the header's toggle always. */
714
+ .twm-preview-table.twm-dt--select tr > .twm-dt-select-cell {
715
+ width: 32px;
716
+ min-width: 0;
717
+ max-width: none;
718
+ padding-left: 6px;
719
+ padding-right: 2px;
720
+ text-align: left;
721
+ color: inherit;
722
+ font-weight: inherit;
723
+ white-space: nowrap;
724
+ }
725
+ .twm-preview-table.twm-dt--select:not(.twm-dt--first-plain) tr > .twm-dt-select-cell + th,
726
+ .twm-preview-table.twm-dt--select:not(.twm-dt--first-plain) tr > .twm-dt-select-cell + td {
727
+ width: 120px;
728
+ min-width: 100px;
729
+ font-weight: 500;
730
+ color: #bbb;
731
+ }
732
+ .twm-preview-table.twm-dt--select:not(.twm-dt--first-plain) tr > th.twm-dt-select-cell + th {
733
+ font-weight: 600;
734
+ color: #aaa;
735
+ }
736
+ .twm-preview-table.twm-dt--select td.twm-dt-select-cell .twm-dt-select-box {
737
+ display: none;
738
+ margin: 0;
739
+ vertical-align: middle;
740
+ cursor: pointer;
741
+ }
742
+ .twm-preview-table.twm-dt--selecting td.twm-dt-select-cell .twm-dt-select-box {
743
+ display: inline-block;
744
+ }
745
+ .twm-preview-table.twm-dt--select th.twm-dt-select-cell .twm-dt-select-all {
746
+ margin: 0 4px 0 0;
747
+ vertical-align: middle;
748
+ cursor: pointer;
749
+ }
750
+ .twm-preview-table.twm-dt--select th.twm-dt-select-cell .twm-dt-select-toggle {
751
+ display: inline-flex;
752
+ align-items: center;
753
+ justify-content: center;
754
+ width: 20px;
755
+ height: 20px;
756
+ margin: -3px 0;
757
+ padding: 0;
758
+ border: 0;
759
+ border-radius: 3px;
760
+ background: transparent;
761
+ color: inherit;
762
+ font-size: 16px;
763
+ line-height: 1;
764
+ vertical-align: middle;
765
+ cursor: pointer;
766
+ opacity: 0.7;
767
+ }
768
+ .twm-preview-table.twm-dt--select th.twm-dt-select-cell .twm-dt-select-toggle:hover,
769
+ .twm-preview-table.twm-dt--select th.twm-dt-select-cell .twm-dt-select-toggle[aria-pressed="true"] {
770
+ opacity: 1;
771
+ background: rgba(255, 255, 255, 0.08);
772
+ }
773
+ .twm-preview-table.twm-dt--select th.twm-dt-select-cell .twm-dt-select-toggle:focus-visible {
774
+ opacity: 1;
775
+ outline: 1px solid var(--accent-bright, #007acc);
776
+ }
777
+ /* In the mode a click ticks: a pointer on every row, and the keyboard's row
778
+ * (the arrows move it, Space ticks it) drawn as an outline. */
779
+ .twm-preview-table.twm-dt--selecting tbody tr:not(.twm-dt-spacer):not(.data-table__empty-row) {
780
+ cursor: pointer;
781
+ }
782
+ .twm-preview-table.twm-dt--selecting tbody tr.twm-dt-row--cursor > td {
783
+ box-shadow: inset 0 1px 0 0 var(--accent-bright, #007acc), inset 0 -1px 0 0 var(--accent-bright, #007acc);
784
+ }
709
785
  /* `rowIcon` — drawn from `data-twm-icon` so the icon's NAME is not cell
710
786
  * text (not in a copy, not in the clipped-cell tooltip). The span carries the
711
787
  * icon font's class; the pseudo-element inherits its font and ligatures. Top
@@ -4889,36 +4965,54 @@ button.twm-about-dialog__btn--close:focus {
4889
4965
  color: #fff;
4890
4966
  }
4891
4967
  /* Content area — drop the host padding so the body host controls its
4892
- * own zones (form rows + flush-bottom action strip). */
4968
+ * own zones (form rows + flush-bottom action strip). The content never
4969
+ * scrolls itself: the zone above the strip does, so the strip stays whole
4970
+ * and in view when the fields outgrow the window. */
4893
4971
  .twm-managed-window--modal .twm-managed-window__content {
4894
4972
  background: var(--ea-bg-content);
4895
4973
  padding: 0;
4896
- overflow: auto;
4974
+ overflow: hidden;
4897
4975
  }
4898
4976
  .twm-managed-window--modal .twm-modal__body-host {
4899
4977
  display: flex;
4900
4978
  flex-direction: column;
4901
- min-height: 100%;
4979
+ height: 100%;
4902
4980
  }
4903
- /* Form sits inside the body host as a flex column so the actions row
4904
- * gets pushed to the bottom via margin-top:auto. */
4981
+ /* Form sits inside the body host as a flex column: the fields take the
4982
+ * room left over and scroll, the error banner and the actions row keep
4983
+ * their height below them. */
4905
4984
  .twm-managed-window--modal .twm-modal__form {
4906
4985
  display: flex;
4907
4986
  flex-direction: column;
4908
4987
  flex: 1 1 auto;
4988
+ min-height: 0;
4909
4989
  padding: 0;
4990
+ overflow: hidden;
4991
+ }
4992
+ .twm-managed-window--modal .twm-modal__fields {
4993
+ flex: 1 1 auto;
4994
+ min-height: 0;
4995
+ overflow-y: auto;
4996
+ padding-bottom: 14px;
4997
+ }
4998
+ .twm-managed-window--modal .twm-modal__form > .twm-modal__error,
4999
+ .twm-managed-window--modal .twm-modal__form > .twm-modal__actions {
5000
+ flex: 0 0 auto;
5001
+ }
5002
+ .twm-managed-window--modal .twm-modal__form > .twm-modal__error {
5003
+ margin-bottom: 8px;
4910
5004
  }
4911
5005
  /* Field rows get inset margins so the action strip can run edge-to-edge
4912
5006
  * as a true bottom band. */
4913
- .twm-managed-window--modal .twm-modal__form > .twm-modal__row,
4914
- .twm-managed-window--modal .twm-modal__form > .twm-modal__section,
5007
+ .twm-managed-window--modal .twm-modal__fields > .twm-modal__row,
5008
+ .twm-managed-window--modal .twm-modal__fields > .twm-modal__section,
4915
5009
  .twm-managed-window--modal .twm-modal__form > .twm-modal__error,
4916
5010
  .twm-managed-window--modal .twm-modal__body {
4917
5011
  margin-left: 14px;
4918
5012
  margin-right: 14px;
4919
5013
  }
4920
- .twm-managed-window--modal .twm-modal__form > .twm-modal__row:first-of-type,
4921
- .twm-managed-window--modal .twm-modal__form > .twm-modal__section:first-child,
5014
+ .twm-managed-window--modal .twm-modal__fields > .twm-modal__row:first-of-type,
5015
+ .twm-managed-window--modal .twm-modal__fields > .twm-modal__section:first-child,
4922
5016
  .twm-managed-window--modal .twm-modal__body:first-child {
4923
5017
  margin-top: 14px;
4924
5018
  }
@@ -5159,6 +5253,8 @@ button.twm-about-dialog__btn--close:focus {
5159
5253
  line-height: 1.5;
5160
5254
  color: var(--ea-text);
5161
5255
  flex: 1 1 auto;
5256
+ min-height: 0;
5257
+ overflow-y: auto;
5162
5258
  }
5163
5259
  /* Form-level error banner — left accent stripe, dim red panel. */
5164
5260
  .twm-managed-window--modal .twm-modal__error {
package/css/overrides.css CHANGED
@@ -241,36 +241,54 @@
241
241
  color: #fff;
242
242
  }
243
243
  /* Content area — drop the host padding so the body host controls its
244
- * own zones (form rows + flush-bottom action strip). */
244
+ * own zones (form rows + flush-bottom action strip). The content never
245
+ * scrolls itself: the zone above the strip does, so the strip stays whole
246
+ * and in view when the fields outgrow the window. */
245
247
  .twm-managed-window--modal .twm-managed-window__content {
246
248
  background: var(--ea-bg-content);
247
249
  padding: 0;
248
- overflow: auto;
250
+ overflow: hidden;
249
251
  }
250
252
  .twm-managed-window--modal .twm-modal__body-host {
251
253
  display: flex;
252
254
  flex-direction: column;
253
- min-height: 100%;
255
+ height: 100%;
254
256
  }
255
- /* Form sits inside the body host as a flex column so the actions row
256
- * gets pushed to the bottom via margin-top:auto. */
257
+ /* Form sits inside the body host as a flex column: the fields take the
258
+ * room left over and scroll, the error banner and the actions row keep
259
+ * their height below them. */
257
260
  .twm-managed-window--modal .twm-modal__form {
258
261
  display: flex;
259
262
  flex-direction: column;
260
263
  flex: 1 1 auto;
264
+ min-height: 0;
261
265
  padding: 0;
266
+ overflow: hidden;
267
+ }
268
+ .twm-managed-window--modal .twm-modal__fields {
269
+ flex: 1 1 auto;
270
+ min-height: 0;
271
+ overflow-y: auto;
272
+ padding-bottom: 14px;
273
+ }
274
+ .twm-managed-window--modal .twm-modal__form > .twm-modal__error,
275
+ .twm-managed-window--modal .twm-modal__form > .twm-modal__actions {
276
+ flex: 0 0 auto;
277
+ }
278
+ .twm-managed-window--modal .twm-modal__form > .twm-modal__error {
279
+ margin-bottom: 8px;
262
280
  }
263
281
  /* Field rows get inset margins so the action strip can run edge-to-edge
264
282
  * as a true bottom band. */
265
- .twm-managed-window--modal .twm-modal__form > .twm-modal__row,
266
- .twm-managed-window--modal .twm-modal__form > .twm-modal__section,
283
+ .twm-managed-window--modal .twm-modal__fields > .twm-modal__row,
284
+ .twm-managed-window--modal .twm-modal__fields > .twm-modal__section,
267
285
  .twm-managed-window--modal .twm-modal__form > .twm-modal__error,
268
286
  .twm-managed-window--modal .twm-modal__body {
269
287
  margin-left: 14px;
270
288
  margin-right: 14px;
271
289
  }
272
- .twm-managed-window--modal .twm-modal__form > .twm-modal__row:first-of-type,
273
- .twm-managed-window--modal .twm-modal__form > .twm-modal__section:first-child,
290
+ .twm-managed-window--modal .twm-modal__fields > .twm-modal__row:first-of-type,
291
+ .twm-managed-window--modal .twm-modal__fields > .twm-modal__section:first-child,
274
292
  .twm-managed-window--modal .twm-modal__body:first-child {
275
293
  margin-top: 14px;
276
294
  }
@@ -481,6 +499,8 @@
481
499
  line-height: 1.5;
482
500
  color: var(--ea-text);
483
501
  flex: 1 1 auto;
502
+ min-height: 0;
503
+ overflow-y: auto;
484
504
  }
485
505
  /* Form-level error banner — left accent stripe, dim red panel. */
486
506
  .twm-managed-window--modal .twm-modal__error {
package/dist/charts.js CHANGED
@@ -39,10 +39,10 @@ import {
39
39
  setPlotlySource,
40
40
  uid,
41
41
  updateChart
42
- } from "./chunk-EHHTKD7B.js";
42
+ } from "./chunk-2LEJQD4H.js";
43
43
  import {
44
44
  createRafResizeObserver
45
- } from "./chunk-6CGH73BC.js";
45
+ } from "./chunk-M2L4XW2U.js";
46
46
  import {
47
47
  ManagedWindow
48
48
  } from "./chunk-6JSOVNID.js";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DataTable,
3
3
  createRafResizeObserver
4
- } from "./chunk-6CGH73BC.js";
4
+ } from "./chunk-M2L4XW2U.js";
5
5
  import {
6
6
  ManagedWindow
7
7
  } from "./chunk-6JSOVNID.js";
@@ -2370,4 +2370,4 @@ export {
2370
2370
  openPlotPopoutWindow,
2371
2371
  openRawTracesWindow
2372
2372
  };
2373
- //# sourceMappingURL=chunk-EHHTKD7B.js.map
2373
+ //# sourceMappingURL=chunk-2LEJQD4H.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  modalHost
3
- } from "./chunk-6EZPPN4E.js";
3
+ } from "./chunk-NNFTETK3.js";
4
4
 
5
5
  // src/help/help_registry.js
6
6
  var EMPTY_PROVIDER = Object.freeze({
@@ -472,4 +472,4 @@ export {
472
472
  showContextMenu,
473
473
  hideContextMenu
474
474
  };
475
- //# sourceMappingURL=chunk-5QPGYHBN.js.map
475
+ //# sourceMappingURL=chunk-CWPMLX67.js.map