@zanichelli/zanichelli-it-frontend-kit 1.4.1 → 1.4.2

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 (94) hide show
  1. package/dist/cjs/{index-BLzQAHAI.js → index-BKkNg6ed.js} +498 -358
  2. package/dist/cjs/index.cjs.js +0 -3
  3. package/dist/cjs/loader.cjs.js +2 -5
  4. package/dist/cjs/zanichelli-it-frontend-kit.cjs.js +3 -6
  5. package/dist/cjs/zanit-back-to-top_4.cjs.entry.js +75 -62
  6. package/dist/collection/collection-manifest.json +3 -2
  7. package/dist/collection/components/back-to-top/back-to-top.js +3 -4
  8. package/dist/collection/components/menubar/menu/menu.js +0 -1
  9. package/dist/collection/components/menubar/menubar.js +12 -11
  10. package/dist/collection/components/menubar/mobile-menubar/mobile-menubar.js +12 -13
  11. package/dist/collection/components/menubar/search-form/search-form.js +14 -12
  12. package/dist/collection/components/menubar/search-form/suggestions.js +0 -1
  13. package/dist/collection/index.js +0 -1
  14. package/dist/collection/utils/index.js +0 -1
  15. package/dist/collection/utils/subjects.api.js +0 -1
  16. package/dist/collection/utils/utils.js +0 -1
  17. package/dist/components/index.d.ts +2 -0
  18. package/dist/components/index.js +1 -1335
  19. package/dist/components/p-BMtMaJq9.js +1 -0
  20. package/dist/components/p-BXeRLfHX.js +1 -0
  21. package/dist/components/zanit-back-to-top.js +1 -88
  22. package/dist/components/zanit-menubar.js +1 -455
  23. package/dist/components/zanit-mobile-menubar.js +1 -9
  24. package/dist/components/zanit-search-form.js +1 -9
  25. package/dist/esm/{index-DSdvvVFj.js → index-CFgcJxsy.js} +498 -358
  26. package/dist/esm/index.js +0 -3
  27. package/dist/esm/loader.js +3 -6
  28. package/dist/esm/zanichelli-it-frontend-kit.js +4 -7
  29. package/dist/esm/zanit-back-to-top_4.entry.js +75 -62
  30. package/dist/types/components/back-to-top/back-to-top.d.ts +2 -1
  31. package/dist/types/components/menubar/menubar.d.ts +2 -1
  32. package/dist/types/components/menubar/mobile-menubar/mobile-menubar.d.ts +2 -1
  33. package/dist/types/components/menubar/search-form/search-form.d.ts +3 -2
  34. package/dist/types/components.d.ts +35 -8
  35. package/dist/types/stencil-public-runtime.d.ts +169 -11
  36. package/dist/zanichelli-it-frontend-kit/index.esm.js +0 -2
  37. package/dist/zanichelli-it-frontend-kit/p-93d8b277.entry.js +1 -0
  38. package/dist/zanichelli-it-frontend-kit/p-CFgcJxsy.js +2 -0
  39. package/dist/zanichelli-it-frontend-kit/zanichelli-it-frontend-kit.esm.js +1 -2
  40. package/package.json +17 -15
  41. package/www/build/index.esm.js +0 -2
  42. package/www/build/p-93d8b277.entry.js +1 -0
  43. package/www/build/p-CFgcJxsy.js +2 -0
  44. package/www/build/p-ec9829f4.js +1 -0
  45. package/www/build/zanichelli-it-frontend-kit.esm.js +1 -2
  46. package/www/index.html +2 -1
  47. package/dist/cjs/index-BLzQAHAI.js.map +0 -1
  48. package/dist/cjs/index.cjs.js.map +0 -1
  49. package/dist/cjs/loader.cjs.js.map +0 -1
  50. package/dist/cjs/zanichelli-it-frontend-kit.cjs.js.map +0 -1
  51. package/dist/cjs/zanit-back-to-top.zanit-menubar.zanit-mobile-menubar.zanit-search-form.entry.cjs.js.map +0 -1
  52. package/dist/cjs/zanit-back-to-top_4.cjs.entry.js.map +0 -1
  53. package/dist/collection/components/back-to-top/back-to-top.js.map +0 -1
  54. package/dist/collection/components/menubar/menu/menu.js.map +0 -1
  55. package/dist/collection/components/menubar/menubar.js.map +0 -1
  56. package/dist/collection/components/menubar/mobile-menubar/mobile-menubar.js.map +0 -1
  57. package/dist/collection/components/menubar/search-form/search-form.js.map +0 -1
  58. package/dist/collection/components/menubar/search-form/suggestions.js.map +0 -1
  59. package/dist/collection/index.js.map +0 -1
  60. package/dist/collection/utils/index.js.map +0 -1
  61. package/dist/collection/utils/subjects.api.js.map +0 -1
  62. package/dist/collection/utils/utils.js.map +0 -1
  63. package/dist/components/index.js.map +0 -1
  64. package/dist/components/p-BlgoYKK3.js +0 -246
  65. package/dist/components/p-BlgoYKK3.js.map +0 -1
  66. package/dist/components/p-DqMqkNnl.js +0 -386
  67. package/dist/components/p-DqMqkNnl.js.map +0 -1
  68. package/dist/components/zanit-back-to-top.js.map +0 -1
  69. package/dist/components/zanit-menubar.js.map +0 -1
  70. package/dist/components/zanit-mobile-menubar.js.map +0 -1
  71. package/dist/components/zanit-search-form.js.map +0 -1
  72. package/dist/esm/index-DSdvvVFj.js.map +0 -1
  73. package/dist/esm/index.js.map +0 -1
  74. package/dist/esm/loader.js.map +0 -1
  75. package/dist/esm/zanichelli-it-frontend-kit.js.map +0 -1
  76. package/dist/esm/zanit-back-to-top.zanit-menubar.zanit-mobile-menubar.zanit-search-form.entry.js.map +0 -1
  77. package/dist/esm/zanit-back-to-top_4.entry.js.map +0 -1
  78. package/dist/zanichelli-it-frontend-kit/index.esm.js.map +0 -1
  79. package/dist/zanichelli-it-frontend-kit/loader.esm.js.map +0 -1
  80. package/dist/zanichelli-it-frontend-kit/p-62cc02c2.entry.js +0 -2
  81. package/dist/zanichelli-it-frontend-kit/p-62cc02c2.entry.js.map +0 -1
  82. package/dist/zanichelli-it-frontend-kit/p-DSdvvVFj.js +0 -3
  83. package/dist/zanichelli-it-frontend-kit/p-DSdvvVFj.js.map +0 -1
  84. package/dist/zanichelli-it-frontend-kit/zanichelli-it-frontend-kit.esm.js.map +0 -1
  85. package/dist/zanichelli-it-frontend-kit/zanit-back-to-top.zanit-menubar.zanit-mobile-menubar.zanit-search-form.entry.esm.js.map +0 -1
  86. package/www/build/index.esm.js.map +0 -1
  87. package/www/build/loader.esm.js.map +0 -1
  88. package/www/build/p-62cc02c2.entry.js +0 -2
  89. package/www/build/p-62cc02c2.entry.js.map +0 -1
  90. package/www/build/p-DSdvvVFj.js +0 -3
  91. package/www/build/p-DSdvvVFj.js.map +0 -1
  92. package/www/build/p-fe3aec03.js +0 -2
  93. package/www/build/zanichelli-it-frontend-kit.esm.js.map +0 -1
  94. package/www/build/zanit-back-to-top.zanit-menubar.zanit-mobile-menubar.zanit-search-form.entry.esm.js.map +0 -1
