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,102 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
--icon-size: 20px;
|
|
3
|
+
--active-color: gold;
|
|
4
|
+
--inactive-color: #ddd;
|
|
5
|
+
--spacing: 0px;
|
|
6
|
+
--_icon: var(
|
|
7
|
+
--icon,
|
|
8
|
+
url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='2 2 20 19.02'><path d='M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z'/></svg>")
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
display: inline-flex;
|
|
12
|
+
align-items: center;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/* — Read-only mode — */
|
|
16
|
+
|
|
17
|
+
.rating {
|
|
18
|
+
height: var(--icon-size);
|
|
19
|
+
background: linear-gradient(
|
|
20
|
+
to right,
|
|
21
|
+
var(--active-color) var(--_fill, 0%),
|
|
22
|
+
var(--inactive-color) var(--_fill, 0%)
|
|
23
|
+
);
|
|
24
|
+
mask-size: var(--icon-size) var(--icon-size);
|
|
25
|
+
mask-repeat: no-repeat;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* — Edit mode — */
|
|
29
|
+
|
|
30
|
+
.rating-edit {
|
|
31
|
+
display: inline-flex;
|
|
32
|
+
gap: var(--spacing);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.icon-wrapper {
|
|
36
|
+
cursor: pointer;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.icon-wrapper input {
|
|
40
|
+
position: absolute;
|
|
41
|
+
width: 1px;
|
|
42
|
+
height: 1px;
|
|
43
|
+
margin: -1px;
|
|
44
|
+
padding: 0;
|
|
45
|
+
overflow: hidden;
|
|
46
|
+
clip: rect(0, 0, 0, 0);
|
|
47
|
+
border: 0;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.icon {
|
|
51
|
+
display: block;
|
|
52
|
+
width: var(--icon-size);
|
|
53
|
+
height: var(--icon-size);
|
|
54
|
+
mask-image: var(--_icon);
|
|
55
|
+
mask-size: contain;
|
|
56
|
+
mask-repeat: no-repeat;
|
|
57
|
+
background: var(--inactive-color);
|
|
58
|
+
transition: scale 0.2s ease;
|
|
59
|
+
pointer-events: none;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.icon.active {
|
|
63
|
+
background: var(--active-color);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.icon-wrapper:hover .icon {
|
|
67
|
+
scale: 1.2;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.icon-wrapper:has(input:focus-visible) .icon {
|
|
71
|
+
outline: 2px solid var(--active-color);
|
|
72
|
+
outline-offset: 2px;
|
|
73
|
+
border-radius: 2px;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
:host([edit-mode]) .wrapper:focus-within {
|
|
77
|
+
outline: 2px solid var(--active-color);
|
|
78
|
+
outline-offset: 2px;
|
|
79
|
+
border-radius: 2px;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* — Disabled — */
|
|
83
|
+
|
|
84
|
+
:host([disabled]) {
|
|
85
|
+
opacity: 0.5;
|
|
86
|
+
pointer-events: none;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* — Label — */
|
|
90
|
+
|
|
91
|
+
.wrapper {
|
|
92
|
+
display: flex;
|
|
93
|
+
align-items: center;
|
|
94
|
+
white-space: nowrap;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.rating-label {
|
|
98
|
+
margin-inline-start: 8px;
|
|
99
|
+
flex: 1;
|
|
100
|
+
font-size: 1rem;
|
|
101
|
+
line-height: 1;
|
|
102
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { LuxenFormAssociatedElement } from '../../shared/luxen-form-associated-element';
|
|
2
|
+
/**
|
|
3
|
+
* A star rating component using CSS mask-image.
|
|
4
|
+
*
|
|
5
|
+
* @summary Displays a star rating, optionally interactive.
|
|
6
|
+
*
|
|
7
|
+
* @csspart label - The label element shown in edit mode.
|
|
8
|
+
*
|
|
9
|
+
* @cssproperty --icon-size - The size of each icon. Defaults to `20px`.
|
|
10
|
+
* @cssproperty --active-color - The fill color for rated icons. Defaults to `gold`.
|
|
11
|
+
* @cssproperty --inactive-color - The fill color for empty icons. Defaults to `#ddd`.
|
|
12
|
+
* @cssproperty --spacing - The spacing between icons. Defaults to `0px`.
|
|
13
|
+
* @cssproperty --icon - Custom SVG shape as a `url()`. Defaults to a 5-pointed star.
|
|
14
|
+
*
|
|
15
|
+
* @event {{ name: string, value: string, checked: boolean, sourceEvent: Event }} change - Emitted when the rating value changes in edit mode.
|
|
16
|
+
*/
|
|
17
|
+
export declare class LuxenRating extends LuxenFormAssociatedElement {
|
|
18
|
+
static styles: import("lit").CSSResult[];
|
|
19
|
+
private currentLabel;
|
|
20
|
+
private previewedValue;
|
|
21
|
+
accessor editMode: boolean;
|
|
22
|
+
accessor labels: string[];
|
|
23
|
+
accessor value: number;
|
|
24
|
+
accessor length: number;
|
|
25
|
+
/** Optional callback returning a CSS `url()` string for a given position (1-based). */
|
|
26
|
+
getIcon?: (value: number) => string;
|
|
27
|
+
connectedCallback(): void;
|
|
28
|
+
formResetCallback(): void;
|
|
29
|
+
formStateRestoreCallback(state: string, _mode: 'restore' | 'autocomplete'): void;
|
|
30
|
+
firstUpdated(): void;
|
|
31
|
+
private setLabelForValue;
|
|
32
|
+
private getRatingStyle;
|
|
33
|
+
render(): import("lit").TemplateResult<1>;
|
|
34
|
+
private previewValue;
|
|
35
|
+
private clearPreview;
|
|
36
|
+
private onClick;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=rating.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rating.d.ts","sourceRoot":"","sources":["../../../src/html/elements/rating/rating.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,0BAA0B,EAAE,MAAM,4CAA4C,CAAC;AAMxF;;;;;;;;;;;;;;GAcG;AACH,qBAAa,WAAY,SAAQ,0BAA0B;IACzD,OAAgB,MAAM,4BAAwB;IAE9C,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,cAAc,CAAK;IAG3B,QAAQ,CAAC,QAAQ,UAAS;IAU1B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAM;IAG/B,QAAQ,CAAC,KAAK,SAAK;IAGnB,QAAQ,CAAC,MAAM,SAAK;IAEpB,uFAAuF;IACvF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAE3B,iBAAiB;IAMjB,iBAAiB;IAKjB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,cAAc;IAKzE,YAAY;IAIrB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,cAAc;IAkBb,MAAM;IAuDf,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,OAAO;CAgBhB"}
|
|
@@ -0,0 +1,193 @@
|
|
|
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 _LuxenRating_editMode_accessor_storage, _LuxenRating_labels_accessor_storage, _LuxenRating_value_accessor_storage, _LuxenRating_length_accessor_storage;
|
|
19
|
+
import { html, nothing, unsafeCSS } from 'lit';
|
|
20
|
+
import { property } from 'lit/decorators.js';
|
|
21
|
+
import { LuxenFormAssociatedElement } from '../../shared/luxen-form-associated-element';
|
|
22
|
+
import hostStyles from '../../shared/styles/host.styles';
|
|
23
|
+
import rawStyles from './rating.css?inline';
|
|
24
|
+
const styles = unsafeCSS(rawStyles);
|
|
25
|
+
/**
|
|
26
|
+
* A star rating component using CSS mask-image.
|
|
27
|
+
*
|
|
28
|
+
* @summary Displays a star rating, optionally interactive.
|
|
29
|
+
*
|
|
30
|
+
* @csspart label - The label element shown in edit mode.
|
|
31
|
+
*
|
|
32
|
+
* @cssproperty --icon-size - The size of each icon. Defaults to `20px`.
|
|
33
|
+
* @cssproperty --active-color - The fill color for rated icons. Defaults to `gold`.
|
|
34
|
+
* @cssproperty --inactive-color - The fill color for empty icons. Defaults to `#ddd`.
|
|
35
|
+
* @cssproperty --spacing - The spacing between icons. Defaults to `0px`.
|
|
36
|
+
* @cssproperty --icon - Custom SVG shape as a `url()`. Defaults to a 5-pointed star.
|
|
37
|
+
*
|
|
38
|
+
* @event {{ name: string, value: string, checked: boolean, sourceEvent: Event }} change - Emitted when the rating value changes in edit mode.
|
|
39
|
+
*/
|
|
40
|
+
export class LuxenRating extends LuxenFormAssociatedElement {
|
|
41
|
+
constructor() {
|
|
42
|
+
super(...arguments);
|
|
43
|
+
this.currentLabel = '';
|
|
44
|
+
this.previewedValue = 0;
|
|
45
|
+
_LuxenRating_editMode_accessor_storage.set(this, false);
|
|
46
|
+
_LuxenRating_labels_accessor_storage.set(this, []);
|
|
47
|
+
_LuxenRating_value_accessor_storage.set(this, 0);
|
|
48
|
+
_LuxenRating_length_accessor_storage.set(this, 5);
|
|
49
|
+
}
|
|
50
|
+
get editMode() { return __classPrivateFieldGet(this, _LuxenRating_editMode_accessor_storage, "f"); }
|
|
51
|
+
set editMode(value) { __classPrivateFieldSet(this, _LuxenRating_editMode_accessor_storage, value, "f"); }
|
|
52
|
+
get labels() { return __classPrivateFieldGet(this, _LuxenRating_labels_accessor_storage, "f"); }
|
|
53
|
+
set labels(value) { __classPrivateFieldSet(this, _LuxenRating_labels_accessor_storage, value, "f"); }
|
|
54
|
+
get value() { return __classPrivateFieldGet(this, _LuxenRating_value_accessor_storage, "f"); }
|
|
55
|
+
set value(value) { __classPrivateFieldSet(this, _LuxenRating_value_accessor_storage, value, "f"); }
|
|
56
|
+
get length() { return __classPrivateFieldGet(this, _LuxenRating_length_accessor_storage, "f"); }
|
|
57
|
+
set length(value) { __classPrivateFieldSet(this, _LuxenRating_length_accessor_storage, value, "f"); }
|
|
58
|
+
connectedCallback() {
|
|
59
|
+
super.connectedCallback();
|
|
60
|
+
this._defaultFormValue = String(this.value);
|
|
61
|
+
this._syncFormValue(this._defaultFormValue);
|
|
62
|
+
}
|
|
63
|
+
formResetCallback() {
|
|
64
|
+
this.value = Number(this._defaultFormValue);
|
|
65
|
+
super.formResetCallback();
|
|
66
|
+
}
|
|
67
|
+
formStateRestoreCallback(state, _mode) {
|
|
68
|
+
this.value = Number(state);
|
|
69
|
+
this._syncFormValue(state);
|
|
70
|
+
}
|
|
71
|
+
firstUpdated() {
|
|
72
|
+
this.setLabelForValue(this.value);
|
|
73
|
+
}
|
|
74
|
+
setLabelForValue(value) {
|
|
75
|
+
const intValue = typeof value === 'string' ? parseInt(value, 10) : value;
|
|
76
|
+
this.currentLabel = intValue ? (this.labels?.[intValue - 1] ?? '') : '';
|
|
77
|
+
this.requestUpdate();
|
|
78
|
+
}
|
|
79
|
+
getRatingStyle() {
|
|
80
|
+
const max = this.length;
|
|
81
|
+
const fillPct = max > 0 ? (this.value / max) * 100 : 0;
|
|
82
|
+
const step = 'calc(var(--icon-size) + var(--spacing))';
|
|
83
|
+
const icons = Array.from({ length: max }, (_, i) => this.getIcon?.(i + 1) ?? 'var(--_icon)');
|
|
84
|
+
const positions = Array.from({ length: max }, (_, i) => i === 0 ? '0 0' : `calc(${i} * ${step}) 0`);
|
|
85
|
+
return [
|
|
86
|
+
`width: calc(${max} * var(--icon-size) + ${max - 1} * var(--spacing))`,
|
|
87
|
+
`--_fill: ${fillPct}%`,
|
|
88
|
+
`mask-image: ${icons.join(', ')}`,
|
|
89
|
+
`mask-position: ${positions.join(', ')}`,
|
|
90
|
+
].join('; ');
|
|
91
|
+
}
|
|
92
|
+
render() {
|
|
93
|
+
if (!this.editMode) {
|
|
94
|
+
return html `<div
|
|
95
|
+
class="rating"
|
|
96
|
+
style=${this.getRatingStyle()}
|
|
97
|
+
></div>`;
|
|
98
|
+
}
|
|
99
|
+
const activeCount = this.previewedValue || this.value;
|
|
100
|
+
return html `
|
|
101
|
+
<div
|
|
102
|
+
class="wrapper"
|
|
103
|
+
@focusout=${this.clearPreview}
|
|
104
|
+
>
|
|
105
|
+
<div class="rating-edit">
|
|
106
|
+
${Array.from({ length: this.length }, (_, i) => {
|
|
107
|
+
const v = i + 1;
|
|
108
|
+
const icon = this.getIcon?.(v);
|
|
109
|
+
return html `
|
|
110
|
+
<label
|
|
111
|
+
class="icon-wrapper"
|
|
112
|
+
@pointerover=${() => this.previewValue(v)}
|
|
113
|
+
@pointerout=${this.clearPreview}
|
|
114
|
+
>
|
|
115
|
+
<input
|
|
116
|
+
type="radio"
|
|
117
|
+
name=${this.name ?? nothing}
|
|
118
|
+
value="${v}"
|
|
119
|
+
aria-label="${this.labels?.[i] ?? `${v} ${v === 1 ? 'star' : 'stars'}`}"
|
|
120
|
+
?checked="${this.value === v}"
|
|
121
|
+
?disabled="${this.disabled}"
|
|
122
|
+
@click=${this.onClick}
|
|
123
|
+
@focusin=${() => this.previewValue(v)}
|
|
124
|
+
/>
|
|
125
|
+
<span
|
|
126
|
+
class="icon ${v <= activeCount ? 'active' : ''}"
|
|
127
|
+
style=${icon ? `mask-image: ${icon}` : nothing}
|
|
128
|
+
></span>
|
|
129
|
+
</label>
|
|
130
|
+
`;
|
|
131
|
+
})}
|
|
132
|
+
</div>
|
|
133
|
+
${this.labels?.length
|
|
134
|
+
? html `<div
|
|
135
|
+
class="rating-label"
|
|
136
|
+
part="label"
|
|
137
|
+
>
|
|
138
|
+
${this.currentLabel}
|
|
139
|
+
</div>`
|
|
140
|
+
: nothing}
|
|
141
|
+
</div>
|
|
142
|
+
`;
|
|
143
|
+
}
|
|
144
|
+
previewValue(value) {
|
|
145
|
+
this.previewedValue = value;
|
|
146
|
+
this.setLabelForValue(value);
|
|
147
|
+
}
|
|
148
|
+
clearPreview(event) {
|
|
149
|
+
if (event) {
|
|
150
|
+
const related = event.relatedTarget;
|
|
151
|
+
if (related && this.shadowRoot?.contains(related))
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
this.previewedValue = 0;
|
|
155
|
+
this.setLabelForValue(this.value);
|
|
156
|
+
}
|
|
157
|
+
onClick(event) {
|
|
158
|
+
const target = event.currentTarget;
|
|
159
|
+
const clickedValue = Number(target.value);
|
|
160
|
+
this.value = clickedValue === this.value ? 0 : clickedValue;
|
|
161
|
+
this.hasInteracted = true;
|
|
162
|
+
this._syncFormValue(String(this.value));
|
|
163
|
+
this.emit('change', {
|
|
164
|
+
detail: {
|
|
165
|
+
name: this.name,
|
|
166
|
+
value: String(this.value),
|
|
167
|
+
checked: this.value > 0,
|
|
168
|
+
sourceEvent: event,
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
_LuxenRating_editMode_accessor_storage = new WeakMap(), _LuxenRating_labels_accessor_storage = new WeakMap(), _LuxenRating_value_accessor_storage = new WeakMap(), _LuxenRating_length_accessor_storage = new WeakMap();
|
|
174
|
+
LuxenRating.styles = [hostStyles, styles];
|
|
175
|
+
__decorate([
|
|
176
|
+
property({ type: Boolean, reflect: true, attribute: 'edit-mode' })
|
|
177
|
+
], LuxenRating.prototype, "editMode", null);
|
|
178
|
+
__decorate([
|
|
179
|
+
property({
|
|
180
|
+
type: Array,
|
|
181
|
+
reflect: true,
|
|
182
|
+
converter: {
|
|
183
|
+
fromAttribute: (value) => value.split('|'),
|
|
184
|
+
toAttribute: (value) => (value.length ? value.join('|') : null),
|
|
185
|
+
},
|
|
186
|
+
})
|
|
187
|
+
], LuxenRating.prototype, "labels", null);
|
|
188
|
+
__decorate([
|
|
189
|
+
property({ type: Number, reflect: true })
|
|
190
|
+
], LuxenRating.prototype, "value", null);
|
|
191
|
+
__decorate([
|
|
192
|
+
property({ type: Number, reflect: true })
|
|
193
|
+
], LuxenRating.prototype, "length", null);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/html/elements/skeleton/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,cAAc,YAAY,CAAC;AAG3B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,YAAY,EAAE,aAAa,CAAC;KAC7B;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { LuxenElement } from '../../shared/luxen-element';
|
|
2
|
+
/**
|
|
3
|
+
* @summary A skeleton loading placeholder.
|
|
4
|
+
* @customElement l-skeleton
|
|
5
|
+
*
|
|
6
|
+
* @cssproperty --width - Width of the skeleton
|
|
7
|
+
* @cssproperty --height - Height of the skeleton
|
|
8
|
+
*/
|
|
9
|
+
export declare class LuxenSkeleton extends LuxenElement {
|
|
10
|
+
createRenderRoot(): this;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=skeleton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skeleton.d.ts","sourceRoot":"","sources":["../../../src/html/elements/skeleton/skeleton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D;;;;;;GAMG;AACH,qBAAa,aAAc,SAAQ,YAAY;IACpC,gBAAgB;CAG1B"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { LuxenElement } from '../../shared/luxen-element';
|
|
2
|
+
/**
|
|
3
|
+
* @summary A skeleton loading placeholder.
|
|
4
|
+
* @customElement l-skeleton
|
|
5
|
+
*
|
|
6
|
+
* @cssproperty --width - Width of the skeleton
|
|
7
|
+
* @cssproperty --height - Height of the skeleton
|
|
8
|
+
*/
|
|
9
|
+
export class LuxenSkeleton extends LuxenElement {
|
|
10
|
+
createRenderRoot() {
|
|
11
|
+
return this;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/html/elements/spinner/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,cAAc,WAAW,CAAC;AAG1B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,YAAY,CAAC;KAC3B;CACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
--size: 1em;
|
|
3
|
+
--indicator-color: currentColor;
|
|
4
|
+
--speed: 0.75s;
|
|
5
|
+
|
|
6
|
+
flex: none;
|
|
7
|
+
display: inline-flex;
|
|
8
|
+
width: var(--size);
|
|
9
|
+
height: var(--size);
|
|
10
|
+
color: var(--indicator-color);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
svg {
|
|
14
|
+
width: 100%;
|
|
15
|
+
height: 100%;
|
|
16
|
+
fill: currentColor;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.spinner {
|
|
20
|
+
transform-origin: center;
|
|
21
|
+
animation: spin var(--speed) linear infinite;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
@keyframes spin {
|
|
25
|
+
to {
|
|
26
|
+
transform: rotate(360deg);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { LuxenElement } from '../../shared/luxen-element';
|
|
2
|
+
/**
|
|
3
|
+
* @summary A spinner component for indicating loading state.
|
|
4
|
+
* @customElement l-spinner
|
|
5
|
+
*
|
|
6
|
+
* @csspart base - The SVG container element.
|
|
7
|
+
*
|
|
8
|
+
* @cssproperty --size - The size of the spinner (width and height). Defaults to `1em`.
|
|
9
|
+
* @cssproperty --indicator-color - The color of the spinner.
|
|
10
|
+
* @cssproperty --speed - The duration of one full spin cycle.
|
|
11
|
+
*/
|
|
12
|
+
export declare class LuxenSpinner extends LuxenElement {
|
|
13
|
+
static styles: import("lit").CSSResult[];
|
|
14
|
+
render(): import("lit").TemplateResult<1>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=spinner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../../src/html/elements/spinner/spinner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAM1D;;;;;;;;;GASG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAgB,MAAM,4BAAwB;IAErC,MAAM;CAmBhB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { html, unsafeCSS } from 'lit';
|
|
2
|
+
import { LuxenElement } from '../../shared/luxen-element';
|
|
3
|
+
import hostStyles from '../../shared/styles/host.styles';
|
|
4
|
+
import rawStyles from './spinner.css?inline';
|
|
5
|
+
const styles = unsafeCSS(rawStyles);
|
|
6
|
+
/**
|
|
7
|
+
* @summary A spinner component for indicating loading state.
|
|
8
|
+
* @customElement l-spinner
|
|
9
|
+
*
|
|
10
|
+
* @csspart base - The SVG container element.
|
|
11
|
+
*
|
|
12
|
+
* @cssproperty --size - The size of the spinner (width and height). Defaults to `1em`.
|
|
13
|
+
* @cssproperty --indicator-color - The color of the spinner.
|
|
14
|
+
* @cssproperty --speed - The duration of one full spin cycle.
|
|
15
|
+
*/
|
|
16
|
+
export class LuxenSpinner extends LuxenElement {
|
|
17
|
+
render() {
|
|
18
|
+
return html `
|
|
19
|
+
<svg
|
|
20
|
+
part="base"
|
|
21
|
+
role="progressbar"
|
|
22
|
+
aria-label="Loading"
|
|
23
|
+
viewBox="0 0 24 24"
|
|
24
|
+
>
|
|
25
|
+
<path
|
|
26
|
+
d="M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z"
|
|
27
|
+
opacity=".25"
|
|
28
|
+
/>
|
|
29
|
+
<path
|
|
30
|
+
d="M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z"
|
|
31
|
+
class="spinner"
|
|
32
|
+
/>
|
|
33
|
+
</svg>
|
|
34
|
+
`;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
LuxenSpinner.styles = [hostStyles, styles];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/html/elements/tabs/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,48 @@
|
|
|
1
|
+
import { LuxenElement } from '../../shared/luxen-element';
|
|
2
|
+
export type TabsVariant = 'enclosed' | 'line';
|
|
3
|
+
export type TabsOrientation = 'horizontal' | 'vertical';
|
|
4
|
+
/**
|
|
5
|
+
* @summary A tabs component that progressively enhances light DOM markup
|
|
6
|
+
* with ARIA roles, keyboard navigation, and animated indicators.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```html
|
|
10
|
+
* <l-tabs variant="enclosed">
|
|
11
|
+
* <div>
|
|
12
|
+
* <button>Tab 1</button>
|
|
13
|
+
* <button>Tab 2</button>
|
|
14
|
+
* </div>
|
|
15
|
+
* <div>Content 1</div>
|
|
16
|
+
* <div>Content 2</div>
|
|
17
|
+
* </l-tabs>
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* @event change - Fired when the active tab changes. Detail: `{ index: number, name: string | null }`.
|
|
21
|
+
*
|
|
22
|
+
* @customElement l-tabs
|
|
23
|
+
*/
|
|
24
|
+
export declare class LuxenTabs extends LuxenElement {
|
|
25
|
+
createRenderRoot(): this;
|
|
26
|
+
private _instanceId;
|
|
27
|
+
private _tablistEl;
|
|
28
|
+
private _tabs;
|
|
29
|
+
private _panels;
|
|
30
|
+
/** Visual variant. */
|
|
31
|
+
variant: TabsVariant;
|
|
32
|
+
/** Index of the active tab (0-based). */
|
|
33
|
+
value: string;
|
|
34
|
+
/** Stretch tabs to fill container width. */
|
|
35
|
+
fullWidth: boolean;
|
|
36
|
+
/** Tab orientation. */
|
|
37
|
+
orientation: TabsOrientation;
|
|
38
|
+
connectedCallback(): void;
|
|
39
|
+
disconnectedCallback(): void;
|
|
40
|
+
updated(changed: Map<string, unknown>): void;
|
|
41
|
+
private _setup;
|
|
42
|
+
private _teardown;
|
|
43
|
+
private _selectTab;
|
|
44
|
+
private _updateIndicator;
|
|
45
|
+
private _onClick;
|
|
46
|
+
private _onKeyDown;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=tabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../../src/html/elements/tabs/tabs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG1D,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,MAAM,CAAC;AAC9C,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,UAAU,CAAC;AAExD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,SAAU,SAAQ,YAAY;IAChC,gBAAgB;IAIzB,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,OAAO,CAAqB;IAEpC,sBAAsB;IAEtB,OAAO,EAAE,WAAW,CAAU;IAE9B,yCAAyC;IAEzC,KAAK,SAAO;IAEZ,4CAA4C;IAE5C,SAAS,UAAS;IAElB,uBAAuB;IAEvB,WAAW,EAAE,eAAe,CAAgB;IAInC,iBAAiB;IAMjB,oBAAoB;IAKpB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAW9C,OAAO,CAAC,MAAM;IAoDd,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,UAAU;IA2BlB,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,QAAQ,CAQd;IAEF,OAAO,CAAC,UAAU,CAkChB;CACH"}
|