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,249 @@
|
|
|
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
|
+
* A stepper control that enhances a native `<input type="number">` with
|
|
11
|
+
* decrement/increment buttons and an optional animated number track.
|
|
12
|
+
*
|
|
13
|
+
* @link https://www.nngroup.com/articles/input-steppers/
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```html
|
|
17
|
+
* <l-input-stepper>
|
|
18
|
+
* <input type="number" min="0" max="10" value="5" />
|
|
19
|
+
* </l-input-stepper>
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* @event change - Fired when the value changes. Detail: `{ value: number }`.
|
|
23
|
+
*/
|
|
24
|
+
export class LuxenInputStepper extends LuxenElement {
|
|
25
|
+
constructor() {
|
|
26
|
+
super(...arguments);
|
|
27
|
+
/** Control size. */
|
|
28
|
+
this.size = 'md';
|
|
29
|
+
/** Enable the animated number roller overlay. */
|
|
30
|
+
this.withRoller = false;
|
|
31
|
+
/** Icon name for the decrement button. */
|
|
32
|
+
this.decrementIcon = 'lucide:minus';
|
|
33
|
+
/** Icon name for the increment button. */
|
|
34
|
+
this.incrementIcon = 'lucide:plus';
|
|
35
|
+
this._input = null;
|
|
36
|
+
this._decrementBtn = null;
|
|
37
|
+
this._incrementBtn = null;
|
|
38
|
+
this._valueWrapper = null;
|
|
39
|
+
this._trackDisplay = null;
|
|
40
|
+
this._track = null;
|
|
41
|
+
this._observer = null;
|
|
42
|
+
this._skipTransition = false;
|
|
43
|
+
// --- Event handlers ---
|
|
44
|
+
this._onDecrement = () => this.decrement();
|
|
45
|
+
this._onIncrement = () => this.increment();
|
|
46
|
+
this._onInputChange = () => {
|
|
47
|
+
if (!this._input)
|
|
48
|
+
return;
|
|
49
|
+
const { min, max } = this._getConstraints();
|
|
50
|
+
const clamped = Math.min(Math.max(this._input.valueAsNumber, min), max);
|
|
51
|
+
this._input.value = String(clamped);
|
|
52
|
+
this._skipTransition = true;
|
|
53
|
+
this._updateButtonStates();
|
|
54
|
+
this._updateTrack();
|
|
55
|
+
this.emit('change', { detail: { value: clamped } });
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
createRenderRoot() {
|
|
59
|
+
return this;
|
|
60
|
+
}
|
|
61
|
+
connectedCallback() {
|
|
62
|
+
super.connectedCallback();
|
|
63
|
+
requestAnimationFrame(() => this._setup());
|
|
64
|
+
}
|
|
65
|
+
disconnectedCallback() {
|
|
66
|
+
super.disconnectedCallback();
|
|
67
|
+
this._teardown();
|
|
68
|
+
}
|
|
69
|
+
updated(changed) {
|
|
70
|
+
if (!this._input)
|
|
71
|
+
return;
|
|
72
|
+
if (changed.has('min') || changed.has('max') || changed.has('step')) {
|
|
73
|
+
this._syncConstraints();
|
|
74
|
+
this._updateButtonStates();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/** Decrease the value by one step. */
|
|
78
|
+
decrement() {
|
|
79
|
+
if (!this._input)
|
|
80
|
+
return;
|
|
81
|
+
const { min, step } = this._getConstraints();
|
|
82
|
+
const newVal = Math.max(this._input.valueAsNumber - step, min);
|
|
83
|
+
this._applyValue(newVal);
|
|
84
|
+
}
|
|
85
|
+
/** Increase the value by one step. */
|
|
86
|
+
increment() {
|
|
87
|
+
if (!this._input)
|
|
88
|
+
return;
|
|
89
|
+
const { max, step } = this._getConstraints();
|
|
90
|
+
const newVal = Math.min(this._input.valueAsNumber + step, max);
|
|
91
|
+
this._applyValue(newVal);
|
|
92
|
+
}
|
|
93
|
+
// --- Setup / Teardown ---
|
|
94
|
+
_setup() {
|
|
95
|
+
this._input = this.querySelector('input[type="number"]');
|
|
96
|
+
if (!this._input)
|
|
97
|
+
return;
|
|
98
|
+
this._input.inputMode = 'numeric';
|
|
99
|
+
// Wrap input in value container
|
|
100
|
+
this._valueWrapper = document.createElement('div');
|
|
101
|
+
this._valueWrapper.className = 'l-input-stepper-value';
|
|
102
|
+
this._input.replaceWith(this._valueWrapper);
|
|
103
|
+
this._valueWrapper.appendChild(this._input);
|
|
104
|
+
// Inject track overlay
|
|
105
|
+
if (this.withRoller) {
|
|
106
|
+
this._buildTrack();
|
|
107
|
+
}
|
|
108
|
+
// Create buttons
|
|
109
|
+
this._decrementBtn = this._createButton(this.decrementIcon, 'Decrease value');
|
|
110
|
+
this._incrementBtn = this._createButton(this.incrementIcon, 'Increase value');
|
|
111
|
+
this._valueWrapper.before(this._decrementBtn);
|
|
112
|
+
this._valueWrapper.after(this._incrementBtn);
|
|
113
|
+
// Events
|
|
114
|
+
this._decrementBtn.addEventListener('click', this._onDecrement);
|
|
115
|
+
this._incrementBtn.addEventListener('click', this._onIncrement);
|
|
116
|
+
this._input.addEventListener('change', this._onInputChange);
|
|
117
|
+
// Observe disabled attribute on input
|
|
118
|
+
this._observer = new MutationObserver(() => this._updateButtonStates());
|
|
119
|
+
this._observer.observe(this._input, { attributes: true, attributeFilter: ['disabled'] });
|
|
120
|
+
this._syncConstraints();
|
|
121
|
+
this._updateButtonStates();
|
|
122
|
+
this._updateTrack();
|
|
123
|
+
}
|
|
124
|
+
_teardown() {
|
|
125
|
+
this._decrementBtn?.removeEventListener('click', this._onDecrement);
|
|
126
|
+
this._incrementBtn?.removeEventListener('click', this._onIncrement);
|
|
127
|
+
this._input?.removeEventListener('change', this._onInputChange);
|
|
128
|
+
this._observer?.disconnect();
|
|
129
|
+
// Restore input to direct child
|
|
130
|
+
if (this._input && this._valueWrapper) {
|
|
131
|
+
this._valueWrapper.replaceWith(this._input);
|
|
132
|
+
}
|
|
133
|
+
this._decrementBtn?.remove();
|
|
134
|
+
this._incrementBtn?.remove();
|
|
135
|
+
this._input = null;
|
|
136
|
+
this._decrementBtn = null;
|
|
137
|
+
this._incrementBtn = null;
|
|
138
|
+
this._valueWrapper = null;
|
|
139
|
+
this._trackDisplay = null;
|
|
140
|
+
this._track = null;
|
|
141
|
+
this._observer = null;
|
|
142
|
+
}
|
|
143
|
+
// --- DOM helpers ---
|
|
144
|
+
_createButton(icon, label) {
|
|
145
|
+
const btn = document.createElement('button');
|
|
146
|
+
btn.type = 'button';
|
|
147
|
+
btn.setAttribute('aria-label', label);
|
|
148
|
+
btn.innerHTML = `<l-icon name="${icon}"></l-icon>`;
|
|
149
|
+
return btn;
|
|
150
|
+
}
|
|
151
|
+
_buildTrack() {
|
|
152
|
+
if (!this._valueWrapper)
|
|
153
|
+
return;
|
|
154
|
+
this._trackDisplay = document.createElement('div');
|
|
155
|
+
this._trackDisplay.className = 'l-input-stepper-track-display';
|
|
156
|
+
this._track = document.createElement('div');
|
|
157
|
+
this._track.className = 'l-input-stepper-track';
|
|
158
|
+
this._track.setAttribute('aria-hidden', 'true');
|
|
159
|
+
this._rebuildTrackNumbers();
|
|
160
|
+
this._trackDisplay.appendChild(this._track);
|
|
161
|
+
this._valueWrapper.appendChild(this._trackDisplay);
|
|
162
|
+
}
|
|
163
|
+
_rebuildTrackNumbers() {
|
|
164
|
+
if (!this._track)
|
|
165
|
+
return;
|
|
166
|
+
const { min, max, step } = this._getConstraints();
|
|
167
|
+
const effectiveMax = Number.isFinite(max) ? max : (this._input?.valueAsNumber ?? 0) + 100;
|
|
168
|
+
this._track.innerHTML = '';
|
|
169
|
+
for (let i = min; i <= effectiveMax; i += step) {
|
|
170
|
+
const div = document.createElement('div');
|
|
171
|
+
div.textContent = String(i);
|
|
172
|
+
this._track.appendChild(div);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// --- Constraints ---
|
|
176
|
+
_getConstraints() {
|
|
177
|
+
const min = this.min ?? (Number(this._input?.getAttribute('min')) || 0);
|
|
178
|
+
const max = this.max ??
|
|
179
|
+
(this._input?.hasAttribute('max') ? Number(this._input.getAttribute('max')) : Infinity);
|
|
180
|
+
const step = this.step ?? (Number(this._input?.getAttribute('step')) || 1);
|
|
181
|
+
return { min, max, step };
|
|
182
|
+
}
|
|
183
|
+
_syncConstraints() {
|
|
184
|
+
if (!this._input)
|
|
185
|
+
return;
|
|
186
|
+
const { min, max, step } = this._getConstraints();
|
|
187
|
+
this._input.min = String(min);
|
|
188
|
+
if (Number.isFinite(max))
|
|
189
|
+
this._input.max = String(max);
|
|
190
|
+
this._input.step = String(step);
|
|
191
|
+
this._rebuildTrackNumbers();
|
|
192
|
+
this._updateTrack();
|
|
193
|
+
}
|
|
194
|
+
// --- Value ---
|
|
195
|
+
_applyValue(val) {
|
|
196
|
+
if (!this._input)
|
|
197
|
+
return;
|
|
198
|
+
this._input.value = String(val);
|
|
199
|
+
this._updateButtonStates();
|
|
200
|
+
this._updateTrack();
|
|
201
|
+
this.emit('change', { detail: { value: val } });
|
|
202
|
+
}
|
|
203
|
+
// --- Track ---
|
|
204
|
+
_updateTrack() {
|
|
205
|
+
if (!this._track)
|
|
206
|
+
return;
|
|
207
|
+
const { min, step } = this._getConstraints();
|
|
208
|
+
const value = this._input?.valueAsNumber ?? min;
|
|
209
|
+
const offset = (min - value) / step;
|
|
210
|
+
this._track.style.translate = `0 calc(${offset} * var(--_button-size))`;
|
|
211
|
+
if (this._skipTransition) {
|
|
212
|
+
this._track.style.transition = 'none';
|
|
213
|
+
void this._track.offsetHeight;
|
|
214
|
+
this._track.style.transition = '';
|
|
215
|
+
this._skipTransition = false;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
// --- Button states ---
|
|
219
|
+
_updateButtonStates() {
|
|
220
|
+
if (!this._input || !this._decrementBtn || !this._incrementBtn)
|
|
221
|
+
return;
|
|
222
|
+
const { min, max } = this._getConstraints();
|
|
223
|
+
const value = this._input.valueAsNumber;
|
|
224
|
+
const disabled = this._input.disabled;
|
|
225
|
+
this._decrementBtn.disabled = disabled || value <= min;
|
|
226
|
+
this._incrementBtn.disabled = disabled || value >= max;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
__decorate([
|
|
230
|
+
property({ type: Number })
|
|
231
|
+
], LuxenInputStepper.prototype, "min", void 0);
|
|
232
|
+
__decorate([
|
|
233
|
+
property({ type: Number })
|
|
234
|
+
], LuxenInputStepper.prototype, "max", void 0);
|
|
235
|
+
__decorate([
|
|
236
|
+
property({ type: Number })
|
|
237
|
+
], LuxenInputStepper.prototype, "step", void 0);
|
|
238
|
+
__decorate([
|
|
239
|
+
property({ reflect: true })
|
|
240
|
+
], LuxenInputStepper.prototype, "size", void 0);
|
|
241
|
+
__decorate([
|
|
242
|
+
property({ type: Boolean, reflect: true, attribute: 'with-roller' })
|
|
243
|
+
], LuxenInputStepper.prototype, "withRoller", void 0);
|
|
244
|
+
__decorate([
|
|
245
|
+
property({ attribute: 'decrement-icon' })
|
|
246
|
+
], LuxenInputStepper.prototype, "decrementIcon", void 0);
|
|
247
|
+
__decorate([
|
|
248
|
+
property({ attribute: 'increment-icon' })
|
|
249
|
+
], LuxenInputStepper.prototype, "incrementIcon", void 0);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/html/elements/popover/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,61 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
--background: var(--l-color-bg-surface, Canvas);
|
|
3
|
+
--color: inherit;
|
|
4
|
+
--radius: 8px;
|
|
5
|
+
--max-width: 320px;
|
|
6
|
+
--shadow: 0 4px 16px rgb(0 0 0 / 12%);
|
|
7
|
+
--arrow-size: 8px;
|
|
8
|
+
--show-duration: 150ms;
|
|
9
|
+
--hide-duration: 150ms;
|
|
10
|
+
|
|
11
|
+
--_border-color: var(--l-color-border, light-dark(#e5e7eb, #374151));
|
|
12
|
+
|
|
13
|
+
display: contents;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
[popover] {
|
|
17
|
+
inset: unset;
|
|
18
|
+
overflow: visible;
|
|
19
|
+
isolation: isolate;
|
|
20
|
+
box-sizing: border-box;
|
|
21
|
+
width: max-content;
|
|
22
|
+
max-width: var(--max-width);
|
|
23
|
+
padding: 12px 16px;
|
|
24
|
+
border: 1px solid var(--_border-color);
|
|
25
|
+
border-radius: var(--radius);
|
|
26
|
+
background: var(--background);
|
|
27
|
+
color: var(--color);
|
|
28
|
+
font-size: 0.875rem;
|
|
29
|
+
line-height: 1.5;
|
|
30
|
+
box-shadow: var(--shadow);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
i {
|
|
34
|
+
position: absolute;
|
|
35
|
+
display: block;
|
|
36
|
+
width: var(--arrow-size);
|
|
37
|
+
height: var(--arrow-size);
|
|
38
|
+
background: var(--background);
|
|
39
|
+
transform: rotate(45deg);
|
|
40
|
+
z-index: -1;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
:host([data-placement^='top']) i {
|
|
44
|
+
border-right: 1px solid var(--_border-color);
|
|
45
|
+
border-bottom: 1px solid var(--_border-color);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
:host([data-placement^='bottom']) i {
|
|
49
|
+
border-top: 1px solid var(--_border-color);
|
|
50
|
+
border-left: 1px solid var(--_border-color);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
:host([data-placement^='left']) i {
|
|
54
|
+
border-right: 1px solid var(--_border-color);
|
|
55
|
+
border-top: 1px solid var(--_border-color);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
:host([data-placement^='right']) i {
|
|
59
|
+
border-left: 1px solid var(--_border-color);
|
|
60
|
+
border-bottom: 1px solid var(--_border-color);
|
|
61
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { type PropertyValues } from 'lit';
|
|
2
|
+
import { LuxenElement } from '../../shared/luxen-element';
|
|
3
|
+
import type { Placement } from '@floating-ui/dom';
|
|
4
|
+
/**
|
|
5
|
+
* @summary A popover that displays interactive content anchored to a trigger.
|
|
6
|
+
* @customElement l-popover
|
|
7
|
+
*
|
|
8
|
+
* @slot - Popover content.
|
|
9
|
+
*
|
|
10
|
+
* @csspart body - The popover container.
|
|
11
|
+
* @csspart arrow - The directional arrow element.
|
|
12
|
+
*
|
|
13
|
+
* @cssproperty --background - Background color. Default: `Canvas`.
|
|
14
|
+
* @cssproperty --color - Text color. Default: inherited.
|
|
15
|
+
* @cssproperty --radius - Border radius. Default `8px`.
|
|
16
|
+
* @cssproperty --max-width - Maximum width. Default `320px`.
|
|
17
|
+
* @cssproperty --shadow - Box shadow.
|
|
18
|
+
* @cssproperty --arrow-size - Arrow size. Default `8px`.
|
|
19
|
+
* @cssproperty --show-duration - Show animation duration. Default `150ms`.
|
|
20
|
+
* @cssproperty --hide-duration - Hide animation duration. Default `150ms`.
|
|
21
|
+
*/
|
|
22
|
+
export declare class LuxenPopover extends LuxenElement {
|
|
23
|
+
static styles: import("lit").CSSResult[];
|
|
24
|
+
private _popoverId;
|
|
25
|
+
private _floating;
|
|
26
|
+
/** The HTML id of the element triggering the popover. */
|
|
27
|
+
accessor for: string;
|
|
28
|
+
/** The preferred placement of the popover. */
|
|
29
|
+
accessor placement: Placement;
|
|
30
|
+
/** The distance in pixels from the target element. */
|
|
31
|
+
accessor distance: number;
|
|
32
|
+
/** Whether or not the popover is visible. */
|
|
33
|
+
accessor open: boolean;
|
|
34
|
+
/** Hide the directional arrow. */
|
|
35
|
+
accessor withoutArrow: boolean;
|
|
36
|
+
/** Space-separated list of trigger modes: `click`, `hover`, `focus`, `manual`. */
|
|
37
|
+
accessor trigger: string;
|
|
38
|
+
private _hasTrigger;
|
|
39
|
+
private get _trigger();
|
|
40
|
+
private get _popoverEl();
|
|
41
|
+
private get _arrowEl();
|
|
42
|
+
private _getDuration;
|
|
43
|
+
connectedCallback(): void;
|
|
44
|
+
disconnectedCallback(): void;
|
|
45
|
+
updated(changed: PropertyValues<this>): void;
|
|
46
|
+
show(): void;
|
|
47
|
+
hide(): void;
|
|
48
|
+
toggle(): void;
|
|
49
|
+
private _handleOpenChange;
|
|
50
|
+
private _onPointerEnter;
|
|
51
|
+
private _onPointerLeave;
|
|
52
|
+
private _onFocusIn;
|
|
53
|
+
private _onFocusOut;
|
|
54
|
+
private _onClick;
|
|
55
|
+
private _onKeyDown;
|
|
56
|
+
/** Sync `open` when popover="auto" light-dismiss fires. */
|
|
57
|
+
private _onToggle;
|
|
58
|
+
private _addTriggerListeners;
|
|
59
|
+
private _removeTriggerListeners;
|
|
60
|
+
render(): import("lit").TemplateResult<1>;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=popover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"popover.d.ts","sourceRoot":"","sources":["../../../src/html/elements/popover/popover.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAQlD;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAgB,MAAM,4BAAwB;IAE9C,OAAO,CAAC,UAAU,CAAuB;IAEzC,OAAO,CAAC,SAAS,CAOd;IAEH,yDAAyD;IAEzD,QAAQ,CAAC,GAAG,SAAM;IAElB,8CAA8C;IAE9C,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAY;IAEzC,sDAAsD;IAEtD,QAAQ,CAAC,QAAQ,SAAK;IAEtB,6CAA6C;IAE7C,QAAQ,CAAC,IAAI,UAAS;IAEtB,kCAAkC;IAElC,QAAQ,CAAC,YAAY,UAAS;IAE9B,kFAAkF;IAElF,QAAQ,CAAC,OAAO,SAAW;IAE3B,OAAO,CAAC,WAAW;IAInB,OAAO,KAAK,QAAQ,GAEnB;IAED,OAAO,KAAK,UAAU,GAErB;IAED,OAAO,KAAK,QAAQ,GAEnB;IAED,OAAO,CAAC,YAAY;IAKX,iBAAiB;IAKjB,oBAAoB;IAKpB,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC;IAU9C,IAAI;IAIJ,IAAI;IAIJ,MAAM;YAIQ,iBAAiB;IA0B/B,OAAO,CAAC,eAAe,CAIrB;IAEF,OAAO,CAAC,eAAe,CAGrB;IAEF,OAAO,CAAC,UAAU,CAEhB;IACF,OAAO,CAAC,WAAW,CAEjB;IACF,OAAO,CAAC,QAAQ,CAEd;IAEF,OAAO,CAAC,UAAU,CAKhB;IAEF,2DAA2D;IAC3D,OAAO,CAAC,SAAS,CAKf;IAEF,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,uBAAuB;IAOtB,MAAM;CAoBhB"}
|
|
@@ -0,0 +1,244 @@
|
|
|
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 _LuxenPopover_for_accessor_storage, _LuxenPopover_placement_accessor_storage, _LuxenPopover_distance_accessor_storage, _LuxenPopover_open_accessor_storage, _LuxenPopover_withoutArrow_accessor_storage, _LuxenPopover_trigger_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 { PopoverController } from '../../shared/controllers/popover';
|
|
23
|
+
import { uniqueId } from '../../registry';
|
|
24
|
+
import hostStyles from '../../shared/styles/host.styles';
|
|
25
|
+
import rawStyles from './popover.css?inline';
|
|
26
|
+
const styles = unsafeCSS(rawStyles);
|
|
27
|
+
/**
|
|
28
|
+
* @summary A popover that displays interactive content anchored to a trigger.
|
|
29
|
+
* @customElement l-popover
|
|
30
|
+
*
|
|
31
|
+
* @slot - Popover content.
|
|
32
|
+
*
|
|
33
|
+
* @csspart body - The popover container.
|
|
34
|
+
* @csspart arrow - The directional arrow element.
|
|
35
|
+
*
|
|
36
|
+
* @cssproperty --background - Background color. Default: `Canvas`.
|
|
37
|
+
* @cssproperty --color - Text color. Default: inherited.
|
|
38
|
+
* @cssproperty --radius - Border radius. Default `8px`.
|
|
39
|
+
* @cssproperty --max-width - Maximum width. Default `320px`.
|
|
40
|
+
* @cssproperty --shadow - Box shadow.
|
|
41
|
+
* @cssproperty --arrow-size - Arrow size. Default `8px`.
|
|
42
|
+
* @cssproperty --show-duration - Show animation duration. Default `150ms`.
|
|
43
|
+
* @cssproperty --hide-duration - Hide animation duration. Default `150ms`.
|
|
44
|
+
*/
|
|
45
|
+
export class LuxenPopover extends LuxenElement {
|
|
46
|
+
constructor() {
|
|
47
|
+
super(...arguments);
|
|
48
|
+
this._popoverId = uniqueId('popover');
|
|
49
|
+
this._floating = new PopoverController(this, {
|
|
50
|
+
getTriggerElement: () => this._trigger,
|
|
51
|
+
getFloatingElement: () => this._popoverEl,
|
|
52
|
+
getArrowElement: () => this._arrowEl,
|
|
53
|
+
onPlacementChange: (p) => {
|
|
54
|
+
this.dataset.placement = p;
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
_LuxenPopover_for_accessor_storage.set(this, '');
|
|
58
|
+
_LuxenPopover_placement_accessor_storage.set(this, 'bottom');
|
|
59
|
+
_LuxenPopover_distance_accessor_storage.set(this, 8);
|
|
60
|
+
_LuxenPopover_open_accessor_storage.set(this, false);
|
|
61
|
+
_LuxenPopover_withoutArrow_accessor_storage.set(this, false);
|
|
62
|
+
_LuxenPopover_trigger_accessor_storage.set(this, 'click');
|
|
63
|
+
// --- Trigger event handlers ---
|
|
64
|
+
this._onPointerEnter = () => {
|
|
65
|
+
if (!this._hasTrigger('hover'))
|
|
66
|
+
return;
|
|
67
|
+
this._floating.cleanupSafePolygon();
|
|
68
|
+
this.show();
|
|
69
|
+
};
|
|
70
|
+
this._onPointerLeave = (e) => {
|
|
71
|
+
if (!this._hasTrigger('hover') || !this.open)
|
|
72
|
+
return;
|
|
73
|
+
this._floating.handlePointerLeave(e, () => this.hide());
|
|
74
|
+
};
|
|
75
|
+
this._onFocusIn = () => {
|
|
76
|
+
if (this._hasTrigger('focus'))
|
|
77
|
+
this.show();
|
|
78
|
+
};
|
|
79
|
+
this._onFocusOut = () => {
|
|
80
|
+
if (this._hasTrigger('focus'))
|
|
81
|
+
this.hide();
|
|
82
|
+
};
|
|
83
|
+
this._onClick = () => {
|
|
84
|
+
if (this._hasTrigger('click'))
|
|
85
|
+
this.toggle();
|
|
86
|
+
};
|
|
87
|
+
this._onKeyDown = (e) => {
|
|
88
|
+
if (this.open && e.key === 'Escape') {
|
|
89
|
+
e.stopPropagation();
|
|
90
|
+
this.hide();
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
/** Sync `open` when popover="auto" light-dismiss fires. */
|
|
94
|
+
this._onToggle = (e) => {
|
|
95
|
+
const toggleEvent = e;
|
|
96
|
+
if (toggleEvent.newState === 'closed' && this.open) {
|
|
97
|
+
this.open = false;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/** The HTML id of the element triggering the popover. */
|
|
102
|
+
get for() { return __classPrivateFieldGet(this, _LuxenPopover_for_accessor_storage, "f"); }
|
|
103
|
+
set for(value) { __classPrivateFieldSet(this, _LuxenPopover_for_accessor_storage, value, "f"); }
|
|
104
|
+
/** The preferred placement of the popover. */
|
|
105
|
+
get placement() { return __classPrivateFieldGet(this, _LuxenPopover_placement_accessor_storage, "f"); }
|
|
106
|
+
set placement(value) { __classPrivateFieldSet(this, _LuxenPopover_placement_accessor_storage, value, "f"); }
|
|
107
|
+
/** The distance in pixels from the target element. */
|
|
108
|
+
get distance() { return __classPrivateFieldGet(this, _LuxenPopover_distance_accessor_storage, "f"); }
|
|
109
|
+
set distance(value) { __classPrivateFieldSet(this, _LuxenPopover_distance_accessor_storage, value, "f"); }
|
|
110
|
+
/** Whether or not the popover is visible. */
|
|
111
|
+
get open() { return __classPrivateFieldGet(this, _LuxenPopover_open_accessor_storage, "f"); }
|
|
112
|
+
set open(value) { __classPrivateFieldSet(this, _LuxenPopover_open_accessor_storage, value, "f"); }
|
|
113
|
+
/** Hide the directional arrow. */
|
|
114
|
+
get withoutArrow() { return __classPrivateFieldGet(this, _LuxenPopover_withoutArrow_accessor_storage, "f"); }
|
|
115
|
+
set withoutArrow(value) { __classPrivateFieldSet(this, _LuxenPopover_withoutArrow_accessor_storage, value, "f"); }
|
|
116
|
+
/** Space-separated list of trigger modes: `click`, `hover`, `focus`, `manual`. */
|
|
117
|
+
get trigger() { return __classPrivateFieldGet(this, _LuxenPopover_trigger_accessor_storage, "f"); }
|
|
118
|
+
set trigger(value) { __classPrivateFieldSet(this, _LuxenPopover_trigger_accessor_storage, value, "f"); }
|
|
119
|
+
_hasTrigger(type) {
|
|
120
|
+
return this.trigger.split(' ').includes(type);
|
|
121
|
+
}
|
|
122
|
+
get _trigger() {
|
|
123
|
+
return this.for ? this.getRootNode().getElementById(this.for) : null;
|
|
124
|
+
}
|
|
125
|
+
get _popoverEl() {
|
|
126
|
+
return this.shadowRoot.querySelector('[popover]');
|
|
127
|
+
}
|
|
128
|
+
get _arrowEl() {
|
|
129
|
+
return this.withoutArrow ? null : this.shadowRoot.querySelector('i');
|
|
130
|
+
}
|
|
131
|
+
_getDuration(prop) {
|
|
132
|
+
const parsed = parseFloat(getComputedStyle(this).getPropertyValue(prop));
|
|
133
|
+
return Number.isNaN(parsed) ? 150 : parsed;
|
|
134
|
+
}
|
|
135
|
+
connectedCallback() {
|
|
136
|
+
super.connectedCallback();
|
|
137
|
+
requestAnimationFrame(() => this._addTriggerListeners());
|
|
138
|
+
}
|
|
139
|
+
disconnectedCallback() {
|
|
140
|
+
super.disconnectedCallback();
|
|
141
|
+
this._removeTriggerListeners();
|
|
142
|
+
}
|
|
143
|
+
updated(changed) {
|
|
144
|
+
if (changed.has('open')) {
|
|
145
|
+
this._handleOpenChange();
|
|
146
|
+
}
|
|
147
|
+
if (changed.has('for')) {
|
|
148
|
+
this._removeTriggerListeners(changed.get('for'));
|
|
149
|
+
this._addTriggerListeners();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
show() {
|
|
153
|
+
if (!this.open)
|
|
154
|
+
this.open = true;
|
|
155
|
+
}
|
|
156
|
+
hide() {
|
|
157
|
+
if (this.open)
|
|
158
|
+
this.open = false;
|
|
159
|
+
}
|
|
160
|
+
toggle() {
|
|
161
|
+
this.open = !this.open;
|
|
162
|
+
}
|
|
163
|
+
async _handleOpenChange() {
|
|
164
|
+
const popover = this._popoverEl;
|
|
165
|
+
if (!popover)
|
|
166
|
+
return;
|
|
167
|
+
const posOpts = { placement: this.placement, distance: this.distance };
|
|
168
|
+
if (this.open) {
|
|
169
|
+
popover.showPopover();
|
|
170
|
+
await this._floating.updatePosition(posOpts);
|
|
171
|
+
if (!this.open)
|
|
172
|
+
return;
|
|
173
|
+
await this._floating.animateShow(popover, this._getDuration('--show-duration'));
|
|
174
|
+
this._floating.startPositioning(posOpts);
|
|
175
|
+
this._trigger?.setAttribute('aria-expanded', 'true');
|
|
176
|
+
this._trigger?.setAttribute('aria-controls', this._popoverId);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
this._floating.stopPositioning();
|
|
180
|
+
this._floating.cleanupSafePolygon();
|
|
181
|
+
this._trigger?.setAttribute('aria-expanded', 'false');
|
|
182
|
+
this._trigger?.removeAttribute('aria-controls');
|
|
183
|
+
await this._floating.animateHide(popover, this._getDuration('--hide-duration'));
|
|
184
|
+
if (popover.matches(':popover-open'))
|
|
185
|
+
popover.hidePopover();
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
_addTriggerListeners() {
|
|
189
|
+
this._floating.addTriggerListeners({
|
|
190
|
+
onPointerEnter: this._onPointerEnter,
|
|
191
|
+
onPointerLeave: this._onPointerLeave,
|
|
192
|
+
onFocusIn: this._onFocusIn,
|
|
193
|
+
onFocusOut: this._onFocusOut,
|
|
194
|
+
onClick: this._onClick,
|
|
195
|
+
onKeyDown: this._onKeyDown,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
_removeTriggerListeners(forId) {
|
|
199
|
+
const trigger = forId
|
|
200
|
+
? this.getRootNode().getElementById(forId)
|
|
201
|
+
: undefined;
|
|
202
|
+
this._floating.removeTriggerListeners(trigger);
|
|
203
|
+
}
|
|
204
|
+
render() {
|
|
205
|
+
return html `
|
|
206
|
+
<div
|
|
207
|
+
id=${this._popoverId}
|
|
208
|
+
popover="auto"
|
|
209
|
+
part="body"
|
|
210
|
+
@toggle=${this._onToggle}
|
|
211
|
+
>
|
|
212
|
+
${this.withoutArrow
|
|
213
|
+
? nothing
|
|
214
|
+
: html `
|
|
215
|
+
<i
|
|
216
|
+
part="arrow"
|
|
217
|
+
role="presentation"
|
|
218
|
+
></i>
|
|
219
|
+
`}
|
|
220
|
+
<slot></slot>
|
|
221
|
+
</div>
|
|
222
|
+
`;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
_LuxenPopover_for_accessor_storage = new WeakMap(), _LuxenPopover_placement_accessor_storage = new WeakMap(), _LuxenPopover_distance_accessor_storage = new WeakMap(), _LuxenPopover_open_accessor_storage = new WeakMap(), _LuxenPopover_withoutArrow_accessor_storage = new WeakMap(), _LuxenPopover_trigger_accessor_storage = new WeakMap();
|
|
226
|
+
LuxenPopover.styles = [hostStyles, styles];
|
|
227
|
+
__decorate([
|
|
228
|
+
property()
|
|
229
|
+
], LuxenPopover.prototype, "for", null);
|
|
230
|
+
__decorate([
|
|
231
|
+
property()
|
|
232
|
+
], LuxenPopover.prototype, "placement", null);
|
|
233
|
+
__decorate([
|
|
234
|
+
property({ type: Number })
|
|
235
|
+
], LuxenPopover.prototype, "distance", null);
|
|
236
|
+
__decorate([
|
|
237
|
+
property({ type: Boolean, reflect: true })
|
|
238
|
+
], LuxenPopover.prototype, "open", null);
|
|
239
|
+
__decorate([
|
|
240
|
+
property({ type: Boolean, reflect: true, attribute: 'without-arrow' })
|
|
241
|
+
], LuxenPopover.prototype, "withoutArrow", null);
|
|
242
|
+
__decorate([
|
|
243
|
+
property()
|
|
244
|
+
], LuxenPopover.prototype, "trigger", null);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/html/elements/rating/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,cAAc,UAAU,CAAC;AAGzB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,WAAW,CAAC;KACzB;CACF"}
|