@@ -1,386 +0,0 @@
1
- import { p as proxyCustomElement, H, c as createEvent, h, a as Host } from './index.js';
2
-
3
- /**
4
- * Check if an element contains an event target by checking its composedPath.
5
- * Useful when an event target may come from a component's shadow DOM.
6
- */
7
- const containsTarget = (ancestor, event) => {
8
- return event
9
- .composedPath()
10
- .filter((el) => el !== document && el !== window.window)
11
- .some((el) => ancestor.contains(el));
12
- };
13
- /** Move the focus to `next` element, set tabindex to 0 for `next` and -1 to `current`. */
14
- const moveFocus = (current, next) => {
15
- current.tabIndex = -1;
16
- next.tabIndex = 0;
17
- next.focus({ preventScroll: true });
18
- };
19
- /** Check if event key is ArrowUp */
20
- const isArrowUpKey = (event) => event.key === 'ArrowUp';
21
- /** Check if event key is ArrowDown */
22
- const isArrowDownKey = (event) => event.key === 'ArrowDown';
23
- /** Check if event key is Tab */
24
- const isTabKey = (event) => event.key === 'Tab';
25
- /** Check if event key is Escape */
26
- const isEscKey = (event) => event.key === 'Escape';
27
-
28
- var SearchEnv;
29
- (function (SearchEnv) {
30
- SearchEnv["DEV"] = "dev";
31
- SearchEnv["TEST"] = "test";
32
- SearchEnv["PROD"] = "prod";
33
- })(SearchEnv || (SearchEnv = {}));
34
- const S3_SHOP_URL = {
35
- dev: 'https://zanichelli-shop-dev.s3.eu-west-1.amazonaws.com',
36
- test: 'https://zanichelli-shop-test.s3.eu-west-1.amazonaws.com',
37
- prod: 'https://zanichelli-shop.s3.eu-west-1.amazonaws.com',
38
- };
39
- async function getSubjectsByArea(searchEnv) {
40
- try {
41
- const response = await fetch(`${S3_SHOP_URL[searchEnv]}/categories.json`);
42
- if (!response.ok) {
43
- throw new Error(`HTTP ${response.status}`);
44
- }
45
- return await response.json();
46
- }
47
- catch (err) {
48
- console.error('Error fetching subjects:', err);
49
- return {};
50
- }
51
- }
52
-
53
- var AREA_LABELS;
54
- (function (AREA_LABELS) {
55
- AREA_LABELS["SCUOLA"] = "Scuola";
56
- AREA_LABELS["UNIVERSIT\u00C0"] = "Universit\u00E0";
57
- AREA_LABELS["GIURIDICO"] = "Giuridico";
58
- AREA_LABELS["DIZIONARI"] = "Dizionari";
59
- AREA_LABELS["SAGGISTICA"] = "Saggistica";
60
- })(AREA_LABELS || (AREA_LABELS = {}));
61
- const AREA_ORDER = Object.keys(AREA_LABELS);
62
- function buildSuggestions(query, subjectsByArea, selectedArea) {
63
- const matchingSubjectAreas = findSubjectAreas(query, subjectsByArea);
64
- const hasSubject = matchingSubjectAreas.length > 0;
65
- const subject = hasSubject ? query.toUpperCase() : undefined;
66
- const suggestions = [];
67
- if (selectedArea)
68
- suggestions.push(buildWordSuggestion(query, selectedArea));
69
- suggestions.push(buildWordSuggestion(query));
70
- if (hasSubject) {
71
- if (selectedArea) {
72
- const orderedSubjectAreas = [
73
- ...matchingSubjectAreas.filter((area) => area === selectedArea),
74
- ...matchingSubjectAreas
75
- .filter((area) => area !== selectedArea)
76
- .sort((a, b) => getAreaOrder(a) - getAreaOrder(b)),
77
- ];
78
- orderedSubjectAreas.forEach((area) => suggestions.push(buildSubjectSuggestion(query, area, subject)));
79
- }
80
- else {
81
- matchingSubjectAreas
82
- .sort((a, b) => getAreaOrder(a) - getAreaOrder(b))
83
- .forEach((subjectArea) => suggestions.push(buildSubjectSuggestion(query, subjectArea, subject)));
84
- }
85
- }
86
- return suggestions;
87
- }
88
- const buildWordSuggestion = (user_query, area) => {
89
- return {
90
- id: buildId(`word-${user_query}-${area}`),
91
- label: buildLabel(user_query, area),
92
- aria_label: buildAriaLabel(user_query, area, false),
93
- url: buildUrl({ q: user_query, ...(area ? { area } : {}), user_query }),
94
- ...buildDetail(user_query, user_query, area),
95
- };
96
- };
97
- const buildSubjectSuggestion = (user_query, area, subject) => {
98
- return {
99
- id: buildId(`subj-${user_query}-${area}-${subject}`),
100
- label: buildLabel(user_query, area),
101
- aria_label: buildAriaLabel(user_query, area, true),
102
- url: buildUrl({ area, materia: subject, user_query }),
103
- ...buildDetail(user_query, undefined, area, subject),
104
- };
105
- };
106
- const buildId = (string) => string
107
- .split('')
108
- .map((c) => c.charCodeAt(0).toString(16))
109
- .join('');
110
- const buildUrl = (params) => {
111
- return `/ricerca?${new URLSearchParams(params).toString()}`;
112
- };
113
- const buildDetail = (user_query, query, area, subject) => ({
114
- user_query,
115
- ...(query ? { query } : {}),
116
- ...(area ? { area } : {}),
117
- ...(subject ? { subject } : {}),
118
- });
119
- const buildLabel = (user_query, area) => {
120
- return `<mark>${user_query}</mark> in <strong>${area ? `${AREA_LABELS[area] ?? area}` : `tutto il sito`}</strong>`;
121
- };
122
- const buildAriaLabel = (user_query, area, isSubject = false) => {
123
- return `Cerca la ${isSubject ? `materia` : `parola`} ${user_query} ${area ? `nel catalogo ${AREA_LABELS[area] ?? area}` : `in tutto il sito`}`;
124
- };
125
- function findSubjectAreas(query, subjectsByArea) {
126
- const cleanedQuery = cleanSearch(query);
127
- return Object.entries(subjectsByArea)
128
- .filter(([, subjects]) => subjects.some((subject) => subject.toLowerCase() === cleanedQuery))
129
- .map(([area]) => area);
130
- }
131
- /** Clear search string: lowercase, remove multiple spaces */
132
- const cleanSearch = (s) => s.toLowerCase().replace(/\s+/g, ' ');
133
- const getAreaOrder = (area) => {
134
- const index = AREA_ORDER.indexOf(area);
135
- return index >= 0 ? index : 100;
136
- };
137
-
138
- const searchFormCss = ":host,*,::before,::after{box-sizing:border-box}*:focus:focus-visible{box-shadow:var(--shadow-focus-primary);outline:none}button{all:unset;cursor:pointer}.searchbar{--searchbar-button-x-padding:14px;--searchbar-button-icon-width:1.75rem;--closed-searchbar-width:calc((var(--searchbar-button-x-padding) * 2) + var(--searchbar-button-icon-width) + 1px);position:absolute;z-index:5;top:0;right:0;display:flex;width:var(--closed-searchbar-width);height:3rem;justify-content:flex-end;transition:width 0.4s ease-in-out}.searchbar.searchbar-open{width:100%}.searchbar .input-wrapper{display:flex;overflow:hidden;width:100%;align-items:center;padding:8px;padding-left:var(--grid-margin);background-color:#fff;gap:8px;transition-duration:0.4s;transition-property:padding-right, padding-left, width;transition-timing-function:ease-in-out}.searchbar:not(.searchbar-open) .input-wrapper{overflow:hidden;width:0;padding:0}.searchbar button[type='reset']{--z-icon-width:1rem;--z-icon-height:1rem;display:flex;align-items:center;cursor:pointer}.searchbar input{z-index:1;width:100%;height:100%;padding:0;border:none;background-color:#fff;font-family:var(--font-family-sans);font-size:1rem}.searchbar.searchbar-open input:first-child{padding-left:4px;margin-left:-4px;}.searchbar input[type='search']::-webkit-search-cancel-button,.searchbar input[type='search']::-webkit-search-decoration{appearance:none}.searchbar input::placeholder{color:var(--gray500)}.searchbar .searchbar-button{display:flex;align-items:center;justify-content:center;padding:10px var(--searchbar-button-x-padding);border-left:1px solid #000;background:var(--zanit-accent-color);font-family:inherit;font-size:inherit;gap:64px;line-height:1}.searchbar .searchbar-button:focus-visible{z-index:1}.searchbar-button z-icon{--z-icon-width:var(--searchbar-button-icon-width);--z-icon-height:var(--searchbar-button-icon-width)}.suggestions-wrapper{position:absolute;z-index:4;top:3rem;left:50%;width:100vw;border-top:1px solid var(--gray200);margin-left:-50vw;background:#fff;box-shadow:var(--shadow-1)}.suggestions-wrapper.hidden{display:none}.suggestions{display:flex;width:100%;flex-direction:column;align-items:stretch;padding:var(--space-unit);margin:0 auto}.suggestion-head{padding:calc(var(--space-unit) * 0.75) var(--space-unit);color:var(--gray700);font-size:0.875rem;font-weight:var(--font-md);line-height:1.125rem}.suggestion{display:flex;padding:calc(var(--space-unit) * 0.75) var(--space-unit);color:var(--gray900);cursor:pointer;font-size:1rem;gap:var(--space-unit);line-height:1.5rem}.suggestion:hover,.suggestion[aria-selected='true']{background:var(--gray100)}.suggestion strong{font-weight:var(--font-bd)}.suggestion mark{background-color:var(--red50)}.suggestion z-icon{--z-icon-height:1.125rem;margin-top:0.125rem}.suggestions z-divider{margin:var(--space-unit) 0}@media (width < 1152px){.searchbar .searchbar-button>.searchbar-button-label{display:none}}@media (width >= 768px){.searchbar{--searchbar-button-x-padding:16px;--searchbar-button-icon-width:2rem}.searchbar .input-wrapper{gap:14px}.searchbar button[type='reset']{--z-icon-width:1.5rem;--z-icon-height:1.5rem}.searchbar input,.searchbar .searchbar-button{font-size:1.5rem}.searchbar .searchbar-button{padding:8px var(--searchbar-button-x-padding)}.suggestions{padding:var(--space-unit) calc(var(--space-unit) * 2)}}@media (width >= 1152px){.searchbar{--closed-searchbar-width:190px}}@media (width >= 1366px){.searchbar .searchbar-button{border-right:1px solid #000}.suggestions{max-width:1366px;padding:var(--space-unit) calc(var(--space-unit) * 3)}}";
139
-
140
- const ZanitSearchForm = /*@__PURE__*/ proxyCustomElement(class ZanitSearchForm extends H {
141
- constructor() {
142
- super();
143
- this.__registerHost();
144
- this.__attachShadow();
145
- this.search = createEvent(this, "search");
146
- this.resetSearch = createEvent(this, "resetSearch");
147
- }
148
- formElement;
149
- subjectsByArea = {};
150
- timer;
151
- get host() { return this; }
152
- /** Indicates whether the searchbar is visible and usable. */
153
- showSearchbar = false;
154
- /** Search query to apply. */
155
- _searchQuery = undefined;
156
- /** Search suggestions to show in the autocomplete dropdown. */
157
- suggestions = [];
158
- /** Active suggestion - used for keyboard navigation */
159
- activeSuggestion = '';
160
- /** Show suggestions list */
161
- showSuggestions = false;
162
- /** Initial search query */
163
- searchQuery = undefined;
164
- /** Environment for search suggestions */
165
- searchEnv = SearchEnv.PROD;
166
- /** Search area (e.g. "SCUOLA", "UNIVERSITÀ", "DIZIONARI"). */
167
- searchArea;
168
- onSearchQueryChange() {
169
- this._searchQuery = this.searchQuery;
170
- if (this.searchQuery) {
171
- this.openSearchbar();
172
- }
173
- this.resetSuggestions();
174
- }
175
- onSearchAreaChange() {
176
- this.resetSuggestions();
177
- }
178
- onShowSearchbarChange() {
179
- if (!this.showSearchbar) {
180
- this.showSuggestions = false;
181
- }
182
- }
183
- onShowSuggestionsChange() {
184
- this.activeSuggestion = '';
185
- }
186
- /** Emitted on search form submission. */
187
- search;
188
- resetSearch;
189
- async connectedCallback() {
190
- this.subjectsByArea = await getSubjectsByArea(this.searchEnv);
191
- this.showSearchbar = !!this.searchQuery;
192
- this._searchQuery = this.searchQuery;
193
- }
194
- /** Close open searchbar when clicking outside. */
195
- handleOutsideClick(event) {
196
- if (this.showSearchbar && this.host && !containsTarget(this.host, event)) {
197
- this.showSearchbar = false;
198
- }
199
- }
200
- /** Close the searchbar/suggestions when pressing Escape. */
201
- handleEsc(event) {
202
- if (!isEscKey(event)) {
203
- return;
204
- }
205
- if (this.showSuggestions) {
206
- this.showSuggestions = false;
207
- }
208
- else {
209
- this.showSearchbar = false;
210
- }
211
- }
212
- /** Close the searchbar/suggestions when pressing Tab. */
213
- handleTab(event) {
214
- if (!isTabKey(event)) {
215
- return;
216
- }
217
- this.showSuggestions = false;
218
- if (!containsTarget(this.host, event)) {
219
- this.showSearchbar = false;
220
- }
221
- }
222
- openSearchbar() {
223
- this.showSearchbar = true;
224
- setTimeout(() => {
225
- const searchbarInput = this.host.shadowRoot.querySelector('#searchbar-input');
226
- searchbarInput.focus({ preventScroll: true });
227
- }, 500);
228
- }
229
- resetSearchQuery() {
230
- this.searchQuery = undefined;
231
- this.resetSearch.emit();
232
- }
233
- resetSuggestions() {
234
- this.suggestions = [];
235
- this.showSuggestions = false;
236
- }
237
- handleInputChange(event) {
238
- this._searchQuery = event.target.value;
239
- if (!this._searchQuery) {
240
- this.searchQuery = undefined;
241
- }
242
- this.updateSuggestions();
243
- }
244
- updateSuggestions() {
245
- clearTimeout(this.timer);
246
- const query = (this._searchQuery || '').trim();
247
- if (query.length < 3) {
248
- this.resetSuggestions();
249
- return;
250
- }
251
- this.timer = setTimeout(() => {
252
- this.resetSuggestions();
253
- this.suggestions = buildSuggestions(query, this.subjectsByArea, this.searchArea?.toUpperCase());
254
- this.showSuggestions = true;
255
- }, 300);
256
- }
257
- onSearchSubmit(event) {
258
- event.preventDefault();
259
- if (!this._searchQuery) {
260
- return;
261
- }
262
- if (this.activeSuggestion) {
263
- const suggestion = this.suggestions.find((s) => s.id === this.activeSuggestion);
264
- if (suggestion) {
265
- this.submitSuggestionSearch(suggestion);
266
- this.showSuggestions = false;
267
- return;
268
- }
269
- }
270
- this.showSearchbar = false;
271
- const searchEv = this.search.emit({ query: this._searchQuery, area: this.searchArea });
272
- // do not submit the form if the event default behavior was prevented
273
- if (searchEv.defaultPrevented) {
274
- return;
275
- }
276
- this.formElement.submit();
277
- }
278
- submitSuggestionSearch(suggestion) {
279
- const ev = this.search.emit({
280
- user_query: suggestion.user_query,
281
- query: suggestion.query,
282
- area: suggestion.area,
283
- subject: suggestion.subject,
284
- });
285
- if (!ev.defaultPrevented) {
286
- window.location.href = suggestion.url;
287
- }
288
- }
289
- handleSuggestionsNav(event) {
290
- if (!isArrowDownKey(event) && !isArrowUpKey(event)) {
291
- return;
292
- }
293
- if (!this.suggestions.length) {
294
- return;
295
- }
296
- const options = this.suggestions.map((o) => o.id);
297
- if (!options.length) {
298
- return;
299
- }
300
- event.preventDefault();
301
- event.stopPropagation();
302
- if (!this.showSuggestions) {
303
- this.showSuggestions = true;
304
- }
305
- let nextId = null;
306
- const firstId = options[0];
307
- const lastId = options[options.length - 1];
308
- const currOption = options.indexOf(this.activeSuggestion);
309
- if (currOption < 0) {
310
- nextId = isArrowDownKey(event) ? firstId : lastId;
311
- }
312
- else {
313
- if (isArrowDownKey(event)) {
314
- nextId = options[currOption + 1] || lastId;
315
- }
316
- else {
317
- nextId = options[currOption - 1] || firstId;
318
- }
319
- }
320
- this.activeSuggestion = nextId;
321
- }
322
- renderSuggestions() {
323
- const renderHeading = (label, key) => (h("span", { key: key, class: "suggestion-head", "aria-hidden": "true" }, label));
324
- return (h("div", { class: { 'suggestions-wrapper': true, 'hidden': !this.showSuggestions || !this.suggestions.length }, onPointerOver: (e) => e.preventDefault() }, h("div", { id: "search-suggestions", class: "suggestions", role: "listbox", "aria-label": "Seleziona tra i suggerimenti" }, this.suggestions.map((suggestion, k) => {
325
- const items = [];
326
- if (k === 0) {
327
- items.push(renderHeading('Cerca la parola', 'word-head'));
328
- }
329
- else if (suggestion.subject && !this.suggestions[k - 1].subject) {
330
- items.push(h("z-divider", { "aria-hidden": "true" }));
331
- items.push(renderHeading('Cerca la materia', 'subj-head'));
332
- }
333
- items.push(h("span", { key: k, id: suggestion.id, class: "suggestion", role: "option", "aria-label": suggestion.aria_label, "aria-selected": this.activeSuggestion === suggestion.id ? 'true' : undefined, onClick: () => this.submitSuggestionSearch(suggestion) }, h("z-icon", { name: "left-magnifying-glass" }), h("span", { "aria-hidden": "true", innerHTML: suggestion.label })));
334
- return items;
335
- }))));
336
- }
337
- render() {
338
- return (h(Host, { key: '9535c68b8cd3e76a55785cb993bed5026f84a589' }, h("form", { key: '26271b8f9034b3ea64bbea6ff413e75d0e857612', class: { 'searchbar': true, 'searchbar-open': this.showSearchbar }, ref: (el) => (this.formElement = el), role: "search", "aria-label": "Cerca nel sito", method: "get", action: "/ricerca", onSubmit: (event) => this.onSearchSubmit(event), onReset: () => this.resetSearchQuery() }, !!this.searchArea && (h("input", { key: '90e9dc4252a02a00db5160d374bd4ea42c4dce17', type: "hidden", name: "area", value: this.searchArea })), h("div", { key: '6189f91f8cbf9086c1dcddac5a1b649065d4319c', class: "input-wrapper", role: "none" }, this.searchQuery && (h("button", { key: '6292dc5e90576b49993ed15d908c675b501568d9', type: "reset", "aria-label": "Svuota campo di ricerca", disabled: !this.showSearchbar, "aria-hidden": !this.showSearchbar ? 'true' : undefined, tabIndex: !this.showSearchbar ? -1 : 0 }, h("z-icon", { key: '67f07f13b459afad718d2687f5feea4271d6ec6a', name: "multiply-circled" }))), h("input", { key: 'ee4f88993f3bf1ba768eaf1b6ff63cd346bd552e', id: "searchbar-input", name: "q", type: "search", disabled: !this.showSearchbar, placeholder: "Cerca per parola chiave o ISBN", value: this.searchQuery, required: true, autocomplete: "off", role: "combobox", "aria-autocomplete": "list", "aria-expanded": this.showSuggestions ? 'true' : 'false', "aria-controls": "search-suggestions", "aria-activedescendant": this.activeSuggestion, "aria-label": "Cerca per parola chiave o ISBN", "aria-hidden": !this.showSearchbar ? 'true' : undefined, tabIndex: !this.showSearchbar ? -1 : 0, onInput: (event) => this.handleInputChange(event), onKeyDown: (e) => {
339
- // INFO: prevent ESC from clearing input
340
- if (isEscKey(e)) {
341
- e.preventDefault();
342
- }
343
- this.handleSuggestionsNav(e);
344
- } })), h("button", { key: '4e0feaeaff7bcecaf6a29409a6accac895810fdf', class: "searchbar-button", "aria-label": this.showSearchbar ? 'Esegui ricerca' : 'Apri il campo di ricerca', "aria-controls": "searchbar-input", type: this.showSearchbar ? 'submit' : 'button', onClick: () => this.openSearchbar() }, this.showSearchbar ? null : h("span", { class: "searchbar-button-label" }, "Cerca"), h("z-icon", { key: '49eec7e6f04c34df57fcf99f405d1c3ada1fcdfb', name: "search" }))), this.renderSuggestions()));
345
- }
346
- static get watchers() { return {
347
- "searchQuery": ["onSearchQueryChange"],
348
- "searchArea": ["onSearchAreaChange"],
349
- "showSearchbar": ["onShowSearchbarChange"],
350
- "showSuggestions": ["onShowSuggestionsChange"]
351
- }; }
352
- static get style() { return searchFormCss; }
353
- }, [1, "zanit-search-form", {
354
- "searchQuery": [1025, "search-query"],
355
- "searchEnv": [1, "search-env"],
356
- "searchArea": [1, "search-area"],
357
- "showSearchbar": [32],
358
- "_searchQuery": [32],
359
- "suggestions": [32],
360
- "activeSuggestion": [32],
361
- "showSuggestions": [32]
362
- }, [[5, "click", "handleOutsideClick"], [1, "keydown", "handleEsc"], [5, "keyup", "handleTab"]], {
363
- "searchQuery": ["onSearchQueryChange"],
364
- "searchArea": ["onSearchAreaChange"],
365
- "showSearchbar": ["onShowSearchbarChange"],
366
- "showSuggestions": ["onShowSuggestionsChange"]
367
- }]);
368
- function defineCustomElement() {
369
- if (typeof customElements === "undefined") {
370
- return;
371
- }
372
- const components = ["zanit-search-form"];
373
- components.forEach(tagName => { switch (tagName) {
374
- case "zanit-search-form":
375
- if (!customElements.get(tagName)) {
376
- customElements.define(tagName, ZanitSearchForm);
377
- }
378
- break;
379
- } });
380
- }
381
- defineCustomElement();
382
-
383
- export { SearchEnv as S, ZanitSearchForm as Z, containsTarget as c, defineCustomElement as d, moveFocus as m };
384
- //# sourceMappingURL=p-DqMqkNnl.js.map
385
-
386
- //# sourceMappingURL=p-DqMqkNnl.js.map
@@ -1 +0,0 @@
1
- {"file":"p-DqMqkNnl.js","mappings":"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","names":["__stencil_proxyCustomElement","HTMLElement"],"sources":["src/utils/utils.ts","src/utils/subjects.api.ts","src/components/menubar/search-form/suggestions.ts","src/components/menubar/search-form/search-form.css?tag=zanit-search-form&encapsulation=shadow","src/components/menubar/search-form/search-form.tsx"],"sourcesContent":["/**\n * Check if an element contains an event target by checking its composedPath.\n * Useful when an event target may come from a component's shadow DOM.\n */\nexport const containsTarget = (ancestor: HTMLElement, event: Event) => {\n return event\n .composedPath()\n .filter((el) => el !== document && el !== window.window)\n .some((el) => ancestor.contains(el as HTMLElement));\n};\n\n/** Move the focus to `next` element, set tabindex to 0 for `next` and -1 to `current`. */\nexport const moveFocus = (current: HTMLElement, next: HTMLElement) => {\n current.tabIndex = -1;\n next.tabIndex = 0;\n next.focus({ preventScroll: true });\n};\n\n/** Check if event key is ArrowUp */\nexport const isArrowUpKey = (event: KeyboardEvent) => event.key === 'ArrowUp';\n\n/** Check if event key is ArrowDown */\nexport const isArrowDownKey = (event: KeyboardEvent) => event.key === 'ArrowDown';\n\n/** Check if event key is Tab */\nexport const isTabKey = (event: KeyboardEvent) => event.key === 'Tab';\n\n/** Check if event key is Escape */\nexport const isEscKey = (event: KeyboardEvent) => event.key === 'Escape';\n","export enum SearchEnv {\n DEV = 'dev',\n TEST = 'test',\n PROD = 'prod',\n}\n\nconst S3_SHOP_URL: Record<string, string> = {\n dev: 'https://zanichelli-shop-dev.s3.eu-west-1.amazonaws.com',\n test: 'https://zanichelli-shop-test.s3.eu-west-1.amazonaws.com',\n prod: 'https://zanichelli-shop.s3.eu-west-1.amazonaws.com',\n};\n\nexport async function getSubjectsByArea(searchEnv: SearchEnv): Promise<Record<string, string[]>> {\n try {\n const response = await fetch(`${S3_SHOP_URL[searchEnv]}/categories.json`);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n return await response.json();\n } catch (err) {\n console.error('Error fetching subjects:', err);\n return {};\n }\n}\n","enum AREA_LABELS {\n SCUOLA = 'Scuola',\n UNIVERSITÀ = 'Università',\n GIURIDICO = 'Giuridico',\n DIZIONARI = 'Dizionari',\n SAGGISTICA = 'Saggistica',\n}\n\nconst AREA_ORDER = Object.keys(AREA_LABELS);\n\nexport type SearchSuggestion = {\n id: string;\n label: string;\n aria_label: string;\n url: string;\n user_query: string;\n query?: string;\n area?: string;\n subject?: string;\n};\n\nexport function buildSuggestions(\n query: string,\n subjectsByArea: Record<string, string[]>,\n selectedArea?: string\n): SearchSuggestion[] {\n const matchingSubjectAreas = findSubjectAreas(query, subjectsByArea);\n const hasSubject = matchingSubjectAreas.length > 0;\n const subject = hasSubject ? query.toUpperCase() : undefined;\n\n const suggestions: SearchSuggestion[] = [];\n\n if (selectedArea) suggestions.push(buildWordSuggestion(query, selectedArea));\n\n suggestions.push(buildWordSuggestion(query));\n\n if (hasSubject) {\n if (selectedArea) {\n const orderedSubjectAreas = [\n ...matchingSubjectAreas.filter((area) => area === selectedArea),\n ...matchingSubjectAreas\n .filter((area) => area !== selectedArea)\n .sort((a, b) => getAreaOrder(a) - getAreaOrder(b)),\n ];\n orderedSubjectAreas.forEach((area) => suggestions.push(buildSubjectSuggestion(query, area, subject)));\n } else {\n matchingSubjectAreas\n .sort((a, b) => getAreaOrder(a) - getAreaOrder(b))\n .forEach((subjectArea) => suggestions.push(buildSubjectSuggestion(query, subjectArea, subject)));\n }\n }\n\n return suggestions;\n}\n\nconst buildWordSuggestion = (user_query: string, area?: string): SearchSuggestion => {\n return {\n id: buildId(`word-${user_query}-${area}`),\n label: buildLabel(user_query, area),\n aria_label: buildAriaLabel(user_query, area, false),\n url: buildUrl({ q: user_query, ...(area ? { area } : {}), user_query }),\n ...buildDetail(user_query, user_query, area),\n };\n};\n\nconst buildSubjectSuggestion = (user_query: string, area: string, subject: string): SearchSuggestion => {\n return {\n id: buildId(`subj-${user_query}-${area}-${subject}`),\n label: buildLabel(user_query, area),\n aria_label: buildAriaLabel(user_query, area, true),\n url: buildUrl({ area, materia: subject, user_query }),\n ...buildDetail(user_query, undefined, area, subject),\n };\n};\n\nconst buildId = (string: string) =>\n string\n .split('')\n .map((c) => c.charCodeAt(0).toString(16))\n .join('');\n\nconst buildUrl = (params: Record<string, string>): string => {\n return `/ricerca?${new URLSearchParams(params).toString()}`;\n};\n\nconst buildDetail = (user_query: string, query?: string, area?: string, subject?: string) => ({\n user_query,\n ...(query ? { query } : {}),\n ...(area ? { area } : {}),\n ...(subject ? { subject } : {}),\n});\n\nconst buildLabel = (user_query: string, area?: string) => {\n return `<mark>${user_query}</mark> in <strong>${area ? `${AREA_LABELS[area] ?? area}` : `tutto il sito`}</strong>`;\n};\n\nconst buildAriaLabel = (user_query: string, area?: string, isSubject: boolean = false) => {\n return `Cerca la ${isSubject ? `materia` : `parola`} ${user_query} ${area ? `nel catalogo ${AREA_LABELS[area] ?? area}` : `in tutto il sito`}`;\n};\n\nfunction findSubjectAreas(query: string, subjectsByArea: Record<string, string[]>): string[] {\n const cleanedQuery = cleanSearch(query);\n return Object.entries(subjectsByArea)\n .filter(([, subjects]) => subjects.some((subject) => subject.toLowerCase() === cleanedQuery))\n .map(([area]) => area);\n}\n\n/** Clear search string: lowercase, remove multiple spaces */\nconst cleanSearch = (s: string) => s.toLowerCase().replace(/\\s+/g, ' ');\n\nconst getAreaOrder = (area: string) => {\n const index = AREA_ORDER.indexOf(area);\n return index >= 0 ? index : 100;\n};\n",":host,\n*,\n::before,\n::after {\n box-sizing: border-box;\n}\n\n*:focus:focus-visible {\n box-shadow: var(--shadow-focus-primary);\n outline: none;\n}\n\nbutton {\n all: unset;\n cursor: pointer;\n}\n\n.searchbar {\n --searchbar-button-x-padding: 14px;\n --searchbar-button-icon-width: 1.75rem;\n\n /* button horizontal padding + icon size + left border */\n --closed-searchbar-width: calc((var(--searchbar-button-x-padding) * 2) + var(--searchbar-button-icon-width) + 1px);\n\n position: absolute;\n z-index: 5;\n top: 0;\n right: 0;\n display: flex;\n width: var(--closed-searchbar-width);\n height: 3rem;\n justify-content: flex-end;\n transition: width 0.4s ease-in-out;\n}\n\n.searchbar.searchbar-open {\n width: 100%;\n}\n\n.searchbar .input-wrapper {\n display: flex;\n overflow: hidden;\n width: 100%;\n align-items: center;\n padding: 8px;\n padding-left: var(--grid-margin);\n background-color: #fff;\n gap: 8px;\n transition-duration: 0.4s;\n transition-property: padding-right, padding-left, width;\n transition-timing-function: ease-in-out;\n}\n\n.searchbar:not(.searchbar-open) .input-wrapper {\n overflow: hidden;\n width: 0;\n padding: 0;\n}\n\n.searchbar button[type='reset'] {\n --z-icon-width: 1rem;\n --z-icon-height: 1rem;\n\n display: flex;\n align-items: center;\n cursor: pointer;\n}\n\n.searchbar input {\n z-index: 1;\n width: 100%;\n height: 100%;\n padding: 0;\n border: none;\n background-color: #fff;\n font-family: var(--font-family-sans);\n font-size: 1rem;\n}\n\n.searchbar.searchbar-open input:first-child {\n padding-left: 4px;\n margin-left: -4px; /* per evitare che la focus shadow vada fuori dallo schermo */\n}\n\n.searchbar input[type='search']::-webkit-search-cancel-button,\n.searchbar input[type='search']::-webkit-search-decoration {\n appearance: none;\n}\n\n.searchbar input::placeholder {\n color: var(--gray500);\n}\n\n.searchbar .searchbar-button {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 10px var(--searchbar-button-x-padding);\n border-left: 1px solid #000;\n background: var(--zanit-accent-color);\n font-family: inherit;\n font-size: inherit;\n gap: 64px;\n line-height: 1;\n}\n\n.searchbar .searchbar-button:focus-visible {\n z-index: 1;\n}\n\n.searchbar-button z-icon {\n --z-icon-width: var(--searchbar-button-icon-width);\n --z-icon-height: var(--searchbar-button-icon-width);\n}\n\n.suggestions-wrapper {\n position: absolute;\n z-index: 4;\n top: 3rem;\n left: 50%;\n width: 100vw;\n border-top: 1px solid var(--gray200);\n margin-left: -50vw;\n background: #fff;\n box-shadow: var(--shadow-1);\n}\n\n.suggestions-wrapper.hidden {\n display: none;\n}\n\n.suggestions {\n display: flex;\n width: 100%;\n flex-direction: column;\n align-items: stretch;\n padding: var(--space-unit);\n margin: 0 auto;\n}\n\n.suggestion-head {\n padding: calc(var(--space-unit) * 0.75) var(--space-unit);\n color: var(--gray700);\n font-size: 0.875rem;\n font-weight: var(--font-md);\n line-height: 1.125rem;\n}\n\n.suggestion {\n display: flex;\n padding: calc(var(--space-unit) * 0.75) var(--space-unit);\n color: var(--gray900);\n cursor: pointer;\n font-size: 1rem;\n gap: var(--space-unit);\n line-height: 1.5rem;\n}\n\n.suggestion:hover,\n.suggestion[aria-selected='true'] {\n background: var(--gray100);\n}\n\n.suggestion strong {\n font-weight: var(--font-bd);\n}\n\n.suggestion mark {\n background-color: var(--red50);\n}\n\n.suggestion z-icon {\n --z-icon-height: 1.125rem;\n\n margin-top: 0.125rem;\n}\n\n.suggestions z-divider {\n margin: var(--space-unit) 0;\n}\n\n@media (width < 1152px) {\n .searchbar .searchbar-button > .searchbar-button-label {\n display: none;\n }\n}\n\n@media (width >= 768px) {\n .searchbar {\n --searchbar-button-x-padding: 16px;\n --searchbar-button-icon-width: 2rem;\n }\n\n .searchbar .input-wrapper {\n gap: 14px;\n }\n\n .searchbar button[type='reset'] {\n --z-icon-width: 1.5rem;\n --z-icon-height: 1.5rem;\n }\n\n .searchbar input,\n .searchbar .searchbar-button {\n font-size: 1.5rem;\n }\n\n .searchbar .searchbar-button {\n padding: 8px var(--searchbar-button-x-padding);\n }\n\n .suggestions {\n padding: var(--space-unit) calc(var(--space-unit) * 2);\n }\n}\n\n@media (width >= 1152px) {\n .searchbar {\n --closed-searchbar-width: 190px;\n }\n}\n\n@media (width >= 1366px) {\n .searchbar .searchbar-button {\n border-right: 1px solid #000;\n }\n\n .suggestions {\n max-width: 1366px;\n padding: var(--space-unit) calc(var(--space-unit) * 3);\n }\n}\n","import { Component, Element, Event, EventEmitter, h, Host, Listen, Prop, State, Watch } from '@stencil/core';\nimport { containsTarget, isArrowDownKey, isArrowUpKey, isEscKey, isTabKey, SearchEvent } from '../../../utils';\nimport { getSubjectsByArea, SearchEnv } from '../../../utils/subjects.api';\nimport { buildSuggestions, SearchSuggestion } from './suggestions';\n\n@Component({\n tag: 'zanit-search-form',\n styleUrl: 'search-form.css',\n shadow: true,\n})\nexport class ZanitSearchForm {\n private formElement: HTMLFormElement;\n private subjectsByArea: Record<string, string[]> = {};\n private timer: NodeJS.Timeout;\n\n @Element() host: HTMLZanitSearchFormElement;\n\n /** Indicates whether the searchbar is visible and usable. */\n @State()\n showSearchbar: boolean = false;\n\n /** Search query to apply. */\n @State()\n _searchQuery: string | undefined = undefined;\n\n /** Search suggestions to show in the autocomplete dropdown. */\n @State() suggestions: SearchSuggestion[] = [];\n\n /** Active suggestion - used for keyboard navigation */\n @State() activeSuggestion: string = '';\n\n /** Show suggestions list */\n @State() showSuggestions: boolean = false;\n\n /** Initial search query */\n @Prop({ mutable: true })\n searchQuery: string | undefined = undefined;\n\n /** Environment for search suggestions */\n @Prop() searchEnv: SearchEnv = SearchEnv.PROD;\n\n /** Search area (e.g. \"SCUOLA\", \"UNIVERSITÀ\", \"DIZIONARI\"). */\n @Prop() searchArea?: string | undefined;\n\n @Watch('searchQuery')\n onSearchQueryChange() {\n this._searchQuery = this.searchQuery;\n if (this.searchQuery) {\n this.openSearchbar();\n }\n this.resetSuggestions();\n }\n\n @Watch('searchArea')\n onSearchAreaChange() {\n this.resetSuggestions();\n }\n\n @Watch('showSearchbar')\n onShowSearchbarChange() {\n if (!this.showSearchbar) {\n this.showSuggestions = false;\n }\n }\n\n @Watch('showSuggestions')\n onShowSuggestionsChange() {\n this.activeSuggestion = '';\n }\n\n /** Emitted on search form submission. */\n @Event({ cancelable: true }) search: EventEmitter<SearchEvent>;\n\n @Event() resetSearch: EventEmitter<void>;\n\n async connectedCallback() {\n this.subjectsByArea = await getSubjectsByArea(this.searchEnv);\n this.showSearchbar = !!this.searchQuery;\n this._searchQuery = this.searchQuery;\n }\n\n /** Close open searchbar when clicking outside. */\n @Listen('click', { target: 'document', passive: true })\n handleOutsideClick(event: MouseEvent) {\n if (this.showSearchbar && this.host && !containsTarget(this.host, event)) {\n this.showSearchbar = false;\n }\n }\n\n /** Close the searchbar/suggestions when pressing Escape. */\n @Listen('keydown', { passive: true })\n handleEsc(event: KeyboardEvent) {\n if (!isEscKey(event)) {\n return;\n }\n\n if (this.showSuggestions) {\n this.showSuggestions = false;\n } else {\n this.showSearchbar = false;\n }\n }\n\n /** Close the searchbar/suggestions when pressing Tab. */\n @Listen('keyup', { target: 'document', passive: true })\n handleTab(event: KeyboardEvent) {\n if (!isTabKey(event)) {\n return;\n }\n\n this.showSuggestions = false;\n\n if (!containsTarget(this.host, event)) {\n this.showSearchbar = false;\n }\n }\n\n private openSearchbar() {\n this.showSearchbar = true;\n setTimeout(() => {\n const searchbarInput = this.host.shadowRoot.querySelector('#searchbar-input') as HTMLInputElement;\n searchbarInput.focus({ preventScroll: true });\n }, 500);\n }\n\n private resetSearchQuery() {\n this.searchQuery = undefined;\n this.resetSearch.emit();\n }\n\n private resetSuggestions() {\n this.suggestions = [];\n this.showSuggestions = false;\n }\n\n private handleInputChange(event: InputEvent) {\n this._searchQuery = (event.target as HTMLInputElement).value;\n if (!this._searchQuery) {\n this.searchQuery = undefined;\n }\n\n this.updateSuggestions();\n }\n\n private updateSuggestions() {\n clearTimeout(this.timer);\n\n const query = (this._searchQuery || '').trim();\n\n if (query.length < 3) {\n this.resetSuggestions();\n return;\n }\n\n this.timer = setTimeout(() => {\n this.resetSuggestions();\n this.suggestions = buildSuggestions(query, this.subjectsByArea, this.searchArea?.toUpperCase());\n this.showSuggestions = true;\n }, 300);\n }\n\n private onSearchSubmit(event: Event) {\n event.preventDefault();\n if (!this._searchQuery) {\n return;\n }\n\n if (this.activeSuggestion) {\n const suggestion = this.suggestions.find((s) => s.id === this.activeSuggestion);\n if (suggestion) {\n this.submitSuggestionSearch(suggestion);\n this.showSuggestions = false;\n return;\n }\n }\n\n this.showSearchbar = false;\n\n const searchEv = this.search.emit({ query: this._searchQuery, area: this.searchArea });\n // do not submit the form if the event default behavior was prevented\n if (searchEv.defaultPrevented) {\n return;\n }\n\n this.formElement.submit();\n }\n\n private submitSuggestionSearch(suggestion: SearchSuggestion) {\n const ev = this.search.emit({\n user_query: suggestion.user_query,\n query: suggestion.query,\n area: suggestion.area,\n subject: suggestion.subject,\n });\n if (!ev.defaultPrevented) {\n window.location.href = suggestion.url;\n }\n }\n\n private handleSuggestionsNav(event: KeyboardEvent) {\n if (!isArrowDownKey(event) && !isArrowUpKey(event)) {\n return;\n }\n\n if (!this.suggestions.length) {\n return;\n }\n\n const options = this.suggestions.map((o) => o.id);\n\n if (!options.length) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n if (!this.showSuggestions) {\n this.showSuggestions = true;\n }\n\n let nextId = null;\n const firstId = options[0];\n const lastId = options[options.length - 1];\n const currOption = options.indexOf(this.activeSuggestion);\n if (currOption < 0) {\n nextId = isArrowDownKey(event) ? firstId : lastId;\n } else {\n if (isArrowDownKey(event)) {\n nextId = options[currOption + 1] || lastId;\n } else {\n nextId = options[currOption - 1] || firstId;\n }\n }\n this.activeSuggestion = nextId;\n }\n\n private renderSuggestions() {\n const renderHeading = (label: string, key: string) => (\n <span\n key={key}\n class=\"suggestion-head\"\n aria-hidden=\"true\"\n >\n {label}\n </span>\n );\n\n return (\n <div\n class={{ 'suggestions-wrapper': true, 'hidden': !this.showSuggestions || !this.suggestions.length }}\n onPointerOver={(e) => e.preventDefault()}\n >\n <div\n id=\"search-suggestions\"\n class=\"suggestions\"\n role=\"listbox\"\n aria-label=\"Seleziona tra i suggerimenti\"\n >\n {this.suggestions.map((suggestion, k) => {\n const items = [];\n\n if (k === 0) {\n items.push(renderHeading('Cerca la parola', 'word-head'));\n } else if (suggestion.subject && !this.suggestions[k - 1].subject) {\n items.push(<z-divider aria-hidden=\"true\" />);\n items.push(renderHeading('Cerca la materia', 'subj-head'));\n }\n\n items.push(\n <span\n key={k}\n id={suggestion.id}\n class=\"suggestion\"\n role=\"option\"\n aria-label={suggestion.aria_label}\n aria-selected={this.activeSuggestion === suggestion.id ? 'true' : undefined}\n onClick={() => this.submitSuggestionSearch(suggestion)}\n >\n <z-icon name=\"left-magnifying-glass\" />\n <span\n aria-hidden=\"true\"\n innerHTML={suggestion.label}\n />\n </span>\n );\n\n return items;\n })}\n </div>\n </div>\n );\n }\n\n render() {\n return (\n <Host>\n <form\n class={{ 'searchbar': true, 'searchbar-open': this.showSearchbar }}\n ref={(el) => (this.formElement = el)}\n role=\"search\"\n aria-label=\"Cerca nel sito\"\n method=\"get\"\n action=\"/ricerca\"\n onSubmit={(event) => this.onSearchSubmit(event)}\n onReset={() => this.resetSearchQuery()}\n >\n {!!this.searchArea && (\n <input\n type=\"hidden\"\n name=\"area\"\n value={this.searchArea}\n />\n )}\n\n <div\n class=\"input-wrapper\"\n role=\"none\"\n >\n {this.searchQuery && (\n <button\n type=\"reset\"\n aria-label=\"Svuota campo di ricerca\"\n disabled={!this.showSearchbar}\n aria-hidden={!this.showSearchbar ? 'true' : undefined}\n tabIndex={!this.showSearchbar ? -1 : 0}\n >\n <z-icon name=\"multiply-circled\" />\n </button>\n )}\n <input\n id=\"searchbar-input\"\n name=\"q\"\n type=\"search\"\n disabled={!this.showSearchbar}\n placeholder=\"Cerca per parola chiave o ISBN\"\n value={this.searchQuery}\n required\n autocomplete=\"off\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={this.showSuggestions ? 'true' : 'false'}\n aria-controls=\"search-suggestions\"\n aria-activedescendant={this.activeSuggestion}\n aria-label=\"Cerca per parola chiave o ISBN\"\n aria-hidden={!this.showSearchbar ? 'true' : undefined}\n tabIndex={!this.showSearchbar ? -1 : 0}\n onInput={(event) => this.handleInputChange(event)}\n onKeyDown={(e) => {\n // INFO: prevent ESC from clearing input\n if (isEscKey(e)) {\n e.preventDefault();\n }\n\n this.handleSuggestionsNav(e);\n }}\n />\n </div>\n\n <button\n class=\"searchbar-button\"\n aria-label={this.showSearchbar ? 'Esegui ricerca' : 'Apri il campo di ricerca'}\n aria-controls=\"searchbar-input\"\n type={this.showSearchbar ? 'submit' : 'button'}\n onClick={() => this.openSearchbar()}\n >\n {this.showSearchbar ? null : <span class=\"searchbar-button-label\">Cerca</span>}\n <z-icon name=\"search\"></z-icon>\n </button>\n </form>\n\n {this.renderSuggestions()}\n </Host>\n );\n }\n}\n"],"version":3}
@@ -1 +0,0 @@
1
- {"file":"zanit-back-to-top.js","mappings":";;AAAA,MAAM,YAAY,GAAG,uQAAuQ;;MCY/Q,YAAY,iBAAAA,kBAAA,CAAA,MAAA,YAAA,SAAAC,CAAA,CAAA;;;;;AACf,IAAA,cAAc;AACd,IAAA,gBAAgB;;;IAMxB,OAAO,GAAY,KAAK;;AAIxB,IAAA,iBAAiB;;IAIjB,QAAQ,GAAY,KAAK;;IAIzB,aAAa,GAAW,IAAI;;IAI5B,eAAe,GAAW,GAAG;IAG7B,YAAY,GAAA;QACV,IAAI,CAAC,mBAAmB,EAAE;;IAGpB,YAAY,GAAG,MAAK;AAC1B,QAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY;AAC5C,QAAA,IAAI,SAAS,KAAK,IAAI,CAAC,iBAAiB,EAAE;AACxC,YAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS;YAClC,IAAI,CAAC,mBAAmB,EAAE;;AAE9B,KAAC;IAED,iBAAiB,GAAA;QACf,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY;QACnD,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC;QAC3D,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC1C,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC;AAC/D,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAChF,IAAI,CAAC,mBAAmB,EAAE;QAE1B,MAAM,gBAAgB,GAAG,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC;AAC7D,QAAA,IAAI,CAAC,QAAQ,GAAG,gBAAgB,CAAC,OAAO;AACxC,QAAA,gBAAgB,CAAC,QAAQ,GAAG,CAAC,GAAG,KAAI;AAClC,YAAA,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,OAAO;AAC7B,SAAC;;IAGH,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;AAChC,QAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;;IAG5B,mBAAmB,GAAA;AACzB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,aAAa,IAAI,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,eAAe;;IAG7F,MAAM,GAAA;AACZ,QAAA,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;;IAGjD,MAAM,GAAA;QACJ,QACE,CAAC,CAAA,IAAI,EACH,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAA,aAAA,EACnB,IAAI,CAAC,OAAO,GAAG,OAAO,GAAG,MAAM,EAAA,EAE5C,CACE,CAAA,QAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAC1D,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,EAAA,EAE5B,CAAQ,CAAA,QAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,IAAI,EAAC,UAAU,EAAG,CAAA,EAC1B,CAAqB,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,EAAA,UAAA,CAAA,CACd,CACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":["__stencil_proxyCustomElement","HTMLElement"],"sources":["src/components/back-to-top/back-to-top.css?tag=zanit-back-to-top&encapsulation=scoped","src/components/back-to-top/back-to-top.tsx"],"sourcesContent":[":host {\n opacity: 1;\n transition: all 0.2s linear;\n visibility: visible;\n}\n\n:host.hidden {\n opacity: 0;\n visibility: hidden;\n}\n\n:host .z-fab {\n --color-primary01: var(--gray950);\n\n outline: 1px solid var(--color-white);\n}\n","import { Component, Element, Host, Listen, Prop, State, h } from '@stencil/core';\n\n/**\n * Back to top floating action button component.\n * Appears on scroll, given a min height for both scroll height and page height.\n */\n@Component({\n tag: 'zanit-back-to-top',\n styleUrls: ['back-to-top.css'],\n shadow: false,\n scoped: true,\n})\nexport class ZanitBackTop {\n private resizeObserver: ResizeObserver;\n private mutationObserver: MutationObserver;\n\n @Element() host: HTMLZanitBackToTopElement;\n\n /** Indicates whether the back-to-top button is visible and usable. */\n @State()\n showFab: boolean = false;\n\n /** Indicates the current height of the page. */\n @State()\n currentPageHeight: number;\n\n /** Indicates if the viewport is mobile. */\n @State()\n isMobile: boolean = false;\n\n /** Min page height from which the back-to-top button must appear. */\n @Prop()\n pageMinHeight: number = 1600;\n\n /** Min scroll height from which the back-to-top button must appear. */\n @Prop()\n scrollMinHeight: number = 800;\n\n @Listen('scroll', { target: 'window', passive: true })\n handleScroll() {\n this.updateFabVisibility();\n }\n\n private handleResize = () => {\n const newHeight = document.body.scrollHeight;\n if (newHeight !== this.currentPageHeight) {\n this.currentPageHeight = newHeight;\n this.updateFabVisibility();\n }\n };\n\n connectedCallback() {\n this.currentPageHeight = document.body.scrollHeight;\n this.resizeObserver = new ResizeObserver(this.handleResize);\n this.resizeObserver.observe(document.body);\n this.mutationObserver = new MutationObserver(this.handleResize);\n this.mutationObserver.observe(document.body, { childList: true, subtree: true });\n this.updateFabVisibility();\n\n const mobileMediaQuery = window.matchMedia('(width < 768px)');\n this.isMobile = mobileMediaQuery.matches;\n mobileMediaQuery.onchange = (mql) => {\n this.isMobile = mql.matches;\n };\n }\n\n disconnectedCallback() {\n this.resizeObserver.disconnect();\n this.mutationObserver.disconnect();\n }\n\n private updateFabVisibility() {\n this.showFab = this.currentPageHeight > this.pageMinHeight && window.scrollY > this.scrollMinHeight;\n }\n\n private scroll() {\n window.scrollTo({ top: 0, behavior: 'smooth' });\n }\n\n render() {\n return (\n <Host\n class={{ hidden: !this.showFab }}\n aria-hidden={this.showFab ? 'false' : 'true'}\n >\n <button\n class={{ 'z-fab': true, 'z-fab-extended': !this.isMobile }}\n onClick={() => this.scroll()}\n >\n <z-icon name=\"back-top\" />\n <span>Torna su</span>\n </button>\n </Host>\n );\n }\n}\n"],"version":3}
@@ -1 +0,0 @@
1
- {"file":"zanit-menubar.js","mappings":"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","names":["ZanitMenubar","__stencil_proxyCustomElement","HTMLElement"],"sources":["src/components/menubar/menubar.css?tag=zanit-menubar&encapsulation=shadow","src/components/menubar/menu/menu.css?tag=zanit-menubar&encapsulation=shadow","src/components/menubar/menubar.tsx"],"sourcesContent":[":host {\n --zanit-menubar-max-width: ;\n --zanit-menubar-top-offset: ;\n\n position: relative;\n z-index: 2;\n display: flex;\n width: 100%;\n background-color: #fff;\n color: var(--gray900);\n font-family: var(--font-family-sans);\n}\n\n:host,\n*,\n::before,\n::after {\n box-sizing: border-box;\n}\n\n*:focus:focus-visible {\n box-shadow: var(--shadow-focus-primary);\n outline: none;\n}\n\nul {\n padding: 0;\n margin: 0;\n list-style: none;\n}\n\na {\n color: var(--gray900);\n cursor: pointer;\n text-decoration: none;\n}\n\nbutton {\n all: unset;\n cursor: pointer;\n}\n\n:host nav {\n width: 100%;\n}\n\n.shadow-wrapper {\n position: relative;\n z-index: 1;\n display: flex;\n width: 100%;\n}\n\n.shadow-wrapper::after {\n position: absolute;\n top: 0;\n right: 0;\n width: 100%;\n height: 100%;\n background: transparent;\n box-shadow: var(--shadow-1);\n content: '';\n pointer-events: none;\n}\n\n.width-limiter {\n position: relative;\n display: flex;\n width: 100%;\n max-width: var(--zanit-menubar-max-width, 1366px);\n margin: 0 auto;\n}\n\n.shadow-wrapper + .shadow-wrapper {\n z-index: 0;\n}\n\n.sub-menubar > ul {\n gap: 28px;\n}\n\n.width-limiter > ul,\n.sub-menubar > ul {\n position: relative;\n z-index: 3;\n display: flex;\n width: 100%;\n align-items: center;\n padding: 0 var(--grid-margin);\n margin-right: auto;\n margin-left: auto;\n gap: 20px;\n}\n\n.shadow-wrapper > .width-limiter,\n.shadow-wrapper > ul {\n width: 100%;\n max-width: var(--zanit-menubar-max-width, 1366px);\n}\n\nul.menubar {\n height: 3rem;\n padding-right: 0;\n}\n\n.menubar z-ghost-loading {\n display: block;\n width: 120px;\n height: 1.25rem;\n}\n\n/* separator bar */\n.menubar > li[role='separator'] {\n width: 1px;\n height: 1.25rem;\n background-color: #000;\n}\n\n.menubar-item {\n position: relative;\n display: flex;\n align-items: center;\n padding: 14px 0;\n font-size: 1rem;\n gap: 8px;\n line-height: 1.25rem;\n}\n\n.menubar .menubar-item {\n text-transform: uppercase;\n}\n\n.menubar-item [data-text] {\n display: flex;\n flex-direction: column;\n}\n\n.menubar-item.active > [data-text],\n.menubar-item:hover > [data-text],\n.menubar-item:focus:focus-visible > [data-text] {\n font-weight: var(--font-bd);\n}\n\n/* To avoid size changes in the element, when it is hovered and becomes bold,\nwe put the same text already bold with height 0, so as to always occupy the maximum necessary width. */\n.menubar-item > [data-text]::after {\n height: 0;\n content: attr(data-text) / '';\n font-weight: var(--font-bd);\n letter-spacing: normal;\n pointer-events: none;\n user-select: none;\n visibility: hidden;\n}\n\n/* active item bottom border */\n.sub-menubar .menubar-item.active::after {\n position: absolute;\n z-index: -1;\n bottom: 0;\n left: -4px;\n width: calc(100% + 8px); /* the border is 4px per side larger than its container */\n height: 4px;\n background-color: var(--red500);\n content: '';\n}\n\nzanit-search-form {\n margin-left: auto;\n}\n",".menu-wrapper {\n width: 100%;\n background-color: #fff;\n}\n\n.menu {\n position: relative;\n display: flex;\n width: 100%;\n flex-direction: column;\n gap: 32px 0;\n}\n\n.menu .group {\n display: flex;\n flex-direction: column;\n}\n\n.menu .group .group-name {\n border-bottom: 1px solid currentcolor;\n margin-bottom: 4px;\n color: var(--red500);\n font-size: 0.875rem;\n font-weight: var(--font-md);\n}\n\n.menu .group .menu-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.menu .group .menu-list .menu-item {\n display: block;\n border-bottom: 2px solid transparent;\n font-size: 0.875rem;\n font-weight: var(--font-md);\n}\n\n.menu .menu-list .menu-item.active,\n.menu .menu-list .menu-item:hover {\n border-bottom-color: var(--red500);\n}\n\n.menu .group.highlight .menu-list .menu-item {\n font-size: 1rem;\n}\n\n@media (width >= 768px) {\n .menu-wrapper {\n position: absolute;\n top: 100%;\n left: 0;\n display: flex;\n justify-content: center;\n box-shadow: var(--shadow-1);\n }\n\n .menu {\n display: grid;\n width: 100%;\n max-width: var(--zanit-menubar-max-width, 1366px);\n padding: 16px var(--grid-margin);\n gap: 0 24px;\n grid-auto-columns: minmax(0, max-content);\n grid-auto-flow: column;\n grid-template-rows: minmax(0, max-content) max-content;\n }\n\n .menu .group {\n display: grid;\n grid-row: 1 / -1;\n grid-template-columns: 1fr;\n grid-template-rows: subgrid;\n }\n\n @supports not (grid-template-rows: subgrid) {\n .menu .group {\n grid-template-rows: repeat(auto-fit, minmax(0, max-content));\n }\n }\n\n .menu .group .group-name {\n border: none;\n margin-bottom: 16px;\n }\n\n .menu .group .menu-list .menu-item {\n font-size: 1rem;\n }\n\n .menu .group.highlight .menu-list .menu-item {\n font-size: 1.5rem;\n }\n}\n","import { Component, Element, Fragment, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { MenubarItem, containsTarget, moveFocus } from '../../utils';\nimport { Menu } from './menu/menu';\nimport { SearchEnv } from '../../utils/subjects.api';\n\n/**\n * Main menubar component. Each item can have a menu with subitems\n * When a main menubar item is the current active one, a sub-menubar is shown and each subitem can have a menu with subitems.\n * @cssprop {--zanit-menubar-max-width} Maximum width of the menubar.\n */\n@Component({\n tag: 'zanit-menubar',\n styleUrls: ['menubar.css', 'menu/menu.css'],\n shadow: {\n delegatesFocus: true,\n },\n})\nexport class ZanitMenubar {\n @Element() host: HTMLZanitMenubarElement;\n\n /** Menubar items extracted from `data`. */\n @State()\n items: MenubarItem[] = [];\n\n /** ID of the currently open menu. */\n @State()\n openMenu: string | undefined = undefined;\n\n /** ID of the item to show the subitems navbar for. */\n @State()\n openNavbar: string | undefined = undefined;\n\n /** IDs of the current prop */\n @State()\n currentPath: string[] = [];\n\n @State()\n isMobile: boolean = false;\n\n @State()\n loading: boolean = false;\n\n /** The data to build the menu (as an array of `MenubarItem` or a JSON array) or the url to fetch to retrieve it. */\n @Prop()\n data: Promise<MenubarItem[]> | MenubarItem[] | URL | string;\n\n /** Path of the current item. */\n @Prop()\n current: string | undefined = undefined;\n\n /** Initial search query. */\n @Prop({ mutable: true })\n searchQuery: string | undefined = undefined;\n\n /** Environment for search suggestions */\n @Prop() searchEnv: SearchEnv = SearchEnv.PROD;\n\n /** Search area (e.g. \"SCUOLA\", \"UNIVERSITÀ\", \"DIZIONARI\"). */\n @Prop() searchArea?: string | undefined;\n\n private timerId: number;\n\n /** Setup the list of items. */\n @Watch('data')\n async parseData(data: typeof this.data) {\n if (!data) {\n return;\n }\n\n if (data instanceof URL) {\n this.items = await this.fetchData(data);\n } else if (data instanceof Promise) {\n this.loading = true;\n this.items = await data;\n this.loading = false;\n } else if (typeof data === 'string') {\n try {\n this.items = JSON.parse(data);\n if (!Array.isArray(this.items) || !this.items?.every((item) => item satisfies MenubarItem)) {\n throw new Error('Expected an array of MenubarItem objects.');\n }\n } catch {\n let url: URL;\n try {\n url = new URL(data);\n } catch {\n throw new Error('Invalid string provided for `data` property: not a valid url or JSON.');\n }\n\n this.items = await this.fetchData(url);\n }\n } else if (Array.isArray(data) && data.every((item) => item satisfies MenubarItem)) {\n this.items = data;\n } else {\n throw new Error(\n 'Invalid `data` property value. Expected an url, a JSON or an array/promise of MenubarItem objects.'\n );\n }\n }\n\n @Watch('items')\n onItemsChange() {\n this.initTabindex();\n }\n\n @Watch('current')\n onCurrentChange() {\n this.currentPath = this.current?.split('/').filter(Boolean) || [];\n }\n\n async connectedCallback() {\n const mobileMediaQuery = window.matchMedia('(width < 768px)');\n this.isMobile = mobileMediaQuery.matches;\n mobileMediaQuery.onchange = (mql) => {\n this.isMobile = mql.matches;\n this.initTabindex();\n this.openMenu = undefined;\n };\n await this.parseData(this.data);\n this.onCurrentChange();\n this.initTabindex();\n }\n\n /** Close any open menu when clicking outside. */\n @Listen('click', { target: 'document', passive: true })\n handleOutsideClick(event: MouseEvent) {\n if (!this.openMenu || containsTarget(this.host, event)) {\n return;\n }\n\n this.openMenu = undefined;\n }\n\n /** Close any open menu when pressing Escape or Tab.\n * Uses document-level listener to ensure Escape works from any focus location within the menu.\n */\n @Listen('keydown', { target: 'document', passive: true })\n handleKeydown(event: KeyboardEvent) {\n switch (event.key) {\n case 'Escape': {\n if (this.openMenu) {\n event.preventDefault();\n // Return focus to the menu trigger after closing\n const menuTriggerId = this.openMenu;\n this.openMenu = undefined;\n // Use setTimeout(0) to defer focus until after Stencil's render cycle completes\n setTimeout(() => {\n const menuTrigger = this.host.shadowRoot.getElementById(menuTriggerId);\n if (menuTrigger) {\n menuTrigger.focus();\n }\n }, 0);\n }\n break;\n }\n case 'Tab':\n this.openMenu = undefined;\n break;\n }\n }\n\n @Listen('mouseover', { passive: true })\n handleMouseover() {\n clearTimeout(this.timerId);\n }\n\n /**\n * Automatically close any open menu on mouseout after with a little delay.\n * The delay is useful to avoid immediate closing when the pointer briefly leaves the component.\n */\n @Listen('mouseout', { passive: true })\n handleMouseout(event: MouseEvent) {\n this.timerId = window.setTimeout(() => {\n if (!this.openMenu || containsTarget(this.host, event)) {\n return;\n }\n\n this.openMenu = undefined;\n }, 500);\n }\n\n /** Close the menu when it loses focus. */\n @Listen('focusout', { passive: true })\n handleFocusout(event: FocusEvent) {\n const relatedTarget = event.relatedTarget as HTMLElement;\n if (!this.openMenu || this.host.shadowRoot.querySelector('.menu')?.contains(relatedTarget)) {\n return;\n }\n\n this.openMenu = undefined;\n }\n\n /** Fetch data from passed URL. */\n private async fetchData(url: URL) {\n try {\n this.loading = true;\n const data = await (await fetch(url)).json();\n this.loading = false;\n if (!Array.isArray(data) || !data.every((item) => item satisfies MenubarItem)) {\n throw new Error('Invalid data structure. Expected an array of MenuItem objects.');\n }\n\n return data as MenubarItem[];\n } catch (error) {\n this.loading = false;\n console.error('Error fetching menubar data:', error);\n throw new Error('Failed to fetch menubar data from the provided URL.', { cause: error });\n }\n }\n\n /** Initialize tabindex on menuitems of menubars, setting -1 to all but the first one. */\n private initTabindex() {\n setTimeout(() => {\n this.host.shadowRoot.querySelectorAll('[role=\"menubar\"]')?.forEach((menubar) => {\n menubar\n .querySelectorAll('[role=\"menuitem\"]')\n ?.forEach((item, index) => item.setAttribute('tabindex', index === 0 ? '0' : '-1'));\n });\n }, 100);\n }\n\n /** Indicates whether the element has to be highlighted by checking whether it is set as current or one of its descendants is. */\n private isActive(item: MenubarItem) {\n if (this.currentPath.length === 0) {\n return false;\n }\n\n if (this.currentPath.includes(item.id)) {\n return true;\n }\n\n if (item.menuItems?.length) {\n return item.menuItems.some((menuItem) => menuItem.id === this.current);\n }\n\n if (item.navbarItems?.length) {\n const isActive = item.navbarItems.some((navbarItem) => this.isActive(navbarItem));\n if (isActive) {\n return true;\n }\n }\n\n return false;\n }\n\n /** Opens the menu associated with the menubar `item`, if any. */\n private showMenu(item: MenubarItem) {\n this.openMenu = undefined; // close any open menu first\n if (!item.menuItems?.length) {\n return;\n }\n\n this.openMenu = item.id;\n }\n\n /** Get all elements with `menuitem` role inside parent's `menubar`. * */\n private getParentMenubarElements(itemEl: HTMLElement) {\n return Array.from(\n itemEl?.closest('[role=\"menubar\"]')?.querySelectorAll(':scope > li a[role=\"menuitem\"]') ?? []\n ) as HTMLElement[];\n }\n\n /** Move the focus to the previous menubar item, or the last one. Then open its menu if any other menu was open. */\n private focusPreviousItem(itemEl: HTMLElement) {\n this.openMenu = undefined; // close any open menu first\n const menubarElements = this.getParentMenubarElements(itemEl);\n const currentIndex = menubarElements.indexOf(itemEl);\n const prevItem = menubarElements[(currentIndex - 1 + menubarElements.length) % menubarElements.length]; // get previous item or last one\n moveFocus(itemEl, prevItem);\n // open the item's menu if any other menu was open\n if (prevItem.ariaHasPopup === 'true' && this.openMenu) {\n this.openMenu = prevItem.id;\n }\n }\n\n /** Move the focus to the next menubar item, or the first one. Then open its menu if any other menu was open. */\n private focusNextItem(itemEl: HTMLElement) {\n this.openMenu = undefined; // close any open menu first\n const menubarElements = this.getParentMenubarElements(itemEl);\n const currentIndex = menubarElements.indexOf(itemEl);\n const nextItem = menubarElements[(currentIndex + 1) % menubarElements.length]; // get next item or first one\n moveFocus(itemEl, nextItem);\n // open the item's menu if any other menu was open\n if (nextItem.ariaHasPopup === 'true' && this.openMenu) {\n this.openMenu = nextItem.id;\n }\n }\n\n /** Handles keyboard navigation on menubar items. */\n private handleItemKeydown(event: KeyboardEvent, item: MenubarItem) {\n const target = event.target as HTMLElement;\n switch (event.key) {\n case 'Home': {\n event.preventDefault();\n event.stopPropagation();\n const firstItem = this.getParentMenubarElements(target)[0];\n moveFocus(target, firstItem);\n break;\n }\n case 'End': {\n event.preventDefault();\n event.stopPropagation();\n const lastItem = this.getParentMenubarElements(target).pop();\n moveFocus(target, lastItem);\n break;\n }\n case 'ArrowUp': {\n if (!item.menuItems?.length) {\n break;\n }\n event.preventDefault();\n event.stopPropagation();\n this.openMenu = item.id;\n // focus last item of the menu\n setTimeout(() => {\n const menuItems = Array.from(\n this.host.shadowRoot.querySelectorAll(`[aria-labelledby=${item.id}] [role=\"menuitem\"]`)\n ) as HTMLElement[];\n moveFocus(target, menuItems[menuItems.length - 1]);\n }, 100);\n break;\n }\n case 'ArrowRight': {\n event.preventDefault();\n event.stopPropagation();\n this.focusNextItem(target);\n break;\n }\n case 'ArrowDown': {\n if (!item.menuItems?.length) {\n break;\n }\n\n this.openItemMenu(item);\n break;\n }\n case 'ArrowLeft': {\n event.preventDefault();\n event.stopPropagation();\n this.focusPreviousItem(target);\n break;\n }\n case ' ': {\n event.preventDefault();\n event.stopPropagation();\n if (this.openMenu === item.id) {\n this.openMenu = undefined;\n break;\n } else if (item.menuItems?.length) {\n this.openItemMenu(item);\n break;\n }\n }\n }\n }\n\n /** Get the previous element with `role=group`. */\n private getPreviousGroup(groupContainer: HTMLElement) {\n const groups = Array.from(\n groupContainer?.closest('[role=\"menu\"]')?.querySelectorAll('[role=\"group\"]') ?? []\n ) as HTMLElement[];\n const currentIndex = groups.indexOf(groupContainer);\n\n return groups[currentIndex - 1];\n }\n\n /** Get the next element with `role=group`. */\n private getNextGroup(groupContainer: HTMLElement) {\n const groups = Array.from(\n groupContainer?.closest('[role=\"menu\"]')?.querySelectorAll('[role=\"group\"]') ?? []\n ) as HTMLElement[];\n const currentIndex = groups.indexOf(groupContainer);\n\n return groups[currentIndex + 1];\n }\n\n private openItemMenu(item: MenubarItem) {\n this.openMenu = item.id;\n setTimeout(() => {\n // focus first item of the menu\n const firstMenuItem = this.host.shadowRoot.querySelector(\n `[aria-labelledby=${item.id}] [role=\"menuitem\"]`\n ) as HTMLElement;\n firstMenuItem.tabIndex = 0;\n firstMenuItem.focus({ preventScroll: true });\n }, 100);\n }\n\n /** Handles keyboard navigation events from `Menu` component. */\n private handleMenuKeydown(event: KeyboardEvent) {\n const itemElement = event.target as HTMLElement;\n const items = Array.from(\n itemElement.closest('[role=\"menu\"]')?.querySelectorAll('[role=\"menuitem\"]') ?? []\n ) as HTMLElement[];\n const currentIndex = items.indexOf(itemElement);\n switch (event.key) {\n case 'ArrowUp': {\n event.preventDefault();\n event.stopPropagation();\n const prevItem = items[currentIndex - 1] || items[items.length - 1];\n moveFocus(itemElement, prevItem);\n break;\n }\n // Move the focus to the first item of the next group if any, otherwise move it to the next menubar item\n case 'ArrowRight': {\n event.preventDefault();\n event.stopPropagation();\n const currentGroup = itemElement.closest('[role=group]') as HTMLElement;\n const nextGroup = this.getNextGroup(currentGroup);\n if (!nextGroup) {\n itemElement.tabIndex = -1;\n const menuTriggerId = itemElement.closest('[role=\"menu\"][aria-labelledby]').getAttribute('aria-labelledby');\n const focusedItem = this.host.shadowRoot.getElementById(menuTriggerId);\n this.focusNextItem(focusedItem);\n break;\n }\n\n const nextGroupItems = (nextGroup.querySelectorAll('[role=\"menuitem\"]') ?? []) as HTMLElement[];\n moveFocus(itemElement, nextGroupItems[0]);\n break;\n }\n case 'ArrowDown': {\n event.preventDefault();\n event.stopPropagation();\n const nextItem = items[currentIndex + 1] || items[0];\n moveFocus(itemElement, nextItem);\n break;\n }\n // Move the focus to the first item of the previous group if any, otherwise move it to the previous menubar item\n case 'ArrowLeft': {\n event.preventDefault();\n event.stopPropagation();\n const currentGroup = itemElement.closest('[role=group]') as HTMLElement;\n const prevGroup = this.getPreviousGroup(currentGroup);\n if (!prevGroup) {\n itemElement.tabIndex = -1;\n const menuTriggerId = itemElement.closest('[role=\"menu\"][aria-labelledby]').getAttribute('aria-labelledby');\n const focusedItem = this.host.shadowRoot.getElementById(menuTriggerId);\n this.focusPreviousItem(focusedItem);\n break;\n }\n\n const prevGroupItems = (prevGroup.querySelectorAll('[role=\"menuitem\"]') ?? []) as HTMLElement[];\n moveFocus(itemElement, prevGroupItems[0]);\n break;\n }\n case 'Home':\n // Move to the first menu item\n event.preventDefault();\n event.stopPropagation();\n moveFocus(itemElement, items[0]);\n break;\n case 'End':\n // Move to the last menu item\n event.preventDefault();\n event.stopPropagation();\n moveFocus(itemElement, items[items.length - 1]);\n break;\n }\n }\n\n render() {\n if (this.isMobile) {\n return (\n <zanit-mobile-menubar\n items={this.items}\n currentPath={this.currentPath}\n searchQuery={this.searchQuery}\n loading={this.loading}\n searchArea={this.searchArea}\n searchEnv={this.searchEnv}\n />\n );\n }\n\n return (\n <nav aria-label=\"Zanichelli.it\">\n <div class=\"shadow-wrapper\">\n <div class=\"width-limiter\">\n <ul\n class=\"menubar\"\n role=\"menubar\"\n aria-label=\"Zanichelli.it\"\n >\n {this.loading &&\n [...new Array(4)].map((_, index) => (\n <Fragment>\n <li role=\"none\">\n <div class=\"menubar-item\">\n <z-ghost-loading></z-ghost-loading>\n </div>\n </li>\n {index < 3 && <li role=\"separator\"></li>}\n </Fragment>\n ))}\n {this.items?.map((item, index) => (\n <Fragment>\n <li role=\"none\">\n <a\n class={{\n 'menubar-item': true,\n 'active': this.isActive(item),\n }}\n href={item.href}\n id={item.id}\n role=\"menuitem\"\n tabIndex={-1}\n aria-expanded={\n item.menuItems?.length ? (this.openMenu === item.id ? 'true' : 'false') : undefined\n }\n aria-haspopup={item.menuItems?.length ? 'true' : 'false'}\n aria-current={this.current.includes(item.id) ? 'page' : 'false'}\n onPointerOver={() => this.showMenu(item)}\n onKeyDown={(event) => this.handleItemKeydown(event, item)}\n target={item.target}\n >\n <span data-text={item.label}>{item.label}</span>\n {item.menuItems?.length > 0 && (\n <z-icon\n name={this.openMenu === item.id ? 'chevron-up' : 'chevron-down'}\n width=\"0.875rem\"\n height=\"0.875rem\"\n />\n )}\n </a>\n </li>\n {index < this.items?.length - 1 && <li role=\"separator\"></li>}\n </Fragment>\n ))}\n </ul>\n <zanit-search-form\n searchQuery={this.searchQuery}\n searchArea={this.searchArea}\n searchEnv={this.searchEnv}\n onResetSearch={() => (this.searchQuery = undefined)}\n />\n </div>\n\n {this.items.map(\n (item) =>\n this.openMenu === item.id && (\n <Menu\n controlledBy={item.id}\n items={item.menuItems}\n currentPath={this.currentPath}\n onItemKeyDown={(event) => this.handleMenuKeydown(event)}\n />\n )\n )}\n </div>\n\n {this.items\n ?.filter((item) => this.isActive(item))\n .map(\n (item) =>\n item.navbarItems?.length && (\n <nav\n class={{ 'sub-menubar': true, 'shadow-wrapper': true }}\n aria-label={`Sezioni: ${item.label}`}\n >\n <ul role=\"menubar\">\n {item.navbarItems.map((subitem) => (\n <Fragment>\n <li role=\"none\">\n <a\n class={{\n 'menubar-item': true,\n 'active': this.isActive(subitem),\n }}\n href={subitem.href}\n id={subitem.id}\n role=\"menuitem\"\n tabIndex={-1}\n aria-haspopup={subitem.menuItems?.length ? 'true' : 'false'}\n aria-expanded={\n subitem.menuItems?.length ? (this.openMenu === subitem.id ? 'true' : 'false') : undefined\n }\n aria-current={this.current.includes(subitem.id) ? 'page' : 'false'}\n onPointerOver={() => this.showMenu(subitem)}\n onKeyDown={(event) => this.handleItemKeydown(event, subitem)}\n target={item.target}\n >\n <span>{subitem.label}</span>\n {subitem.menuItems?.length > 0 && (\n <z-icon\n name={this.openMenu === subitem.id ? 'chevron-up' : 'chevron-down'}\n width=\"0.75rem\"\n height=\"0.75rem\"\n />\n )}\n </a>\n </li>\n </Fragment>\n ))}\n </ul>\n {item.navbarItems.map(\n (subitem) =>\n this.openMenu === subitem.id && (\n <Menu\n controlledBy={subitem.id}\n items={subitem.menuItems}\n currentPath={this.currentPath}\n onItemKeyDown={(event) => this.handleMenuKeydown(event)}\n />\n )\n )}\n </nav>\n )\n )}\n </nav>\n );\n }\n}\n"],"version":3}
@@ -1 +0,0 @@
1
- {"file":"zanit-mobile-menubar.js","mappings":";;;;;;;","names":[],"sources":[],"sourcesContent":[],"version":3}
@@ -1 +0,0 @@
1
- {"file":"zanit-search-form.js","mappings":";;;;;;;","names":[],"sources":[],"sourcesContent":[],"version":3}