@penn-libraries/web 1.4.0-dev.2 → 1.4.0-dev.4

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.
Files changed (61) hide show
  1. package/dist/cjs/{index-nu4ClYFS.js → index-BKWYkqL-.js} +4 -4
  2. package/dist/cjs/index-BKWYkqL-.js.map +1 -0
  3. package/dist/cjs/index.cjs.js +1 -1
  4. package/dist/cjs/loader.cjs.js +2 -2
  5. package/dist/cjs/pennlibs-accordion.pennlibs-expand-text.pennlibs-feedback.pennlibs-footer.pennlibs-header.entry.cjs.js.map +1 -0
  6. package/dist/cjs/{pennlibs-expand-text_4.cjs.entry.js → pennlibs-accordion_5.cjs.entry.js} +168 -2
  7. package/dist/cjs/pennlibs-autocomplete.cjs.entry.js +1 -1
  8. package/dist/cjs/pennlibs-banner.cjs.entry.js +1 -1
  9. package/dist/cjs/pennlibs-chat.cjs.entry.js +1 -1
  10. package/dist/cjs/pennlibs-fallback-img.cjs.entry.js +1 -1
  11. package/dist/cjs/pennlibs-hero.cjs.entry.js +1 -1
  12. package/dist/cjs/pennlibs-iiif-img.cjs.entry.js +1 -1
  13. package/dist/cjs/web.cjs.js +2 -2
  14. package/dist/collection/collection-manifest.json +1 -0
  15. package/dist/collection/components/pennlibs-accordion/pennlibs-accordion.css +9 -0
  16. package/dist/collection/components/pennlibs-accordion/pennlibs-accordion.js +228 -0
  17. package/dist/collection/components/pennlibs-accordion/pennlibs-accordion.js.map +1 -0
  18. package/dist/components/index.d.ts +2 -0
  19. package/dist/components/index.js +1 -0
  20. package/dist/components/index.js.map +1 -1
  21. package/dist/components/pennlibs-accordion.d.ts +11 -0
  22. package/dist/components/pennlibs-accordion.js +192 -0
  23. package/dist/components/pennlibs-accordion.js.map +1 -0
  24. package/dist/docs.json +71 -1
  25. package/dist/{web/p-DJQvPLp9.js → esm/index-Cw9fYoti.js} +4 -4
  26. package/dist/esm/index-Cw9fYoti.js.map +1 -0
  27. package/dist/esm/index.js +1 -1
  28. package/dist/esm/loader.js +3 -3
  29. package/dist/esm/pennlibs-accordion.pennlibs-expand-text.pennlibs-feedback.pennlibs-footer.pennlibs-header.entry.js.map +1 -0
  30. package/dist/{web/p-e0cb5433.entry.js → esm/pennlibs-accordion_5.entry.js} +168 -3
  31. package/dist/esm/pennlibs-autocomplete.entry.js +1 -1
  32. package/dist/esm/pennlibs-banner.entry.js +1 -1
  33. package/dist/esm/pennlibs-chat.entry.js +1 -1
  34. package/dist/esm/pennlibs-fallback-img.entry.js +1 -1
  35. package/dist/esm/pennlibs-hero.entry.js +1 -1
  36. package/dist/esm/pennlibs-iiif-img.entry.js +1 -1
  37. package/dist/esm/web.js +3 -3
  38. package/dist/types/components/pennlibs-accordion/pennlibs-accordion.d.ts +44 -0
  39. package/dist/types/components.d.ts +89 -0
  40. package/dist/web/index.esm.js +1 -1
  41. package/dist/web/{p-33f42a73.entry.js → p-0eb9e4fa.entry.js} +1 -1
  42. package/dist/web/{p-c5190071.entry.js → p-1c284e42.entry.js} +1 -1
  43. package/dist/web/{p-aac371c4.entry.js → p-4f2ff6ec.entry.js} +1 -1
  44. package/dist/web/{p-3198c994.entry.js → p-85b7d695.entry.js} +1 -1
  45. package/dist/web/{p-c0ad70c7.entry.js → p-8d7c5424.entry.js} +1 -1
  46. package/dist/{esm/index-DJQvPLp9.js → web/p-Cw9fYoti.js} +4 -4
  47. package/dist/web/p-Cw9fYoti.js.map +1 -0
  48. package/dist/web/{p-a917779a.entry.js → p-af10bd16.entry.js} +1 -1
  49. package/dist/{esm/pennlibs-expand-text_4.entry.js → web/p-ca1412b5.entry.js} +168 -3
  50. package/dist/web/pennlibs-accordion.pennlibs-expand-text.pennlibs-feedback.pennlibs-footer.pennlibs-header.entry.esm.js.map +1 -0
  51. package/dist/web/web.css +110 -0
  52. package/dist/web/web.esm.js +3 -3
  53. package/hydrate/index.js +197 -1
  54. package/hydrate/index.mjs +197 -1
  55. package/package.json +1 -1
  56. package/dist/cjs/index-nu4ClYFS.js.map +0 -1
  57. package/dist/cjs/pennlibs-expand-text.pennlibs-feedback.pennlibs-footer.pennlibs-header.entry.cjs.js.map +0 -1
  58. package/dist/esm/index-DJQvPLp9.js.map +0 -1
  59. package/dist/esm/pennlibs-expand-text.pennlibs-feedback.pennlibs-footer.pennlibs-header.entry.js.map +0 -1
  60. package/dist/web/p-DJQvPLp9.js.map +0 -1
  61. package/dist/web/pennlibs-expand-text.pennlibs-feedback.pennlibs-footer.pennlibs-header.entry.esm.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { r as registerInstance, h, a as getElement } from './p-DJQvPLp9.js';
