@tachui/data 0.8.0-alpha
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/LICENSE +363 -0
- package/README.md +486 -0
- package/dist/List.js +481 -0
- package/dist/List.js.map +1 -0
- package/dist/Menu.js +466 -0
- package/dist/Menu.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/list/List.d.ts +213 -0
- package/dist/list/List.d.ts.map +1 -0
- package/dist/list/index.d.ts +5 -0
- package/dist/list/index.d.ts.map +1 -0
- package/dist/list/index.js +7 -0
- package/dist/list/index.js.map +1 -0
- package/dist/menu/Menu.d.ts +159 -0
- package/dist/menu/Menu.d.ts.map +1 -0
- package/dist/menu/index.d.ts +5 -0
- package/dist/menu/index.d.ts.map +1 -0
- package/dist/menu/index.js +9 -0
- package/dist/menu/index.js.map +1 -0
- package/package.json +77 -0
package/dist/Menu.js
ADDED
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
var x = Object.defineProperty;
|
|
2
|
+
var E = (o, e, n) => e in o ? x(o, e, { enumerable: !0, configurable: !0, writable: !0, value: n }) : o[e] = n;
|
|
3
|
+
var h = (o, e, n) => E(o, typeof e != "symbol" ? e + "" : e, n);
|
|
4
|
+
import { createSignal as g, useLifecycle as y, isSignal as I, setupPositioning as k, h as d, createEffect as v, AnimationManager as O, FocusManager as w, withModifiers as C } from "@tachui/core";
|
|
5
|
+
const f = {
|
|
6
|
+
colors: {
|
|
7
|
+
background: "#FFFFFF",
|
|
8
|
+
surface: "#F8F9FA",
|
|
9
|
+
text: "#1A1A1A",
|
|
10
|
+
textSecondary: "#6B7280",
|
|
11
|
+
textDisabled: "#A0A0A0",
|
|
12
|
+
textDestructive: "#FF3B30",
|
|
13
|
+
border: "#E5E5E5",
|
|
14
|
+
hover: "#F0F0F0",
|
|
15
|
+
active: "#E3F2FD",
|
|
16
|
+
separator: "#E5E5E5",
|
|
17
|
+
shortcut: "#8E8E93",
|
|
18
|
+
backdrop: "rgba(0, 0, 0, 0.1)"
|
|
19
|
+
},
|
|
20
|
+
spacing: {
|
|
21
|
+
padding: 8,
|
|
22
|
+
itemPadding: 12,
|
|
23
|
+
gap: 4
|
|
24
|
+
},
|
|
25
|
+
borderRadius: 8,
|
|
26
|
+
minWidth: 200,
|
|
27
|
+
maxWidth: 320,
|
|
28
|
+
itemHeight: 36,
|
|
29
|
+
shadow: "0 4px 12px rgba(0, 0, 0, 0.15)",
|
|
30
|
+
backdropBlur: "blur(2px)"
|
|
31
|
+
};
|
|
32
|
+
class A {
|
|
33
|
+
constructor(e) {
|
|
34
|
+
h(this, "type", "component");
|
|
35
|
+
h(this, "id");
|
|
36
|
+
h(this, "props");
|
|
37
|
+
h(this, "cleanup", []);
|
|
38
|
+
h(this, "theme", f);
|
|
39
|
+
h(this, "isOpenSignal", g(!1));
|
|
40
|
+
h(this, "focusedIndex", -1);
|
|
41
|
+
h(this, "menuElement", null);
|
|
42
|
+
h(this, "triggerElement", null);
|
|
43
|
+
h(this, "handleKeyDown", (e) => {
|
|
44
|
+
if (!this.isOpen()) return;
|
|
45
|
+
const n = this.getVisibleItems();
|
|
46
|
+
switch (e.key) {
|
|
47
|
+
case "Escape":
|
|
48
|
+
(this.props.escapeKeyCloses ?? !0) && (e.preventDefault(), this.setIsOpenValue(!1));
|
|
49
|
+
break;
|
|
50
|
+
case "ArrowDown":
|
|
51
|
+
e.preventDefault(), this.focusedIndex = Math.min(
|
|
52
|
+
this.focusedIndex + 1,
|
|
53
|
+
n.length - 1
|
|
54
|
+
), this.updateItemFocus();
|
|
55
|
+
break;
|
|
56
|
+
case "ArrowUp":
|
|
57
|
+
e.preventDefault(), this.focusedIndex = Math.max(this.focusedIndex - 1, 0), this.updateItemFocus();
|
|
58
|
+
break;
|
|
59
|
+
case "Enter":
|
|
60
|
+
case " ":
|
|
61
|
+
if (this.focusedIndex >= 0 && this.focusedIndex < n.length) {
|
|
62
|
+
e.preventDefault();
|
|
63
|
+
const t = this.menuElement?.querySelector(
|
|
64
|
+
`[data-menu-item-index="${this.focusedIndex}"]`
|
|
65
|
+
);
|
|
66
|
+
t && t.click();
|
|
67
|
+
}
|
|
68
|
+
break;
|
|
69
|
+
case "Home":
|
|
70
|
+
e.preventDefault(), this.focusedIndex = 0, this.updateItemFocus();
|
|
71
|
+
break;
|
|
72
|
+
case "End":
|
|
73
|
+
e.preventDefault(), this.focusedIndex = n.length - 1, this.updateItemFocus();
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
h(this, "handleClickOutside", (e) => {
|
|
78
|
+
if (!(this.props.closeOnClickOutside ?? !0)) return;
|
|
79
|
+
const n = e.target, t = this.menuElement?.contains(n), i = this.triggerElement?.contains(n);
|
|
80
|
+
!t && !i && this.setIsOpenValue(!1);
|
|
81
|
+
});
|
|
82
|
+
h(this, "setIsOpenValue", (e) => {
|
|
83
|
+
this.props.isOpen ? typeof this.props.isOpen == "function" && this.props.isOpen(e) : this.setIsOpen(e);
|
|
84
|
+
});
|
|
85
|
+
this.props = e, this.id = `menu-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`, this.props.isOpen && (this.isOpenSignal = [
|
|
86
|
+
this.props.isOpen,
|
|
87
|
+
((n) => {
|
|
88
|
+
typeof this.props.isOpen == "function" && this.props.isOpen(
|
|
89
|
+
typeof n == "function" ? n(this.props.isOpen()) : n
|
|
90
|
+
);
|
|
91
|
+
})
|
|
92
|
+
]), y(this, {
|
|
93
|
+
onDOMReady: (n, t) => {
|
|
94
|
+
t && (this.setupMenuPositioning(t), this.setupMenuAnimations(t));
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
get isOpen() {
|
|
99
|
+
return this.isOpenSignal[0];
|
|
100
|
+
}
|
|
101
|
+
get setIsOpen() {
|
|
102
|
+
return this.isOpenSignal[1];
|
|
103
|
+
}
|
|
104
|
+
resolveValue(e) {
|
|
105
|
+
return I(e) ? e() : e;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Set up menu positioning using enhanced lifecycle (ENHANCED Phase 3)
|
|
109
|
+
*/
|
|
110
|
+
setupMenuPositioning(e) {
|
|
111
|
+
this.cleanup || (this.cleanup = []), k(
|
|
112
|
+
this,
|
|
113
|
+
`[data-menu-trigger="${this.id}"]`,
|
|
114
|
+
`[data-menu-content="${this.id}"]`,
|
|
115
|
+
(n, t) => this.calculatePosition(n, t)
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Set up menu animations using enhanced lifecycle (ENHANCED Phase 3)
|
|
120
|
+
*/
|
|
121
|
+
setupMenuAnimations(e) {
|
|
122
|
+
this.cleanup || (this.cleanup = []);
|
|
123
|
+
}
|
|
124
|
+
getVisibleItems() {
|
|
125
|
+
return this.props.items.filter((e) => e.title !== "---");
|
|
126
|
+
}
|
|
127
|
+
createMenuItem(e, n) {
|
|
128
|
+
if (e.title === "---")
|
|
129
|
+
return d("div", {
|
|
130
|
+
role: "separator",
|
|
131
|
+
style: {
|
|
132
|
+
height: "1px",
|
|
133
|
+
backgroundColor: this.theme.colors.separator,
|
|
134
|
+
margin: `${this.theme.spacing.gap}px 0`
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
const t = this.resolveValue(e.disabled ?? !1), i = this.resolveValue(e.title), s = d("div", {
|
|
138
|
+
role: "menuitem",
|
|
139
|
+
tabindex: t ? "-1" : "0",
|
|
140
|
+
"aria-disabled": t,
|
|
141
|
+
"data-menu-item-index": n,
|
|
142
|
+
style: {
|
|
143
|
+
display: "flex",
|
|
144
|
+
alignItems: "center",
|
|
145
|
+
justifyContent: "space-between",
|
|
146
|
+
padding: `${this.theme.spacing.itemPadding}px`,
|
|
147
|
+
minHeight: `${this.theme.itemHeight}px`,
|
|
148
|
+
fontSize: "14px",
|
|
149
|
+
fontWeight: "400",
|
|
150
|
+
color: t ? this.theme.colors.textDisabled : e.destructive || e.role === "destructive" ? this.theme.colors.textDestructive : this.theme.colors.text,
|
|
151
|
+
cursor: t ? "default" : "pointer",
|
|
152
|
+
borderRadius: `${this.theme.borderRadius / 2}px`,
|
|
153
|
+
transition: "all 150ms ease-out",
|
|
154
|
+
userSelect: "none"
|
|
155
|
+
},
|
|
156
|
+
onclick: async (u) => {
|
|
157
|
+
if (!t) {
|
|
158
|
+
if (u.preventDefault(), u.stopPropagation(), e.action)
|
|
159
|
+
try {
|
|
160
|
+
await e.action();
|
|
161
|
+
} catch (r) {
|
|
162
|
+
console.error("Menu item action failed:", r);
|
|
163
|
+
}
|
|
164
|
+
(this.props.closeOnSelect ?? !0) && this.setIsOpenValue(!1);
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
onmouseenter: () => {
|
|
168
|
+
if (!t) {
|
|
169
|
+
this.focusedIndex = n, this.updateItemFocus();
|
|
170
|
+
const u = s.element;
|
|
171
|
+
u && (u.style.backgroundColor = this.theme.colors.hover);
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
onmouseleave: () => {
|
|
175
|
+
if (!t) {
|
|
176
|
+
const u = s.element;
|
|
177
|
+
u && (u.style.backgroundColor = "transparent");
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}), a = d("div", {
|
|
181
|
+
style: {
|
|
182
|
+
display: "flex",
|
|
183
|
+
alignItems: "center",
|
|
184
|
+
gap: `${this.theme.spacing.gap * 2}px`
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
if (e.systemImage) {
|
|
188
|
+
const r = d("span", {
|
|
189
|
+
style: {
|
|
190
|
+
fontSize: "16px",
|
|
191
|
+
color: "inherit"
|
|
192
|
+
}
|
|
193
|
+
}).element;
|
|
194
|
+
r && (r.textContent = e.systemImage);
|
|
195
|
+
const b = a.element;
|
|
196
|
+
b && r && b.appendChild(r);
|
|
197
|
+
}
|
|
198
|
+
const l = d("span").element;
|
|
199
|
+
l && (l.textContent = i);
|
|
200
|
+
const c = a.element;
|
|
201
|
+
c && l && c.appendChild(l);
|
|
202
|
+
const m = s.element;
|
|
203
|
+
if (m && c && m.appendChild(c), e.shortcut) {
|
|
204
|
+
const r = d("span", {
|
|
205
|
+
style: {
|
|
206
|
+
fontSize: "12px",
|
|
207
|
+
color: this.theme.colors.shortcut,
|
|
208
|
+
fontFamily: "monospace"
|
|
209
|
+
}
|
|
210
|
+
}).element;
|
|
211
|
+
r && (r.textContent = e.shortcut), m && r && m.appendChild(r);
|
|
212
|
+
}
|
|
213
|
+
if (e.submenu && e.submenu.length > 0) {
|
|
214
|
+
const r = d("span", {
|
|
215
|
+
style: {
|
|
216
|
+
fontSize: "12px",
|
|
217
|
+
color: this.theme.colors.textSecondary
|
|
218
|
+
}
|
|
219
|
+
}).element;
|
|
220
|
+
r && (r.textContent = "▶"), m && r && m.appendChild(r);
|
|
221
|
+
}
|
|
222
|
+
return s;
|
|
223
|
+
}
|
|
224
|
+
updateItemFocus() {
|
|
225
|
+
if (!this.menuElement) return;
|
|
226
|
+
this.menuElement.querySelectorAll('[role="menuitem"]').forEach((n, t) => {
|
|
227
|
+
const i = n;
|
|
228
|
+
t === this.focusedIndex ? (i.style.backgroundColor = this.theme.colors.hover, i.focus()) : i.style.backgroundColor = "transparent";
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
calculatePosition(e, n) {
|
|
232
|
+
const t = e.getBoundingClientRect(), i = n.getBoundingClientRect(), s = {
|
|
233
|
+
width: window.innerWidth,
|
|
234
|
+
height: window.innerHeight
|
|
235
|
+
}, a = this.props.placement ?? "bottom", p = this.props.offset ?? { x: 0, y: 4 };
|
|
236
|
+
let l = 0, c = 0;
|
|
237
|
+
switch (a) {
|
|
238
|
+
case "bottom":
|
|
239
|
+
case "bottom-start":
|
|
240
|
+
case "bottom-end":
|
|
241
|
+
c = t.bottom + p.y;
|
|
242
|
+
break;
|
|
243
|
+
case "top":
|
|
244
|
+
case "top-start":
|
|
245
|
+
case "top-end":
|
|
246
|
+
c = t.top - i.height - p.y;
|
|
247
|
+
break;
|
|
248
|
+
case "right":
|
|
249
|
+
case "right-start":
|
|
250
|
+
case "right-end":
|
|
251
|
+
l = t.right + p.x;
|
|
252
|
+
break;
|
|
253
|
+
case "left":
|
|
254
|
+
case "left-start":
|
|
255
|
+
case "left-end":
|
|
256
|
+
l = t.left - i.width - p.x;
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
259
|
+
switch (a) {
|
|
260
|
+
case "bottom":
|
|
261
|
+
case "top":
|
|
262
|
+
l = t.left + (t.width - i.width) / 2;
|
|
263
|
+
break;
|
|
264
|
+
case "bottom-start":
|
|
265
|
+
case "top-start":
|
|
266
|
+
l = t.left;
|
|
267
|
+
break;
|
|
268
|
+
case "bottom-end":
|
|
269
|
+
case "top-end":
|
|
270
|
+
l = t.right - i.width;
|
|
271
|
+
break;
|
|
272
|
+
case "right":
|
|
273
|
+
case "left":
|
|
274
|
+
c = t.top + (t.height - i.height) / 2;
|
|
275
|
+
break;
|
|
276
|
+
case "right-start":
|
|
277
|
+
case "left-start":
|
|
278
|
+
c = t.top;
|
|
279
|
+
break;
|
|
280
|
+
case "right-end":
|
|
281
|
+
case "left-end":
|
|
282
|
+
c = t.bottom - i.height;
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
285
|
+
return (this.props.flip ?? !0) && (c + i.height > s.height && t.top > i.height && (c = t.top - i.height - p.y), l + i.width > s.width && t.left > i.width && (l = t.left - i.width - p.x)), (this.props.shift ?? !0) && (l = Math.max(8, Math.min(l, s.width - i.width - 8)), c = Math.max(8, Math.min(c, s.height - i.height - 8))), { x: l, y: c };
|
|
286
|
+
}
|
|
287
|
+
createMenuContent() {
|
|
288
|
+
const e = d("div", {
|
|
289
|
+
role: "menu",
|
|
290
|
+
"aria-labelledby": `${this.id}-trigger`,
|
|
291
|
+
"data-menu-id": this.id,
|
|
292
|
+
"data-menu-content": this.id,
|
|
293
|
+
// ENHANCED: Add data attribute for lifecycle hooks
|
|
294
|
+
style: {
|
|
295
|
+
position: "fixed",
|
|
296
|
+
backgroundColor: this.theme.colors.background,
|
|
297
|
+
border: `1px solid ${this.theme.colors.border}`,
|
|
298
|
+
borderRadius: `${this.theme.borderRadius}px`,
|
|
299
|
+
boxShadow: this.theme.shadow,
|
|
300
|
+
minWidth: `${this.theme.minWidth}px`,
|
|
301
|
+
maxWidth: `${this.theme.maxWidth}px`,
|
|
302
|
+
padding: `${this.theme.spacing.padding}px`,
|
|
303
|
+
zIndex: "9999",
|
|
304
|
+
opacity: "0",
|
|
305
|
+
transform: "scale(0.95)",
|
|
306
|
+
transformOrigin: "top",
|
|
307
|
+
transition: `all ${this.props.animationDuration || 150}ms cubic-bezier(0.16, 1, 0.3, 1)`
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
return this.props.items.forEach((n, t) => {
|
|
311
|
+
const i = this.createMenuItem(n, t), s = e.element, a = i.element;
|
|
312
|
+
s && a && s.appendChild(a);
|
|
313
|
+
}), this.menuElement = e.element, e;
|
|
314
|
+
}
|
|
315
|
+
setupTrigger() {
|
|
316
|
+
let e;
|
|
317
|
+
if (typeof this.props.trigger == "function") {
|
|
318
|
+
const n = this.props.trigger();
|
|
319
|
+
if ("render" in n) {
|
|
320
|
+
const t = n.render();
|
|
321
|
+
Array.isArray(t) ? e = t[0]?.element : e = t instanceof HTMLElement ? t : t?.element;
|
|
322
|
+
} else
|
|
323
|
+
e = n;
|
|
324
|
+
} else if ("render" in this.props.trigger) {
|
|
325
|
+
const n = this.props.trigger.render();
|
|
326
|
+
Array.isArray(n) ? e = n[0]?.element : e = n instanceof HTMLElement ? n : n?.element;
|
|
327
|
+
} else
|
|
328
|
+
e = this.props.trigger;
|
|
329
|
+
return e.id = e.id || `${this.id}-trigger`, e.setAttribute("aria-haspopup", "menu"), e.setAttribute("aria-expanded", String(this.isOpen())), e.setAttribute("data-menu-trigger", this.id), e.addEventListener("click", (n) => {
|
|
330
|
+
n.preventDefault(), n.stopPropagation(), this.setIsOpenValue(!this.isOpen());
|
|
331
|
+
}), this.triggerElement = e, e;
|
|
332
|
+
}
|
|
333
|
+
render() {
|
|
334
|
+
const e = d("div", {
|
|
335
|
+
style: {
|
|
336
|
+
position: "relative",
|
|
337
|
+
display: "inline-block"
|
|
338
|
+
}
|
|
339
|
+
}), n = this.setupTrigger();
|
|
340
|
+
return e.element && n && e.element.appendChild(n), v(() => {
|
|
341
|
+
if (this.isOpen()) {
|
|
342
|
+
const s = this.createMenuContent().element;
|
|
343
|
+
if (s && (document.body.appendChild(s), this.menuElement = s), this.triggerElement && this.menuElement) {
|
|
344
|
+
const a = this.calculatePosition(
|
|
345
|
+
this.triggerElement,
|
|
346
|
+
this.menuElement
|
|
347
|
+
);
|
|
348
|
+
this.menuElement.style.left = `${a.x}px`, this.menuElement.style.top = `${a.y}px`, O.scaleIn(
|
|
349
|
+
this,
|
|
350
|
+
this.menuElement,
|
|
351
|
+
this.props.animationDuration || 150
|
|
352
|
+
), this.focusedIndex = 0, w.focusWhenReady(
|
|
353
|
+
this,
|
|
354
|
+
'[role="menuitem"]',
|
|
355
|
+
this.menuElement
|
|
356
|
+
);
|
|
357
|
+
}
|
|
358
|
+
document.addEventListener("keydown", this.handleKeyDown), document.addEventListener("click", this.handleClickOutside), this.triggerElement?.setAttribute("aria-expanded", "true");
|
|
359
|
+
} else {
|
|
360
|
+
if (this.menuElement) {
|
|
361
|
+
this.menuElement.style.opacity = "0", this.menuElement.style.transform = "scale(0.95)";
|
|
362
|
+
const i = () => {
|
|
363
|
+
this.menuElement?.parentNode && (document.body.removeChild(this.menuElement), this.menuElement = null), this.menuElement?.removeEventListener(
|
|
364
|
+
"transitionend",
|
|
365
|
+
i
|
|
366
|
+
);
|
|
367
|
+
};
|
|
368
|
+
this.menuElement.addEventListener(
|
|
369
|
+
"transitionend",
|
|
370
|
+
i
|
|
371
|
+
);
|
|
372
|
+
const s = setTimeout(() => {
|
|
373
|
+
this.menuElement?.removeEventListener(
|
|
374
|
+
"transitionend",
|
|
375
|
+
i
|
|
376
|
+
), i();
|
|
377
|
+
}, this.props.animationDuration || 150);
|
|
378
|
+
this.cleanup || (this.cleanup = []), this.cleanup.push(() => {
|
|
379
|
+
s && clearTimeout(s);
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
document.removeEventListener("keydown", this.handleKeyDown), document.removeEventListener("click", this.handleClickOutside), this.triggerElement?.setAttribute("aria-expanded", "false"), this.focusedIndex = -1;
|
|
383
|
+
}
|
|
384
|
+
}), e;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
function D(o) {
|
|
388
|
+
return C(new A(o));
|
|
389
|
+
}
|
|
390
|
+
const S = {
|
|
391
|
+
/**
|
|
392
|
+
* Create a separator item
|
|
393
|
+
*/
|
|
394
|
+
separator() {
|
|
395
|
+
return { title: "---" };
|
|
396
|
+
},
|
|
397
|
+
/**
|
|
398
|
+
* Create a destructive menu item
|
|
399
|
+
*/
|
|
400
|
+
destructive(o, e, n) {
|
|
401
|
+
return {
|
|
402
|
+
title: o,
|
|
403
|
+
action: e,
|
|
404
|
+
destructive: !0,
|
|
405
|
+
systemImage: n
|
|
406
|
+
};
|
|
407
|
+
},
|
|
408
|
+
/**
|
|
409
|
+
* Create a menu item with keyboard shortcut
|
|
410
|
+
*/
|
|
411
|
+
withShortcut(o, e, n, t) {
|
|
412
|
+
return {
|
|
413
|
+
title: o,
|
|
414
|
+
shortcut: e,
|
|
415
|
+
action: n,
|
|
416
|
+
systemImage: t
|
|
417
|
+
};
|
|
418
|
+
},
|
|
419
|
+
/**
|
|
420
|
+
* Create a context menu for right-click interactions
|
|
421
|
+
*/
|
|
422
|
+
contextMenu(o, e) {
|
|
423
|
+
const [n, t] = g(!1), [i, s] = g({ x: 0, y: 0 });
|
|
424
|
+
o.addEventListener("contextmenu", (a) => {
|
|
425
|
+
a.preventDefault(), s({ x: a.clientX, y: a.clientY }), t(!0);
|
|
426
|
+
}), console.log("Context menu requested", {
|
|
427
|
+
items: e,
|
|
428
|
+
position: i(),
|
|
429
|
+
isOpen: n()
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
}, $ = {
|
|
433
|
+
theme: f,
|
|
434
|
+
/**
|
|
435
|
+
* Create a custom menu theme
|
|
436
|
+
*/
|
|
437
|
+
createTheme(o) {
|
|
438
|
+
return { ...f, ...o };
|
|
439
|
+
},
|
|
440
|
+
/**
|
|
441
|
+
* Dark theme preset
|
|
442
|
+
*/
|
|
443
|
+
darkTheme() {
|
|
444
|
+
return {
|
|
445
|
+
...f,
|
|
446
|
+
colors: {
|
|
447
|
+
...f.colors,
|
|
448
|
+
background: "#2A2A2A",
|
|
449
|
+
surface: "#3A3A3A",
|
|
450
|
+
text: "#FFFFFF",
|
|
451
|
+
textSecondary: "#A0A0A0",
|
|
452
|
+
border: "#404040",
|
|
453
|
+
hover: "#404040",
|
|
454
|
+
active: "#0066CC"
|
|
455
|
+
}
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
};
|
|
459
|
+
export {
|
|
460
|
+
A as M,
|
|
461
|
+
D as a,
|
|
462
|
+
S as b,
|
|
463
|
+
$ as c,
|
|
464
|
+
f as d
|
|
465
|
+
};
|
|
466
|
+
//# sourceMappingURL=Menu.js.map
|
package/dist/Menu.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Menu.js","sources":["../src/menu/Menu.ts"],"sourcesContent":["/**\n * Menu Component\n *\n * SwiftUI-inspired Menu component with dropdowns, context menus,\n * positioning, and keyboard navigation support.\n */\n\nimport type { ModifiableComponent, ModifierBuilder } from '@tachui/core'\nimport { createEffect, createSignal, isSignal } from '@tachui/core'\nimport type { Signal } from '@tachui/core'\nimport { h } from '@tachui/core'\nimport type { ComponentInstance, ComponentProps, DOMNode } from '@tachui/core'\nimport { withModifiers } from '@tachui/core'\nimport {\n useLifecycle,\n AnimationManager,\n FocusManager,\n setupPositioning,\n} from '@tachui/core'\n\n/**\n * Menu item configuration\n */\nexport interface MenuItem {\n id?: string\n title: string | Signal<string>\n systemImage?: string\n shortcut?: string\n disabled?: boolean | Signal<boolean>\n destructive?: boolean\n role?: 'default' | 'destructive' | 'cancel'\n action?: () => void | Promise<void>\n submenu?: MenuItem[]\n}\n\n/**\n * Menu positioning options\n */\nexport type MenuPlacement =\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n | 'left'\n | 'left-start'\n | 'left-end'\n\n/**\n * Menu component properties\n */\nexport interface MenuProps extends ComponentProps {\n // Content\n items: MenuItem[]\n\n // Trigger\n trigger:\n | ComponentInstance\n | HTMLElement\n | (() => ComponentInstance | HTMLElement)\n\n // Visibility\n isOpen?: Signal<boolean>\n\n // Behavior\n placement?: MenuPlacement\n closeOnSelect?: boolean\n closeOnClickOutside?: boolean\n escapeKeyCloses?: boolean\n\n // Positioning\n offset?: { x: number; y: number }\n flip?: boolean\n shift?: boolean\n\n // Animation\n animationDuration?: number\n\n // Accessibility\n accessibilityLabel?: string\n}\n\n/**\n * Menu theme configuration\n */\nexport interface MenuTheme {\n colors: {\n background: string\n surface: string\n text: string\n textSecondary: string\n textDisabled: string\n textDestructive: string\n border: string\n hover: string\n active: string\n separator: string\n shortcut: string\n backdrop: string\n }\n spacing: {\n padding: number\n itemPadding: number\n gap: number\n }\n borderRadius: number\n minWidth: number\n maxWidth: number\n itemHeight: number\n shadow: string\n backdropBlur: string\n}\n\n/**\n * Default menu theme\n */\nexport const defaultMenuTheme: MenuTheme = {\n colors: {\n background: '#FFFFFF',\n surface: '#F8F9FA',\n text: '#1A1A1A',\n textSecondary: '#6B7280',\n textDisabled: '#A0A0A0',\n textDestructive: '#FF3B30',\n border: '#E5E5E5',\n hover: '#F0F0F0',\n active: '#E3F2FD',\n separator: '#E5E5E5',\n shortcut: '#8E8E93',\n backdrop: 'rgba(0, 0, 0, 0.1)',\n },\n spacing: {\n padding: 8,\n itemPadding: 12,\n gap: 4,\n },\n borderRadius: 8,\n minWidth: 200,\n maxWidth: 320,\n itemHeight: 36,\n shadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n backdropBlur: 'blur(2px)',\n}\n\n/**\n * Menu component implementation\n */\nexport class MenuComponent implements ComponentInstance<MenuProps> {\n public readonly type = 'component' as const\n public readonly id: string\n public readonly props: MenuProps\n public cleanup: (() => void)[] = []\n private theme: MenuTheme = defaultMenuTheme\n private isOpenSignal = createSignal(false)\n private get isOpen() {\n return this.isOpenSignal[0]\n }\n private get setIsOpen() {\n return this.isOpenSignal[1]\n }\n private focusedIndex = -1\n private menuElement: HTMLElement | null = null\n private triggerElement: HTMLElement | null = null\n\n constructor(props: MenuProps) {\n this.props = props\n this.id = `menu-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n\n // Use provided isOpen signal or internal one\n if (this.props.isOpen) {\n this.isOpenSignal = [\n this.props.isOpen,\n ((value: boolean | ((prev: boolean) => boolean)) => {\n if (typeof this.props.isOpen === 'function') {\n ;(this.props.isOpen as any)(\n typeof value === 'function'\n ? value((this.props.isOpen as any)())\n : value\n )\n }\n }) as any,\n ]\n }\n\n // ENHANCED: Set up lifecycle hooks for menu positioning and animations\n useLifecycle(this, {\n onDOMReady: (_elements, primaryElement) => {\n if (primaryElement) {\n // Set up menu positioning when DOM is ready\n this.setupMenuPositioning(primaryElement)\n\n // Set up animation and focus management\n this.setupMenuAnimations(primaryElement)\n }\n },\n })\n }\n\n private resolveValue<T>(value: T | Signal<T>): T {\n return isSignal(value) ? value() : value\n }\n\n /**\n * Set up menu positioning using enhanced lifecycle (ENHANCED Phase 3)\n */\n private setupMenuPositioning(_containerElement: Element): void {\n // Positioning is now handled via onDOMReady hooks when menu elements are guaranteed to exist\n // No more setTimeout positioning hacks needed\n if (!this.cleanup) this.cleanup = []\n\n // Set up positioning calculation that runs when both trigger and menu exist\n setupPositioning(\n this,\n `[data-menu-trigger=\"${this.id}\"]`,\n `[data-menu-content=\"${this.id}\"]`,\n (trigger, menu) =>\n this.calculatePosition(trigger as HTMLElement, menu as HTMLElement)\n )\n }\n\n /**\n * Set up menu animations using enhanced lifecycle (ENHANCED Phase 3)\n */\n private setupMenuAnimations(_containerElement: Element): void {\n // Animation coordination now handled by AnimationManager instead of setTimeout\n // Focus management handled by FocusManager instead of setTimeout\n if (!this.cleanup) this.cleanup = []\n }\n\n private getVisibleItems(): MenuItem[] {\n return this.props.items.filter(item => item.title !== '---') // Exclude separators\n }\n\n private createMenuItem(item: MenuItem, index: number): DOMNode {\n if (item.title === '---') {\n // Separator\n return h('div', {\n role: 'separator',\n style: {\n height: '1px',\n backgroundColor: this.theme.colors.separator,\n margin: `${this.theme.spacing.gap}px 0`,\n },\n })\n }\n\n const isDisabled = this.resolveValue(item.disabled ?? false)\n const title = this.resolveValue(item.title)\n\n const menuItem = h('div', {\n role: 'menuitem',\n tabindex: isDisabled ? '-1' : '0',\n 'aria-disabled': isDisabled,\n 'data-menu-item-index': index,\n style: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: `${this.theme.spacing.itemPadding}px`,\n minHeight: `${this.theme.itemHeight}px`,\n fontSize: '14px',\n fontWeight: '400',\n color: isDisabled\n ? this.theme.colors.textDisabled\n : item.destructive || item.role === 'destructive'\n ? this.theme.colors.textDestructive\n : this.theme.colors.text,\n cursor: isDisabled ? 'default' : 'pointer',\n borderRadius: `${this.theme.borderRadius / 2}px`,\n transition: 'all 150ms ease-out',\n userSelect: 'none',\n },\n onclick: async (e: Event) => {\n if (isDisabled) return\n\n e.preventDefault()\n e.stopPropagation()\n\n if (item.action) {\n try {\n await item.action()\n } catch (error) {\n console.error('Menu item action failed:', error)\n }\n }\n\n if (this.props.closeOnSelect ?? true) {\n this.setIsOpenValue(false)\n }\n },\n onmouseenter: () => {\n if (!isDisabled) {\n this.focusedIndex = index\n this.updateItemFocus()\n const element = menuItem.element as HTMLElement\n if (element) element.style.backgroundColor = this.theme.colors.hover\n }\n },\n onmouseleave: () => {\n if (!isDisabled) {\n const element = menuItem.element as HTMLElement\n if (element) element.style.backgroundColor = 'transparent'\n }\n },\n })\n\n // Content container\n const content = h('div', {\n style: {\n display: 'flex',\n alignItems: 'center',\n gap: `${this.theme.spacing.gap * 2}px`,\n },\n })\n\n // System image/icon\n if (item.systemImage) {\n const icon = h('span', {\n style: {\n fontSize: '16px',\n color: 'inherit',\n },\n })\n const iconElement = icon.element as HTMLElement\n if (iconElement) iconElement.textContent = item.systemImage\n const contentElement = content.element as HTMLElement\n if (contentElement && iconElement) contentElement.appendChild(iconElement)\n }\n\n // Title\n const titleElement = h('span')\n const titleElementDOM = titleElement.element as HTMLElement\n if (titleElementDOM) titleElementDOM.textContent = title\n const contentElement = content.element as HTMLElement\n if (contentElement && titleElementDOM)\n contentElement.appendChild(titleElementDOM)\n\n const menuItemElement = menuItem.element as HTMLElement\n if (menuItemElement && contentElement)\n menuItemElement.appendChild(contentElement)\n\n // Keyboard shortcut\n if (item.shortcut) {\n const shortcut = h('span', {\n style: {\n fontSize: '12px',\n color: this.theme.colors.shortcut,\n fontFamily: 'monospace',\n },\n })\n const shortcutElement = shortcut.element as HTMLElement\n if (shortcutElement) shortcutElement.textContent = item.shortcut\n if (menuItemElement && shortcutElement)\n menuItemElement.appendChild(shortcutElement)\n }\n\n // Submenu indicator\n if (item.submenu && item.submenu.length > 0) {\n const indicator = h('span', {\n style: {\n fontSize: '12px',\n color: this.theme.colors.textSecondary,\n },\n })\n const indicatorElement = indicator.element as HTMLElement\n if (indicatorElement) indicatorElement.textContent = '▶'\n if (menuItemElement && indicatorElement)\n menuItemElement.appendChild(indicatorElement)\n }\n\n return menuItem\n }\n\n private updateItemFocus(): void {\n if (!this.menuElement) return\n\n const items = this.menuElement.querySelectorAll('[role=\"menuitem\"]')\n items.forEach((item, index) => {\n const element = item as HTMLElement\n if (index === this.focusedIndex) {\n element.style.backgroundColor = this.theme.colors.hover\n element.focus()\n } else {\n element.style.backgroundColor = 'transparent'\n }\n })\n }\n\n private handleKeyDown = (e: KeyboardEvent): void => {\n if (!this.isOpen()) return\n\n const visibleItems = this.getVisibleItems()\n\n switch (e.key) {\n case 'Escape':\n if (this.props.escapeKeyCloses ?? true) {\n e.preventDefault()\n this.setIsOpenValue(false)\n }\n break\n\n case 'ArrowDown':\n e.preventDefault()\n this.focusedIndex = Math.min(\n this.focusedIndex + 1,\n visibleItems.length - 1\n )\n this.updateItemFocus()\n break\n\n case 'ArrowUp':\n e.preventDefault()\n this.focusedIndex = Math.max(this.focusedIndex - 1, 0)\n this.updateItemFocus()\n break\n\n case 'Enter':\n case ' ':\n if (this.focusedIndex >= 0 && this.focusedIndex < visibleItems.length) {\n e.preventDefault()\n // const item = visibleItems[this.focusedIndex]\n const menuItem = this.menuElement?.querySelector(\n `[data-menu-item-index=\"${this.focusedIndex}\"]`\n ) as HTMLElement\n if (menuItem) {\n menuItem.click()\n }\n }\n break\n\n case 'Home':\n e.preventDefault()\n this.focusedIndex = 0\n this.updateItemFocus()\n break\n\n case 'End':\n e.preventDefault()\n this.focusedIndex = visibleItems.length - 1\n this.updateItemFocus()\n break\n }\n }\n\n private calculatePosition(\n trigger: HTMLElement,\n menu: HTMLElement\n ): { x: number; y: number } {\n const triggerRect = trigger.getBoundingClientRect()\n const menuRect = menu.getBoundingClientRect()\n const viewport = {\n width: window.innerWidth,\n height: window.innerHeight,\n }\n\n const placement = this.props.placement ?? 'bottom'\n const offset = this.props.offset ?? { x: 0, y: 4 }\n\n let x = 0\n let y = 0\n\n // Calculate base position based on placement\n switch (placement) {\n case 'bottom':\n case 'bottom-start':\n case 'bottom-end':\n y = triggerRect.bottom + offset.y\n break\n case 'top':\n case 'top-start':\n case 'top-end':\n y = triggerRect.top - menuRect.height - offset.y\n break\n case 'right':\n case 'right-start':\n case 'right-end':\n x = triggerRect.right + offset.x\n break\n case 'left':\n case 'left-start':\n case 'left-end':\n x = triggerRect.left - menuRect.width - offset.x\n break\n }\n\n switch (placement) {\n case 'bottom':\n case 'top':\n x = triggerRect.left + (triggerRect.width - menuRect.width) / 2\n break\n case 'bottom-start':\n case 'top-start':\n x = triggerRect.left\n break\n case 'bottom-end':\n case 'top-end':\n x = triggerRect.right - menuRect.width\n break\n case 'right':\n case 'left':\n y = triggerRect.top + (triggerRect.height - menuRect.height) / 2\n break\n case 'right-start':\n case 'left-start':\n y = triggerRect.top\n break\n case 'right-end':\n case 'left-end':\n y = triggerRect.bottom - menuRect.height\n break\n }\n\n // Handle flipping and shifting if enabled\n if (this.props.flip ?? true) {\n if (\n y + menuRect.height > viewport.height &&\n triggerRect.top > menuRect.height\n ) {\n y = triggerRect.top - menuRect.height - offset.y\n }\n if (\n x + menuRect.width > viewport.width &&\n triggerRect.left > menuRect.width\n ) {\n x = triggerRect.left - menuRect.width - offset.x\n }\n }\n\n if (this.props.shift ?? true) {\n x = Math.max(8, Math.min(x, viewport.width - menuRect.width - 8))\n y = Math.max(8, Math.min(y, viewport.height - menuRect.height - 8))\n }\n\n return { x, y }\n }\n\n private createMenuContent(): DOMNode {\n const menu = h('div', {\n role: 'menu',\n 'aria-labelledby': `${this.id}-trigger`,\n 'data-menu-id': this.id,\n 'data-menu-content': this.id, // ENHANCED: Add data attribute for lifecycle hooks\n style: {\n position: 'fixed',\n backgroundColor: this.theme.colors.background,\n border: `1px solid ${this.theme.colors.border}`,\n borderRadius: `${this.theme.borderRadius}px`,\n boxShadow: this.theme.shadow,\n minWidth: `${this.theme.minWidth}px`,\n maxWidth: `${this.theme.maxWidth}px`,\n padding: `${this.theme.spacing.padding}px`,\n zIndex: '9999',\n opacity: '0',\n transform: 'scale(0.95)',\n transformOrigin: 'top',\n transition: `all ${this.props.animationDuration || 150}ms cubic-bezier(0.16, 1, 0.3, 1)`,\n },\n })\n\n // Create menu items\n this.props.items.forEach((item, index) => {\n const menuItem = this.createMenuItem(item, index)\n const menuElement = menu.element as HTMLElement\n const menuItemElement = menuItem.element as HTMLElement\n if (menuElement && menuItemElement) {\n menuElement.appendChild(menuItemElement)\n }\n })\n\n this.menuElement = menu.element as HTMLElement\n return menu\n }\n\n private setupTrigger(): HTMLElement {\n let trigger: HTMLElement\n\n if (typeof this.props.trigger === 'function') {\n const result = this.props.trigger()\n if ('render' in result) {\n const rendered = result.render()\n if (Array.isArray(rendered)) {\n trigger = rendered[0]?.element as HTMLElement\n } else {\n trigger =\n rendered instanceof HTMLElement\n ? rendered\n : (rendered?.element as HTMLElement)\n }\n } else {\n trigger = result as HTMLElement\n }\n } else if ('render' in this.props.trigger) {\n const rendered = this.props.trigger.render()\n if (Array.isArray(rendered)) {\n trigger = rendered[0]?.element as HTMLElement\n } else {\n trigger =\n rendered instanceof HTMLElement\n ? rendered\n : (rendered?.element as HTMLElement)\n }\n } else {\n trigger = this.props.trigger as HTMLElement\n }\n\n trigger.id = trigger.id || `${this.id}-trigger`\n trigger.setAttribute('aria-haspopup', 'menu')\n trigger.setAttribute('aria-expanded', String(this.isOpen()))\n trigger.setAttribute('data-menu-trigger', this.id) // ENHANCED: Add data attribute for lifecycle hooks\n\n trigger.addEventListener('click', e => {\n e.preventDefault()\n e.stopPropagation()\n this.setIsOpenValue(!this.isOpen())\n })\n\n this.triggerElement = trigger\n return trigger\n }\n\n render(): DOMNode {\n const container = h('div', {\n style: {\n position: 'relative',\n display: 'inline-block',\n },\n })\n\n // Setup trigger\n const trigger = this.setupTrigger()\n if (container.element && trigger) {\n ;(container.element as HTMLElement).appendChild(trigger)\n }\n\n // Create reactive effect for menu visibility\n createEffect(() => {\n const isOpenValue = this.isOpen()\n\n if (isOpenValue) {\n // Show menu\n const menu = this.createMenuContent()\n const menuElement = menu.element as HTMLElement\n if (menuElement) {\n document.body.appendChild(menuElement)\n this.menuElement = menuElement\n }\n\n // ENHANCED: Position and animate menu using lifecycle hooks\n if (this.triggerElement && this.menuElement) {\n // Immediate positioning - no setTimeout needed\n const position = this.calculatePosition(\n this.triggerElement,\n this.menuElement\n )\n this.menuElement.style.left = `${position.x}px`\n this.menuElement.style.top = `${position.y}px`\n\n // Use AnimationManager for smooth animation\n AnimationManager.scaleIn(\n this,\n this.menuElement,\n this.props.animationDuration || 150\n )\n\n // Use FocusManager for proper focus handling\n this.focusedIndex = 0\n FocusManager.focusWhenReady(\n this,\n '[role=\"menuitem\"]',\n this.menuElement\n )\n }\n\n // Add event listeners\n document.addEventListener('keydown', this.handleKeyDown)\n document.addEventListener('click', this.handleClickOutside)\n\n // Update trigger aria-expanded\n this.triggerElement?.setAttribute('aria-expanded', 'true')\n } else {\n // ENHANCED: Hide menu using transition event listener instead of setTimeout\n if (this.menuElement) {\n this.menuElement.style.opacity = '0'\n this.menuElement.style.transform = 'scale(0.95)'\n\n // Use transition event listener for cleanup\n const handleTransitionEnd = () => {\n if (this.menuElement?.parentNode) {\n document.body.removeChild(this.menuElement)\n this.menuElement = null\n }\n this.menuElement?.removeEventListener(\n 'transitionend',\n handleTransitionEnd\n )\n }\n this.menuElement.addEventListener(\n 'transitionend',\n handleTransitionEnd\n )\n\n // Fallback timeout in case transition doesn't fire (rare edge case)\n const fallbackTimeout = setTimeout(() => {\n this.menuElement?.removeEventListener(\n 'transitionend',\n handleTransitionEnd\n )\n handleTransitionEnd()\n }, this.props.animationDuration || 150)\n\n // Store cleanup for fallback timeout\n if (!this.cleanup) this.cleanup = []\n this.cleanup.push(() => {\n if (fallbackTimeout) clearTimeout(fallbackTimeout)\n })\n }\n\n // Remove event listeners\n document.removeEventListener('keydown', this.handleKeyDown)\n document.removeEventListener('click', this.handleClickOutside)\n\n // Update trigger aria-expanded\n this.triggerElement?.setAttribute('aria-expanded', 'false')\n\n // Reset focus index\n this.focusedIndex = -1\n }\n })\n\n return container\n }\n\n private handleClickOutside = (e: Event): void => {\n if (!(this.props.closeOnClickOutside ?? true)) return\n\n const target = e.target as Element\n const isInsideMenu = this.menuElement?.contains(target)\n const isInsideTrigger = this.triggerElement?.contains(target)\n\n if (!isInsideMenu && !isInsideTrigger) {\n this.setIsOpenValue(false)\n }\n }\n\n private setIsOpenValue = (value: boolean): void => {\n if (this.props.isOpen) {\n // For controlled component, the signal setter should be used directly\n if (typeof this.props.isOpen === 'function') {\n ;(this.props.isOpen as any)(value)\n }\n } else {\n this.setIsOpen(value)\n }\n }\n}\n\n/**\n * Create a Menu component\n */\nexport function Menu(\n props: MenuProps\n): ModifiableComponent<MenuProps> & {\n modifier: ModifierBuilder<ModifiableComponent<MenuProps>>\n} {\n return withModifiers(new MenuComponent(props))\n}\n\n/**\n * Menu utility functions and presets\n */\nexport const MenuUtils = {\n /**\n * Create a separator item\n */\n separator(): MenuItem {\n return { title: '---' }\n },\n\n /**\n * Create a destructive menu item\n */\n destructive(\n title: string,\n action: () => void,\n systemImage?: string\n ): MenuItem {\n return {\n title,\n action,\n destructive: true,\n systemImage,\n }\n },\n\n /**\n * Create a menu item with keyboard shortcut\n */\n withShortcut(\n title: string,\n shortcut: string,\n action: () => void,\n systemImage?: string\n ): MenuItem {\n return {\n title,\n shortcut,\n action,\n systemImage,\n }\n },\n\n /**\n * Create a context menu for right-click interactions\n */\n contextMenu(target: HTMLElement, items: MenuItem[]): void {\n const [isOpen, setIsOpen] = createSignal(false)\n const [position, setPosition] = createSignal({ x: 0, y: 0 })\n\n target.addEventListener('contextmenu', e => {\n e.preventDefault()\n setPosition({ x: e.clientX, y: e.clientY })\n setIsOpen(true)\n })\n\n // Note: This is a stub implementation\n // Full context menu positioning would require additional DOM manipulation\n console.log('Context menu requested', {\n items,\n position: position(),\n isOpen: isOpen(),\n })\n },\n}\n\n/**\n * Menu styles and theming\n */\nexport const MenuStyles = {\n theme: defaultMenuTheme,\n\n /**\n * Create a custom menu theme\n */\n createTheme(overrides: Partial<MenuTheme>): MenuTheme {\n return { ...defaultMenuTheme, ...overrides }\n },\n\n /**\n * Dark theme preset\n */\n darkTheme(): MenuTheme {\n return {\n ...defaultMenuTheme,\n colors: {\n ...defaultMenuTheme.colors,\n background: '#2A2A2A',\n surface: '#3A3A3A',\n text: '#FFFFFF',\n textSecondary: '#A0A0A0',\n border: '#404040',\n hover: '#404040',\n active: '#0066CC',\n },\n }\n },\n}\n"],"names":["defaultMenuTheme","MenuComponent","props","__publicField","createSignal","visibleItems","menuItem","target","isInsideMenu","isInsideTrigger","value","useLifecycle","_elements","primaryElement","isSignal","_containerElement","setupPositioning","trigger","menu","item","index","h","isDisabled","title","e","error","element","content","iconElement","contentElement","titleElementDOM","menuItemElement","shortcutElement","indicatorElement","triggerRect","menuRect","viewport","placement","offset","x","y","menuElement","result","rendered","container","createEffect","position","AnimationManager","FocusManager","handleTransitionEnd","fallbackTimeout","Menu","withModifiers","MenuUtils","action","systemImage","shortcut","items","isOpen","setIsOpen","setPosition","MenuStyles","overrides"],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @tachui/data - Data Display and Organization Components
|
|
3
|
+
*
|
|
4
|
+
* SwiftUI-inspired components for displaying and organizing data including
|
|
5
|
+
* lists and menus with advanced features like virtual scrolling,
|
|
6
|
+
* contextual menus, and flexible content organization.
|
|
7
|
+
*/
|
|
8
|
+
export * from './list';
|
|
9
|
+
export * from './menu';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,cAAc,QAAQ,CAAA;AAGtB,cAAc,QAAQ,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { E as a, L as t, a as n } from "./List.js";
|
|
2
|
+
import { a as u, M, c as i, b as l, d as m } from "./Menu.js";
|
|
3
|
+
export {
|
|
4
|
+
a as EnhancedList,
|
|
5
|
+
t as List,
|
|
6
|
+
n as ListUtils,
|
|
7
|
+
u as Menu,
|
|
8
|
+
M as MenuComponent,
|
|
9
|
+
i as MenuStyles,
|
|
10
|
+
l as MenuUtils,
|
|
11
|
+
m as defaultMenuTheme
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|