@fluixi/devtools 0.2.0-alpha.3 → 0.2.0-alpha.4

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 (64) hide show
  1. package/dist/callsite.cjs +72 -0
  2. package/dist/callsite.mjs +51 -0
  3. package/dist/change-view.cjs +134 -0
  4. package/dist/change-view.mjs +111 -0
  5. package/dist/copy.cjs +63 -0
  6. package/dist/copy.mjs +42 -0
  7. package/dist/describe.cjs +55 -0
  8. package/dist/describe.mjs +34 -0
  9. package/dist/detail-panel.cjs +307 -0
  10. package/dist/detail-panel.mjs +284 -0
  11. package/dist/diff.cjs +225 -0
  12. package/dist/diff.mjs +202 -0
  13. package/dist/dom.cjs +204 -0
  14. package/dist/dom.mjs +183 -0
  15. package/dist/export.cjs +221 -0
  16. package/dist/export.mjs +209 -0
  17. package/dist/float.cjs +232 -0
  18. package/dist/float.mjs +211 -0
  19. package/dist/format.cjs +175 -0
  20. package/dist/format.mjs +154 -0
  21. package/dist/graph-view.cjs +893 -0
  22. package/dist/graph-view.mjs +870 -0
  23. package/dist/highlight.cjs +140 -0
  24. package/dist/highlight.mjs +119 -0
  25. package/dist/history.cjs +95 -0
  26. package/dist/history.mjs +74 -0
  27. package/dist/hook.cjs +1562 -0
  28. package/dist/hook.mjs +1553 -0
  29. package/dist/index.cjs +4552 -0
  30. package/dist/index.mjs +4544 -0
  31. package/dist/inspector.cjs +688 -0
  32. package/dist/inspector.mjs +676 -0
  33. package/dist/instrument.cjs +497 -0
  34. package/dist/instrument.mjs +487 -0
  35. package/dist/kind-filter.cjs +172 -0
  36. package/dist/kind-filter.mjs +151 -0
  37. package/dist/menu.cjs +141 -0
  38. package/dist/menu.mjs +120 -0
  39. package/dist/observe.cjs +1352 -0
  40. package/dist/observe.mjs +1345 -0
  41. package/dist/palette.cjs +52 -0
  42. package/dist/palette.mjs +31 -0
  43. package/dist/path.cjs +45 -0
  44. package/dist/path.mjs +24 -0
  45. package/dist/plugin.cjs +87 -0
  46. package/dist/plugin.mjs +66 -0
  47. package/dist/plugins/context.cjs +98 -0
  48. package/dist/plugins/context.mjs +75 -0
  49. package/dist/plugins/directives.cjs +98 -0
  50. package/dist/plugins/directives.mjs +75 -0
  51. package/dist/plugins/index.cjs +162 -0
  52. package/dist/plugins/index.mjs +140 -0
  53. package/dist/source.cjs +111 -0
  54. package/dist/source.mjs +90 -0
  55. package/dist/timeline.cjs +350 -0
  56. package/dist/timeline.mjs +327 -0
  57. package/dist/tree.cjs +574 -0
  58. package/dist/tree.mjs +551 -0
  59. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  60. package/dist/value-pane.cjs +223 -0
  61. package/dist/value-pane.mjs +200 -0
  62. package/dist/wire.cjs +109 -0
  63. package/dist/wire.mjs +89 -0
  64. package/package.json +13 -6