1
+ import { r as registerInstance, h, a as getElement } from './p-Cw9fYoti.js';
2
2
 
3
3
  const pennlibsHeroCss = ":host{--pl-hero-height:clamp(42vh, 32rem, 26rem);--pl-hero-heading-font:var(--pl-font-serif);--pl-hero-color:var(--pl-color-fg-on-emphasis)}*,*:before,*:after{box-sizing:inherit}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.viewport-margins{width:100%;max-width:var(--pl-viewport-margins-max-width);margin:0 auto;padding:0 var(--pl-viewport-margins-gutter, 1em)}.hero{position:relative;min-height:var(--pl-hero-height);height:100%;background-size:cover;background-repeat:no-repeat;background-position:50% 33%;display:flex;container-type:inline-size}.hero::before{content:\"\";display:flex;width:100%;height:100%;top:0;position:absolute;background:linear-gradient(360deg, rgba(0, 0, 0, 0.9) 0%, rgba(0, 0, 0, 0.7) 20%, rgba(0, 0, 0, 0.4) 40%, rgba(0, 0, 0, 0.05) 100%);z-index:0}.hero::after{content:\"\";display:flex;width:100%;height:100%;top:0;position:absolute;background:linear-gradient(180deg, rgba(1, 31, 91, 1) 0%, rgba(1, 31, 91, 0.9) 10%, rgba(1, 31, 91, 0.8) 20%, rgba(1, 31, 91, 0.1) 50%, rgba(1, 31, 91, 0.0) 100%);z-index:0}.hero__content{position:relative;display:flex;flex-direction:column;width:100%;z-index:1}.hero__heading-container{margin-top:auto;padding-top:var(--pl-space-3xl);padding-bottom:var(--pl-space-3xl)}.hero__heading{text-shadow:1px 1px 2px var(--pl-color-fg-default);line-height:1;font-size:var(--pl-font-size-5xl);font-size:clamp(var(--pl-font-size-4xl), 3cqi + 1rem, var(--pl-font-size-5xl));font-weight:400;font-family:var(--pl-hero-heading-font);text-wrap:pretty;max-width:30ch;margin:0;color:var(--pl-hero-color)}.hero__sub-heading{font-size:1.25em;font-family:var(--pl-font-family);font-weight:400;color:var(--pl-hero-color);max-width:52ch;text-wrap:pretty;margin-top:var(--pl-space-s);margin-bottom:0}.hero__sub-heading a{text-decoration:underline;text-underline-offset:var(--pl-link-text-underline-offset);text-decoration-thickness:var(--pl-link-text-decoration-thickness);color:var(--pl-hero-color)}.hero__sub-heading a:hover{text-decoration-thickness:var(--pl-link-hover-text-decoration-thickness)}.hero__sub-heading strong{font-weight:bold}@media (max-width: 620px){.hero__sub-heading{font-size:1em}}";
4
4
 
@@ -1,4 +1,169 @@
1
- import { r as registerInstance, h, H as Host, a as getElement, c as createEvent, d as getAssetPath } from './index-DJQvPLp9.js';
1
+ import { r as registerInstance, a as getElement, h, H as Host, c as createEvent, d as getAssetPath } from './p-Cw9fYoti.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