flexdesk 0.17.18 → 0.18.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.
Files changed (126) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/README.md +1 -0
  3. package/css/flexdesk.css +7547 -5891
  4. package/css/reset.css +1 -1
  5. package/css/tokens.css +30 -1
  6. package/dist/charts.js +83 -13
  7. package/dist/charts.js.map +2 -2
  8. package/dist/chunk-3BLIVOFD.js +778 -0
  9. package/dist/chunk-3BLIVOFD.js.map +7 -0
  10. package/dist/{chunk-7OL6F2AM.js → chunk-4X4SY3CP.js} +7 -5
  11. package/dist/chunk-4X4SY3CP.js.map +7 -0
  12. package/dist/chunk-DNJ3N4T4.js +82 -0
  13. package/dist/chunk-DNJ3N4T4.js.map +7 -0
  14. package/dist/{chunk-PGZ4EHSE.js → chunk-HL3IIHU3.js} +501 -359
  15. package/dist/chunk-HL3IIHU3.js.map +7 -0
  16. package/dist/{chunk-REJ5HLIM.js → chunk-HYJYYEPK.js} +2 -2
  17. package/dist/{chunk-7U4IB65H.js → chunk-LLBJ2SJH.js} +5 -3
  18. package/dist/{chunk-7U4IB65H.js.map → chunk-LLBJ2SJH.js.map} +1 -1
  19. package/dist/{chunk-XJNADRGR.js → chunk-NFZJ6P42.js} +188 -96
  20. package/dist/chunk-NFZJ6P42.js.map +7 -0
  21. package/dist/chunk-PAI2ZUWV.js +260 -0
  22. package/dist/chunk-PAI2ZUWV.js.map +7 -0
  23. package/dist/chunk-Q7BALEPX.js +527 -0
  24. package/dist/chunk-Q7BALEPX.js.map +7 -0
  25. package/dist/{chunk-2Z2ENHR3.js → chunk-QRBOIUU3.js} +7 -8
  26. package/dist/chunk-QRBOIUU3.js.map +7 -0
  27. package/dist/chunk-QXAOTGCC.js +40 -0
  28. package/dist/chunk-QXAOTGCC.js.map +7 -0
  29. package/dist/chunk-UKP22RUG.js +219 -0
  30. package/dist/chunk-UKP22RUG.js.map +7 -0
  31. package/dist/chunk-VLOAI3HS.js +43 -0
  32. package/dist/chunk-VLOAI3HS.js.map +7 -0
  33. package/dist/{chunk-WUFLGETN.js → chunk-WVFGV5FT.js} +2 -39
  34. package/dist/{chunk-WUFLGETN.js.map → chunk-WVFGV5FT.js.map} +3 -3
  35. package/dist/editor.js +3 -2
  36. package/dist/editor.js.map +1 -1
  37. package/dist/flexdesk.css +7547 -5891
  38. package/dist/flow.js +29 -97
  39. package/dist/flow.js.map +3 -3
  40. package/dist/git.js +1356 -0
  41. package/dist/git.js.map +7 -0
  42. package/dist/reset.css +1 -1
  43. package/dist/tiles.js +20 -15
  44. package/dist/tiles.js.map +2 -2
  45. package/dist/tokens.css +30 -1
  46. package/dist/widgets.js +4146 -1199
  47. package/dist/widgets.js.map +4 -4
  48. package/dist/wm.js +120 -32
  49. package/dist/wm.js.map +2 -2
  50. package/docs/README.md +9 -4
  51. package/docs/best-practices.md +2 -2
  52. package/docs/components/charts.md +40 -0
  53. package/docs/components/chat-shell.md +204 -0
  54. package/docs/components/conversation.md +10 -0
  55. package/docs/components/filter-builder.md +292 -0
  56. package/docs/components/forms-and-dialogs.md +30 -0
  57. package/docs/components/git.md +355 -0
  58. package/docs/components/input-fields.md +191 -2
  59. package/docs/components/keymap.md +8 -0
  60. package/docs/components/menus.md +86 -2
  61. package/docs/components/panels-and-desktops.md +16 -5
  62. package/docs/components/shell.md +108 -1
  63. package/docs/components/workspace-picker.md +193 -0
  64. package/docs/concepts/building-and-packaging.md +2 -2
  65. package/docs/concepts/packages-and-entry-points.md +14 -13
  66. package/docs/concepts/state-guard.md +3 -3
  67. package/docs/quickstart.md +1 -1
  68. package/git.js +13 -0
  69. package/package.json +6 -1
  70. package/src/charts/plot_config_editor.js +92 -6
  71. package/src/charts/plot_grid.js +6 -1
  72. package/src/flow/kit/dom.js +28 -119
  73. package/src/flow/kit/step_picker.js +1 -1
  74. package/src/flow/kit/value_picker.js +1 -1
  75. package/src/flow/outline/menu.js +1 -1
  76. package/src/git/diff_viewer.js +212 -0
  77. package/src/git/diff_window.js +51 -0
  78. package/src/git/git_graph.js +401 -0
  79. package/src/git/git_ops.js +61 -0
  80. package/src/git/git_panel.js +755 -0
  81. package/src/git/index.js +9 -0
  82. package/src/git/line_diff.js +202 -0
  83. package/src/tiles/tile_base.js +5 -4
  84. package/src/tiling/desktops.js +10 -8
  85. package/src/tiling/keymap.js +6 -5
  86. package/src/tiling/kind_taxonomy.js +15 -2
  87. package/src/tiling/shell.js +124 -17
  88. package/src/tiling/tile_renderer.js +2 -3
  89. package/src/ui/components/action_dropdown.js +4 -78
  90. package/src/ui/components/anchored_layer.js +255 -0
  91. package/src/ui/components/chat_shell.js +926 -0
  92. package/src/ui/components/chat_state_machine.js +223 -0
  93. package/src/ui/components/choice_controls.js +45 -2
  94. package/src/ui/components/color_field.js +3 -2
  95. package/src/ui/components/color_list_field.js +3 -2
  96. package/src/ui/components/combobox.js +422 -0
  97. package/src/ui/components/context_menu.js +8 -2
  98. package/src/ui/components/conversation_view.js +17 -2
  99. package/src/ui/components/data_table.js +2 -2
  100. package/src/ui/components/filter_builder.js +791 -0
  101. package/src/ui/components/filter_model.js +682 -0
  102. package/src/ui/components/inline_renamer.js +10 -5
  103. package/src/ui/components/managed_window.js +24 -47
  104. package/src/ui/components/modal.js +104 -117
  105. package/src/ui/components/option_list.js +160 -0
  106. package/src/ui/components/popover.js +94 -0
  107. package/src/ui/components/recent_items.js +169 -0
  108. package/src/ui/components/select.js +322 -0
  109. package/src/ui/components/tag_input.js +77 -8
  110. package/src/ui/components/workspace_picker.js +1253 -0
  111. package/src/ui/utils/fire_event.js +17 -0
  112. package/src/ui/utils/focusable.js +25 -0
  113. package/src/ui/utils/modal_host.js +27 -0
  114. package/src/ui/utils/tooltip_service.js +81 -14
  115. package/widgets.js +12 -2
  116. package/css/base.css +0 -10547
  117. package/css/overrides.css +0 -2596
  118. package/dist/chunk-2Z2ENHR3.js.map +0 -7
  119. package/dist/chunk-7JI7HHSY.js +0 -107
  120. package/dist/chunk-7JI7HHSY.js.map +0 -7
  121. package/dist/chunk-7OL6F2AM.js.map +0 -7
  122. package/dist/chunk-MIW7D6WC.js +0 -526
  123. package/dist/chunk-MIW7D6WC.js.map +0 -7
  124. package/dist/chunk-PGZ4EHSE.js.map +0 -7
  125. package/dist/chunk-XJNADRGR.js.map +0 -7
  126. /package/dist/{chunk-REJ5HLIM.js.map → chunk-HYJYYEPK.js.map} +0 -0
