luxen-ui 0.1.0
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 +98 -0
- package/dist/css/elements/avatar.css +20 -0
- package/dist/css/elements/badge.css +159 -0
- package/dist/css/elements/button.css +171 -0
- package/dist/css/elements/close-button/circle.css +66 -0
- package/dist/css/elements/close-button/ring.css +71 -0
- package/dist/css/elements/close-button/square.css +70 -0
- package/dist/css/elements/disclosure.css +137 -0
- package/dist/css/elements/divider.css +75 -0
- package/dist/css/elements/input-otp.css +164 -0
- package/dist/css/elements/input-stepper/default.css +245 -0
- package/dist/css/elements/input-stepper/rounded.css +238 -0
- package/dist/css/elements/kbd.css +21 -0
- package/dist/css/elements/progress.css +114 -0
- package/dist/css/elements/select.css +71 -0
- package/dist/css/elements/skeleton.css +89 -0
- package/dist/css/elements/tabs/enclosed.css +148 -0
- package/dist/css/elements/tabs/line.css +138 -0
- package/dist/css/elements/toast.css +260 -0
- package/dist/css/index.css +885 -0
- package/dist/custom-elements.json +14424 -0
- package/dist/define.d.ts +9 -0
- package/dist/define.d.ts.map +1 -0
- package/dist/define.js +16 -0
- package/dist/elements/avatar/avatar.css +128 -0
- package/dist/elements/avatar/avatar.d.ts +21 -0
- package/dist/elements/avatar/avatar.d.ts.map +1 -0
- package/dist/elements/avatar/avatar.js +106 -0
- package/dist/elements/avatar/index.d.ts +8 -0
- package/dist/elements/avatar/index.d.ts.map +1 -0
- package/dist/elements/avatar/index.js +4 -0
- package/dist/elements/badge/badge.d.ts +17 -0
- package/dist/elements/badge/badge.d.ts.map +1 -0
- package/dist/elements/badge/badge.js +34 -0
- package/dist/elements/badge/index.d.ts +8 -0
- package/dist/elements/badge/index.d.ts.map +1 -0
- package/dist/elements/badge/index.js +4 -0
- package/dist/elements/carousel/carousel.css +205 -0
- package/dist/elements/carousel/carousel.d.ts +148 -0
- package/dist/elements/carousel/carousel.d.ts.map +1 -0
- package/dist/elements/carousel/carousel.js +473 -0
- package/dist/elements/carousel/index.d.ts +8 -0
- package/dist/elements/carousel/index.d.ts.map +1 -0
- package/dist/elements/carousel/index.js +4 -0
- package/dist/elements/carousel-item/carousel-item.css +11 -0
- package/dist/elements/carousel-item/carousel-item.d.ts +13 -0
- package/dist/elements/carousel-item/carousel-item.d.ts.map +1 -0
- package/dist/elements/carousel-item/carousel-item.js +20 -0
- package/dist/elements/carousel-item/index.d.ts +8 -0
- package/dist/elements/carousel-item/index.d.ts.map +1 -0
- package/dist/elements/carousel-item/index.js +4 -0
- package/dist/elements/dialog/dialog.css +92 -0
- package/dist/elements/dialog/dialog.d.ts +56 -0
- package/dist/elements/dialog/dialog.d.ts.map +1 -0
- package/dist/elements/dialog/dialog.js +204 -0
- package/dist/elements/dialog/dialog.styles.d.ts +8 -0
- package/dist/elements/dialog/dialog.styles.d.ts.map +1 -0
- package/dist/elements/dialog/dialog.styles.js +8 -0
- package/dist/elements/dialog/index.d.ts +8 -0
- package/dist/elements/dialog/index.d.ts.map +1 -0
- package/dist/elements/dialog/index.js +4 -0
- package/dist/elements/divider/divider.d.ts +23 -0
- package/dist/elements/divider/divider.d.ts.map +1 -0
- package/dist/elements/divider/divider.js +49 -0
- package/dist/elements/divider/index.d.ts +8 -0
- package/dist/elements/divider/index.d.ts.map +1 -0
- package/dist/elements/divider/index.js +4 -0
- package/dist/elements/drawer/drawer.css +66 -0
- package/dist/elements/drawer/drawer.d.ts +34 -0
- package/dist/elements/drawer/drawer.d.ts.map +1 -0
- package/dist/elements/drawer/drawer.js +46 -0
- package/dist/elements/drawer/index.d.ts +8 -0
- package/dist/elements/drawer/index.d.ts.map +1 -0
- package/dist/elements/drawer/index.js +4 -0
- package/dist/elements/dropdown/dropdown.css +31 -0
- package/dist/elements/dropdown/dropdown.d.ts +64 -0
- package/dist/elements/dropdown/dropdown.d.ts.map +1 -0
- package/dist/elements/dropdown/dropdown.js +322 -0
- package/dist/elements/dropdown/index.d.ts +8 -0
- package/dist/elements/dropdown/index.d.ts.map +1 -0
- package/dist/elements/dropdown/index.js +4 -0
- package/dist/elements/dropdown-item/dropdown-item.css +51 -0
- package/dist/elements/dropdown-item/dropdown-item.d.ts +25 -0
- package/dist/elements/dropdown-item/dropdown-item.d.ts.map +1 -0
- package/dist/elements/dropdown-item/dropdown-item.js +110 -0
- package/dist/elements/dropdown-item/index.d.ts +8 -0
- package/dist/elements/dropdown-item/index.d.ts.map +1 -0
- package/dist/elements/dropdown-item/index.js +4 -0
- package/dist/elements/icon/icon.css +10 -0
- package/dist/elements/icon/icon.d.ts +19 -0
- package/dist/elements/icon/icon.d.ts.map +1 -0
- package/dist/elements/icon/icon.js +53 -0
- package/dist/elements/icon/index.d.ts +8 -0
- package/dist/elements/icon/index.d.ts.map +1 -0
- package/dist/elements/icon/index.js +4 -0
- package/dist/elements/input-otp/index.d.ts +8 -0
- package/dist/elements/input-otp/index.d.ts.map +1 -0
- package/dist/elements/input-otp/index.js +4 -0
- package/dist/elements/input-otp/input-otp.d.ts +31 -0
- package/dist/elements/input-otp/input-otp.d.ts.map +1 -0
- package/dist/elements/input-otp/input-otp.js +139 -0
- package/dist/elements/input-stepper/index.d.ts +8 -0
- package/dist/elements/input-stepper/index.d.ts.map +1 -0
- package/dist/elements/input-stepper/index.js +4 -0
- package/dist/elements/input-stepper/input-stepper.d.ts +63 -0
- package/dist/elements/input-stepper/input-stepper.d.ts.map +1 -0
- package/dist/elements/input-stepper/input-stepper.js +249 -0
- package/dist/elements/popover/index.d.ts +8 -0
- package/dist/elements/popover/index.d.ts.map +1 -0
- package/dist/elements/popover/index.js +4 -0
- package/dist/elements/popover/popover.css +61 -0
- package/dist/elements/popover/popover.d.ts +62 -0
- package/dist/elements/popover/popover.d.ts.map +1 -0
- package/dist/elements/popover/popover.js +244 -0
- package/dist/elements/rating/index.d.ts +8 -0
- package/dist/elements/rating/index.d.ts.map +1 -0
- package/dist/elements/rating/index.js +4 -0
- package/dist/elements/rating/rating.css +102 -0
- package/dist/elements/rating/rating.d.ts +38 -0
- package/dist/elements/rating/rating.d.ts.map +1 -0
- package/dist/elements/rating/rating.js +193 -0
- package/dist/elements/skeleton/index.d.ts +8 -0
- package/dist/elements/skeleton/index.d.ts.map +1 -0
- package/dist/elements/skeleton/index.js +4 -0
- package/dist/elements/skeleton/skeleton.d.ts +12 -0
- package/dist/elements/skeleton/skeleton.d.ts.map +1 -0
- package/dist/elements/skeleton/skeleton.js +13 -0
- package/dist/elements/spinner/index.d.ts +8 -0
- package/dist/elements/spinner/index.d.ts.map +1 -0
- package/dist/elements/spinner/index.js +4 -0
- package/dist/elements/spinner/spinner.css +28 -0
- package/dist/elements/spinner/spinner.d.ts +16 -0
- package/dist/elements/spinner/spinner.d.ts.map +1 -0
- package/dist/elements/spinner/spinner.js +37 -0
- package/dist/elements/tabs/index.d.ts +8 -0
- package/dist/elements/tabs/index.d.ts.map +1 -0
- package/dist/elements/tabs/index.js +4 -0
- package/dist/elements/tabs/tabs.d.ts +48 -0
- package/dist/elements/tabs/tabs.d.ts.map +1 -0
- package/dist/elements/tabs/tabs.js +210 -0
- package/dist/elements/toast/index.d.ts +9 -0
- package/dist/elements/toast/index.d.ts.map +1 -0
- package/dist/elements/toast/index.js +5 -0
- package/dist/elements/toast/toast.d.ts +72 -0
- package/dist/elements/toast/toast.d.ts.map +1 -0
- package/dist/elements/toast/toast.js +375 -0
- package/dist/elements/tooltip/index.d.ts +8 -0
- package/dist/elements/tooltip/index.d.ts.map +1 -0
- package/dist/elements/tooltip/index.js +4 -0
- package/dist/elements/tooltip/tooltip.css +37 -0
- package/dist/elements/tooltip/tooltip.d.ts +59 -0
- package/dist/elements/tooltip/tooltip.d.ts.map +1 -0
- package/dist/elements/tooltip/tooltip.js +231 -0
- package/dist/elements/tree/index.d.ts +8 -0
- package/dist/elements/tree/index.d.ts.map +1 -0
- package/dist/elements/tree/index.js +4 -0
- package/dist/elements/tree/tree.css +26 -0
- package/dist/elements/tree/tree.d.ts +76 -0
- package/dist/elements/tree/tree.d.ts.map +1 -0
- package/dist/elements/tree/tree.js +432 -0
- package/dist/elements/tree-item/index.d.ts +8 -0
- package/dist/elements/tree-item/index.d.ts.map +1 -0
- package/dist/elements/tree-item/index.js +4 -0
- package/dist/elements/tree-item/tree-item.css +172 -0
- package/dist/elements/tree-item/tree-item.d.ts +74 -0
- package/dist/elements/tree-item/tree-item.d.ts.map +1 -0
- package/dist/elements/tree-item/tree-item.js +301 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/registry.d.ts +22 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +33 -0
- package/dist/shared/controllers/popover.d.ts +44 -0
- package/dist/shared/controllers/popover.d.ts.map +1 -0
- package/dist/shared/controllers/popover.js +359 -0
- package/dist/shared/luxen-element.d.ts +20 -0
- package/dist/shared/luxen-element.d.ts.map +1 -0
- package/dist/shared/luxen-element.js +23 -0
- package/dist/shared/luxen-form-associated-element.d.ts +49 -0
- package/dist/shared/luxen-form-associated-element.d.ts.map +1 -0
- package/dist/shared/luxen-form-associated-element.js +123 -0
- package/dist/shared/styles/host.css +13 -0
- package/dist/shared/styles/host.styles.d.ts +9 -0
- package/dist/shared/styles/host.styles.d.ts.map +1 -0
- package/dist/shared/styles/host.styles.js +9 -0
- package/dist/skills/luxen-ui/SKILL.md +82 -0
- package/dist/skills/luxen-ui/references/avatar.md +259 -0
- package/dist/skills/luxen-ui/references/badge.md +289 -0
- package/dist/skills/luxen-ui/references/button.md +309 -0
- package/dist/skills/luxen-ui/references/close-button.md +104 -0
- package/dist/skills/luxen-ui/references/dialog.md +435 -0
- package/dist/skills/luxen-ui/references/drawer.md +400 -0
- package/dist/skills/luxen-ui/references/progress.md +133 -0
- package/dist/skills/luxen-ui/references/select.md +100 -0
- package/dist/skills/luxen-ui/references/toast.md +396 -0
- package/dist/skills/luxen-ui/references/tree.md +359 -0
- package/package.json +116 -0
- package/postcss-plugin-prefix.js +63 -0
- package/vite-plugin.ts +29 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
13
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
14
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
15
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
16
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
17
|
+
};
|
|
18
|
+
var _LuxenDropdownItem_value_accessor_storage, _LuxenDropdownItem_disabled_accessor_storage, _LuxenDropdownItem_type_accessor_storage, _LuxenDropdownItem_checked_accessor_storage;
|
|
19
|
+
import { html, nothing, unsafeCSS } from 'lit';
|
|
20
|
+
import { LuxenElement } from '../../shared/luxen-element';
|
|
21
|
+
import { property } from 'lit/decorators.js';
|
|
22
|
+
import hostStyles from '../../shared/styles/host.styles';
|
|
23
|
+
import rawStyles from './dropdown-item.css?inline';
|
|
24
|
+
const styles = unsafeCSS(rawStyles);
|
|
25
|
+
/**
|
|
26
|
+
* A menu item for use inside `<l-dropdown>`.
|
|
27
|
+
*
|
|
28
|
+
* @slot - Label text.
|
|
29
|
+
* @slot prefix - Leading content (e.g. icon).
|
|
30
|
+
* @slot suffix - Trailing content.
|
|
31
|
+
*
|
|
32
|
+
* @cssproperty --color - Text color.
|
|
33
|
+
*/
|
|
34
|
+
export class LuxenDropdownItem extends LuxenElement {
|
|
35
|
+
constructor() {
|
|
36
|
+
super(...arguments);
|
|
37
|
+
_LuxenDropdownItem_value_accessor_storage.set(this, '');
|
|
38
|
+
_LuxenDropdownItem_disabled_accessor_storage.set(this, false);
|
|
39
|
+
_LuxenDropdownItem_type_accessor_storage.set(this, 'normal');
|
|
40
|
+
_LuxenDropdownItem_checked_accessor_storage.set(this, false);
|
|
41
|
+
}
|
|
42
|
+
/** The value associated with this item. */
|
|
43
|
+
get value() { return __classPrivateFieldGet(this, _LuxenDropdownItem_value_accessor_storage, "f"); }
|
|
44
|
+
set value(value) { __classPrivateFieldSet(this, _LuxenDropdownItem_value_accessor_storage, value, "f"); }
|
|
45
|
+
/** Disables the item. */
|
|
46
|
+
get disabled() { return __classPrivateFieldGet(this, _LuxenDropdownItem_disabled_accessor_storage, "f"); }
|
|
47
|
+
set disabled(value) { __classPrivateFieldSet(this, _LuxenDropdownItem_disabled_accessor_storage, value, "f"); }
|
|
48
|
+
/** The type of item: `normal` or `checkbox`. */
|
|
49
|
+
get type() { return __classPrivateFieldGet(this, _LuxenDropdownItem_type_accessor_storage, "f"); }
|
|
50
|
+
set type(value) { __classPrivateFieldSet(this, _LuxenDropdownItem_type_accessor_storage, value, "f"); }
|
|
51
|
+
/** Whether the checkbox item is checked. */
|
|
52
|
+
get checked() { return __classPrivateFieldGet(this, _LuxenDropdownItem_checked_accessor_storage, "f"); }
|
|
53
|
+
set checked(value) { __classPrivateFieldSet(this, _LuxenDropdownItem_checked_accessor_storage, value, "f"); }
|
|
54
|
+
/** Returns the text label of this item. */
|
|
55
|
+
getTextLabel() {
|
|
56
|
+
return (this.textContent ?? '').trim();
|
|
57
|
+
}
|
|
58
|
+
render() {
|
|
59
|
+
const isCheckbox = this.type === 'checkbox';
|
|
60
|
+
return html `
|
|
61
|
+
<div
|
|
62
|
+
class="item"
|
|
63
|
+
role=${isCheckbox ? 'menuitemcheckbox' : 'menuitem'}
|
|
64
|
+
aria-checked=${isCheckbox ? String(this.checked) : nothing}
|
|
65
|
+
aria-disabled=${this.disabled ? 'true' : nothing}
|
|
66
|
+
tabindex="-1"
|
|
67
|
+
>
|
|
68
|
+
${isCheckbox
|
|
69
|
+
? html `
|
|
70
|
+
<span
|
|
71
|
+
class="check"
|
|
72
|
+
aria-hidden="true"
|
|
73
|
+
>
|
|
74
|
+
<svg
|
|
75
|
+
width="16"
|
|
76
|
+
height="16"
|
|
77
|
+
viewBox="0 0 16 16"
|
|
78
|
+
fill="none"
|
|
79
|
+
>
|
|
80
|
+
<path
|
|
81
|
+
d="M3.5 8.5L6.5 11.5L12.5 4.5"
|
|
82
|
+
stroke="currentColor"
|
|
83
|
+
stroke-width="1.5"
|
|
84
|
+
stroke-linecap="round"
|
|
85
|
+
stroke-linejoin="round"
|
|
86
|
+
/>
|
|
87
|
+
</svg>
|
|
88
|
+
</span>
|
|
89
|
+
`
|
|
90
|
+
: html ` <slot name="prefix"></slot> `}
|
|
91
|
+
<span class="label"><slot></slot></span>
|
|
92
|
+
<slot name="suffix"></slot>
|
|
93
|
+
</div>
|
|
94
|
+
`;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
_LuxenDropdownItem_value_accessor_storage = new WeakMap(), _LuxenDropdownItem_disabled_accessor_storage = new WeakMap(), _LuxenDropdownItem_type_accessor_storage = new WeakMap(), _LuxenDropdownItem_checked_accessor_storage = new WeakMap();
|
|
98
|
+
LuxenDropdownItem.styles = [hostStyles, styles];
|
|
99
|
+
__decorate([
|
|
100
|
+
property()
|
|
101
|
+
], LuxenDropdownItem.prototype, "value", null);
|
|
102
|
+
__decorate([
|
|
103
|
+
property({ type: Boolean, reflect: true })
|
|
104
|
+
], LuxenDropdownItem.prototype, "disabled", null);
|
|
105
|
+
__decorate([
|
|
106
|
+
property()
|
|
107
|
+
], LuxenDropdownItem.prototype, "type", null);
|
|
108
|
+
__decorate([
|
|
109
|
+
property({ type: Boolean, reflect: true })
|
|
110
|
+
], LuxenDropdownItem.prototype, "checked", null);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/html/elements/dropdown-item/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,cAAc,iBAAiB,CAAC;AAGhC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,iBAAiB,EAAE,iBAAiB,CAAC;KACtC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import 'iconify-icon';
|
|
2
|
+
import type { PropertyValues } from 'lit';
|
|
3
|
+
import { LuxenElement } from '../../shared/luxen-element';
|
|
4
|
+
/**
|
|
5
|
+
* @summary An icon component that renders icons from any Iconify icon set. Decorative by default. Set `label` for meaningful icons.
|
|
6
|
+
* @customElement l-icon
|
|
7
|
+
*
|
|
8
|
+
* @cssproperty --color - The color of the icon. Defaults to `currentColor`.
|
|
9
|
+
*/
|
|
10
|
+
export declare class LuxenIcon extends LuxenElement {
|
|
11
|
+
static styles: import("lit").CSSResult[];
|
|
12
|
+
/** The icon name in Iconify format (e.g. `mdi:home`, `lucide:check`). */
|
|
13
|
+
name: string;
|
|
14
|
+
/** Accessible label. When set, the icon becomes meaningful (`role="img"` + `aria-label`). When absent, the icon is decorative. */
|
|
15
|
+
label?: string;
|
|
16
|
+
updated(changedProperties: PropertyValues<this>): void;
|
|
17
|
+
render(): import("lit").TemplateResult<1>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=icon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon.d.ts","sourceRoot":"","sources":["../../../src/html/elements/icon/icon.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAG1C,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAM1D;;;;;GAKG;AACH,qBAAa,SAAU,SAAQ,YAAY;IACzC,OAAgB,MAAM,4BAAwB;IAE9C,yEAAyE;IAEzE,IAAI,SAAM;IAEV,kIAAkI;IAElI,KAAK,CAAC,EAAE,MAAM,CAAC;IAEN,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC;IAY/C,MAAM;CAQhB"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import 'iconify-icon';
|
|
8
|
+
import { html, unsafeCSS } from 'lit';
|
|
9
|
+
import { property } from 'lit/decorators.js';
|
|
10
|
+
import { LuxenElement } from '../../shared/luxen-element';
|
|
11
|
+
import hostStyles from '../../shared/styles/host.styles';
|
|
12
|
+
import rawStyles from './icon.css?inline';
|
|
13
|
+
const styles = unsafeCSS(rawStyles);
|
|
14
|
+
/**
|
|
15
|
+
* @summary An icon component that renders icons from any Iconify icon set. Decorative by default. Set `label` for meaningful icons.
|
|
16
|
+
* @customElement l-icon
|
|
17
|
+
*
|
|
18
|
+
* @cssproperty --color - The color of the icon. Defaults to `currentColor`.
|
|
19
|
+
*/
|
|
20
|
+
export class LuxenIcon extends LuxenElement {
|
|
21
|
+
constructor() {
|
|
22
|
+
super(...arguments);
|
|
23
|
+
/** The icon name in Iconify format (e.g. `mdi:home`, `lucide:check`). */
|
|
24
|
+
this.name = '';
|
|
25
|
+
}
|
|
26
|
+
updated(changedProperties) {
|
|
27
|
+
if (changedProperties.has('label')) {
|
|
28
|
+
if (this.label) {
|
|
29
|
+
this.setAttribute('role', 'img');
|
|
30
|
+
this.setAttribute('aria-label', this.label);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
this.removeAttribute('role');
|
|
34
|
+
this.removeAttribute('aria-label');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
render() {
|
|
39
|
+
return html `
|
|
40
|
+
<iconify-icon
|
|
41
|
+
icon=${this.name}
|
|
42
|
+
aria-hidden="true"
|
|
43
|
+
></iconify-icon>
|
|
44
|
+
`;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
LuxenIcon.styles = [hostStyles, styles];
|
|
48
|
+
__decorate([
|
|
49
|
+
property()
|
|
50
|
+
], LuxenIcon.prototype, "name", void 0);
|
|
51
|
+
__decorate([
|
|
52
|
+
property()
|
|
53
|
+
], LuxenIcon.prototype, "label", void 0);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/html/elements/icon/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,cAAc,QAAQ,CAAC;AAGvB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,QAAQ,EAAE,SAAS,CAAC;KACrB;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/html/elements/input-otp/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,cAAc,aAAa,CAAC;AAG5B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,aAAa,EAAE,aAAa,CAAC;KAC9B;CACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { LuxenElement } from '../../shared/luxen-element';
|
|
2
|
+
/**
|
|
3
|
+
* Enhances a child `<input>` with visual digit cells (Stripe-style OTP input).
|
|
4
|
+
*
|
|
5
|
+
* A single hidden `<input>` handles keyboard, paste, and autocomplete.
|
|
6
|
+
* Visual cells are rendered as real DOM elements with individual borders and focus ring.
|
|
7
|
+
*
|
|
8
|
+
* @summary Stripe-style OTP input with visual digit cells over a hidden native input.
|
|
9
|
+
* @customElement l-input-otp
|
|
10
|
+
*
|
|
11
|
+
* @cssproperty --digits - Number of digit boxes (default: 6). Must match input's maxlength.
|
|
12
|
+
* @cssproperty --size - Cell width and height (default: 2.75rem). Font size scales automatically.
|
|
13
|
+
* @cssproperty --gap - Space between cells (default: 0.5rem).
|
|
14
|
+
*/
|
|
15
|
+
export declare class LuxenInputOtp extends LuxenElement {
|
|
16
|
+
createRenderRoot(): this;
|
|
17
|
+
/** Position after which to insert a visual separator (e.g., 3 for a 3-3 grouping). */
|
|
18
|
+
separatorAfter?: number;
|
|
19
|
+
private _input;
|
|
20
|
+
private _container;
|
|
21
|
+
private _cells;
|
|
22
|
+
private _separatorEl;
|
|
23
|
+
private _initialized;
|
|
24
|
+
connectedCallback(): void;
|
|
25
|
+
disconnectedCallback(): void;
|
|
26
|
+
private _setup;
|
|
27
|
+
private _teardown;
|
|
28
|
+
private _updateCells;
|
|
29
|
+
private _clearCells;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=input-otp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-otp.d.ts","sourceRoot":"","sources":["../../../src/html/elements/input-otp/input-otp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D;;;;;;;;;;;;GAYG;AACH,qBAAa,aAAc,SAAQ,YAAY;IACpC,gBAAgB;IAIzB,sFAAsF;IAEtF,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,YAAY,CAAS;IAEpB,iBAAiB;IAKjB,oBAAoB;IAO7B,OAAO,CAAC,MAAM;IA2Dd,OAAO,CAAC,SAAS;IAoBjB,OAAO,CAAC,YAAY,CAyBlB;IAEF,OAAO,CAAC,WAAW,CAIjB;CACH"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { property } from 'lit/decorators.js';
|
|
8
|
+
import { LuxenElement } from '../../shared/luxen-element';
|
|
9
|
+
/**
|
|
10
|
+
* Enhances a child `<input>` with visual digit cells (Stripe-style OTP input).
|
|
11
|
+
*
|
|
12
|
+
* A single hidden `<input>` handles keyboard, paste, and autocomplete.
|
|
13
|
+
* Visual cells are rendered as real DOM elements with individual borders and focus ring.
|
|
14
|
+
*
|
|
15
|
+
* @summary Stripe-style OTP input with visual digit cells over a hidden native input.
|
|
16
|
+
* @customElement l-input-otp
|
|
17
|
+
*
|
|
18
|
+
* @cssproperty --digits - Number of digit boxes (default: 6). Must match input's maxlength.
|
|
19
|
+
* @cssproperty --size - Cell width and height (default: 2.75rem). Font size scales automatically.
|
|
20
|
+
* @cssproperty --gap - Space between cells (default: 0.5rem).
|
|
21
|
+
*/
|
|
22
|
+
export class LuxenInputOtp extends LuxenElement {
|
|
23
|
+
constructor() {
|
|
24
|
+
super(...arguments);
|
|
25
|
+
this._cells = [];
|
|
26
|
+
this._separatorEl = null;
|
|
27
|
+
this._initialized = false;
|
|
28
|
+
// --- Cell updates ---
|
|
29
|
+
this._updateCells = () => {
|
|
30
|
+
const value = this._input.value;
|
|
31
|
+
const maxLen = this._input.maxLength || 6;
|
|
32
|
+
const pos = Math.min(this._input.selectionStart ?? 0, maxLen - 1);
|
|
33
|
+
const isFocused = document.activeElement === this._input;
|
|
34
|
+
for (let i = 0; i < this._cells.length; i++) {
|
|
35
|
+
const cell = this._cells[i];
|
|
36
|
+
const span = cell.firstElementChild;
|
|
37
|
+
const char = value[i] ?? '';
|
|
38
|
+
span.textContent = char;
|
|
39
|
+
if (char) {
|
|
40
|
+
cell.setAttribute('data-filled', '');
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
cell.removeAttribute('data-filled');
|
|
44
|
+
}
|
|
45
|
+
if (isFocused && i === pos) {
|
|
46
|
+
cell.setAttribute('data-active', '');
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
cell.removeAttribute('data-active');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
this._clearCells = () => {
|
|
54
|
+
for (const cell of this._cells) {
|
|
55
|
+
cell.removeAttribute('data-active');
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
createRenderRoot() {
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
connectedCallback() {
|
|
63
|
+
super.connectedCallback();
|
|
64
|
+
requestAnimationFrame(() => this._setup());
|
|
65
|
+
}
|
|
66
|
+
disconnectedCallback() {
|
|
67
|
+
super.disconnectedCallback();
|
|
68
|
+
this._teardown();
|
|
69
|
+
}
|
|
70
|
+
// --- Setup / Teardown ---
|
|
71
|
+
_setup() {
|
|
72
|
+
const input = this.querySelector('input');
|
|
73
|
+
if (!input)
|
|
74
|
+
return;
|
|
75
|
+
this._input = input;
|
|
76
|
+
// Derive digit count from --digits CSS custom property (default 6)
|
|
77
|
+
const digits = Number(getComputedStyle(this).getPropertyValue('--digits').trim()) || 6;
|
|
78
|
+
// Set sensible defaults — author can still override via HTML attributes
|
|
79
|
+
const defaults = {
|
|
80
|
+
type: 'text',
|
|
81
|
+
inputmode: 'numeric',
|
|
82
|
+
autocomplete: 'one-time-code',
|
|
83
|
+
maxlength: String(digits),
|
|
84
|
+
pattern: String.raw `\d{${digits}}`,
|
|
85
|
+
};
|
|
86
|
+
for (const [attr, value] of Object.entries(defaults)) {
|
|
87
|
+
if (!this._input.hasAttribute(attr)) {
|
|
88
|
+
this._input.setAttribute(attr, value);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Build visual cells container
|
|
92
|
+
this._container = document.createElement('div');
|
|
93
|
+
this._container.className = 'l-input-otp-cells';
|
|
94
|
+
this._container.setAttribute('aria-hidden', 'true');
|
|
95
|
+
for (let i = 0; i < digits; i++) {
|
|
96
|
+
const cell = document.createElement('div');
|
|
97
|
+
cell.className = 'l-input-otp-cell';
|
|
98
|
+
cell.appendChild(document.createElement('span'));
|
|
99
|
+
this._cells.push(cell);
|
|
100
|
+
this._container.appendChild(cell);
|
|
101
|
+
// Insert separator after the specified position
|
|
102
|
+
if (this.separatorAfter && i === this.separatorAfter - 1 && i < digits - 1) {
|
|
103
|
+
this._separatorEl = document.createElement('span');
|
|
104
|
+
this._separatorEl.className = 'l-input-otp-separator';
|
|
105
|
+
this._container.appendChild(this._separatorEl);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Wrap: insert container before input, then move input inside
|
|
109
|
+
this._input.replaceWith(this._container);
|
|
110
|
+
this._container.appendChild(this._input);
|
|
111
|
+
this._initialized = true;
|
|
112
|
+
// Populate cells if input already has a value (e.g. disabled with prefilled value)
|
|
113
|
+
this._updateCells();
|
|
114
|
+
// Events
|
|
115
|
+
this._input.addEventListener('input', this._updateCells);
|
|
116
|
+
this._input.addEventListener('click', this._updateCells);
|
|
117
|
+
this._input.addEventListener('keyup', this._updateCells);
|
|
118
|
+
this._input.addEventListener('focus', this._updateCells);
|
|
119
|
+
this._input.addEventListener('blur', this._clearCells);
|
|
120
|
+
}
|
|
121
|
+
_teardown() {
|
|
122
|
+
if (!this._initialized)
|
|
123
|
+
return;
|
|
124
|
+
this._input.removeEventListener('input', this._updateCells);
|
|
125
|
+
this._input.removeEventListener('click', this._updateCells);
|
|
126
|
+
this._input.removeEventListener('keyup', this._updateCells);
|
|
127
|
+
this._input.removeEventListener('focus', this._updateCells);
|
|
128
|
+
this._input.removeEventListener('blur', this._clearCells);
|
|
129
|
+
// Restore input to direct child
|
|
130
|
+
this._container.replaceWith(this._input);
|
|
131
|
+
this._separatorEl?.remove();
|
|
132
|
+
this._cells = [];
|
|
133
|
+
this._separatorEl = null;
|
|
134
|
+
this._initialized = false;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
__decorate([
|
|
138
|
+
property({ type: Number, reflect: true, attribute: 'separator-after' })
|
|
139
|
+
], LuxenInputOtp.prototype, "separatorAfter", void 0);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/html/elements/input-stepper/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,cAAc,iBAAiB,CAAC;AAGhC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,iBAAiB,EAAE,iBAAiB,CAAC;KACtC;CACF"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { LuxenElement } from '../../shared/luxen-element';
|
|
2
|
+
export type InputStepperSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
3
|
+
/**
|
|
4
|
+
* A stepper control that enhances a native `<input type="number">` with
|
|
5
|
+
* decrement/increment buttons and an optional animated number track.
|
|
6
|
+
*
|
|
7
|
+
* @link https://www.nngroup.com/articles/input-steppers/
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```html
|
|
11
|
+
* <l-input-stepper>
|
|
12
|
+
* <input type="number" min="0" max="10" value="5" />
|
|
13
|
+
* </l-input-stepper>
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* @event change - Fired when the value changes. Detail: `{ value: number }`.
|
|
17
|
+
*/
|
|
18
|
+
export declare class LuxenInputStepper extends LuxenElement {
|
|
19
|
+
createRenderRoot(): this;
|
|
20
|
+
/** Minimum allowed value. Falls back to the input's `min` attribute. */
|
|
21
|
+
min?: number;
|
|
22
|
+
/** Maximum allowed value. Falls back to the input's `max` attribute. */
|
|
23
|
+
max?: number;
|
|
24
|
+
/** Step increment. Falls back to the input's `step` attribute. */
|
|
25
|
+
step?: number;
|
|
26
|
+
/** Control size. */
|
|
27
|
+
size: InputStepperSize;
|
|
28
|
+
/** Enable the animated number roller overlay. */
|
|
29
|
+
withRoller: boolean;
|
|
30
|
+
/** Icon name for the decrement button. */
|
|
31
|
+
decrementIcon: string;
|
|
32
|
+
/** Icon name for the increment button. */
|
|
33
|
+
incrementIcon: string;
|
|
34
|
+
private _input;
|
|
35
|
+
private _decrementBtn;
|
|
36
|
+
private _incrementBtn;
|
|
37
|
+
private _valueWrapper;
|
|
38
|
+
private _trackDisplay;
|
|
39
|
+
private _track;
|
|
40
|
+
private _observer;
|
|
41
|
+
private _skipTransition;
|
|
42
|
+
connectedCallback(): void;
|
|
43
|
+
disconnectedCallback(): void;
|
|
44
|
+
updated(changed: Map<string, unknown>): void;
|
|
45
|
+
/** Decrease the value by one step. */
|
|
46
|
+
decrement(): void;
|
|
47
|
+
/** Increase the value by one step. */
|
|
48
|
+
increment(): void;
|
|
49
|
+
private _setup;
|
|
50
|
+
private _teardown;
|
|
51
|
+
private _createButton;
|
|
52
|
+
private _buildTrack;
|
|
53
|
+
private _rebuildTrackNumbers;
|
|
54
|
+
private _getConstraints;
|
|
55
|
+
private _syncConstraints;
|
|
56
|
+
private _applyValue;
|
|
57
|
+
private _updateTrack;
|
|
58
|
+
private _updateButtonStates;
|
|
59
|
+
private _onDecrement;
|
|
60
|
+
private _onIncrement;
|
|
61
|
+
private _onInputChange;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=input-stepper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-stepper.d.ts","sourceRoot":"","sources":["../../../src/html/elements/input-stepper/input-stepper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,MAAM,MAAM,gBAAgB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEhE;;;;;;;;;;;;;;GAcG;AACH,qBAAa,iBAAkB,SAAQ,YAAY;IACxC,gBAAgB;IAIzB,wEAAwE;IAExE,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,wEAAwE;IAExE,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,kEAAkE;IAElE,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,oBAAoB;IAEpB,IAAI,EAAE,gBAAgB,CAAQ;IAE9B,iDAAiD;IAEjD,UAAU,UAAS;IAEnB,0CAA0C;IAE1C,aAAa,SAAkB;IAE/B,0CAA0C;IAE1C,aAAa,SAAiB;IAE9B,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,eAAe,CAAS;IAEvB,iBAAiB;IAKjB,oBAAoB;IAKpB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAS9C,sCAAsC;IACtC,SAAS;IAOT,sCAAsC;IACtC,SAAS;IAST,OAAO,CAAC,MAAM;IAsCd,OAAO,CAAC,SAAS;IAwBjB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,YAAY,CAA0B;IAE9C,OAAO,CAAC,cAAc,CAWpB;CACH"}
|