@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.
Files changed (142) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +22 -0
  3. package/dist/Alert.d.ts +12 -0
  4. package/dist/Alert.d.ts.map +1 -0
  5. package/dist/Alert.js +35 -0
  6. package/dist/Alert.js.map +1 -0
  7. package/dist/Badge.d.ts +8 -0
  8. package/dist/Badge.d.ts.map +1 -0
  9. package/dist/Badge.js +19 -0
  10. package/dist/Badge.js.map +1 -0
  11. package/dist/Button.d.ts +14 -0
  12. package/dist/Button.d.ts.map +1 -0
  13. package/dist/Button.js +60 -0
  14. package/dist/Button.js.map +1 -0
  15. package/dist/Card.d.ts +19 -0
  16. package/dist/Card.d.ts.map +1 -0
  17. package/dist/Card.js +76 -0
  18. package/dist/Card.js.map +1 -0
  19. package/dist/Checkbox.d.ts +15 -0
  20. package/dist/Checkbox.d.ts.map +1 -0
  21. package/dist/Checkbox.js +49 -0
  22. package/dist/Checkbox.js.map +1 -0
  23. package/dist/CodeBlock.d.ts +11 -0
  24. package/dist/CodeBlock.d.ts.map +1 -0
  25. package/dist/CodeBlock.js +90 -0
  26. package/dist/CodeBlock.js.map +1 -0
  27. package/dist/CopyButton.d.ts +11 -0
  28. package/dist/CopyButton.d.ts.map +1 -0
  29. package/dist/CopyButton.js +65 -0
  30. package/dist/CopyButton.js.map +1 -0
  31. package/dist/Dialog.d.ts +24 -0
  32. package/dist/Dialog.d.ts.map +1 -0
  33. package/dist/Dialog.js +72 -0
  34. package/dist/Dialog.js.map +1 -0
  35. package/dist/DialogBase.d.ts +13 -0
  36. package/dist/DialogBase.d.ts.map +1 -0
  37. package/dist/DialogBase.js +48 -0
  38. package/dist/DialogBase.js.map +1 -0
  39. package/dist/Diff.d.ts +8 -0
  40. package/dist/Diff.d.ts.map +1 -0
  41. package/dist/Diff.js +47 -0
  42. package/dist/Diff.js.map +1 -0
  43. package/dist/DownloadButton.d.ts +16 -0
  44. package/dist/DownloadButton.d.ts.map +1 -0
  45. package/dist/DownloadButton.js +53 -0
  46. package/dist/DownloadButton.js.map +1 -0
  47. package/dist/FileButton.d.ts +9 -0
  48. package/dist/FileButton.d.ts.map +1 -0
  49. package/dist/FileButton.js +53 -0
  50. package/dist/FileButton.js.map +1 -0
  51. package/dist/Input.d.ts +28 -0
  52. package/dist/Input.d.ts.map +1 -0
  53. package/dist/Input.js +58 -0
  54. package/dist/Input.js.map +1 -0
  55. package/dist/Label.d.ts +9 -0
  56. package/dist/Label.d.ts.map +1 -0
  57. package/dist/Label.js +17 -0
  58. package/dist/Label.js.map +1 -0
  59. package/dist/LanguageSelector.d.ts +14 -0
  60. package/dist/LanguageSelector.d.ts.map +1 -0
  61. package/dist/LanguageSelector.js +92 -0
  62. package/dist/LanguageSelector.js.map +1 -0
  63. package/dist/MarkdownBlock.d.ts +10 -0
  64. package/dist/MarkdownBlock.d.ts.map +1 -0
  65. package/dist/MarkdownBlock.js +257 -0
  66. package/dist/MarkdownBlock.js.map +1 -0
  67. package/dist/ModeToggle.d.ts +14 -0
  68. package/dist/ModeToggle.d.ts.map +1 -0
  69. package/dist/ModeToggle.js +59 -0
  70. package/dist/ModeToggle.js.map +1 -0
  71. package/dist/PreviewCode.d.ts +12 -0
  72. package/dist/PreviewCode.d.ts.map +1 -0
  73. package/dist/PreviewCode.js +80 -0
  74. package/dist/PreviewCode.js.map +1 -0
  75. package/dist/PreviewCodeToggle.d.ts +15 -0
  76. package/dist/PreviewCodeToggle.d.ts.map +1 -0
  77. package/dist/PreviewCodeToggle.js +55 -0
  78. package/dist/PreviewCodeToggle.js.map +1 -0
  79. package/dist/Progress.d.ts +10 -0
  80. package/dist/Progress.d.ts.map +1 -0
  81. package/dist/Progress.js +27 -0
  82. package/dist/Progress.js.map +1 -0
  83. package/dist/PromptDialog.d.ts +20 -0
  84. package/dist/PromptDialog.d.ts.map +1 -0
  85. package/dist/PromptDialog.js +114 -0
  86. package/dist/PromptDialog.js.map +1 -0
  87. package/dist/Select.d.ts +25 -0
  88. package/dist/Select.d.ts.map +1 -0
  89. package/dist/Select.js +335 -0
  90. package/dist/Select.js.map +1 -0
  91. package/dist/Separator.d.ts +10 -0
  92. package/dist/Separator.d.ts.map +1 -0
  93. package/dist/Separator.js +19 -0
  94. package/dist/Separator.js.map +1 -0
  95. package/dist/Sidebar.d.ts +27 -0
  96. package/dist/Sidebar.d.ts.map +1 -0
  97. package/dist/Sidebar.js +151 -0
  98. package/dist/Sidebar.js.map +1 -0
  99. package/dist/SplitPanel.d.ts +40 -0
  100. package/dist/SplitPanel.d.ts.map +1 -0
  101. package/dist/SplitPanel.js +275 -0
  102. package/dist/SplitPanel.js.map +1 -0
  103. package/dist/Switch.d.ts +13 -0
  104. package/dist/Switch.d.ts.map +1 -0
  105. package/dist/Switch.js +48 -0
  106. package/dist/Switch.js.map +1 -0
  107. package/dist/Textarea.d.ts +21 -0
  108. package/dist/Textarea.d.ts.map +1 -0
  109. package/dist/Textarea.js +67 -0
  110. package/dist/Textarea.js.map +1 -0
  111. package/dist/ThemeToggle.d.ts +11 -0
  112. package/dist/ThemeToggle.d.ts.map +1 -0
  113. package/dist/ThemeToggle.js +91 -0
  114. package/dist/ThemeToggle.js.map +1 -0
  115. package/dist/component.d.ts +190 -0
  116. package/dist/component.d.ts.map +1 -0
  117. package/dist/component.js +241 -0
  118. package/dist/component.js.map +1 -0
  119. package/dist/i18n.d.ts +73 -0
  120. package/dist/i18n.d.ts.map +1 -0
  121. package/dist/i18n.js +146 -0
  122. package/dist/i18n.js.map +1 -0
  123. package/dist/icons.d.ts +7 -0
  124. package/dist/icons.d.ts.map +1 -0
  125. package/dist/icons.js +21 -0
  126. package/dist/icons.js.map +1 -0
  127. package/dist/index.d.ts +4 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +8 -0
  130. package/dist/index.js.map +1 -0
  131. package/dist/mini.d.ts +19 -0
  132. package/dist/mini.d.ts.map +1 -0
  133. package/dist/mini.js +29 -0
  134. package/dist/mini.js.map +1 -0
  135. package/llms.txt +681 -0
  136. package/package.json +69 -0
  137. package/src/styles/base.css +63 -0
  138. package/src/styles/themes/claude.css +155 -0
  139. package/src/styles/themes/default.css +102 -0
  140. package/src/styles/utils/markdown.css +104 -0
  141. package/src/styles/utils/math.css +7 -0
  142. package/src/styles/utils/syntax-highlighting.css +134 -0
@@ -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
@@ -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"}
@@ -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"}
@@ -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"}