@penn-libraries/web 1.4.0-dev.2 → 1.4.0-dev.3
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/dist/cjs/{index-nu4ClYFS.js → index-DuAtidph.js} +4 -4
- package/dist/cjs/index-DuAtidph.js.map +1 -0
- package/dist/cjs/index.cjs.js +1 -1
- package/dist/cjs/loader.cjs.js +2 -2
- package/dist/cjs/pennlibs-accordion.pennlibs-expand-text.pennlibs-feedback.pennlibs-footer.pennlibs-header.entry.cjs.js.map +1 -0
- package/dist/cjs/{pennlibs-expand-text_4.cjs.entry.js → pennlibs-accordion_5.cjs.entry.js} +168 -2
- package/dist/cjs/pennlibs-autocomplete.cjs.entry.js +1 -1
- package/dist/cjs/pennlibs-banner.cjs.entry.js +1 -1
- package/dist/cjs/pennlibs-chat.cjs.entry.js +1 -1
- package/dist/cjs/pennlibs-fallback-img.cjs.entry.js +1 -1
- package/dist/cjs/pennlibs-hero.cjs.entry.js +1 -1
- package/dist/cjs/pennlibs-iiif-img.cjs.entry.js +1 -1
- package/dist/cjs/web.cjs.js +2 -2
- package/dist/collection/collection-manifest.json +1 -0
- package/dist/collection/components/pennlibs-accordion/pennlibs-accordion.css +9 -0
- package/dist/collection/components/pennlibs-accordion/pennlibs-accordion.js +228 -0
- package/dist/collection/components/pennlibs-accordion/pennlibs-accordion.js.map +1 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.js +1 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/pennlibs-accordion.d.ts +11 -0
- package/dist/components/pennlibs-accordion.js +192 -0
- package/dist/components/pennlibs-accordion.js.map +1 -0
- package/dist/docs.json +71 -1
- package/dist/{web/p-DJQvPLp9.js → esm/index-BXL8iX4F.js} +4 -4
- package/dist/esm/index-BXL8iX4F.js.map +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/loader.js +3 -3
- package/dist/esm/pennlibs-accordion.pennlibs-expand-text.pennlibs-feedback.pennlibs-footer.pennlibs-header.entry.js.map +1 -0
- package/dist/{web/p-e0cb5433.entry.js → esm/pennlibs-accordion_5.entry.js} +168 -3
- package/dist/esm/pennlibs-autocomplete.entry.js +1 -1
- package/dist/esm/pennlibs-banner.entry.js +1 -1
- package/dist/esm/pennlibs-chat.entry.js +1 -1
- package/dist/esm/pennlibs-fallback-img.entry.js +1 -1
- package/dist/esm/pennlibs-hero.entry.js +1 -1
- package/dist/esm/pennlibs-iiif-img.entry.js +1 -1
- package/dist/esm/web.js +3 -3
- package/dist/types/components/pennlibs-accordion/pennlibs-accordion.d.ts +44 -0
- package/dist/types/components.d.ts +89 -0
- package/dist/web/index.esm.js +1 -1
- package/dist/web/{p-3198c994.entry.js → p-5bf6e5f8.entry.js} +1 -1
- package/dist/web/{p-a917779a.entry.js → p-5f1cef00.entry.js} +1 -1
- package/dist/web/{p-c5190071.entry.js → p-61ae9fb2.entry.js} +1 -1
- package/dist/web/{p-aac371c4.entry.js → p-64e74684.entry.js} +1 -1
- package/dist/web/{p-33f42a73.entry.js → p-8b17cc4d.entry.js} +1 -1
- package/dist/web/{p-c0ad70c7.entry.js → p-9de28f5c.entry.js} +1 -1
- package/dist/{esm/index-DJQvPLp9.js → web/p-BXL8iX4F.js} +4 -4
- package/dist/web/p-BXL8iX4F.js.map +1 -0
- package/dist/{esm/pennlibs-expand-text_4.entry.js → web/p-ed1b5ac4.entry.js} +168 -3
- package/dist/web/pennlibs-accordion.pennlibs-expand-text.pennlibs-feedback.pennlibs-footer.pennlibs-header.entry.esm.js.map +1 -0
- package/dist/web/web.css +85 -0
- package/dist/web/web.esm.js +3 -3
- package/hydrate/index.js +197 -1
- package/hydrate/index.mjs +197 -1
- package/package.json +1 -1
- package/dist/cjs/index-nu4ClYFS.js.map +0 -1
- package/dist/cjs/pennlibs-expand-text.pennlibs-feedback.pennlibs-footer.pennlibs-header.entry.cjs.js.map +0 -1
- package/dist/esm/index-DJQvPLp9.js.map +0 -1
- package/dist/esm/pennlibs-expand-text.pennlibs-feedback.pennlibs-footer.pennlibs-header.entry.js.map +0 -1
- package/dist/web/p-DJQvPLp9.js.map +0 -1
- package/dist/web/pennlibs-expand-text.pennlibs-feedback.pennlibs-footer.pennlibs-header.entry.esm.js.map +0 -1
|
@@ -1,4 +1,169 @@
|
|
|
1
|
-
import { r as registerInstance, h, H as Host,
|
|
1
|
+
import { r as registerInstance, a as getElement, h, H as Host, c as createEvent, d as getAssetPath } from './p-BXL8iX4F.js';
|
|
2
|
+
|
|
3
|
+
const pennlibsAccordionCss = "pennlibs-accordion{display:contents}";
|
|
4
|
+
|
|
5
|
+
let accordionUid = 0;
|
|
6
|
+
const Accordion = class {
|
|
7
|
+
constructor(hostRef) {
|
|
8
|
+
registerInstance(this, hostRef);
|
|
9
|
+
/**
|
|
10
|
+
* When set, only one panel can be open at a time, so opening one closes the
|
|
11
|
+
* others, like a classic accordion.
|
|
12
|
+
* @prop single
|
|
13
|
+
*/
|
|
14
|
+
this.single = false;
|
|
15
|
+
this.uid = accordionUid++;
|
|
16
|
+
this.items = [];
|
|
17
|
+
this.summaries = [];
|
|
18
|
+
// Roving focus between headers per the WAI-ARIA Accordion keyboard model.
|
|
19
|
+
// Enter/Space toggling is left to the browser's native <details> behavior.
|
|
20
|
+
this.onKeydown = (event) => {
|
|
21
|
+
var _a;
|
|
22
|
+
const current = event.currentTarget;
|
|
23
|
+
const index = this.summaries.indexOf(current);
|
|
24
|
+
if (index === -1)
|
|
25
|
+
return;
|
|
26
|
+
const count = this.summaries.length;
|
|
27
|
+
let next;
|
|
28
|
+
switch (event.key) {
|
|
29
|
+
case 'ArrowDown':
|
|
30
|
+
next = (index + 1) % count;
|
|
31
|
+
break;
|
|
32
|
+
case 'ArrowUp':
|
|
33
|
+
next = (index - 1 + count) % count;
|
|
34
|
+
break;
|
|
35
|
+
case 'Home':
|
|
36
|
+
next = 0;
|
|
37
|
+
break;
|
|
38
|
+
case 'End':
|
|
39
|
+
next = count - 1;
|
|
40
|
+
break;
|
|
41
|
+
default:
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
event.preventDefault();
|
|
45
|
+
(_a = this.summaries[next]) === null || _a === void 0 ? void 0 : _a.focus();
|
|
46
|
+
};
|
|
47
|
+
this.onToggle = (event) => {
|
|
48
|
+
if (!this.single)
|
|
49
|
+
return;
|
|
50
|
+
const details = event.target;
|
|
51
|
+
if (!details.open)
|
|
52
|
+
return;
|
|
53
|
+
this.items.forEach((other) => {
|
|
54
|
+
if (other !== details && other.open)
|
|
55
|
+
other.open = false;
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
componentDidLoad() {
|
|
60
|
+
this.collectItems();
|
|
61
|
+
this.enhanceItems();
|
|
62
|
+
this.syncControls(this.el, this.items.some((details) => details.open));
|
|
63
|
+
}
|
|
64
|
+
disconnectedCallback() {
|
|
65
|
+
this.summaries.forEach((summary) => summary.removeEventListener('keydown', this.onKeydown));
|
|
66
|
+
this.items.forEach((details) => details.removeEventListener('toggle', this.onToggle));
|
|
67
|
+
}
|
|
68
|
+
collectItems() {
|
|
69
|
+
this.items = Array.from(this.el.querySelectorAll(':scope > details, :scope > .pl-details'));
|
|
70
|
+
this.summaries = this.items
|
|
71
|
+
.map((details) => details.querySelector(':scope > summary'))
|
|
72
|
+
.filter((summary) => summary instanceof HTMLElement);
|
|
73
|
+
}
|
|
74
|
+
enhanceItems() {
|
|
75
|
+
this.items.forEach((details, index) => {
|
|
76
|
+
const summary = details.querySelector(':scope > summary');
|
|
77
|
+
if (!summary)
|
|
78
|
+
return;
|
|
79
|
+
const panel = summary.nextElementSibling;
|
|
80
|
+
const baseId = `pl-accordion-${this.uid}-${index}`;
|
|
81
|
+
// Wire the summary (the disclosure button) to its panel as a labelled
|
|
82
|
+
// region. Native <summary> already exposes the button role and
|
|
83
|
+
// aria-expanded, so we only add what it lacks.
|
|
84
|
+
if (!summary.id)
|
|
85
|
+
summary.id = `${baseId}-summary`;
|
|
86
|
+
if (panel) {
|
|
87
|
+
if (!panel.id)
|
|
88
|
+
panel.id = `${baseId}-panel`;
|
|
89
|
+
if (!panel.hasAttribute('role'))
|
|
90
|
+
panel.setAttribute('role', 'region');
|
|
91
|
+
if (!panel.hasAttribute('aria-labelledby'))
|
|
92
|
+
panel.setAttribute('aria-labelledby', summary.id);
|
|
93
|
+
summary.setAttribute('aria-controls', panel.id);
|
|
94
|
+
}
|
|
95
|
+
summary.addEventListener('keydown', this.onKeydown);
|
|
96
|
+
details.addEventListener('toggle', this.onToggle);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
// A declarative toggle-all control: any element marked with
|
|
100
|
+
// `data-pl-accordion-toggle`. With no value it controls the closest enclosing
|
|
101
|
+
// accordion; set the value to an accordion's id to control one from elsewhere
|
|
102
|
+
// on the page. Add `data-pl-accordion-toggle-deep` to also reach nested
|
|
103
|
+
// accordions, or a number for that many levels. `data-pl-expand-label` and
|
|
104
|
+
// `data-pl-collapse-label` swap its text to match the state.
|
|
105
|
+
onControlClick(event) {
|
|
106
|
+
var _a;
|
|
107
|
+
const control = (_a = event.target) === null || _a === void 0 ? void 0 : _a.closest('[data-pl-accordion-toggle]');
|
|
108
|
+
if (!control || this.controlTarget(control) !== this.el)
|
|
109
|
+
return;
|
|
110
|
+
event.preventDefault();
|
|
111
|
+
const expanded = !this.items.some((details) => details.open);
|
|
112
|
+
this.setAll(this.el, expanded, this.controlDepth(control));
|
|
113
|
+
}
|
|
114
|
+
// The accordion a control points at: the element whose id is in the attribute
|
|
115
|
+
// value, or the closest enclosing accordion when the value is empty.
|
|
116
|
+
controlTarget(control) {
|
|
117
|
+
const id = control.getAttribute('data-pl-accordion-toggle');
|
|
118
|
+
return id ? document.getElementById(id) : control.closest('pennlibs-accordion');
|
|
119
|
+
}
|
|
120
|
+
// How many nested levels a control reaches: absent is none, a bare attribute
|
|
121
|
+
// is every level, and a non-negative number is that many levels down.
|
|
122
|
+
controlDepth(control) {
|
|
123
|
+
if (!control.hasAttribute('data-pl-accordion-toggle-deep'))
|
|
124
|
+
return 0;
|
|
125
|
+
const raw = control.getAttribute('data-pl-accordion-toggle-deep');
|
|
126
|
+
if (raw === null || raw === '')
|
|
127
|
+
return Infinity;
|
|
128
|
+
const levels = parseInt(raw, 10);
|
|
129
|
+
return Number.isFinite(levels) && levels >= 0 ? levels : Infinity;
|
|
130
|
+
}
|
|
131
|
+
// Expand or collapse every item in an accordion, pushing the same direction
|
|
132
|
+
// `levels` deep. Each level reads its own single-open rule, so nothing forces
|
|
133
|
+
// two panels open in a single-open group.
|
|
134
|
+
setAll(accordion, expanded, levels) {
|
|
135
|
+
const items = Array.from(accordion.querySelectorAll(':scope > details, :scope > .pl-details'));
|
|
136
|
+
if (expanded && accordion.single) {
|
|
137
|
+
items.forEach((details, index) => (details.open = index === 0));
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
items.forEach((details) => (details.open = expanded));
|
|
141
|
+
}
|
|
142
|
+
this.syncControls(accordion, expanded);
|
|
143
|
+
if (levels > 0) {
|
|
144
|
+
this.nestedAccordions(accordion).forEach((nested) => this.setAll(nested, expanded, levels - 1));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// The accordions one level down from the given one (not their descendants).
|
|
148
|
+
nestedAccordions(accordion) {
|
|
149
|
+
return Array.from(accordion.querySelectorAll('pennlibs-accordion')).filter((node) => { var _a; return ((_a = node.parentElement) === null || _a === void 0 ? void 0 : _a.closest('pennlibs-accordion')) === accordion; });
|
|
150
|
+
}
|
|
151
|
+
// Keep every control pointing at an accordion in sync with its state.
|
|
152
|
+
syncControls(accordion, expanded) {
|
|
153
|
+
document.querySelectorAll('[data-pl-accordion-toggle]').forEach((control) => {
|
|
154
|
+
if (this.controlTarget(control) !== accordion)
|
|
155
|
+
return;
|
|
156
|
+
control.setAttribute('aria-expanded', String(expanded));
|
|
157
|
+
const label = expanded
|
|
158
|
+
? control.getAttribute('data-pl-collapse-label')
|
|
159
|
+
: control.getAttribute('data-pl-expand-label');
|
|
160
|
+
if (label)
|
|
161
|
+
control.textContent = label;
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
get el() { return getElement(this); }
|
|
165
|
+
};
|
|
166
|
+
Accordion.style = pennlibsAccordionCss;
|
|
2
167
|
|
|
3
168
|
const pennlibsExpandTextCss = ":host{display:inline-block;position:relative;max-width:100%;vertical-align:bottom}.expand-text{display:block}.expand-text--clamped{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:var(--pl-expand-text-lines, 3);line-clamp:var(--pl-expand-text-lines, 3);overflow:hidden}.expand-text--expanded{display:inline}.expand-text__fade{position:absolute;right:0;bottom:0;padding-left:2em;background:linear-gradient(\n to right,\n transparent,\n var(--pl-expand-text-bg, var(--pl-color-bg-default)) 1.5em\n );pointer-events:none}.expand-text__toggle{display:inline-block;vertical-align:baseline;pointer-events:auto;padding:var(--pl-space-3xs) var(--pl-space-s);border:none;background:var(--pl-color-bg-subtle);color:var(--pl-color-fg-default);font-family:var(--pl-font-family);border-radius:var(--pl-border-radius-subtle);font-size:var(--pl-font-size-xs);font-weight:500;line-height:1.5;letter-spacing:0.075rem;text-transform:uppercase;cursor:pointer}.expand-text__toggle:hover{text-decoration:underline;text-decoration-thickness:var(--pl-link-text-decoration-thickness);text-underline-offset:var(--pl-link-text-underline-offset)}.expand-text__toggle:focus-visible{outline:none;box-shadow:var(--pl-focus-box-shadow)}.expand-text__fade--inline{position:static;padding-left:0;background:none;margin-inline-start:var(--pl-space-2xs, 0.25rem)}";
|
|
4
169
|
|
|
@@ -259,5 +424,5 @@ const Header = class {
|
|
|
259
424
|
};
|
|
260
425
|
Header.style = pennlibsHeaderCss;
|
|
261
426
|
|
|
262
|
-
export { ExpandText as pennlibs_expand_text, PennlibsFeedback as pennlibs_feedback, Footer as pennlibs_footer, Header as pennlibs_header };
|
|
263
|
-
//# sourceMappingURL=pennlibs-expand-text.pennlibs-feedback.pennlibs-footer.pennlibs-header.entry.js.map
|
|
427
|
+
export { Accordion as pennlibs_accordion, ExpandText as pennlibs_expand_text, PennlibsFeedback as pennlibs_feedback, Footer as pennlibs_footer, Header as pennlibs_header };
|
|
428
|
+
//# sourceMappingURL=pennlibs-accordion.pennlibs-expand-text.pennlibs-feedback.pennlibs-footer.pennlibs-header.entry.esm.js.map
|