flexdesk 0.18.0 → 0.18.2

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.
Files changed (47) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/css/flexdesk.css +83 -5
  3. package/css/tokens.css +7 -0
  4. package/dist/charts.js +78 -12
  5. package/dist/charts.js.map +2 -2
  6. package/dist/{chunk-5W4EEKSK.js → chunk-3BLIVOFD.js} +3 -3
  7. package/dist/{chunk-P74F6I6P.js → chunk-4X4SY3CP.js} +4 -4
  8. package/dist/{chunk-P74F6I6P.js.map → chunk-4X4SY3CP.js.map} +2 -2
  9. package/dist/{chunk-ZL3VKINP.js → chunk-HL3IIHU3.js} +494 -3
  10. package/dist/{chunk-ZL3VKINP.js.map → chunk-HL3IIHU3.js.map} +4 -4
  11. package/dist/{chunk-RKVYIXDC.js → chunk-NFZJ6P42.js} +19 -500
  12. package/dist/chunk-NFZJ6P42.js.map +7 -0
  13. package/dist/{chunk-U5GKJUOC.js → chunk-QRBOIUU3.js} +5 -6
  14. package/dist/chunk-QRBOIUU3.js.map +7 -0
  15. package/dist/flexdesk.css +83 -5
  16. package/dist/flow.js +22 -10
  17. package/dist/flow.js.map +2 -2
  18. package/dist/git.js +3 -3
  19. package/dist/tiles.js +4 -4
  20. package/dist/tokens.css +7 -0
  21. package/dist/widgets.js +226 -58
  22. package/dist/widgets.js.map +2 -2
  23. package/dist/wm.js +2 -2
  24. package/docs/components/charts.md +40 -0
  25. package/docs/components/chat-shell.md +8 -2
  26. package/docs/components/filter-builder.md +52 -6
  27. package/docs/components/flow-editors.md +20 -0
  28. package/docs/components/forms-and-dialogs.md +8 -0
  29. package/docs/components/input-fields.md +24 -0
  30. package/docs/components/menus.md +4 -0
  31. package/docs/components/shell.md +4 -0
  32. package/docs/components/workspace-picker.md +46 -2
  33. package/package.json +1 -1
  34. package/src/charts/plot_config_editor.js +92 -6
  35. package/src/charts/plot_grid.js +6 -1
  36. package/src/flow/kit/settings_panel.js +24 -9
  37. package/src/ui/components/chat_shell.js +7 -1
  38. package/src/ui/components/context_menu.js +8 -2
  39. package/src/ui/components/filter_builder.js +53 -28
  40. package/src/ui/components/filter_model.js +86 -18
  41. package/src/ui/components/inline_renamer.js +10 -5
  42. package/src/ui/components/modal.js +25 -8
  43. package/src/ui/components/workspace_picker.js +125 -27
  44. package/src/ui/utils/tooltip_service.js +81 -14
  45. package/dist/chunk-RKVYIXDC.js.map +0 -7
  46. package/dist/chunk-U5GKJUOC.js.map +0 -7
  47. /package/dist/{chunk-5W4EEKSK.js.map → chunk-3BLIVOFD.js.map} +0 -0