@@ -0,0 +1,151 @@
1
+ // src/kind-filter.ts
2
+ var FILTERABLE_KINDS = [
3
+ "state",
4
+ "memo",
5
+ "effect",
6
+ "store",
7
+ "resource",
8
+ "component",
9
+ "provider",
10
+ "control",
11
+ "router",
12
+ "handler",
13
+ "context",
14
+ "directive"
15
+ ];
16
+ var LABEL = { handler: "route" };
17
+ function createKindFilter(host, options) {
18
+ const doc = host.ownerDocument;
19
+ const kinds = options.kinds ?? FILTERABLE_KINDS;
20
+ const on = new Set(kinds);
21
+ const root = doc.createElement("div");
22
+ root.className = "fx-kinds";
23
+ const button = doc.createElement("button");
24
+ button.type = "button";
25
+ button.className = "fx-kinds-button fx-dropdown-btn";
26
+ button.setAttribute("aria-haspopup", "true");
27
+ button.setAttribute("aria-expanded", "false");
28
+ button.title = "Choose which kinds of node the graph draws";
29
+ const caret = doc.createElement("div");
30
+ caret.className = "fx-dropdown-caret";
31
+ const panel = doc.createElement("div");
32
+ panel.className = "fx-kinds-panel";
33
+ if (options.panelClass) {
34
+ panel.classList.add(...options.panelClass.split(/\s+/).filter((c) => c));
35
+ }
36
+ panel.hidden = true;
37
+ const all = doc.createElement("input");
38
+ all.type = "checkbox";
39
+ const allRow = doc.createElement("label");
40
+ allRow.className = "fx-kinds-all";
41
+ allRow.append(all, doc.createTextNode("all"));
42
+ const boxes = /* @__PURE__ */ new Map();
43
+ for (const kind of kinds) {
44
+ const box = doc.createElement("input");
45
+ box.type = "checkbox";
46
+ box.checked = true;
47
+ const row = doc.createElement("label");
48
+ row.append(box, doc.createTextNode(LABEL[kind] ?? kind));
49
+ panel.append(row);
50
+ boxes.set(kind, box);
51
+ }
52
+ panel.prepend(allRow);
53
+ root.append(button, panel);
54
+ host.append(root);
55
+ const everything = () => on.size === kinds.length;
56
+ const chosen = () => kinds.filter((kind) => on.has(kind));
57
+ function paint() {
58
+ const name = options.label ?? "Kinds";
59
+ button.textContent = everything() ? name : `${name} · ${on.size}`;
60
+ button.classList.toggle("on", !everything());
61
+ all.checked = everything();
62
+ button.appendChild(caret);
63
+ all.indeterminate = on.size > 0 && !everything();
64
+ for (const [kind, box] of boxes) box.checked = on.has(kind);
65
+ }
66
+ function report() {
67
+ options.onChange(everything() ? null : chosen());
68
+ }
69
+ for (const [kind, box] of boxes) {
70
+ box.addEventListener("change", () => {
71
+ if (box.checked) on.add(kind);
72
+ else on.delete(kind);
73
+ paint();
74
+ report();
75
+ });
76
+ }
77
+ all.addEventListener("change", () => {
78
+ for (const kind of kinds) on.add(kind);
79
+ paint();
80
+ report();
81
+ });
82
+ const close = () => {
83
+ panel.hidden = true;
84
+ button.setAttribute("aria-expanded", "false");
85
+ };
86
+ button.addEventListener("click", (event) => {
87
+ event.stopPropagation();
88
+ panel.hidden = !panel.hidden;
89
+ button.setAttribute("aria-expanded", String(!panel.hidden));
90
+ });
91
+ panel.addEventListener("click", (event) => event.stopPropagation());
92
+ const away = () => close();
93
+ const key = (event) => {
94
+ if (event.key === "Escape") close();
95
+ };
96
+ doc.addEventListener("click", away);
97
+ doc.addEventListener("keydown", key);
98
+ paint();
99
+ return {
100
+ get selected() {
101
+ return chosen();
102
+ },
103
+ select(next) {
104
+ on.clear();
105
+ for (const kind of next ?? kinds) on.add(kind);
106
+ paint();
107
+ },
108
+ destroy() {
109
+ doc.removeEventListener("click", away);
110
+ doc.removeEventListener("keydown", key);
111
+ root.remove();
112
+ }
113
+ };
114
+ }
115
+ var KIND_FILTER_CSS = `
116
+ .fx-kinds { position: relative; display: inline-flex; }
117
+ .fx-kinds-button { white-space: nowrap; }
118
+ /* The hidden attribute is display:none from the user agent, which a class setting display outranks. */
119
+ .fx-kinds-panel[hidden] { display: none; }
120
+ .fx-kinds-panel {
121
+ position: absolute; top: calc(100% + 4px); z-index: 40;
122
+ display: grid; gap: 2px; padding: 6px 8px; min-width: 132px;
123
+ background: var(--fx-panel, #14161c);
124
+ border: 1px solid var(--fx-line, #262a35); border-radius: 6px;
125
+ box-shadow: 0 6px 18px rgba(0, 0, 0, .38);
126
+ }
127
+ .fx-kinds-panel:not(.fx-panel-left){ right: 0; }
128
+ .fx-kinds-panel.fx-panel-left { left: 0; }
129
+ .fx-kinds-panel label {
130
+ display: flex; align-items: center; gap: 6px;
131
+ font-size: 11px; color: var(--fx-muted, #8a90a2); cursor: pointer; user-select: none;
132
+ }
133
+ .fx-kinds-panel label:hover { color: var(--fx-label, #e7e9ee); }
134
+ .fx-kinds-panel input { width: 11px; height: 11px; margin: 0; accent-color: var(--fx-accent, #5eead4); }
135
+ .fx-kinds-all {
136
+ padding-bottom: 4px; margin-bottom: 2px;
137
+ border-bottom: 1px solid var(--fx-line, #262a35);
138
+ color: var(--fx-label, #e7e9ee) !important;
139
+ }
140
+ `;
141
+ var DROPDOWN_FILTER_CSS = `
142
+ .fx-dropdown-btn { background-color: transparent; appearance: none; border: 1px solid var(--line-strong); outline: none; border-radius: .25rem; padding-block: .25rem; padding-inline: .875rem; font-size: .75rem; cursor: pointer }
143
+ .fx-dropdown-btn:hover { border-color: color-mix(in oklab, var(--accent) 50%, transparent); background-color: var(--bg); }
144
+ .fx-dropdown-caret { width: 0;height: 0;border-left: .15rem solid transparent; border-right: .15rem solid transparent; border-top: .15rem solid currentColor; transition: transform 0.2s ease; right: .4rem; top: 50%; color: color-mix(in oklab, var(--muted) 50%, transparent); position: absolute; }
145
+ `;
146
+ export {
147
+ DROPDOWN_FILTER_CSS,
148
+ FILTERABLE_KINDS,
149
+ KIND_FILTER_CSS,
150
+ createKindFilter
151
+ };
package/dist/menu.cjs ADDED
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/menu.ts
21
+ var menu_exports = {};
22
+ __export(menu_exports, {
23
+ MENU_CSS: () => MENU_CSS,
24
+ createMenu: () => createMenu
25
+ });
26
+ module.exports = __toCommonJS(menu_exports);
27
+ function createMenu(host, options) {
28
+ const doc = host.ownerDocument;
29
+ const root = doc.createElement("div");
30
+ root.className = "fx-menu";
31
+ const button = doc.createElement("button");
32
+ button.type = "button";
33
+ button.className = "fx-menu-button fx-dropdown-btn";
34
+ button.setAttribute("aria-haspopup", "true");
35
+ button.setAttribute("aria-expanded", "false");
36
+ if (options.hint) button.title = options.hint;
37
+ const caret = doc.createElement("div");
38
+ caret.className = "fx-dropdown-caret";
39
+ const panel = doc.createElement("div");
40
+ panel.className = "fx-menu-panel";
41
+ if (options.menuClass) {
42
+ panel.classList.add(...options.menuClass.split(/\s+/).filter((c) => c));
43
+ }
44
+ panel.hidden = true;
45
+ const boxes = /* @__PURE__ */ new Map();
46
+ for (const item of options.items) {
47
+ if (item.type === "action") {
48
+ const run = doc.createElement("button");
49
+ run.type = "button";
50
+ run.className = "fx-menu-action";
51
+ run.textContent = item.label;
52
+ if (item.hint) run.title = item.hint;
53
+ run.addEventListener("click", () => {
54
+ close();
55
+ item.onRun();
56
+ });
57
+ panel.append(run);
58
+ continue;
59
+ }
60
+ const box = doc.createElement("input");
61
+ box.type = "checkbox";
62
+ box.checked = item.on === true;
63
+ const row = doc.createElement("label");
64
+ if (item.hint) row.title = item.hint;
65
+ row.append(box, doc.createTextNode(item.label));
66
+ box.addEventListener("change", () => {
67
+ paint();
68
+ item.onChange(box.checked);
69
+ });
70
+ panel.append(row);
71
+ boxes.set(item.label, box);
72
+ }
73
+ root.append(button, panel);
74
+ host.append(root);
75
+ function paint() {
76
+ let on = 0;
77
+ for (const box of boxes.values()) if (box.checked) on++;
78
+ button.textContent = on ? `${options.label} · ${on}` : options.label;
79
+ button.appendChild(caret);
80
+ button.classList.toggle("on", on > 0);
81
+ }
82
+ function close() {
83
+ panel.hidden = true;
84
+ button.setAttribute("aria-expanded", "false");
85
+ }
86
+ button.addEventListener("click", (event) => {
87
+ event.stopPropagation();
88
+ panel.hidden = !panel.hidden;
89
+ button.setAttribute("aria-expanded", String(!panel.hidden));
90
+ });
91
+ panel.addEventListener("click", (event) => event.stopPropagation());
92
+ const away = () => close();
93
+ const key = (event) => {
94
+ if (event.key === "Escape") close();
95
+ };
96
+ doc.addEventListener("click", away);
97
+ doc.addEventListener("keydown", key);
98
+ paint();
99
+ return {
100
+ set(label, on) {
101
+ const box = boxes.get(label);
102
+ if (!box) return;
103
+ box.checked = on;
104
+ paint();
105
+ },
106
+ destroy() {
107
+ doc.removeEventListener("click", away);
108
+ doc.removeEventListener("keydown", key);
109
+ root.remove();
110
+ }
111
+ };
112
+ }
113
+ var MENU_CSS = `
114
+ /* The button itself is styled by DROPDOWN_FILTER_CSS, shared with the kind filter. */
115
+ .fx-menu { position: relative; display: inline-flex; }
116
+ .fx-menu-button { white-space: nowrap; position: relative; padding-inline-end: 1.1rem; }
117
+ /* hidden is display:none from the user agent, which a class setting display outranks. */
118
+ .fx-menu-panel[hidden] { display: none; }
119
+ .fx-menu-panel {
120
+ position: absolute; top: calc(100% + 4px); z-index: 40;
121
+ display: grid; gap: 2px; padding: 6px 8px; min-width: 150px;
122
+ background: var(--fx-panel, #14161c);
123
+ border: 1px solid var(--fx-line, #262a35); border-radius: 6px;
124
+ box-shadow: 0 6px 18px rgba(0, 0, 0, .38);
125
+ }
126
+ .fx-menu-panel:not(.fx-panel-left){ right: 0; }
127
+ .fx-menu-panel.fx-panel-left { left: 0; }
128
+ .fx-menu-panel label {
129
+ display: flex; align-items: center; gap: 6px;
130
+ font-size: 11px; color: var(--fx-muted, #8a90a2); cursor: pointer; user-select: none;
131
+ }
132
+ .fx-menu-panel label:hover { color: var(--fx-label, #e7e9ee); }
133
+ .fx-menu-panel input { width: 11px; height: 11px; margin: 0; accent-color: var(--fx-accent, #5eead4); }
134
+ .fx-menu-action {
135
+ text-align: left; padding: 2px 0; border: 0; background: none; cursor: pointer;
136
+ font: inherit; font-size: 11px; color: var(--fx-muted, #8a90a2);
137
+ /* A button does not inherit this, so an action read lowercase beside uppercase toggles. */
138
+ text-transform: inherit; letter-spacing: inherit;
139
+ }
140
+ .fx-menu-action:hover { color: var(--fx-accent, #5eead4); }
141
+ `;
package/dist/menu.mjs ADDED
@@ -0,0 +1,120 @@
1
+ // src/menu.ts
2
+ function createMenu(host, options) {
3
+ const doc = host.ownerDocument;
4
+ const root = doc.createElement("div");
5
+ root.className = "fx-menu";
6
+ const button = doc.createElement("button");
7
+ button.type = "button";
8
+ button.className = "fx-menu-button fx-dropdown-btn";
9
+ button.setAttribute("aria-haspopup", "true");
10
+ button.setAttribute("aria-expanded", "false");
11
+ if (options.hint) button.title = options.hint;
12
+ const caret = doc.createElement("div");
13
+ caret.className = "fx-dropdown-caret";
14
+ const panel = doc.createElement("div");
15
+ panel.className = "fx-menu-panel";
16
+ if (options.menuClass) {
17
+ panel.classList.add(...options.menuClass.split(/\s+/).filter((c) => c));
18
+ }
19
+ panel.hidden = true;
20
+ const boxes = /* @__PURE__ */ new Map();
21
+ for (const item of options.items) {
22
+ if (item.type === "action") {
23
+ const run = doc.createElement("button");
24
+ run.type = "button";
25
+ run.className = "fx-menu-action";
26
+ run.textContent = item.label;
27
+ if (item.hint) run.title = item.hint;
28
+ run.addEventListener("click", () => {
29
+ close();
30
+ item.onRun();
31
+ });
32
+ panel.append(run);
33
+ continue;
34
+ }
35
+ const box = doc.createElement("input");
36
+ box.type = "checkbox";
37
+ box.checked = item.on === true;
38
+ const row = doc.createElement("label");
39
+ if (item.hint) row.title = item.hint;
40
+ row.append(box, doc.createTextNode(item.label));
41
+ box.addEventListener("change", () => {
42
+ paint();
43
+ item.onChange(box.checked);
44
+ });
45
+ panel.append(row);
46
+ boxes.set(item.label, box);
47
+ }
48
+ root.append(button, panel);
49
+ host.append(root);
50
+ function paint() {
51
+ let on = 0;
52
+ for (const box of boxes.values()) if (box.checked) on++;
53
+ button.textContent = on ? `${options.label} · ${on}` : options.label;
54
+ button.appendChild(caret);
55
+ button.classList.toggle("on", on > 0);
56
+ }
57
+ function close() {
58
+ panel.hidden = true;
59
+ button.setAttribute("aria-expanded", "false");
60
+ }
61
+ button.addEventListener("click", (event) => {
62
+ event.stopPropagation();
63
+ panel.hidden = !panel.hidden;
64
+ button.setAttribute("aria-expanded", String(!panel.hidden));
65
+ });
66
+ panel.addEventListener("click", (event) => event.stopPropagation());
67
+ const away = () => close();
68
+ const key = (event) => {
69
+ if (event.key === "Escape") close();
70
+ };
71
+ doc.addEventListener("click", away);
72
+ doc.addEventListener("keydown", key);
73
+ paint();
74
+ return {
75
+ set(label, on) {
76
+ const box = boxes.get(label);
77
+ if (!box) return;
78
+ box.checked = on;
79
+ paint();
80
+ },
81
+ destroy() {
82
+ doc.removeEventListener("click", away);
83
+ doc.removeEventListener("keydown", key);
84
+ root.remove();
85
+ }
86
+ };
87
+ }
88
+ var MENU_CSS = `
89
+ /* The button itself is styled by DROPDOWN_FILTER_CSS, shared with the kind filter. */
90
+ .fx-menu { position: relative; display: inline-flex; }
91
+ .fx-menu-button { white-space: nowrap; position: relative; padding-inline-end: 1.1rem; }
92
+ /* hidden is display:none from the user agent, which a class setting display outranks. */
93
+ .fx-menu-panel[hidden] { display: none; }
94
+ .fx-menu-panel {
95
+ position: absolute; top: calc(100% + 4px); z-index: 40;
96
+ display: grid; gap: 2px; padding: 6px 8px; min-width: 150px;
97
+ background: var(--fx-panel, #14161c);
98
+ border: 1px solid var(--fx-line, #262a35); border-radius: 6px;
99
+ box-shadow: 0 6px 18px rgba(0, 0, 0, .38);
100
+ }
101
+ .fx-menu-panel:not(.fx-panel-left){ right: 0; }
102
+ .fx-menu-panel.fx-panel-left { left: 0; }
103
+ .fx-menu-panel label {
104
+ display: flex; align-items: center; gap: 6px;
105
+ font-size: 11px; color: var(--fx-muted, #8a90a2); cursor: pointer; user-select: none;
106
+ }
107
+ .fx-menu-panel label:hover { color: var(--fx-label, #e7e9ee); }
108
+ .fx-menu-panel input { width: 11px; height: 11px; margin: 0; accent-color: var(--fx-accent, #5eead4); }
109
+ .fx-menu-action {
110
+ text-align: left; padding: 2px 0; border: 0; background: none; cursor: pointer;
111
+ font: inherit; font-size: 11px; color: var(--fx-muted, #8a90a2);
112
+ /* A button does not inherit this, so an action read lowercase beside uppercase toggles. */
113
+ text-transform: inherit; letter-spacing: inherit;
114
+ }
115
+ .fx-menu-action:hover { color: var(--fx-accent, #5eead4); }
116
+ `;
117
+ export {
118
+ MENU_CSS,
119
+ createMenu
120
+ };