@jungherz-de/glasskit-elements 1.16.0 → 1.16.1
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/README.md +1 -1
- package/dist/components/base.js +18 -0
- package/dist/components/glk-accordion-item.js +15 -3
- package/dist/components/glk-empty.js +15 -2
- package/dist/components/glk-list-item.js +15 -3
- package/dist/components/glk-modal.js +15 -3
- package/dist/components/glk-sheet.js +12 -3
- package/dist/glasskit-elements.esm.js +90 -14
- package/dist/glasskit-elements.js +90 -14
- package/dist/glasskit-elements.min.js +1 -1
- package/package.json +1 -1
- package/src/base.js +18 -0
- package/src/components/containers/glk-accordion-item.js +15 -3
- package/src/components/containers/glk-list-item.js +15 -3
- package/src/components/content/glk-empty.js +15 -2
- package/src/components/feedback/glk-modal.js +15 -3
- package/src/components/feedback/glk-sheet.js +12 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jungherz-de/glasskit-elements",
|
|
3
|
-
"version": "1.16.
|
|
3
|
+
"version": "1.16.1",
|
|
4
4
|
"description": "Vanilla JavaScript Web Components wrapping the GlassKit CSS glassmorphism library",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://glasskit-elements.jungherz.com",
|
package/src/base.js
CHANGED
|
@@ -181,6 +181,24 @@ export class GlkElement extends HTMLElement {
|
|
|
181
181
|
|
|
182
182
|
// ── Utility Methods ──
|
|
183
183
|
|
|
184
|
+
/**
|
|
185
|
+
* For elements whose heading arrives as `title`. That is also the global
|
|
186
|
+
* HTML attribute, and a title on the host shows as a browser tooltip — the
|
|
187
|
+
* sheet's heading floating over its form. So the value is read into
|
|
188
|
+
* this._title and the attribute is taken off the host; a later
|
|
189
|
+
* setAttribute('title') comes through attributeChangedCallback, is taken
|
|
190
|
+
* the same way and removed again, and the element's `title` accessor
|
|
191
|
+
* answers from this._title. The removal fires the callback with null,
|
|
192
|
+
* which is ignored here — only an empty string clears the heading.
|
|
193
|
+
* Returns whether a value was taken.
|
|
194
|
+
*/
|
|
195
|
+
takeTitle(value = this.getAttribute('title')) {
|
|
196
|
+
if (value === null) return false;
|
|
197
|
+
this._title = value;
|
|
198
|
+
this.removeAttribute('title');
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
|
|
184
202
|
getBoolAttr(name) {
|
|
185
203
|
return this.hasAttribute(name);
|
|
186
204
|
}
|
|
@@ -13,7 +13,8 @@ class GlkAccordionItem extends GlkElement {
|
|
|
13
13
|
|
|
14
14
|
// Trigger button
|
|
15
15
|
this._trigger = this.createElement('button', ['glass-accordion__trigger']);
|
|
16
|
-
this.
|
|
16
|
+
this.takeTitle();
|
|
17
|
+
this._triggerText = document.createTextNode(this._title || '');
|
|
17
18
|
this._trigger.appendChild(this._triggerText);
|
|
18
19
|
this._trigger.insertAdjacentHTML('beforeend', CHEVRON_SVG);
|
|
19
20
|
|
|
@@ -41,18 +42,29 @@ class GlkAccordionItem extends GlkElement {
|
|
|
41
42
|
this._trigger?.removeEventListener('click', this._onClick);
|
|
42
43
|
}
|
|
43
44
|
|
|
44
|
-
onAttributeChanged(name) {
|
|
45
|
+
onAttributeChanged(name, _old, value) {
|
|
45
46
|
if (!this._item) return;
|
|
46
47
|
switch (name) {
|
|
47
48
|
case 'open':
|
|
48
49
|
this._item.classList.toggle('is-open', this.getBoolAttr('open'));
|
|
49
50
|
break;
|
|
50
51
|
case 'title':
|
|
51
|
-
this.
|
|
52
|
+
if (this.takeTitle(value)) this._applyTitle();
|
|
52
53
|
break;
|
|
53
54
|
}
|
|
54
55
|
}
|
|
55
56
|
|
|
57
|
+
_applyTitle() {
|
|
58
|
+
if (this._triggerText) this._triggerText.textContent = this._title || '';
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// `title` is the heading, never a tooltip — see GlkElement.takeTitle().
|
|
62
|
+
get title() { return this._title ?? ''; }
|
|
63
|
+
set title(v) {
|
|
64
|
+
this._title = v == null ? '' : String(v);
|
|
65
|
+
this._applyTitle();
|
|
66
|
+
}
|
|
67
|
+
|
|
56
68
|
get open() { return this.getBoolAttr('open'); }
|
|
57
69
|
set open(v) { this.setBoolAttr('open', v); }
|
|
58
70
|
}
|
|
@@ -48,7 +48,8 @@ class GlkListItem extends GlkElement {
|
|
|
48
48
|
// Content — title + optional subtitle.
|
|
49
49
|
this._content = this.createElement('div', ['glass-list__content']);
|
|
50
50
|
this._titleEl = this.createElement('div', ['glass-list__title']);
|
|
51
|
-
this.
|
|
51
|
+
this.takeTitle();
|
|
52
|
+
this._titleEl.textContent = this._title || '';
|
|
52
53
|
this._subtitleEl = this.createElement('div', ['glass-list__subtitle']);
|
|
53
54
|
if (this.getBoolAttr('wrap')) this._subtitleEl.classList.add('glass-list__subtitle--wrap');
|
|
54
55
|
const initialSubtitle = this.getAttribute('subtitle') || '';
|
|
@@ -114,11 +115,11 @@ class GlkListItem extends GlkElement {
|
|
|
114
115
|
this._item?.removeEventListener('click', this._onClick);
|
|
115
116
|
}
|
|
116
117
|
|
|
117
|
-
onAttributeChanged(name) {
|
|
118
|
+
onAttributeChanged(name, _old, value) {
|
|
118
119
|
if (!this._item) return;
|
|
119
120
|
switch (name) {
|
|
120
121
|
case 'title':
|
|
121
|
-
this.
|
|
122
|
+
if (this.takeTitle(value)) this._applyTitle();
|
|
122
123
|
break;
|
|
123
124
|
case 'subtitle': {
|
|
124
125
|
const value = this.getAttribute('subtitle') || '';
|
|
@@ -162,6 +163,17 @@ class GlkListItem extends GlkElement {
|
|
|
162
163
|
}
|
|
163
164
|
}
|
|
164
165
|
|
|
166
|
+
_applyTitle() {
|
|
167
|
+
if (this._titleEl) this._titleEl.textContent = this._title || '';
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// `title` is the heading, never a tooltip — see GlkElement.takeTitle().
|
|
171
|
+
get title() { return this._title ?? ''; }
|
|
172
|
+
set title(v) {
|
|
173
|
+
this._title = v == null ? '' : String(v);
|
|
174
|
+
this._applyTitle();
|
|
175
|
+
}
|
|
176
|
+
|
|
165
177
|
get interactive() { return this.getBoolAttr('interactive'); }
|
|
166
178
|
set interactive(v) { this.setBoolAttr('interactive', v); }
|
|
167
179
|
|
|
@@ -24,11 +24,12 @@ class GlkEmpty extends GlkElement {
|
|
|
24
24
|
action.appendChild(this.createElement('slot', [], { name: 'action' }));
|
|
25
25
|
root.append(icon, this._titleEl, this._textEl, action);
|
|
26
26
|
this._wrapper.appendChild(root);
|
|
27
|
+
this.takeTitle();
|
|
27
28
|
this._update();
|
|
28
29
|
}
|
|
29
30
|
|
|
30
31
|
_update() {
|
|
31
|
-
const title = this.
|
|
32
|
+
const title = this._title || '';
|
|
32
33
|
const text = this.getAttribute('text') || '';
|
|
33
34
|
this._titleEl.textContent = title;
|
|
34
35
|
this._titleEl.hidden = !title;
|
|
@@ -36,10 +37,22 @@ class GlkEmpty extends GlkElement {
|
|
|
36
37
|
this._textEl.hidden = !text;
|
|
37
38
|
}
|
|
38
39
|
|
|
39
|
-
onAttributeChanged() {
|
|
40
|
+
onAttributeChanged(name, _old, value) {
|
|
41
|
+
if (name === 'title' && !this.takeTitle(value)) return;
|
|
40
42
|
if (this._titleEl) this._update();
|
|
41
43
|
}
|
|
42
44
|
|
|
45
|
+
_applyTitle() {
|
|
46
|
+
if (this._titleEl) this._update();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// `title` is the heading, never a tooltip — see GlkElement.takeTitle().
|
|
50
|
+
get title() { return this._title ?? ''; }
|
|
51
|
+
set title(v) {
|
|
52
|
+
this._title = v == null ? '' : String(v);
|
|
53
|
+
this._applyTitle();
|
|
54
|
+
}
|
|
55
|
+
|
|
43
56
|
get text() { return this.getAttribute('text') || ''; }
|
|
44
57
|
set text(v) {
|
|
45
58
|
if (v) this.setAttribute('text', v);
|
|
@@ -15,7 +15,8 @@ class GlkModal extends GlkElement {
|
|
|
15
15
|
// Header
|
|
16
16
|
const header = this.createElement('div', ['glass-modal__header'], { part: 'header' });
|
|
17
17
|
this._titleEl = this.createElement('h2', ['glass-modal__title']);
|
|
18
|
-
this.
|
|
18
|
+
this.takeTitle();
|
|
19
|
+
this._applyTitle();
|
|
19
20
|
header.appendChild(this._titleEl);
|
|
20
21
|
|
|
21
22
|
// Body
|
|
@@ -84,14 +85,14 @@ class GlkModal extends GlkElement {
|
|
|
84
85
|
document.removeEventListener('keydown', this._onKeydown);
|
|
85
86
|
}
|
|
86
87
|
|
|
87
|
-
onAttributeChanged(name) {
|
|
88
|
+
onAttributeChanged(name, _old, value) {
|
|
88
89
|
if (!this._overlay) return;
|
|
89
90
|
switch (name) {
|
|
90
91
|
case 'open':
|
|
91
92
|
this._overlay.classList.toggle('is-active', this.getBoolAttr('open'));
|
|
92
93
|
break;
|
|
93
94
|
case 'title':
|
|
94
|
-
this.
|
|
95
|
+
if (this.takeTitle(value)) this._applyTitle();
|
|
95
96
|
break;
|
|
96
97
|
}
|
|
97
98
|
}
|
|
@@ -99,6 +100,17 @@ class GlkModal extends GlkElement {
|
|
|
99
100
|
show() { this.setAttribute('open', ''); }
|
|
100
101
|
close() { this.removeAttribute('open'); }
|
|
101
102
|
|
|
103
|
+
_applyTitle() {
|
|
104
|
+
if (this._titleEl) this._titleEl.textContent = this._title || '';
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// `title` is the heading, never a tooltip — see GlkElement.takeTitle().
|
|
108
|
+
get title() { return this._title ?? ''; }
|
|
109
|
+
set title(v) {
|
|
110
|
+
this._title = v == null ? '' : String(v);
|
|
111
|
+
this._applyTitle();
|
|
112
|
+
}
|
|
113
|
+
|
|
102
114
|
get open() { return this.getBoolAttr('open'); }
|
|
103
115
|
set open(v) { this.setBoolAttr('open', v); }
|
|
104
116
|
}
|
|
@@ -37,12 +37,14 @@ class GlkSheet extends GlkElement {
|
|
|
37
37
|
this._panel.append(this._titleEl, body, actions);
|
|
38
38
|
this._overlay.appendChild(this._panel);
|
|
39
39
|
this._wrapper.appendChild(this._overlay);
|
|
40
|
+
this.takeTitle();
|
|
40
41
|
this._applyTitle();
|
|
41
42
|
this._applyMode();
|
|
42
43
|
}
|
|
43
44
|
|
|
44
45
|
_applyTitle() {
|
|
45
|
-
|
|
46
|
+
if (!this._titleEl) return;
|
|
47
|
+
const title = this._title || '';
|
|
46
48
|
this._titleEl.textContent = title;
|
|
47
49
|
this._titleEl.hidden = !title;
|
|
48
50
|
if (title) this._panel.setAttribute('aria-label', title);
|
|
@@ -112,7 +114,7 @@ class GlkSheet extends GlkElement {
|
|
|
112
114
|
document.removeEventListener('keydown', this._onKeydown);
|
|
113
115
|
}
|
|
114
116
|
|
|
115
|
-
onAttributeChanged(name) {
|
|
117
|
+
onAttributeChanged(name, _old, value) {
|
|
116
118
|
if (!this._overlay) return;
|
|
117
119
|
switch (name) {
|
|
118
120
|
case 'open':
|
|
@@ -121,13 +123,20 @@ class GlkSheet extends GlkElement {
|
|
|
121
123
|
else this._hide();
|
|
122
124
|
break;
|
|
123
125
|
case 'inline': this._applyMode(); break;
|
|
124
|
-
case 'title': this._applyTitle(); break;
|
|
126
|
+
case 'title': if (this.takeTitle(value)) this._applyTitle(); break;
|
|
125
127
|
}
|
|
126
128
|
}
|
|
127
129
|
|
|
128
130
|
show() { this.setAttribute('open', ''); }
|
|
129
131
|
close() { this.removeAttribute('open'); }
|
|
130
132
|
|
|
133
|
+
// `title` is the heading, never a tooltip — see GlkElement.takeTitle().
|
|
134
|
+
get title() { return this._title ?? ''; }
|
|
135
|
+
set title(v) {
|
|
136
|
+
this._title = v == null ? '' : String(v);
|
|
137
|
+
this._applyTitle();
|
|
138
|
+
}
|
|
139
|
+
|
|
131
140
|
get open() { return this.getBoolAttr('open'); }
|
|
132
141
|
set open(v) { this.setBoolAttr('open', v); }
|
|
133
142
|
|