@elyracode/mini-lit 0.9.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.
- package/LICENSE +21 -0
- package/README.md +22 -0
- package/dist/Alert.d.ts +12 -0
- package/dist/Alert.d.ts.map +1 -0
- package/dist/Alert.js +35 -0
- package/dist/Alert.js.map +1 -0
- package/dist/Badge.d.ts +8 -0
- package/dist/Badge.d.ts.map +1 -0
- package/dist/Badge.js +19 -0
- package/dist/Badge.js.map +1 -0
- package/dist/Button.d.ts +14 -0
- package/dist/Button.d.ts.map +1 -0
- package/dist/Button.js +60 -0
- package/dist/Button.js.map +1 -0
- package/dist/Card.d.ts +19 -0
- package/dist/Card.d.ts.map +1 -0
- package/dist/Card.js +76 -0
- package/dist/Card.js.map +1 -0
- package/dist/Checkbox.d.ts +15 -0
- package/dist/Checkbox.d.ts.map +1 -0
- package/dist/Checkbox.js +49 -0
- package/dist/Checkbox.js.map +1 -0
- package/dist/CodeBlock.d.ts +11 -0
- package/dist/CodeBlock.d.ts.map +1 -0
- package/dist/CodeBlock.js +90 -0
- package/dist/CodeBlock.js.map +1 -0
- package/dist/CopyButton.d.ts +11 -0
- package/dist/CopyButton.d.ts.map +1 -0
- package/dist/CopyButton.js +65 -0
- package/dist/CopyButton.js.map +1 -0
- package/dist/Dialog.d.ts +24 -0
- package/dist/Dialog.d.ts.map +1 -0
- package/dist/Dialog.js +72 -0
- package/dist/Dialog.js.map +1 -0
- package/dist/DialogBase.d.ts +13 -0
- package/dist/DialogBase.d.ts.map +1 -0
- package/dist/DialogBase.js +48 -0
- package/dist/DialogBase.js.map +1 -0
- package/dist/Diff.d.ts +8 -0
- package/dist/Diff.d.ts.map +1 -0
- package/dist/Diff.js +47 -0
- package/dist/Diff.js.map +1 -0
- package/dist/DownloadButton.d.ts +16 -0
- package/dist/DownloadButton.d.ts.map +1 -0
- package/dist/DownloadButton.js +53 -0
- package/dist/DownloadButton.js.map +1 -0
- package/dist/FileButton.d.ts +9 -0
- package/dist/FileButton.d.ts.map +1 -0
- package/dist/FileButton.js +53 -0
- package/dist/FileButton.js.map +1 -0
- package/dist/Input.d.ts +28 -0
- package/dist/Input.d.ts.map +1 -0
- package/dist/Input.js +58 -0
- package/dist/Input.js.map +1 -0
- package/dist/Label.d.ts +9 -0
- package/dist/Label.d.ts.map +1 -0
- package/dist/Label.js +17 -0
- package/dist/Label.js.map +1 -0
- package/dist/LanguageSelector.d.ts +14 -0
- package/dist/LanguageSelector.d.ts.map +1 -0
- package/dist/LanguageSelector.js +92 -0
- package/dist/LanguageSelector.js.map +1 -0
- package/dist/MarkdownBlock.d.ts +10 -0
- package/dist/MarkdownBlock.d.ts.map +1 -0
- package/dist/MarkdownBlock.js +257 -0
- package/dist/MarkdownBlock.js.map +1 -0
- package/dist/ModeToggle.d.ts +14 -0
- package/dist/ModeToggle.d.ts.map +1 -0
- package/dist/ModeToggle.js +59 -0
- package/dist/ModeToggle.js.map +1 -0
- package/dist/PreviewCode.d.ts +12 -0
- package/dist/PreviewCode.d.ts.map +1 -0
- package/dist/PreviewCode.js +80 -0
- package/dist/PreviewCode.js.map +1 -0
- package/dist/PreviewCodeToggle.d.ts +15 -0
- package/dist/PreviewCodeToggle.d.ts.map +1 -0
- package/dist/PreviewCodeToggle.js +55 -0
- package/dist/PreviewCodeToggle.js.map +1 -0
- package/dist/Progress.d.ts +10 -0
- package/dist/Progress.d.ts.map +1 -0
- package/dist/Progress.js +27 -0
- package/dist/Progress.js.map +1 -0
- package/dist/PromptDialog.d.ts +20 -0
- package/dist/PromptDialog.d.ts.map +1 -0
- package/dist/PromptDialog.js +114 -0
- package/dist/PromptDialog.js.map +1 -0
- package/dist/Select.d.ts +25 -0
- package/dist/Select.d.ts.map +1 -0
- package/dist/Select.js +335 -0
- package/dist/Select.js.map +1 -0
- package/dist/Separator.d.ts +10 -0
- package/dist/Separator.d.ts.map +1 -0
- package/dist/Separator.js +19 -0
- package/dist/Separator.js.map +1 -0
- package/dist/Sidebar.d.ts +27 -0
- package/dist/Sidebar.d.ts.map +1 -0
- package/dist/Sidebar.js +151 -0
- package/dist/Sidebar.js.map +1 -0
- package/dist/SplitPanel.d.ts +40 -0
- package/dist/SplitPanel.d.ts.map +1 -0
- package/dist/SplitPanel.js +275 -0
- package/dist/SplitPanel.js.map +1 -0
- package/dist/Switch.d.ts +13 -0
- package/dist/Switch.d.ts.map +1 -0
- package/dist/Switch.js +48 -0
- package/dist/Switch.js.map +1 -0
- package/dist/Textarea.d.ts +21 -0
- package/dist/Textarea.d.ts.map +1 -0
- package/dist/Textarea.js +67 -0
- package/dist/Textarea.js.map +1 -0
- package/dist/ThemeToggle.d.ts +11 -0
- package/dist/ThemeToggle.d.ts.map +1 -0
- package/dist/ThemeToggle.js +91 -0
- package/dist/ThemeToggle.js.map +1 -0
- package/dist/component.d.ts +190 -0
- package/dist/component.d.ts.map +1 -0
- package/dist/component.js +241 -0
- package/dist/component.js.map +1 -0
- package/dist/i18n.d.ts +73 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +146 -0
- package/dist/i18n.js.map +1 -0
- package/dist/icons.d.ts +7 -0
- package/dist/icons.d.ts.map +1 -0
- package/dist/icons.js +21 -0
- package/dist/icons.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/mini.d.ts +19 -0
- package/dist/mini.d.ts.map +1 -0
- package/dist/mini.js +29 -0
- package/dist/mini.js.map +1 -0
- package/llms.txt +681 -0
- package/package.json +69 -0
- package/src/styles/base.css +63 -0
- package/src/styles/themes/claude.css +155 -0
- package/src/styles/themes/default.css +102 -0
- package/src/styles/utils/markdown.css +104 -0
- package/src/styles/utils/math.css +7 -0
- package/src/styles/utils/syntax-highlighting.css +134 -0
package/dist/Dialog.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type BaseComponentProps } from "./mini.js";
|
|
2
|
+
export interface DialogProps {
|
|
3
|
+
isOpen: boolean;
|
|
4
|
+
onClose?: () => void;
|
|
5
|
+
children: any;
|
|
6
|
+
width?: string;
|
|
7
|
+
height?: string;
|
|
8
|
+
className?: string;
|
|
9
|
+
backdropClassName?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface DialogHeaderProps {
|
|
12
|
+
title: string;
|
|
13
|
+
description?: string;
|
|
14
|
+
className?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface DialogContentProps extends BaseComponentProps {
|
|
17
|
+
}
|
|
18
|
+
export interface DialogFooterProps extends BaseComponentProps {
|
|
19
|
+
}
|
|
20
|
+
export declare const Dialog: import("./mini.js").Component<DialogProps>;
|
|
21
|
+
export declare const DialogHeader: import("./mini.js").Component<DialogHeaderProps>;
|
|
22
|
+
export declare const DialogContent: import("./mini.js").Component<DialogContentProps>;
|
|
23
|
+
export declare const DialogFooter: import("./mini.js").Component<DialogFooterProps>;
|
|
24
|
+
//# sourceMappingURL=Dialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../src/Dialog.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,kBAAkB,EAAM,MAAM,WAAW,CAAC;AAExD,MAAM,WAAW,WAAW;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,EAAE,GAAG,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAmB,SAAQ,kBAAkB;CAAG;AAEjE,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;CAAG;AAGhE,eAAO,MAAM,MAAM,4CA8DlB,CAAC;AAGF,eAAO,MAAM,YAAY,kDAOvB,CAAC;AAGH,eAAO,MAAM,aAAa,mDAExB,CAAC;AAGH,eAAO,MAAM,YAAY,kDAEvB,CAAC"}
|
package/dist/Dialog.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { html } from "lit";
|
|
2
|
+
import { i18n } from "./i18n.js";
|
|
3
|
+
import { fc } from "./mini.js";
|
|
4
|
+
// Main Dialog container
|
|
5
|
+
export const Dialog = fc(({ isOpen, onClose, children, width = "min(600px, 90vw)", height = "auto", className = "", backdropClassName = "bg-black/50", }) => {
|
|
6
|
+
if (!isOpen)
|
|
7
|
+
return html ``;
|
|
8
|
+
const handleBackdropClick = (e) => {
|
|
9
|
+
if (e.target === e.currentTarget) {
|
|
10
|
+
onClose?.();
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
// Add escape key handler
|
|
14
|
+
const handleKeyDown = (e) => {
|
|
15
|
+
if (e.key === "Escape") {
|
|
16
|
+
onClose?.();
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
// Add/remove event listener when dialog opens/closes
|
|
20
|
+
if (isOpen) {
|
|
21
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
22
|
+
// Clean up on unmount
|
|
23
|
+
setTimeout(() => {
|
|
24
|
+
if (!isOpen) {
|
|
25
|
+
document.removeEventListener("keydown", handleKeyDown);
|
|
26
|
+
}
|
|
27
|
+
}, 0);
|
|
28
|
+
}
|
|
29
|
+
return html `
|
|
30
|
+
<!-- Backdrop -->
|
|
31
|
+
<div class="fixed inset-0 ${backdropClassName} z-40" @click=${handleBackdropClick}>
|
|
32
|
+
<!-- Modal -->
|
|
33
|
+
<div
|
|
34
|
+
class="fixed z-50 bg-background rounded-lg shadow-xl flex flex-col border border-border ${className}"
|
|
35
|
+
style="top: 50%; left: 50%; transform: translate(-50%, -50%); width: ${width}; height: ${height};"
|
|
36
|
+
@click=${(e) => e.stopPropagation()}
|
|
37
|
+
>
|
|
38
|
+
${children}
|
|
39
|
+
|
|
40
|
+
<!-- Close button - absolutely positioned -->
|
|
41
|
+
<button
|
|
42
|
+
type="button"
|
|
43
|
+
@click=${() => onClose?.()}
|
|
44
|
+
class="absolute top-4 right-4 rounded-sm text-muted-foreground opacity-70 transition-all hover:opacity-100 hover:text-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background disabled:pointer-events-none cursor-pointer"
|
|
45
|
+
aria-label="${i18n("Close")}"
|
|
46
|
+
>
|
|
47
|
+
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
48
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
|
|
49
|
+
</svg>
|
|
50
|
+
</button>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
`;
|
|
54
|
+
});
|
|
55
|
+
// Dialog header component
|
|
56
|
+
export const DialogHeader = fc(({ title, description, className = "" }) => {
|
|
57
|
+
return html `
|
|
58
|
+
<div class="pr-8 ${className}">
|
|
59
|
+
<h2 class="text-lg font-semibold text-foreground${description ? " mb-2" : ""}">${title}</h2>
|
|
60
|
+
${description ? html `<p class="text-sm text-muted-foreground">${description}</p>` : ""}
|
|
61
|
+
</div>
|
|
62
|
+
`;
|
|
63
|
+
});
|
|
64
|
+
// Dialog content wrapper
|
|
65
|
+
export const DialogContent = fc(({ children, className = "" }) => {
|
|
66
|
+
return html ` <div class="p-6 flex flex-col gap-4 ${className}">${children}</div> `;
|
|
67
|
+
});
|
|
68
|
+
// Dialog footer for action buttons
|
|
69
|
+
export const DialogFooter = fc(({ children, className = "" }) => {
|
|
70
|
+
return html ` <div class="flex flex-col-reverse gap-2 sm:flex-row sm:justify-end ${className}">${children}</div> `;
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=Dialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dialog.js","sourceRoot":"","sources":["../src/Dialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAA2B,EAAE,EAAE,MAAM,WAAW,CAAC;AAsBxD,wBAAwB;AACxB,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,CACrB,CAAC,EACE,MAAM,EACN,OAAO,EACP,QAAQ,EACR,KAAK,GAAG,kBAAkB,EAC1B,MAAM,GAAG,MAAM,EACf,SAAS,GAAG,EAAE,EACd,iBAAiB,GAAG,aAAa,GACnC,EAAE,EAAE;IACF,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA,EAAE,CAAC;IAE3B,MAAM,mBAAmB,GAAG,CAAC,CAAQ,EAAE,EAAE;QACtC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;YAChC,OAAO,EAAE,EAAE,CAAC;QACf,CAAC;IACJ,CAAC,CAAC;IAEF,yBAAyB;IACzB,MAAM,aAAa,GAAG,CAAC,CAAgB,EAAE,EAAE;QACxC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,EAAE,EAAE,CAAC;QACf,CAAC;IACJ,CAAC,CAAC;IAEF,qDAAqD;IACrD,IAAI,MAAM,EAAE,CAAC;QACV,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACpD,sBAAsB;QACtB,UAAU,CAAC,GAAG,EAAE;YACb,IAAI,CAAC,MAAM,EAAE,CAAC;gBACX,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YAC1D,CAAC;QACJ,CAAC,EAAE,CAAC,CAAC,CAAC;IACT,CAAC;IAED,OAAO,IAAI,CAAA;;qCAEoB,iBAAiB,iBAAiB,mBAAmB;;;yGAGe,SAAS;sFAC5B,KAAK,aAAa,MAAM;wBACtF,CAAC,CAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE;;iBAExC,QAAQ;;;;;2BAKE,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE;;gCAEZ,IAAI,CAAC,OAAO,CAAC;;;;;;;;OAQtC,CAAC;AACL,CAAC,CACH,CAAC;AAEF,0BAA0B;AAC1B,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAoB,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE;IAC1F,OAAO,IAAI,CAAA;yBACW,SAAS;2DACyB,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK;WACpF,WAAW,CAAC,CAAC,CAAC,IAAI,CAAA,4CAA4C,WAAW,MAAM,CAAC,CAAC,CAAC,EAAE;;IAE3F,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,yBAAyB;AACzB,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAqB,CAAC,EAAE,QAAQ,EAAE,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE;IAClF,OAAO,IAAI,CAAA,wCAAwC,SAAS,KAAK,QAAQ,SAAS,CAAC;AACtF,CAAC,CAAC,CAAC;AAEH,mCAAmC;AACnC,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAoB,CAAC,EAAE,QAAQ,EAAE,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE;IAChF,OAAO,IAAI,CAAA,uEAAuE,SAAS,KAAK,QAAQ,SAAS,CAAC;AACrH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { LitElement, type TemplateResult } from "lit";
|
|
2
|
+
export declare abstract class DialogBase extends LitElement {
|
|
3
|
+
protected modalWidth: string;
|
|
4
|
+
protected modalHeight: string;
|
|
5
|
+
private boundHandleKeyDown?;
|
|
6
|
+
private previousFocus?;
|
|
7
|
+
protected createRenderRoot(): HTMLElement | DocumentFragment;
|
|
8
|
+
open(): void;
|
|
9
|
+
close(): void;
|
|
10
|
+
protected abstract renderContent(): TemplateResult;
|
|
11
|
+
render(): TemplateResult;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=DialogBase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DialogBase.d.ts","sourceRoot":"","sources":["../src/DialogBase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAGtD,8BAAsB,UAAW,SAAQ,UAAU;IAEhD,SAAS,CAAC,UAAU,SAAsB;IAC1C,SAAS,CAAC,WAAW,SAAsB;IAC3C,OAAO,CAAC,kBAAkB,CAAC,CAA6B;IACxD,OAAO,CAAC,aAAa,CAAC,CAAc;cAEjB,gBAAgB,IAAI,WAAW,GAAG,gBAAgB;IAIrE,IAAI;IAaJ,KAAK;IAgBL,SAAS,CAAC,QAAQ,CAAC,aAAa,IAAI,cAAc;IAEzC,MAAM;CAUjB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { LitElement } from "lit";
|
|
2
|
+
import { Dialog } from "./Dialog.js";
|
|
3
|
+
export class DialogBase extends LitElement {
|
|
4
|
+
constructor() {
|
|
5
|
+
super(...arguments);
|
|
6
|
+
// Modal configuration - can be overridden by subclasses
|
|
7
|
+
this.modalWidth = "min(600px, 90vw)";
|
|
8
|
+
this.modalHeight = "min(600px, 80vh)";
|
|
9
|
+
}
|
|
10
|
+
createRenderRoot() {
|
|
11
|
+
return this;
|
|
12
|
+
}
|
|
13
|
+
open() {
|
|
14
|
+
// Store the currently focused element
|
|
15
|
+
this.previousFocus = document.activeElement;
|
|
16
|
+
document.body.appendChild(this);
|
|
17
|
+
this.boundHandleKeyDown = (e) => {
|
|
18
|
+
if (e.key === "Escape") {
|
|
19
|
+
this.close();
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
window.addEventListener("keydown", this.boundHandleKeyDown);
|
|
23
|
+
}
|
|
24
|
+
close() {
|
|
25
|
+
if (this.boundHandleKeyDown) {
|
|
26
|
+
window.removeEventListener("keydown", this.boundHandleKeyDown);
|
|
27
|
+
}
|
|
28
|
+
this.remove();
|
|
29
|
+
// Restore focus to the previously focused element
|
|
30
|
+
if (this.previousFocus?.focus) {
|
|
31
|
+
// Use requestAnimationFrame to ensure the dialog is fully removed first
|
|
32
|
+
requestAnimationFrame(() => {
|
|
33
|
+
this.previousFocus?.focus();
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
render() {
|
|
38
|
+
return Dialog({
|
|
39
|
+
isOpen: true,
|
|
40
|
+
onClose: () => this.close(),
|
|
41
|
+
width: this.modalWidth,
|
|
42
|
+
height: this.modalHeight,
|
|
43
|
+
backdropClassName: "bg-black/50 backdrop-blur-sm",
|
|
44
|
+
children: this.renderContent(),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=DialogBase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DialogBase.js","sourceRoot":"","sources":["../src/DialogBase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAuB,MAAM,KAAK,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,OAAgB,UAAW,SAAQ,UAAU;IAAnD;;QACG,wDAAwD;QAC9C,eAAU,GAAG,kBAAkB,CAAC;QAChC,gBAAW,GAAG,kBAAkB,CAAC;IAiD9C,CAAC;IA7CqB,gBAAgB;QAChC,OAAO,IAAI,CAAC;IACf,CAAC;IAED,IAAI;QACD,sCAAsC;QACtC,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,aAA4B,CAAC;QAE3D,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAgB,EAAE,EAAE;YAC5C,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACtB,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,CAAC;QACJ,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK;QACF,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC3B,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;QAEd,kDAAkD;QAClD,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC;YAC7B,wEAAwE;YACxE,qBAAqB,CAAC,GAAG,EAAE;gBACxB,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC;YAC/B,CAAC,CAAC,CAAC;QACN,CAAC;IACJ,CAAC;IAKQ,MAAM;QACZ,OAAO,MAAM,CAAC;YACX,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE;YAC3B,KAAK,EAAE,IAAI,CAAC,UAAU;YACtB,MAAM,EAAE,IAAI,CAAC,WAAW;YACxB,iBAAiB,EAAE,8BAA8B;YACjD,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE;SAChC,CAAC,CAAC;IACN,CAAC;CACH"}
|
package/dist/Diff.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type BaseComponentProps } from "./mini.js";
|
|
2
|
+
export interface DiffProps extends BaseComponentProps {
|
|
3
|
+
oldText: string;
|
|
4
|
+
newText: string;
|
|
5
|
+
title?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const Diff: import("./mini.js").Component<DiffProps>;
|
|
8
|
+
//# sourceMappingURL=Diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Diff.d.ts","sourceRoot":"","sources":["../src/Diff.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,kBAAkB,EAAiC,MAAM,WAAW,CAAC;AAEnF,MAAM,WAAW,SAAU,SAAQ,kBAAkB;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,IAAI,0CAkDf,CAAC"}
|
package/dist/Diff.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as DiffLib from "diff";
|
|
2
|
+
import { fc, html } from "./mini.js";
|
|
3
|
+
export const Diff = fc(({ oldText, newText, title, className = "" }) => {
|
|
4
|
+
const parts = DiffLib.diffLines(oldText ?? "", newText ?? "");
|
|
5
|
+
const lines = [];
|
|
6
|
+
let addedCount = 0;
|
|
7
|
+
let removedCount = 0;
|
|
8
|
+
for (const part of parts) {
|
|
9
|
+
// Split into lines and drop a trailing empty line (diffLines often ends with one)
|
|
10
|
+
const raw = part.value.split("\n");
|
|
11
|
+
if (raw[raw.length - 1] === "")
|
|
12
|
+
raw.pop();
|
|
13
|
+
for (const line of raw) {
|
|
14
|
+
const prefix = part.added ? "+" : part.removed ? "-" : " ";
|
|
15
|
+
// Keep text readable across light/dark by using theme foreground,
|
|
16
|
+
// only tint the background to indicate add/remove.
|
|
17
|
+
const rowClass = part.added ? "bg-emerald-500/15" : part.removed ? "bg-red-500/15" : "";
|
|
18
|
+
if (part.added)
|
|
19
|
+
addedCount++;
|
|
20
|
+
if (part.removed)
|
|
21
|
+
removedCount++;
|
|
22
|
+
lines.push(html `<div class="${rowClass}">
|
|
23
|
+
<pre class="m-0 px-4 py-0.5 text-xs font-mono text-foreground">${prefix} ${line}</pre>
|
|
24
|
+
</div>`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const content = html ` <div class="overflow-auto max-h-96">${lines}</div> `;
|
|
28
|
+
// If title is provided, render with a header like CodeBlock
|
|
29
|
+
if (title) {
|
|
30
|
+
return html `
|
|
31
|
+
<div class="border border-border rounded-lg overflow-hidden ${className}">
|
|
32
|
+
<div class="flex items-center justify-between px-3 py-1.5 bg-muted border-b border-border">
|
|
33
|
+
<span class="text-xs text-muted-foreground font-mono">${title}</span>
|
|
34
|
+
<span class="text-xs text-muted-foreground">
|
|
35
|
+
<span class="text-emerald-600">+${addedCount}</span>
|
|
36
|
+
<span class="mx-1">/</span>
|
|
37
|
+
<span class="text-red-600">-${removedCount}</span>
|
|
38
|
+
</span>
|
|
39
|
+
</div>
|
|
40
|
+
${content}
|
|
41
|
+
</div>
|
|
42
|
+
`;
|
|
43
|
+
}
|
|
44
|
+
// Otherwise, simple bordered container
|
|
45
|
+
return html `<div class="border border-border rounded-lg overflow-hidden ${className}">${content}</div>`;
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=Diff.js.map
|
package/dist/Diff.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Diff.js","sourceRoot":"","sources":["../src/Diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,MAAM,CAAC;AAChC,OAAO,EAA2B,EAAE,EAAE,IAAI,EAAuB,MAAM,WAAW,CAAC;AAQnF,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,CAAY,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,EAAE,EAAE,EAAkB,EAAE;IAC/F,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAqB,EAAE,CAAC;IAEnC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACxB,kFAAkF;QAClF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE;YAAE,GAAG,CAAC,GAAG,EAAE,CAAC;QAE1C,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC3D,kEAAkE;YAClE,mDAAmD;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;YAExF,IAAI,IAAI,CAAC,KAAK;gBAAE,UAAU,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,OAAO;gBAAE,YAAY,EAAE,CAAC;YAEjC,KAAK,CAAC,IAAI,CACP,IAAI,CAAA,eAAe,QAAQ;gFACyC,MAAM,IAAI,IAAI;mBAC3E,CACT,CAAC;QACL,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAA,wCAAwC,KAAK,SAAS,CAAC;IAE3E,4DAA4D;IAC5D,IAAI,KAAK,EAAE,CAAC;QACT,OAAO,IAAI,CAAA;uEACsD,SAAS;;uEAET,KAAK;;oDAExB,UAAU;;gDAEd,YAAY;;;cAG9C,OAAO;;OAEd,CAAC;IACL,CAAC;IAED,uCAAuC;IACvC,OAAO,IAAI,CAAA,+DAA+D,SAAS,KAAK,OAAO,QAAQ,CAAC;AAC3G,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type TemplateResult } from "lit";
|
|
2
|
+
import { type ButtonProps } from "./Button.js";
|
|
3
|
+
import { type IconSize } from "./icons.js";
|
|
4
|
+
export interface DownloadButtonProps {
|
|
5
|
+
content: string | Uint8Array;
|
|
6
|
+
filename: string;
|
|
7
|
+
mimeType?: string;
|
|
8
|
+
title?: string;
|
|
9
|
+
showText?: boolean;
|
|
10
|
+
size?: ButtonProps["size"];
|
|
11
|
+
variant?: ButtonProps["variant"];
|
|
12
|
+
iconSize?: IconSize;
|
|
13
|
+
isBase64?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function DownloadButton({ content, filename, mimeType, title, showText, size, variant, iconSize, isBase64, }: DownloadButtonProps): TemplateResult;
|
|
16
|
+
//# sourceMappingURL=DownloadButton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DownloadButton.d.ts","sourceRoot":"","sources":["../src/DownloadButton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAEhD,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,KAAK,QAAQ,EAAQ,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,mBAAmB;IACjC,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,OAAO,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,cAAc,CAAC,EAC5B,OAAO,EACP,QAAQ,EACR,QAAuB,EACvB,KAAwB,EACxB,QAAgB,EAChB,IAAW,EACX,OAAiB,EACjB,QAAe,EACf,QAAgB,GAClB,EAAE,mBAAmB,GAAG,cAAc,CA+CtC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { html } from "lit";
|
|
2
|
+
import { Download } from "lucide";
|
|
3
|
+
import { Button } from "./Button.js";
|
|
4
|
+
import { i18n } from "./i18n.js";
|
|
5
|
+
import { icon } from "./icons.js";
|
|
6
|
+
export function DownloadButton({ content, filename, mimeType = "text/plain", title = i18n("Download"), showText = false, size = "sm", variant = "ghost", iconSize = "sm", isBase64 = false, }) {
|
|
7
|
+
const handleDownload = () => {
|
|
8
|
+
let blobContent;
|
|
9
|
+
if (content instanceof Uint8Array) {
|
|
10
|
+
blobContent = content.buffer.slice(content.byteOffset, content.byteOffset + content.byteLength);
|
|
11
|
+
}
|
|
12
|
+
else if (typeof content === "string") {
|
|
13
|
+
// Check if it's base64
|
|
14
|
+
const base64Regex = /^[A-Za-z0-9+/]*={0,2}$/;
|
|
15
|
+
const isBase64String = isBase64 || (content.length >= 4 && content.length % 4 === 0 && base64Regex.test(content));
|
|
16
|
+
if (isBase64String) {
|
|
17
|
+
try {
|
|
18
|
+
const binaryString = atob(content);
|
|
19
|
+
const bytes = new Uint8Array(binaryString.length);
|
|
20
|
+
for (let i = 0; i < binaryString.length; i++) {
|
|
21
|
+
bytes[i] = binaryString.charCodeAt(i);
|
|
22
|
+
}
|
|
23
|
+
blobContent = bytes;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// If base64 decode fails, treat as plain text
|
|
27
|
+
blobContent = content;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
blobContent = content;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
blobContent = "";
|
|
36
|
+
}
|
|
37
|
+
const blob = new Blob([blobContent], { type: mimeType });
|
|
38
|
+
const url = URL.createObjectURL(blob);
|
|
39
|
+
const a = document.createElement("a");
|
|
40
|
+
a.href = url;
|
|
41
|
+
a.download = filename;
|
|
42
|
+
a.click();
|
|
43
|
+
URL.revokeObjectURL(url);
|
|
44
|
+
};
|
|
45
|
+
return Button({
|
|
46
|
+
variant,
|
|
47
|
+
size,
|
|
48
|
+
onClick: handleDownload,
|
|
49
|
+
title,
|
|
50
|
+
children: html ` ${icon(Download, iconSize)} ${showText ? html `<span>${i18n("Download")}</span>` : ""} `,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=DownloadButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DownloadButton.js","sourceRoot":"","sources":["../src/DownloadButton.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ButtonProps } from "./Button.js";
|
|
2
|
+
export interface FileButtonProps extends Omit<ButtonProps, "onClick"> {
|
|
3
|
+
accept?: string;
|
|
4
|
+
multiple?: boolean;
|
|
5
|
+
maxFileSize?: number;
|
|
6
|
+
onFilesSelected?: (files: File[]) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare const FileButton: ({ accept, multiple, maxFileSize, onFilesSelected, disabled, loading, ...buttonProps }: FileButtonProps) => import("lit-html").TemplateResult<1>;
|
|
9
|
+
//# sourceMappingURL=FileButton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileButton.d.ts","sourceRoot":"","sources":["../src/FileButton.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAGvD,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;CAC5C;AAED,eAAO,MAAM,UAAU,GAAI,uFAQxB,eAAe,yCAmDjB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { createRef, ref } from "lit/directives/ref.js";
|
|
2
|
+
import { Button } from "./Button.js";
|
|
3
|
+
import { html } from "./mini.js";
|
|
4
|
+
export const FileButton = ({ accept = "*", multiple = false, maxFileSize, onFilesSelected, disabled = false, loading = false, ...buttonProps }) => {
|
|
5
|
+
const inputRef = createRef();
|
|
6
|
+
const handleFileChange = (e) => {
|
|
7
|
+
const input = e.target;
|
|
8
|
+
const files = Array.from(input.files || []);
|
|
9
|
+
if (maxFileSize) {
|
|
10
|
+
const validFiles = files.filter((file) => {
|
|
11
|
+
if (file.size > maxFileSize) {
|
|
12
|
+
console.warn(`File ${file.name} exceeds maximum size of ${maxFileSize} bytes`);
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
return true;
|
|
16
|
+
});
|
|
17
|
+
if (validFiles.length > 0) {
|
|
18
|
+
onFilesSelected?.(validFiles);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
if (files.length > 0) {
|
|
23
|
+
onFilesSelected?.(files);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Reset input so same file can be selected again
|
|
27
|
+
input.value = "";
|
|
28
|
+
};
|
|
29
|
+
return html `
|
|
30
|
+
<label class="inline-block">
|
|
31
|
+
<input
|
|
32
|
+
type="file"
|
|
33
|
+
class="sr-only"
|
|
34
|
+
accept="${accept}"
|
|
35
|
+
?multiple="${multiple}"
|
|
36
|
+
?disabled="${disabled || loading}"
|
|
37
|
+
@change="${handleFileChange}"
|
|
38
|
+
${ref(inputRef)}
|
|
39
|
+
/>
|
|
40
|
+
${Button({
|
|
41
|
+
...buttonProps,
|
|
42
|
+
disabled: disabled || loading,
|
|
43
|
+
loading,
|
|
44
|
+
onClick: (e) => {
|
|
45
|
+
// Prevent label from triggering click
|
|
46
|
+
e.preventDefault();
|
|
47
|
+
inputRef.value?.click();
|
|
48
|
+
},
|
|
49
|
+
})}
|
|
50
|
+
</label>
|
|
51
|
+
`;
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=FileButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileButton.js","sourceRoot":"","sources":["../src/FileButton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAoB,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AASjC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EACxB,MAAM,GAAG,GAAG,EACZ,QAAQ,GAAG,KAAK,EAChB,WAAW,EACX,eAAe,EACf,QAAQ,GAAG,KAAK,EAChB,OAAO,GAAG,KAAK,EACf,GAAG,WAAW,EACC,EAAE,EAAE;IACnB,MAAM,QAAQ,GAAG,SAAS,EAAoB,CAAC;IAE/C,MAAM,gBAAgB,GAAG,CAAC,CAAQ,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,CAAC,CAAC,MAA0B,CAAC;QAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAE5C,IAAI,WAAW,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;gBACtC,IAAI,IAAI,CAAC,IAAI,GAAG,WAAW,EAAE,CAAC;oBAC3B,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,4BAA4B,WAAW,QAAQ,CAAC,CAAC;oBAC/E,OAAO,KAAK,CAAC;gBAChB,CAAC;gBACD,OAAO,IAAI,CAAC;YACf,CAAC,CAAC,CAAC;YACH,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,eAAe,EAAE,CAAC,UAAU,CAAC,CAAC;YACjC,CAAC;QACJ,CAAC;aAAM,CAAC;YACL,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;QACJ,CAAC;QAED,iDAAiD;QACjD,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,OAAO,IAAI,CAAA;;;;;sBAKQ,MAAM;yBACH,QAAQ;yBACR,QAAQ,IAAI,OAAO;uBACrB,gBAAgB;cACzB,GAAG,CAAC,QAAQ,CAAC;;WAEhB,MAAM,CAAC;QACN,GAAG,WAAW;QACd,QAAQ,EAAE,QAAQ,IAAI,OAAO;QAC7B,OAAO;QACP,OAAO,EAAE,CAAC,CAAQ,EAAE,EAAE;YACnB,sCAAsC;YACtC,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;QAC3B,CAAC;KACH,CAAC;;IAEP,CAAC;AACL,CAAC,CAAC"}
|
package/dist/Input.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type Ref } from "lit/directives/ref.js";
|
|
2
|
+
import { type BaseComponentProps } from "./mini.js";
|
|
3
|
+
export type InputType = "text" | "email" | "password" | "number" | "url" | "tel" | "search" | "date";
|
|
4
|
+
export type InputSize = "sm" | "md" | "lg";
|
|
5
|
+
export interface InputProps extends BaseComponentProps {
|
|
6
|
+
id?: string;
|
|
7
|
+
type?: InputType;
|
|
8
|
+
size?: InputSize;
|
|
9
|
+
value?: string;
|
|
10
|
+
placeholder?: string;
|
|
11
|
+
label?: string;
|
|
12
|
+
error?: string;
|
|
13
|
+
disabled?: boolean;
|
|
14
|
+
readonly?: boolean;
|
|
15
|
+
required?: boolean;
|
|
16
|
+
name?: string;
|
|
17
|
+
autocomplete?: string;
|
|
18
|
+
min?: number;
|
|
19
|
+
max?: number;
|
|
20
|
+
step?: number;
|
|
21
|
+
inputRef?: Ref<HTMLInputElement>;
|
|
22
|
+
onInput?: (e: Event) => void;
|
|
23
|
+
onChange?: (e: Event) => void;
|
|
24
|
+
onKeyDown?: (e: KeyboardEvent) => void;
|
|
25
|
+
onKeyUp?: (e: KeyboardEvent) => void;
|
|
26
|
+
}
|
|
27
|
+
export declare const Input: import("./mini.js").Component<InputProps>;
|
|
28
|
+
//# sourceMappingURL=Input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../src/Input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAO,MAAM,uBAAuB,CAAC;AAEtD,OAAO,EAAE,KAAK,kBAAkB,EAAY,MAAM,WAAW,CAAC;AAE9D,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AACrG,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3C,MAAM,WAAW,UAAW,SAAQ,kBAAkB;IACnD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IAC9B,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;CACvC;AAED,eAAO,MAAM,KAAK,2CAuFjB,CAAC"}
|
package/dist/Input.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { ref } from "lit/directives/ref.js";
|
|
2
|
+
import { i18n } from "./i18n.js";
|
|
3
|
+
import { fc, html } from "./mini.js";
|
|
4
|
+
export const Input = fc(({ id = "", type = "text", size = "md", value = "", placeholder = "", label = "", error = "", disabled = false, readonly = false, required = false, name = "", autocomplete = "", min, max, step, inputRef, onInput, onChange, onKeyDown, onKeyUp, className = "", }) => {
|
|
5
|
+
const sizeClasses = {
|
|
6
|
+
sm: "h-8 px-3 py-1 text-sm",
|
|
7
|
+
md: "h-9 px-3 py-1 text-sm md:text-sm",
|
|
8
|
+
lg: "h-10 px-4 py-1 text-base",
|
|
9
|
+
};
|
|
10
|
+
const baseClasses = "flex w-full min-w-0 rounded-md border bg-transparent text-foreground shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium";
|
|
11
|
+
const interactionClasses = "placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground";
|
|
12
|
+
const focusClasses = "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]";
|
|
13
|
+
const darkClasses = "dark:bg-input/30";
|
|
14
|
+
const stateClasses = error
|
|
15
|
+
? "border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40"
|
|
16
|
+
: "border-input";
|
|
17
|
+
const disabledClasses = "disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50";
|
|
18
|
+
const handleInput = (e) => {
|
|
19
|
+
onInput?.(e);
|
|
20
|
+
};
|
|
21
|
+
const handleChange = (e) => {
|
|
22
|
+
onChange?.(e);
|
|
23
|
+
};
|
|
24
|
+
return html `
|
|
25
|
+
<div class="flex flex-col gap-1.5 ${className}">
|
|
26
|
+
${label
|
|
27
|
+
? html `
|
|
28
|
+
<label class="text-sm font-medium text-foreground">
|
|
29
|
+
${label} ${required ? html `<span class="text-destructive">${i18n("*")}</span>` : ""}
|
|
30
|
+
</label>
|
|
31
|
+
`
|
|
32
|
+
: ""}
|
|
33
|
+
<input
|
|
34
|
+
id=${id}
|
|
35
|
+
type="${type}"
|
|
36
|
+
class="${baseClasses} ${sizeClasses[size]} ${interactionClasses} ${focusClasses} ${darkClasses} ${stateClasses} ${disabledClasses}"
|
|
37
|
+
.value=${value}
|
|
38
|
+
placeholder="${placeholder}"
|
|
39
|
+
?disabled=${disabled}
|
|
40
|
+
?readonly=${readonly}
|
|
41
|
+
?required=${required}
|
|
42
|
+
?aria-invalid=${!!error}
|
|
43
|
+
name="${name}"
|
|
44
|
+
autocomplete="${autocomplete}"
|
|
45
|
+
min="${min ?? ""}"
|
|
46
|
+
max="${max ?? ""}"
|
|
47
|
+
step="${step ?? ""}"
|
|
48
|
+
@input=${handleInput}
|
|
49
|
+
@change=${handleChange}
|
|
50
|
+
@keydown=${onKeyDown}
|
|
51
|
+
@keyup=${onKeyUp}
|
|
52
|
+
${inputRef ? ref(inputRef) : ""}
|
|
53
|
+
/>
|
|
54
|
+
${error ? html `<span class="text-sm text-destructive">${error}</span>` : ""}
|
|
55
|
+
</div>
|
|
56
|
+
`;
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=Input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Input.js","sourceRoot":"","sources":["../src/Input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,GAAG,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAA2B,EAAE,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA4B9D,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CACpB,CAAC,EACE,EAAE,GAAG,EAAE,EACP,IAAI,GAAG,MAAM,EACb,IAAI,GAAG,IAAI,EACX,KAAK,GAAG,EAAE,EACV,WAAW,GAAG,EAAE,EAChB,KAAK,GAAG,EAAE,EACV,KAAK,GAAG,EAAE,EACV,QAAQ,GAAG,KAAK,EAChB,QAAQ,GAAG,KAAK,EAChB,QAAQ,GAAG,KAAK,EAChB,IAAI,GAAG,EAAE,EACT,YAAY,GAAG,EAAE,EACjB,GAAG,EACH,GAAG,EACH,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,SAAS,EACT,OAAO,EACP,SAAS,GAAG,EAAE,GAChB,EAAE,EAAE;IACF,MAAM,WAAW,GAAG;QACjB,EAAE,EAAE,uBAAuB;QAC3B,EAAE,EAAE,kCAAkC;QACtC,EAAE,EAAE,0BAA0B;KAChC,CAAC;IAEF,MAAM,WAAW,GACd,qNAAqN,CAAC;IACzN,MAAM,kBAAkB,GACrB,0FAA0F,CAAC;IAC9F,MAAM,YAAY,GAAG,+EAA+E,CAAC;IACrG,MAAM,WAAW,GAAG,kBAAkB,CAAC;IACvC,MAAM,YAAY,GAAG,KAAK;QACvB,CAAC,CAAC,2FAA2F;QAC7F,CAAC,CAAC,cAAc,CAAC;IACpB,MAAM,eAAe,GAAG,8EAA8E,CAAC;IAEvG,MAAM,WAAW,GAAG,CAAC,CAAQ,EAAE,EAAE;QAC9B,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,CAAQ,EAAE,EAAE;QAC/B,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,OAAO,IAAI,CAAA;6CAC4B,SAAS;cAEvC,KAAK;QACF,CAAC,CAAC,IAAI,CAAA;;yBAEC,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAA,kCAAkC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;;kBAExF;QACA,CAAC,CAAC,EACR;;oBAEQ,EAAE;uBACC,IAAI;wBACH,WAAW,IACjB,WAAW,CAAC,IAAI,CACnB,IAAI,kBAAkB,IAAI,YAAY,IAAI,WAAW,IAAI,YAAY,IAAI,eAAe;wBAC/E,KAAK;8BACC,WAAW;2BACd,QAAQ;2BACR,QAAQ;2BACR,QAAQ;+BACJ,CAAC,CAAC,KAAK;uBACf,IAAI;+BACI,YAAY;sBACrB,GAAG,IAAI,EAAE;sBACT,GAAG,IAAI,EAAE;uBACR,IAAI,IAAI,EAAE;wBACT,WAAW;yBACV,YAAY;0BACX,SAAS;wBACX,OAAO;iBACd,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;;cAEhC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA,0CAA0C,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE;;OAEhF,CAAC;AACL,CAAC,CACH,CAAC"}
|
package/dist/Label.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type BaseComponentProps, type TemplateResult } from "./mini.js";
|
|
2
|
+
interface LabelProps extends BaseComponentProps {
|
|
3
|
+
htmlFor?: string;
|
|
4
|
+
required?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function Label(props: LabelProps): TemplateResult;
|
|
7
|
+
export declare function Label(children: TemplateResult | string, htmlFor?: string, required?: boolean, className?: string): TemplateResult;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=Label.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Label.d.ts","sourceRoot":"","sources":["../src/Label.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,kBAAkB,EAAY,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAEnF,UAAU,UAAW,SAAQ,kBAAkB;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACrB;AAcD,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,cAAc,CAAC;AACzD,wBAAgB,KAAK,CAClB,QAAQ,EAAE,cAAc,GAAG,MAAM,EACjC,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,OAAO,EAClB,SAAS,CAAC,EAAE,MAAM,GAClB,cAAc,CAAC"}
|
package/dist/Label.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { i18n } from "./i18n.js";
|
|
2
|
+
import { fc, html } from "./mini.js";
|
|
3
|
+
const _Label = fc(({ htmlFor = "", required = false, className = "", children }) => {
|
|
4
|
+
const baseClasses = "inline-block text-sm font-medium leading-none text-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70 mb-2";
|
|
5
|
+
return html `
|
|
6
|
+
<label for="${htmlFor}" class="${baseClasses} ${className}">
|
|
7
|
+
${children} ${required ? html `<span class="text-destructive ml-1">${i18n("*")}</span>` : ""}
|
|
8
|
+
</label>
|
|
9
|
+
`;
|
|
10
|
+
});
|
|
11
|
+
export function Label(propsOrChildren, htmlFor = "", required = false, className = "") {
|
|
12
|
+
if (typeof propsOrChildren === "object" && propsOrChildren !== null && "children" in propsOrChildren) {
|
|
13
|
+
return _Label(propsOrChildren);
|
|
14
|
+
}
|
|
15
|
+
return _Label({ children: propsOrChildren, htmlFor, required, className });
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=Label.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Label.js","sourceRoot":"","sources":["../src/Label.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAA2B,EAAE,EAAE,IAAI,EAAuB,MAAM,WAAW,CAAC;AAOnF,MAAM,MAAM,GAAG,EAAE,CAAa,CAAC,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,KAAK,EAAE,SAAS,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC5F,MAAM,WAAW,GACd,8HAA8H,CAAC;IAElI,OAAO,IAAI,CAAA;oBACM,OAAO,YAAY,WAAW,IAAI,SAAS;WACpD,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAA,uCAAuC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;;IAEhG,CAAC;AACL,CAAC,CAAC,CAAC;AAUH,MAAM,UAAU,KAAK,CAClB,eAAqD,EACrD,OAAO,GAAG,EAAE,EACZ,QAAQ,GAAG,KAAK,EAChB,SAAS,GAAG,EAAE;IAEd,IAAI,OAAO,eAAe,KAAK,QAAQ,IAAI,eAAe,KAAK,IAAI,IAAI,UAAU,IAAI,eAAe,EAAE,CAAC;QACpG,OAAO,MAAM,CAAC,eAA6B,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,MAAM,CAAC,EAAE,QAAQ,EAAE,eAA0C,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;AACzG,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { LitElement } from "lit";
|
|
2
|
+
export declare class LanguageSelector extends LitElement {
|
|
3
|
+
private currentLanguage;
|
|
4
|
+
private isOpen;
|
|
5
|
+
private languages;
|
|
6
|
+
private selectLanguage;
|
|
7
|
+
private toggleDropdown;
|
|
8
|
+
private handleClickOutside;
|
|
9
|
+
connectedCallback(): void;
|
|
10
|
+
disconnectedCallback(): void;
|
|
11
|
+
createRenderRoot(): this;
|
|
12
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=LanguageSelector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LanguageSelector.d.ts","sourceRoot":"","sources":["../src/LanguageSelector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,UAAU,EAAE,MAAM,KAAK,CAAC;AAOvC,qBACa,gBAAiB,SAAQ,UAAU;IACpC,OAAO,CAAC,eAAe,CAAsC;IAC7D,OAAO,CAAC,MAAM,CAAS;IAEhC,OAAO,CAAC,SAAS,CAGf;IAEF,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,kBAAkB,CAIxB;IAEO,iBAAiB;IAKjB,oBAAoB;IAKpB,gBAAgB;IAIhB,MAAM;CAqCjB"}
|