@@ -0,0 +1,82 @@
1
+ import {
2
+ collectFocusable,
3
+ openAnchoredLayer
4
+ } from "./chunk-Q7BALEPX.js";
5
+
6
+ // src/ui/components/popover.js
7
+ var OPEN = /* @__PURE__ */ new Set();
8
+ var nothingOpened = (toggled) => ({ el: null, close() {
9
+ }, closed: Promise.resolve(), reposition() {
10
+ }, toggled });
11
+ function keepTabInside(el) {
12
+ el.addEventListener("keydown", (ev) => {
13
+ if (ev.key !== "Tab" || ev.defaultPrevented) return;
14
+ const controls = collectFocusable(el);
15
+ if (!controls.length) {
16
+ ev.preventDefault();
17
+ return;
18
+ }
19
+ const first = controls[0];
20
+ const last = controls[controls.length - 1];
21
+ const active = el.ownerDocument.activeElement;
22
+ if (ev.shiftKey ? active === first || active === el : active === last) {
23
+ ev.preventDefault();
24
+ (ev.shiftKey ? last : first).focus();
25
+ }
26
+ });
27
+ }
28
+ function openPopover({
29
+ anchor,
30
+ content,
31
+ label = "",
32
+ className = "",
33
+ focus = null,
34
+ align = "start",
35
+ inside = null,
36
+ onClose = null
37
+ }) {
38
+ for (const open of OPEN) {
39
+ if (anchor && open.anchor === anchor) {
40
+ open.close("toggle");
41
+ return nothingOpened(true);
42
+ }
43
+ }
44
+ const el = document.createElement("div");
45
+ el.className = `twm-popover${className ? ` ${className}` : ""}`;
46
+ el.setAttribute("role", "dialog");
47
+ if (label) el.setAttribute("aria-label", label);
48
+ el.tabIndex = -1;
49
+ el.appendChild(content);
50
+ keepTabInside(el);
51
+ let settle;
52
+ const closed = new Promise((resolve) => {
53
+ settle = resolve;
54
+ });
55
+ const layer = openAnchoredLayer({
56
+ anchor,
57
+ el,
58
+ align,
59
+ gap: 4,
60
+ inside,
61
+ onClose(reason) {
62
+ OPEN.delete(handle);
63
+ anchor?.classList?.remove("twm-is-open");
64
+ anchor?.setAttribute?.("aria-expanded", "false");
65
+ onClose?.(reason);
66
+ settle();
67
+ }
68
+ });
69
+ if (!layer) return nothingOpened(false);
70
+ const handle = { el, anchor, closed, toggled: false, close: layer.close, reposition: layer.place };
71
+ OPEN.add(handle);
72
+ anchor?.classList?.add("twm-is-open");
73
+ if (anchor && !anchor.hasAttribute?.("aria-haspopup")) anchor.setAttribute?.("aria-haspopup", "dialog");
74
+ anchor?.setAttribute?.("aria-expanded", "true");
75
+ (focus || el).focus?.({ preventScroll: true });
76
+ return handle;
77
+ }
78
+
79
+ export {
80
+ openPopover
81
+ };
82
+ //# sourceMappingURL=chunk-DNJ3N4T4.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/ui/components/popover.js"],
4
+ "sourcesContent": ["/**\n * A POPOVER \u2014 a panel of rich content hung off the element that opened it. (0.18.0)\n *\n * `role=\"dialog\"`, on an anchored layer (`anchored_layer.js`, which says how it is\n * placed and what closes it). Focus moves into it on open and comes back to the\n * anchor on close. Opening one from the anchor that holds an open one closes it,\n * a toggle; opening one anywhere else closes the open one, unless that one owns\n * the new anchor (`anchored_layer.js`).\n *\n * TAB STAYS INSIDE, cycling the panel's controls, as a modal's and a `CategoryPicker`'s\n * do. The panel is mounted at the end of the page, so past its edge lies whatever comes\n * next in the document, which is not the anchor's neighbour and, over a modal, is behind\n * it. Escape is the way out.\n */\nimport { openAnchoredLayer } from './anchored_layer.js';\nimport { collectFocusable } from '../utils/focusable.js';\n\n/** The open popovers, to find the one an anchor holds. */\nconst OPEN = new Set();\n\n/** What a call answers when nothing opened. */\nconst nothingOpened = (toggled) => ({ el: null, close() {}, closed: Promise.resolve(), reposition() {}, toggled });\n\n/** Tab at the panel's edge goes round to the other edge. */\nfunction keepTabInside(el) {\n el.addEventListener('keydown', (ev) => {\n if (ev.key !== 'Tab' || ev.defaultPrevented) return;\n const controls = collectFocusable(el);\n if (!controls.length) { ev.preventDefault(); return; }\n const first = controls[0];\n const last = controls[controls.length - 1];\n const active = el.ownerDocument.activeElement;\n if (ev.shiftKey ? (active === first || active === el) : active === last) {\n ev.preventDefault();\n (ev.shiftKey ? last : first).focus();\n }\n });\n}\n\n/**\n * @param {object} o\n * @param {HTMLElement} o.anchor What opened it; focus returns here.\n * @param {HTMLElement} o.content The popover's body.\n * @param {string} [o.label] Its accessible name.\n * @param {string} [o.className] Extra classes on the panel.\n * @param {HTMLElement} [o.focus] What takes focus on open; else the panel.\n * @param {'start'|'end'} [o.align] Which anchor edge it lines up with first.\n * @param {string} [o.inside] A selector for floating things of your own that\n * are not \"outside\" it.\n * @param {(reason: string) => void} [o.onClose] After it is gone.\n * @returns {{el: HTMLElement|null, close: (reason?: string) => void, closed: Promise<void>,\n * reposition: () => void, toggled: boolean}}\n * `el` is null when nothing opened, and `onClose` is not called for it: `toggled`\n * is true when the call only CLOSED the popover its anchor held, false when\n * the anchor has left the document.\n */\nexport function openPopover({ anchor, content, label = '', className = '', focus = null, align = 'start',\n inside = null, onClose = null }) {\n for (const open of OPEN) {\n if (anchor && open.anchor === anchor) {\n open.close('toggle');\n return nothingOpened(true);\n }\n }\n\n const el = document.createElement('div');\n el.className = `twm-popover${className ? ` ${className}` : ''}`;\n el.setAttribute('role', 'dialog');\n if (label) el.setAttribute('aria-label', label);\n el.tabIndex = -1;\n el.appendChild(content);\n keepTabInside(el);\n\n let settle;\n const closed = new Promise((resolve) => { settle = resolve; });\n const layer = openAnchoredLayer({\n anchor, el, align, gap: 4, inside,\n onClose(reason) {\n OPEN.delete(handle);\n anchor?.classList?.remove('twm-is-open');\n anchor?.setAttribute?.('aria-expanded', 'false');\n onClose?.(reason);\n settle();\n },\n });\n if (!layer) return nothingOpened(false);\n const handle = { el, anchor, closed, toggled: false, close: layer.close, reposition: layer.place };\n OPEN.add(handle);\n anchor?.classList?.add('twm-is-open');\n if (anchor && !anchor.hasAttribute?.('aria-haspopup')) anchor.setAttribute?.('aria-haspopup', 'dialog');\n anchor?.setAttribute?.('aria-expanded', 'true');\n (focus || el).focus?.({ preventScroll: true });\n return handle;\n}\n"],
5
+ "mappings": ";;;;;;AAkBA,IAAM,OAAO,oBAAI,IAAI;AAGrB,IAAM,gBAAgB,CAAC,aAAa,EAAE,IAAI,MAAM,QAAQ;AAAC,GAAG,QAAQ,QAAQ,QAAQ,GAAG,aAAa;AAAC,GAAG,QAAQ;AAGhH,SAAS,cAAc,IAAI;AACvB,KAAG,iBAAiB,WAAW,CAAC,OAAO;AACnC,QAAI,GAAG,QAAQ,SAAS,GAAG,iBAAkB;AAC7C,UAAM,WAAW,iBAAiB,EAAE;AACpC,QAAI,CAAC,SAAS,QAAQ;AAAE,SAAG,eAAe;AAAG;AAAA,IAAQ;AACrD,UAAM,QAAQ,SAAS,CAAC;AACxB,UAAM,OAAO,SAAS,SAAS,SAAS,CAAC;AACzC,UAAM,SAAS,GAAG,cAAc;AAChC,QAAI,GAAG,WAAY,WAAW,SAAS,WAAW,KAAM,WAAW,MAAM;AACrE,SAAG,eAAe;AAClB,OAAC,GAAG,WAAW,OAAO,OAAO,MAAM;AAAA,IACvC;AAAA,EACJ,CAAC;AACL;AAmBO,SAAS,YAAY;AAAA,EAAE;AAAA,EAAQ;AAAA,EAAS,QAAQ;AAAA,EAAI,YAAY;AAAA,EAAI,QAAQ;AAAA,EAAM,QAAQ;AAAA,EACnE,SAAS;AAAA,EAAM,UAAU;AAAK,GAAG;AAC3D,aAAW,QAAQ,MAAM;AACrB,QAAI,UAAU,KAAK,WAAW,QAAQ;AAClC,WAAK,MAAM,QAAQ;AACnB,aAAO,cAAc,IAAI;AAAA,IAC7B;AAAA,EACJ;AAEA,QAAM,KAAK,SAAS,cAAc,KAAK;AACvC,KAAG,YAAY,cAAc,YAAY,IAAI,SAAS,KAAK,EAAE;AAC7D,KAAG,aAAa,QAAQ,QAAQ;AAChC,MAAI,MAAO,IAAG,aAAa,cAAc,KAAK;AAC9C,KAAG,WAAW;AACd,KAAG,YAAY,OAAO;AACtB,gBAAc,EAAE;AAEhB,MAAI;AACJ,QAAM,SAAS,IAAI,QAAQ,CAAC,YAAY;AAAE,aAAS;AAAA,EAAS,CAAC;AAC7D,QAAM,QAAQ,kBAAkB;AAAA,IAC5B;AAAA,IAAQ;AAAA,IAAI;AAAA,IAAO,KAAK;AAAA,IAAG;AAAA,IAC3B,QAAQ,QAAQ;AACZ,WAAK,OAAO,MAAM;AAClB,cAAQ,WAAW,OAAO,aAAa;AACvC,cAAQ,eAAe,iBAAiB,OAAO;AAC/C,gBAAU,MAAM;AAChB,aAAO;AAAA,IACX;AAAA,EACJ,CAAC;AACD,MAAI,CAAC,MAAO,QAAO,cAAc,KAAK;AACtC,QAAM,SAAS,EAAE,IAAI,QAAQ,QAAQ,SAAS,OAAO,OAAO,MAAM,OAAO,YAAY,MAAM,MAAM;AACjG,OAAK,IAAI,MAAM;AACf,UAAQ,WAAW,IAAI,aAAa;AACpC,MAAI,UAAU,CAAC,OAAO,eAAe,eAAe,EAAG,QAAO,eAAe,iBAAiB,QAAQ;AACtG,UAAQ,eAAe,iBAAiB,MAAM;AAC9C,GAAC,SAAS,IAAI,QAAQ,EAAE,eAAe,KAAK,CAAC;AAC7C,SAAO;AACX;",
6
+ "names": []
7
+ }