package/dist/flexdesk.css CHANGED
@@ -4899,14 +4899,14 @@ body.twm-window-maximized .twm-resize-handle {
4899
4899
  .twm-wspicker-field--open {
4900
4900
  outline: none;
4901
4901
  background: var(--state-active);
4902
- border-color: var(--accent-bright);
4902
+ border-color: var(--twm-wspicker-field-focus-border);
4903
4903
  }
4904
4904
  .twm-wspicker-field [hidden] {
4905
4905
  display: none;
4906
4906
  }
4907
4907
  .twm-wspicker-field__icon.material-symbols-outlined {
4908
4908
  flex: none;
4909
- color: var(--accent-bright);
4909
+ color: var(--twm-wspicker-field-icon);
4910
4910
  font-size: 15px;
4911
4911
  opacity: 0.85;
4912
4912
  }
@@ -4921,11 +4921,11 @@ body.twm-window-maximized .twm-resize-handle {
4921
4921
  white-space: nowrap;
4922
4922
  }
4923
4923
  .twm-wspicker-field--muted .twm-wspicker-field__name {
4924
- font-style: italic;
4925
- opacity: 0.55;
4924
+ font-style: var(--twm-wspicker-field-muted-style);
4925
+ opacity: var(--twm-wspicker-field-muted-opacity);
4926
4926
  }
4927
4927
  .twm-wspicker-field--muted .twm-wspicker-field__icon.material-symbols-outlined {
4928
- color: var(--text-muted);
4928
+ color: var(--twm-wspicker-field-muted-icon);
4929
4929
  }
4930
4930
  .twm-wspicker-field__key {
4931
4931
  flex: none;
@@ -5063,6 +5063,10 @@ body.twm-window-maximized .twm-resize-handle {
5063
5063
  background: var(--state-selected);
5064
5064
  color: var(--text-bright);
5065
5065
  }
5066
+ /* A row with focus wears the highlight; no ring as well. */
5067
+ .twm-wspicker__row:focus {
5068
+ outline: none;
5069
+ }
5066
5070
  .twm-wspicker__row--disabled {
5067
5071
  color: var(--text-dim);
5068
5072
  cursor: default;
@@ -5143,6 +5147,10 @@ body.twm-window-maximized .twm-resize-handle {
5143
5147
  width: calc(100% - 2 * var(--space-md));
5144
5148
  margin: var(--space-xs) var(--space-md);
5145
5149
  }
5150
+ .twm-wspicker__more[aria-disabled="true"] {
5151
+ opacity: 0.4;
5152
+ cursor: not-allowed;
5153
+ }
5146
5154
  .twm-wspicker__more-label {
5147
5155
  min-width: 0;
5148
5156
  overflow: hidden;
@@ -5392,6 +5400,9 @@ body.twm-window-maximized .twm-resize-handle {
5392
5400
  .twm-filter-builder__select--field {
5393
5401
  flex: 0 1 140px;
5394
5402
  }
5403
+ .twm-filter-builder__select--unknown {
5404
+ flex: 0 1 auto;
5405
+ }
5395
5406
  .twm-filter-builder__select--op {
5396
5407
  flex: 0 1 120px;
5397
5408
  }
@@ -12372,6 +12383,23 @@ button.twm-alerts__ref:hover { text-decoration: underline; }
12372
12383
  .twm-plot-config__row > .twm-plot-config__input--select {
12373
12384
  flex: 0 1 auto;
12374
12385
  }
12386
+ /* A reference line's value that may name a constant, and what the name is now. */
12387
+ .twm-plot-config__constant {
12388
+ display: inline-flex;
12389
+ flex: 1 1 140px;
12390
+ align-items: center;
12391
+ gap: var(--space-xs);
12392
+ min-width: 0;
12393
+ }
12394
+ .twm-plot-config__constant > .twm-plot-config__input {
12395
+ flex: 1 1 auto;
12396
+ min-width: 0;
12397
+ }
12398
+ .twm-plot-config__constant-value {
12399
+ flex: none;
12400
+ color: var(--text-muted);
12401
+ font-size: var(--font-size-xs);
12402
+ }
12375
12403
  /* On a field line a colour is the swatch and a hex box sized to `#rrggbb`. */
12376
12404
  .twm-plot-config__field > .twm-color-field {
12377
12405
  flex: 0 1 auto;
@@ -13614,6 +13642,55 @@ button.twm-alerts__ref:hover { text-decoration: underline; }
13614
13642
  color: var(--twm-flow-warning-text);
13615
13643
  }
13616
13644
 
13645
+ /* ── the settings panel as a sheet (variant: 'sheet', 0.18.2) ──────────
13646
+ * Flat: no fill and no chip. The title and the description sit in a margin at
13647
+ * the left, the fields beside them; two sheets in a row are split by a rule, so
13648
+ * a page of them reads as one form in sections. Narrower than 560px, the margin
13649
+ * goes above the fields. */
13650
+ .twm-flow-panel--sheet {
13651
+ container-type: inline-size;
13652
+ gap: 0;
13653
+ padding: 14px 0;
13654
+ background: transparent;
13655
+ }
13656
+ .twm-flow-panel--sheet + .twm-flow-panel--sheet {
13657
+ border-top: 1px solid var(--border-subtle);
13658
+ }
13659
+ .twm-flow-panel__sheet {
13660
+ display: grid;
13661
+ grid-template-columns: minmax(120px, 180px) minmax(0, 1fr);
13662
+ gap: 10px 28px;
13663
+ align-items: start;
13664
+ }
13665
+ .twm-flow-panel__margin {
13666
+ display: flex;
13667
+ flex-direction: column;
13668
+ gap: 4px;
13669
+ min-width: 0;
13670
+ padding-top: 5px;
13671
+ }
13672
+ .twm-flow-panel__body {
13673
+ display: flex;
13674
+ flex-direction: column;
13675
+ gap: 12px;
13676
+ min-width: 0;
13677
+ }
13678
+ .twm-flow-panel--sheet .twm-flow-panel__icon { display: none; }
13679
+ .twm-flow-panel--sheet .twm-flow-panel__titles { flex-basis: auto; }
13680
+ .twm-flow-panel--sheet .twm-flow-panel__title,
13681
+ .twm-flow-panel--sheet .twm-flow-panel__title-input {
13682
+ font-size: var(--font-size-md);
13683
+ }
13684
+ .twm-flow-panel--sheet .twm-flow-panel__description {
13685
+ font-size: var(--font-size-xs);
13686
+ color: var(--twm-flow-muted);
13687
+ }
13688
+ .twm-flow-panel--sheet .twm-flow-panel__fields { gap: 10px; }
13689
+ .twm-flow-panel--sheet .twm-flow-field__label { flex-basis: 110px; }
13690
+ @container (max-width: 560px) {
13691
+ .twm-flow-panel__sheet { grid-template-columns: minmax(0, 1fr); }
13692
+ }
13693
+
13617
13694
  /* ── a field: its label, its control, its finding, its help ─────────── */
13618
13695
  .twm-flow-field {
13619
13696
  display: flex;
@@ -13759,6 +13836,7 @@ button.twm-alerts__ref:hover { text-decoration: underline; }
13759
13836
  resize: vertical;
13760
13837
  }
13761
13838
  .twm-flow-checkbox {
13839
+ align-self: flex-start;
13762
13840
  margin: 6px 0 0;
13763
13841
  accent-color: var(--twm-flow-focus);
13764
13842
  }
package/dist/flow.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-DNJ3N4T4.js";
4
4
  import {
5
5
  DataTable
6
- } from "./chunk-U5GKJUOC.js";
6
+ } from "./chunk-QRBOIUU3.js";
7
7
  import "./chunk-VLOAI3HS.js";
8
8
  import {
9
9
  choiceList,
@@ -2197,11 +2197,16 @@ function createSettingsPanel({
2197
2197
  values = null,
2198
2198
  valuesNote = null,
2199
2199
  columns = null,
2200
- host = null
2200
+ host = null,
2201
+ variant = "card"
2201
2202
  } = {}) {
2202
2203
  if (!widgets?.get) throw new Error("createSettingsPanel needs a widget registry (createWidgetRegistry()).");
2204
+ if (variant !== "card" && variant !== "sheet") {
2205
+ throw new Error(`createSettingsPanel's variant is 'card' or 'sheet', not ${JSON.stringify(variant)}.`);
2206
+ }
2207
+ const sheet = variant === "sheet";
2203
2208
  const S = createStrings(strings);
2204
- const root = el("section", "twm-flow-panel");
2209
+ const root = el("section", sheet ? "twm-flow-panel twm-flow-panel--sheet" : "twm-flow-panel");
2205
2210
  root.setAttribute("role", "region");
2206
2211
  root.setAttribute("aria-label", say(S, "settings"));
2207
2212
  if (host) host.appendChild(root);
@@ -2316,15 +2321,22 @@ function createSettingsPanel({
2316
2321
  root.replaceChildren();
2317
2322
  if (!spec) return;
2318
2323
  if (isReadOnly() && readOnlyReason()) root.appendChild(el("p", "twm-flow-panel__readonly", readOnlyReason()));
2319
- root.appendChild(paintHeader());
2320
- if (spec.description) root.appendChild(el("p", "twm-flow-panel__description", spec.description));
2321
- if (spec.idLine) root.appendChild(el("div", "twm-flow-panel__id", spec.idLine));
2324
+ const margin = sheet ? el("div", "twm-flow-panel__margin") : root;
2325
+ const body = sheet ? el("div", "twm-flow-panel__body") : root;
2326
+ if (sheet) {
2327
+ const grid = el("div", "twm-flow-panel__sheet");
2328
+ grid.append(margin, body);
2329
+ root.appendChild(grid);
2330
+ }
2331
+ margin.appendChild(paintHeader());
2332
+ if (spec.description) margin.appendChild(el("p", "twm-flow-panel__description", spec.description));
2333
+ if (spec.idLine) body.appendChild(el("div", "twm-flow-panel__id", spec.idLine));
2322
2334
  findingsBox = el("ul", "twm-flow-panel__findings");
2323
2335
  findingsBox.hidden = true;
2324
- root.appendChild(findingsBox);
2336
+ body.appendChild(findingsBox);
2325
2337
  slotBefore = el("div", "twm-flow-panel__slot");
2326
2338
  slotBefore.dataset.slot = "before";
2327
- root.appendChild(slotBefore);
2339
+ body.appendChild(slotBefore);
2328
2340
  const list = el("div", "twm-flow-panel__fields");
2329
2341
  allFields = Array.isArray(spec.fields) ? spec.fields : fieldsFromSchema(spec.type?.config_schema);
2330
2342
  const drawn = visibleFields(allFields, current);
@@ -2361,10 +2373,10 @@ function createSettingsPanel({
2361
2373
  const anchor = placed(e);
2362
2374
  if (anchor === null || !keys.has(anchor)) drawExtra(e);
2363
2375
  }
2364
- root.appendChild(list);
2376
+ body.appendChild(list);
2365
2377
  slotAfter = el("div", "twm-flow-panel__slot");
2366
2378
  slotAfter.dataset.slot = "after";
2367
- root.appendChild(slotAfter);
2379
+ body.appendChild(slotAfter);
2368
2380
  paintSlots();
2369
2381
  applyFindings();
2370
2382
  }