@zanichelli/zanichelli-it-frontend-kit 1.0.0 → 1.0.3-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/dist/cjs/index-xkrZykI_.js +1532 -0
  2. package/dist/cjs/index-xkrZykI_.js.map +1 -0
  3. package/dist/cjs/index.cjs.js +5 -0
  4. package/dist/cjs/index.cjs.js.map +1 -0
  5. package/dist/cjs/loader.cjs.js +15 -0
  6. package/dist/cjs/loader.cjs.js.map +1 -0
  7. package/dist/cjs/zanichelli-it-frontend-kit.cjs.js +27 -0
  8. package/dist/cjs/zanichelli-it-frontend-kit.cjs.js.map +1 -0
  9. package/dist/cjs/zanit-menubar.zanit-mobile-menubar.zanit-search-form.entry.cjs.js.map +1 -0
  10. package/dist/cjs/zanit-menubar_3.cjs.entry.js +682 -0
  11. package/dist/cjs/zanit-menubar_3.cjs.entry.js.map +1 -0
  12. package/dist/collection/collection-manifest.json +14 -0
  13. package/dist/collection/components/menubar/menu/menu.css +95 -0
  14. package/dist/collection/components/menubar/menu/menu.js +38 -0
  15. package/dist/collection/components/menubar/menu/menu.js.map +1 -0
  16. package/dist/collection/components/menubar/menubar.css +167 -0
  17. package/{www/build/zanit-menubar.entry.js → dist/collection/components/menubar/menubar.js} +157 -25
  18. package/dist/collection/components/menubar/menubar.js.map +1 -0
  19. package/dist/collection/components/menubar/mobile-menubar/mobile-menubar.css +119 -0
  20. package/dist/collection/components/menubar/mobile-menubar/mobile-menubar.js +290 -0
  21. package/dist/collection/components/menubar/mobile-menubar/mobile-menubar.js.map +1 -0
  22. package/dist/collection/components/menubar/search-form/search-form.css +155 -0
  23. package/dist/collection/components/menubar/search-form/search-form.js +176 -0
  24. package/dist/collection/components/menubar/search-form/search-form.js.map +1 -0
  25. package/dist/collection/index.js +11 -0
  26. package/dist/collection/index.js.map +1 -0
  27. package/dist/collection/utils/index.js +2 -0
  28. package/dist/collection/utils/index.js.map +1 -0
  29. package/dist/{zanichelli-it-frontend-kit/utils-CaxAWyZI.js → collection/utils/utils.js} +3 -7
  30. package/dist/collection/utils/utils.js.map +1 -0
  31. package/dist/components/index.js +1290 -0
  32. package/dist/components/index.js.map +1 -0
  33. package/dist/components/p-B79OTwr-.js +133 -0
  34. package/dist/components/p-B79OTwr-.js.map +1 -0
  35. package/dist/components/p-DnMMUaAD.js +239 -0
  36. package/dist/components/p-DnMMUaAD.js.map +1 -0
  37. package/dist/{zanichelli-it-frontend-kit/zanit-menubar.entry.js → components/zanit-menubar.js} +56 -13
  38. package/dist/components/zanit-menubar.js.map +1 -0
  39. package/dist/components/zanit-mobile-menubar.js +9 -0
  40. package/dist/components/zanit-mobile-menubar.js.map +1 -0
  41. package/dist/components/zanit-search-form.js +9 -0
  42. package/dist/components/zanit-search-form.js.map +1 -0
  43. package/dist/esm/index-BWVQ0LD4.js +1504 -0
  44. package/dist/esm/index-BWVQ0LD4.js.map +1 -0
  45. package/dist/esm/index.js +4 -0
  46. package/dist/esm/index.js.map +1 -0
  47. package/dist/esm/loader.js +13 -0
  48. package/dist/esm/loader.js.map +1 -0
  49. package/dist/esm/zanichelli-it-frontend-kit.js +23 -0
  50. package/dist/esm/zanichelli-it-frontend-kit.js.map +1 -0
  51. package/dist/esm/zanit-menubar.zanit-mobile-menubar.zanit-search-form.entry.js.map +1 -0
  52. package/dist/esm/zanit-menubar_3.entry.js +678 -0
  53. package/dist/esm/zanit-menubar_3.entry.js.map +1 -0
  54. package/dist/index.cjs.js +1 -0
  55. package/dist/index.js +1 -0
  56. package/dist/types/components/menubar/menu/menu.d.ts +1 -1
  57. package/dist/types/components/menubar/menubar.d.ts +1 -1
  58. package/dist/types/components/menubar/mobile-menubar/mobile-menubar.d.ts +1 -1
  59. package/dist/types/components/menubar/search-form/search-form.d.ts +2 -1
  60. package/dist/types/components.d.ts +2 -2
  61. package/dist/types/utils/index.d.ts +2 -0
  62. package/dist/types/utils/types.d.ts +9 -11
  63. package/dist/zanichelli-it-frontend-kit/index.esm.js +0 -10
  64. package/dist/zanichelli-it-frontend-kit/index.esm.js.map +1 -1
  65. package/dist/zanichelli-it-frontend-kit/p-005efe36.entry.js +2 -0
  66. package/dist/zanichelli-it-frontend-kit/p-005efe36.entry.js.map +1 -0
  67. package/dist/zanichelli-it-frontend-kit/p-BWVQ0LD4.js +3 -0
  68. package/dist/zanichelli-it-frontend-kit/p-BWVQ0LD4.js.map +1 -0
  69. package/dist/zanichelli-it-frontend-kit/zanichelli-it-frontend-kit.css +1 -993
  70. package/dist/zanichelli-it-frontend-kit/zanichelli-it-frontend-kit.esm.js +1 -49
  71. package/dist/zanichelli-it-frontend-kit/zanichelli-it-frontend-kit.esm.js.map +1 -1
  72. package/dist/zanichelli-it-frontend-kit/zanit-menubar.zanit-mobile-menubar.zanit-search-form.entry.esm.js.map +1 -0
  73. package/package.json +1 -1
  74. package/www/build/index.esm.js +0 -10
  75. package/www/build/index.esm.js.map +1 -1
  76. package/www/build/p-005efe36.entry.js +2 -0
  77. package/www/build/p-005efe36.entry.js.map +1 -0
  78. package/www/build/p-750230e3.js +2 -0
  79. package/www/build/p-984b8fa6.css +1 -0
  80. package/www/build/p-BWVQ0LD4.js +3 -0
  81. package/www/build/p-BWVQ0LD4.js.map +1 -0
  82. package/www/build/zanichelli-it-frontend-kit.css +1 -993
  83. package/www/build/zanichelli-it-frontend-kit.esm.js +1 -49
  84. package/www/build/zanichelli-it-frontend-kit.esm.js.map +1 -1
  85. package/www/build/zanit-menubar.zanit-mobile-menubar.zanit-search-form.entry.esm.js.map +1 -0
  86. package/www/index.html +33 -50
  87. package/dist/zanichelli-it-frontend-kit/index-Cn3aX5eK.js +0 -4170
  88. package/dist/zanichelli-it-frontend-kit/index-Cn3aX5eK.js.map +0 -1
  89. package/dist/zanichelli-it-frontend-kit/menu-DZlhu_pe.js +0 -46
  90. package/dist/zanichelli-it-frontend-kit/menu-DZlhu_pe.js.map +0 -1
  91. package/dist/zanichelli-it-frontend-kit/utils-CaxAWyZI.js.map +0 -1
  92. package/dist/zanichelli-it-frontend-kit/zanit-menubar.entry.esm.js.map +0 -1
  93. package/dist/zanichelli-it-frontend-kit/zanit-menubar.entry.js.map +0 -1
  94. package/dist/zanichelli-it-frontend-kit/zanit-mobile-menubar.entry.esm.js.map +0 -1
  95. package/dist/zanichelli-it-frontend-kit/zanit-mobile-menubar.entry.js +0 -166
  96. package/dist/zanichelli-it-frontend-kit/zanit-mobile-menubar.entry.js.map +0 -1
  97. package/dist/zanichelli-it-frontend-kit/zanit-search-form.entry.esm.js.map +0 -1
  98. package/dist/zanichelli-it-frontend-kit/zanit-search-form.entry.js +0 -89
  99. package/dist/zanichelli-it-frontend-kit/zanit-search-form.entry.js.map +0 -1
  100. package/www/build/index-Cn3aX5eK.js +0 -4170
  101. package/www/build/index-Cn3aX5eK.js.map +0 -1
  102. package/www/build/menu-DZlhu_pe.js +0 -46
  103. package/www/build/menu-DZlhu_pe.js.map +0 -1
  104. package/www/build/utils-CaxAWyZI.js +0 -21
  105. package/www/build/utils-CaxAWyZI.js.map +0 -1
  106. package/www/build/zanit-menubar.entry.esm.js.map +0 -1
  107. package/www/build/zanit-menubar.entry.js.map +0 -1
  108. package/www/build/zanit-mobile-menubar.entry.esm.js.map +0 -1
  109. package/www/build/zanit-mobile-menubar.entry.js +0 -166
  110. package/www/build/zanit-mobile-menubar.entry.js.map +0 -1
  111. package/www/build/zanit-search-form.entry.esm.js.map +0 -1
  112. package/www/build/zanit-search-form.entry.js +0 -89
  113. package/www/build/zanit-search-form.entry.js.map +0 -1
@@ -0,0 +1,290 @@
1
+ import { h } from "@stencil/core";
2
+ import { Menu } from "../menu/menu";
3
+ import { containsTarget, moveFocus } from "../../../utils";
4
+ /** Mobile menubar component. */
5
+ export class ZanitMobileMenubar {
6
+ host;
7
+ /** IDs path of the current item. */
8
+ currentPath = [];
9
+ /** Menubar items. */
10
+ items = [];
11
+ /** Initial search query. */
12
+ searchQuery = undefined;
13
+ /** Whether the menubar is loading the data. */
14
+ loading = false;
15
+ /** Last active item ID. */
16
+ lastCurrent = undefined;
17
+ parentItem = undefined;
18
+ menuItems = undefined;
19
+ /** Whether the items to render come from a menubar or a menu. */
20
+ menuType = undefined;
21
+ open;
22
+ onItemsChange() {
23
+ this.lastCurrent = this.currentPath?.length ? this.currentPath[this.currentPath.length - 1] : undefined;
24
+ this.setupData(this.items);
25
+ }
26
+ /**
27
+ * Find the current item and take its parent, `menuItems` or the `navbarItems`.
28
+ */
29
+ setupData(items, parent) {
30
+ // If no current item is defined, we show all items
31
+ if (this.lastCurrent === undefined) {
32
+ this.parentItem = undefined;
33
+ this.menuType = 'menubar';
34
+ this.menuItems = items;
35
+ return;
36
+ }
37
+ for (const item of items) {
38
+ if (item.id === this.lastCurrent) {
39
+ this.parentItem = parent;
40
+ this.menuType = item.menuItems?.length ? 'menu' : 'menubar';
41
+ this.menuItems = item.menuItems || item.navbarItems;
42
+ return;
43
+ }
44
+ if (this.currentPath.length > 1 &&
45
+ item.id === this.currentPath[this.currentPath.length - 2] &&
46
+ item.menuItems?.some(({ id }) => id === this.lastCurrent)) {
47
+ this.parentItem = item;
48
+ this.menuType = item.menuItems?.length ? 'menu' : 'menubar';
49
+ this.menuItems = item.menuItems || item.navbarItems;
50
+ return;
51
+ }
52
+ if (item.navbarItems?.length) {
53
+ this.setupData(item.navbarItems, item);
54
+ }
55
+ }
56
+ }
57
+ get menuItemsElement() {
58
+ return Array.from(this.host.shadowRoot.querySelectorAll('[role="menuitem"]'));
59
+ }
60
+ /** Initialize tabindex on menuitems, setting -1 to all but the first one. */
61
+ initTabindex() {
62
+ this.menuItemsElement.forEach((item, index) => item.setAttribute('tabindex', index === 0 ? '0' : '-1'));
63
+ }
64
+ toggleMenu() {
65
+ if (this.open) {
66
+ this.open = false;
67
+ }
68
+ else {
69
+ this.open = true;
70
+ setTimeout(() => {
71
+ this.initTabindex();
72
+ this.menuItemsElement[0]?.focus();
73
+ }, 200);
74
+ }
75
+ }
76
+ /** Handles keyboard navigation on mobile menu. */
77
+ handleItemKeydown(event) {
78
+ switch (event.key) {
79
+ case 'ArrowUp': {
80
+ event.preventDefault();
81
+ event.stopPropagation();
82
+ const items = this.menuItemsElement;
83
+ const currentIndex = items.indexOf(event.target);
84
+ const prevItem = items[(currentIndex - 1 + items.length) % items.length];
85
+ moveFocus(items[currentIndex], prevItem);
86
+ break;
87
+ }
88
+ case 'ArrowDown': {
89
+ event.preventDefault();
90
+ event.stopPropagation();
91
+ const items = this.menuItemsElement;
92
+ const currentIndex = items.indexOf(event.target);
93
+ const nextItem = items[(currentIndex + 1) % items.length];
94
+ moveFocus(items[currentIndex], nextItem);
95
+ break;
96
+ }
97
+ case 'Home': {
98
+ event.preventDefault();
99
+ event.stopPropagation();
100
+ moveFocus(event.target, this.menuItemsElement[0]);
101
+ break;
102
+ }
103
+ case 'End': {
104
+ event.preventDefault();
105
+ event.stopPropagation();
106
+ moveFocus(event.target, this.menuItemsElement.pop());
107
+ break;
108
+ }
109
+ }
110
+ }
111
+ connectedCallback() {
112
+ this.lastCurrent = this.currentPath?.length ? this.currentPath[this.currentPath.length - 1] : undefined;
113
+ this.setupData(this.items);
114
+ }
115
+ /** Close the menu when clicking outside. */
116
+ handleOutsideClick(event) {
117
+ if (containsTarget(this.host, event)) {
118
+ return;
119
+ }
120
+ this.open = false;
121
+ }
122
+ /** Close the menu when pressing Escape or Tab. */
123
+ handleKeydown(event) {
124
+ switch (event.key) {
125
+ case 'Escape':
126
+ this.open = false;
127
+ break;
128
+ case 'Tab':
129
+ if (containsTarget(this.host, event)) {
130
+ break;
131
+ }
132
+ this.open = false;
133
+ break;
134
+ }
135
+ }
136
+ /** Close the menu when the focus goes out. */
137
+ handleFocusout(event) {
138
+ if (containsTarget(this.host, event)) {
139
+ return;
140
+ }
141
+ this.open = false;
142
+ }
143
+ render() {
144
+ return (h("nav", { key: 'ff09b71900eed2cfa8747a41d6ee8debb953beef', "aria-label": "Zanichelli.it" }, h("button", { key: '589b555269d7d247957131c820005cc7bf40160c', class: "burger-button", type: "button", "aria-expanded": this.open ? 'true' : 'false', "aria-controls": "mobile-menu", "aria-label": this.open ? 'Chiudi menù' : 'Apri menù', onClick: () => this.toggleMenu() }, h("z-icon", { key: '2e4f0258278c05edc059b7cd9e9de861c8b85f89', name: this.open ? 'multiply' : 'burger-menu', width: "1.5rem", height: "1.5rem" })), h("z-logo", { key: 'd157c94bbde6b834c86121591277e944993cf21e', imageAlt: "Logo Zanichelli", link: "/", height: 32, width: 126 }), h("zanit-search-form", { key: '5b1e3193102243668232ff5ebe2379bcd72306e4', searchQuery: this.searchQuery, onResetSearch: () => (this.searchQuery = undefined) }), this.open && (h("ul", { key: '9697268848890991281e3f6508e3b6c4e9df5f96', class: "mobile-menu", role: "menubar" }, !this.loading && this.currentPath && this.currentPath.length > 0 && (h("li", { key: '718ef3f0a0ba31a9a5639042bb0bebe938a85ae3', role: "none" }, h("a", { key: '0e7f3c3947c1acd0931682fd39db7f134859a185', class: "parent", href: this.parentItem?.href ?? '/', id: this.parentItem?.id ?? undefined, role: "menuitem", tabIndex: -1, onKeyDown: (event) => this.handleItemKeydown(event), target: this.parentItem?.target }, h("z-icon", { key: 'f0978efd2064c9ee872f6dfb85440616ae7f8a11', name: "arrow-left", width: "0.5rem", height: "0.5rem" }), h("span", { key: '56702e49f5a97feddeb66e6271bd898061aa0d48' }, this.parentItem?.label || 'Home')))), this.loading ? (h("div", { class: "items-container", role: "none" }, [...new Array(4)].map(() => (h("li", { role: "none" }, h("div", { class: "menubar-item", role: "none" }, h("z-ghost-loading", null))))))) : this.menuType === 'menu' ? (h(Menu, { items: this.menuItems, controlledBy: this.parentItem?.id, currentPath: this.currentPath, onItemKeyDown: (event) => this.handleItemKeydown(event) })) : (this.menuItems?.length > 0 && (h("div", { class: "items-container", role: "none" }, this.menuItems.map((item) => (h("li", { role: "none" }, h("a", { class: {
145
+ 'menu-item': this.menuType === 'menu',
146
+ 'menubar-item': this.menuType === 'menubar',
147
+ }, href: item.href, id: item.id, role: "menuitem", "aria-current": this.lastCurrent === item.id ? 'page' : 'false', tabIndex: -1, onKeyDown: (event) => this.handleItemKeydown(event), target: item.target }, h("span", { "data-text": item.label }, item.label))))))))))));
148
+ }
149
+ static get is() { return "zanit-mobile-menubar"; }
150
+ static get encapsulation() { return "shadow"; }
151
+ static get originalStyleUrls() {
152
+ return {
153
+ "$": ["mobile-menubar.css", "../menu/menu.css"]
154
+ };
155
+ }
156
+ static get styleUrls() {
157
+ return {
158
+ "$": ["mobile-menubar.css", "../menu/menu.css"]
159
+ };
160
+ }
161
+ static get properties() {
162
+ return {
163
+ "currentPath": {
164
+ "type": "unknown",
165
+ "attribute": "current-path",
166
+ "mutable": false,
167
+ "complexType": {
168
+ "original": "string[]",
169
+ "resolved": "string[]",
170
+ "references": {}
171
+ },
172
+ "required": false,
173
+ "optional": false,
174
+ "docs": {
175
+ "tags": [],
176
+ "text": "IDs path of the current item."
177
+ },
178
+ "getter": false,
179
+ "setter": false,
180
+ "defaultValue": "[]"
181
+ },
182
+ "items": {
183
+ "type": "unknown",
184
+ "attribute": "items",
185
+ "mutable": false,
186
+ "complexType": {
187
+ "original": "MenubarItem[]",
188
+ "resolved": "MenubarItem[]",
189
+ "references": {
190
+ "MenubarItem": {
191
+ "location": "import",
192
+ "path": "../../../utils",
193
+ "id": "src/utils/index.ts::MenubarItem"
194
+ }
195
+ }
196
+ },
197
+ "required": false,
198
+ "optional": false,
199
+ "docs": {
200
+ "tags": [],
201
+ "text": "Menubar items."
202
+ },
203
+ "getter": false,
204
+ "setter": false,
205
+ "defaultValue": "[]"
206
+ },
207
+ "searchQuery": {
208
+ "type": "string",
209
+ "attribute": "search-query",
210
+ "mutable": true,
211
+ "complexType": {
212
+ "original": "string | undefined",
213
+ "resolved": "string",
214
+ "references": {}
215
+ },
216
+ "required": false,
217
+ "optional": false,
218
+ "docs": {
219
+ "tags": [],
220
+ "text": "Initial search query."
221
+ },
222
+ "getter": false,
223
+ "setter": false,
224
+ "reflect": false,
225
+ "defaultValue": "undefined"
226
+ },
227
+ "loading": {
228
+ "type": "boolean",
229
+ "attribute": "loading",
230
+ "mutable": false,
231
+ "complexType": {
232
+ "original": "boolean",
233
+ "resolved": "boolean",
234
+ "references": {}
235
+ },
236
+ "required": false,
237
+ "optional": false,
238
+ "docs": {
239
+ "tags": [],
240
+ "text": "Whether the menubar is loading the data."
241
+ },
242
+ "getter": false,
243
+ "setter": false,
244
+ "reflect": false,
245
+ "defaultValue": "false"
246
+ }
247
+ };
248
+ }
249
+ static get states() {
250
+ return {
251
+ "lastCurrent": {},
252
+ "parentItem": {},
253
+ "menuItems": {},
254
+ "menuType": {},
255
+ "open": {}
256
+ };
257
+ }
258
+ static get elementRef() { return "host"; }
259
+ static get watchers() {
260
+ return [{
261
+ "propName": "items",
262
+ "methodName": "onItemsChange"
263
+ }, {
264
+ "propName": "currentPath",
265
+ "methodName": "onItemsChange"
266
+ }];
267
+ }
268
+ static get listeners() {
269
+ return [{
270
+ "name": "click",
271
+ "method": "handleOutsideClick",
272
+ "target": "document",
273
+ "capture": false,
274
+ "passive": true
275
+ }, {
276
+ "name": "keydown",
277
+ "method": "handleKeydown",
278
+ "target": undefined,
279
+ "capture": false,
280
+ "passive": true
281
+ }, {
282
+ "name": "focusin",
283
+ "method": "handleFocusout",
284
+ "target": "document",
285
+ "capture": false,
286
+ "passive": true
287
+ }];
288
+ }
289
+ }
290
+ //# sourceMappingURL=mobile-menubar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mobile-menubar.js","sourceRoot":"","sources":["../../../../src/components/menubar/mobile-menubar/mobile-menubar.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Element, h, Listen, Prop, State, Watch } from '@stencil/core';\nimport { MenubarItem, MenuItem } from '../../../utils';\nimport { Menu } from '../menu/menu';\nimport { containsTarget, moveFocus } from '../../../utils';\n\n/** Mobile menubar component. */\n@Component({\n tag: 'zanit-mobile-menubar',\n styleUrls: ['mobile-menubar.css', '../menu/menu.css'],\n shadow: true,\n})\nexport class ZanitMobileMenubar {\n @Element() host: HTMLZanitMobileMenubarElement;\n\n /** IDs path of the current item. */\n @Prop() currentPath: string[] = [];\n\n /** Menubar items. */\n @Prop() items: MenubarItem[] = [];\n\n /** Initial search query. */\n @Prop({ mutable: true }) searchQuery: string | undefined = undefined;\n\n /** Whether the menubar is loading the data. */\n @Prop() loading: boolean = false;\n\n /** Last active item ID. */\n @State() lastCurrent: string | undefined = undefined;\n @State() parentItem: MenubarItem | undefined = undefined;\n @State() menuItems: MenubarItem[] | MenuItem[] | undefined = undefined;\n /** Whether the items to render come from a menubar or a menu. */\n @State() menuType: 'menubar' | 'menu' | undefined = undefined;\n @State() open: boolean;\n\n @Watch('items')\n @Watch('currentPath')\n onItemsChange() {\n this.lastCurrent = this.currentPath?.length ? this.currentPath[this.currentPath.length - 1] : undefined;\n this.setupData(this.items);\n }\n\n /**\n * Find the current item and take its parent, `menuItems` or the `navbarItems`.\n */\n private setupData(items: MenubarItem[], parent?: MenubarItem) {\n // If no current item is defined, we show all items\n if (this.lastCurrent === undefined) {\n this.parentItem = undefined;\n this.menuType = 'menubar';\n this.menuItems = items;\n return;\n }\n\n for (const item of items) {\n if (item.id === this.lastCurrent) {\n this.parentItem = parent;\n this.menuType = item.menuItems?.length ? 'menu' : 'menubar';\n this.menuItems = item.menuItems || item.navbarItems;\n return;\n }\n\n if (\n this.currentPath.length > 1 &&\n item.id === this.currentPath[this.currentPath.length - 2] &&\n item.menuItems?.some(({ id }) => id === this.lastCurrent)\n ) {\n this.parentItem = item;\n this.menuType = item.menuItems?.length ? 'menu' : 'menubar';\n this.menuItems = item.menuItems || item.navbarItems;\n return;\n }\n\n if (item.navbarItems?.length) {\n this.setupData(item.navbarItems, item);\n }\n }\n }\n\n private get menuItemsElement() {\n return Array.from(this.host.shadowRoot.querySelectorAll('[role=\"menuitem\"]')) as HTMLElement[];\n }\n\n /** Initialize tabindex on menuitems, setting -1 to all but the first one. */\n private initTabindex() {\n this.menuItemsElement.forEach((item, index) => item.setAttribute('tabindex', index === 0 ? '0' : '-1'));\n }\n\n private toggleMenu() {\n if (this.open) {\n this.open = false;\n } else {\n this.open = true;\n setTimeout(() => {\n this.initTabindex();\n this.menuItemsElement[0]?.focus();\n }, 200);\n }\n }\n\n /** Handles keyboard navigation on mobile menu. */\n private handleItemKeydown(event: KeyboardEvent) {\n switch (event.key) {\n case 'ArrowUp': {\n event.preventDefault();\n event.stopPropagation();\n const items = this.menuItemsElement;\n const currentIndex = items.indexOf(event.target as HTMLElement);\n const prevItem = items[(currentIndex - 1 + items.length) % items.length];\n moveFocus(items[currentIndex], prevItem);\n break;\n }\n case 'ArrowDown': {\n event.preventDefault();\n event.stopPropagation();\n const items = this.menuItemsElement;\n const currentIndex = items.indexOf(event.target as HTMLElement);\n const nextItem = items[(currentIndex + 1) % items.length];\n moveFocus(items[currentIndex], nextItem);\n break;\n }\n case 'Home': {\n event.preventDefault();\n event.stopPropagation();\n moveFocus(event.target as HTMLElement, this.menuItemsElement[0]);\n break;\n }\n case 'End': {\n event.preventDefault();\n event.stopPropagation();\n moveFocus(event.target as HTMLElement, this.menuItemsElement.pop());\n break;\n }\n }\n }\n\n connectedCallback() {\n this.lastCurrent = this.currentPath?.length ? this.currentPath[this.currentPath.length - 1] : undefined;\n this.setupData(this.items);\n }\n\n /** Close the menu when clicking outside. */\n @Listen('click', { target: 'document', passive: true })\n handleOutsideClick(event: MouseEvent) {\n if (containsTarget(this.host, event)) {\n return;\n }\n\n this.open = false;\n }\n\n /** Close the menu when pressing Escape or Tab. */\n @Listen('keydown', { passive: true })\n handleKeydown(event: KeyboardEvent) {\n switch (event.key) {\n case 'Escape':\n this.open = false;\n break;\n case 'Tab':\n if (containsTarget(this.host, event)) {\n break;\n }\n\n this.open = false;\n break;\n }\n }\n\n /** Close the menu when the focus goes out. */\n @Listen('focusin', { target: 'document', passive: true })\n handleFocusout(event: FocusEvent) {\n if (containsTarget(this.host, event)) {\n return;\n }\n\n this.open = false;\n }\n\n render() {\n return (\n <nav aria-label=\"Zanichelli.it\">\n <button\n class=\"burger-button\"\n type=\"button\"\n aria-expanded={this.open ? 'true' : 'false'}\n aria-controls=\"mobile-menu\"\n aria-label={this.open ? 'Chiudi menù' : 'Apri menù'}\n onClick={() => this.toggleMenu()}\n >\n <z-icon\n name={this.open ? 'multiply' : 'burger-menu'}\n width=\"1.5rem\"\n height=\"1.5rem\"\n ></z-icon>\n </button>\n\n <z-logo\n imageAlt=\"Logo Zanichelli\"\n link=\"/\"\n height={32}\n width={126}\n ></z-logo>\n\n <zanit-search-form\n searchQuery={this.searchQuery}\n onResetSearch={() => (this.searchQuery = undefined)}\n />\n\n {this.open && (\n <ul\n class=\"mobile-menu\"\n role=\"menubar\"\n >\n {!this.loading && this.currentPath && this.currentPath.length > 0 && (\n <li role=\"none\">\n <a\n class=\"parent\"\n href={this.parentItem?.href ?? '/'}\n id={this.parentItem?.id ?? undefined}\n role=\"menuitem\"\n tabIndex={-1}\n onKeyDown={(event) => this.handleItemKeydown(event)}\n target={this.parentItem?.target}\n >\n <z-icon\n name=\"arrow-left\"\n width=\"0.5rem\"\n height=\"0.5rem\"\n ></z-icon>\n <span>\n {/* Show the 'Home' label if the current item is a root child. */}\n {this.parentItem?.label || 'Home'}\n </span>\n </a>\n </li>\n )}\n\n {this.loading ? (\n <div\n class=\"items-container\"\n role=\"none\"\n >\n {[...new Array(4)].map(() => (\n <li role=\"none\">\n <div\n class=\"menubar-item\"\n role=\"none\"\n >\n <z-ghost-loading></z-ghost-loading>\n </div>\n </li>\n ))}\n </div>\n ) : this.menuType === 'menu' ? (\n <Menu\n items={this.menuItems}\n controlledBy={this.parentItem?.id}\n currentPath={this.currentPath}\n onItemKeyDown={(event) => this.handleItemKeydown(event)}\n />\n ) : (\n this.menuItems?.length > 0 && (\n <div\n class=\"items-container\"\n role=\"none\"\n >\n {this.menuItems.map((item) => (\n <li role=\"none\">\n <a\n class={{\n 'menu-item': this.menuType === 'menu',\n 'menubar-item': this.menuType === 'menubar',\n }}\n href={item.href}\n id={item.id}\n role=\"menuitem\"\n aria-current={this.lastCurrent === item.id ? 'page' : 'false'}\n tabIndex={-1}\n onKeyDown={(event) => this.handleItemKeydown(event)}\n target={item.target}\n >\n <span data-text={item.label}>{item.label}</span>\n </a>\n </li>\n ))}\n </div>\n )\n )}\n </ul>\n )}\n </nav>\n );\n }\n}\n"]}
@@ -0,0 +1,155 @@
1
+ :host,
2
+ *,
3
+ ::before,
4
+ ::after {
5
+ box-sizing: border-box;
6
+ }
7
+
8
+ *:focus:focus-visible {
9
+ box-shadow: var(--shadow-focus-primary);
10
+ outline: none;
11
+ }
12
+
13
+ button {
14
+ all: unset;
15
+ cursor: pointer;
16
+ }
17
+
18
+ .searchbar {
19
+ --searchbar-button-x-padding: 14px;
20
+ --searchbar-button-icon-width: 1.75rem;
21
+
22
+ /* button horizontal padding + icon size + left border */
23
+ --closed-searchbar-width: calc((var(--searchbar-button-x-padding) * 2) + var(--searchbar-button-icon-width) + 1px);
24
+
25
+ position: absolute;
26
+ top: 0;
27
+ right: 0;
28
+ display: flex;
29
+ width: var(--closed-searchbar-width);
30
+ justify-content: flex-end;
31
+ transition: width 0.6s ease-in;
32
+ }
33
+
34
+ .searchbar.searchbar-open {
35
+ width: 100%;
36
+ }
37
+
38
+ .searchbar .input-wrapper {
39
+ display: flex;
40
+ overflow: hidden;
41
+ width: 100%;
42
+ align-items: center;
43
+ padding: 8px;
44
+ padding-left: var(--grid-margin);
45
+ background-color: #fff;
46
+ gap: 8px;
47
+ transition-duration: 0.4s;
48
+ transition-property: padding-right, padding-left, width;
49
+ transition-timing-function: ease-in;
50
+ }
51
+
52
+ .searchbar:not(.searchbar-open) .input-wrapper {
53
+ overflow: hidden;
54
+ width: 0;
55
+ padding: 0;
56
+ }
57
+
58
+ .searchbar button[type='reset'] {
59
+ --z-icon-width: 1rem;
60
+ --z-icon-height: 1rem;
61
+
62
+ display: flex;
63
+ align-items: center;
64
+ cursor: pointer;
65
+ }
66
+
67
+ .searchbar input {
68
+ z-index: 1;
69
+ width: 100%;
70
+ height: 100%;
71
+ padding: 0;
72
+ border: none;
73
+ background-color: #fff;
74
+ font-family: var(--font-family-sans);
75
+ font-size: 1rem;
76
+ }
77
+
78
+ .searchbar.searchbar-open input:first-child {
79
+ padding-left: 4px;
80
+ margin-left: -4px; /* per evitare che la focus shadow vada fuori dallo schermo */
81
+ }
82
+
83
+ .searchbar input[type='search']::-webkit-search-cancel-button,
84
+ .searchbar input[type='search']::-webkit-search-decoration {
85
+ appearance: none;
86
+ }
87
+
88
+ .searchbar input::placeholder {
89
+ color: var(--gray500);
90
+ }
91
+
92
+ .searchbar .searchbar-button {
93
+ display: flex;
94
+ align-items: center;
95
+ justify-content: center;
96
+ padding: 10px var(--searchbar-button-x-padding);
97
+ border-left: 1px solid #000;
98
+ background: var(--zanit-accent-color);
99
+ font-family: inherit;
100
+ font-size: inherit;
101
+ gap: 64px;
102
+ line-height: 1;
103
+ }
104
+
105
+ .searchbar .searchbar-button:focus-visible {
106
+ z-index: 1;
107
+ }
108
+
109
+ .searchbar-button z-icon {
110
+ --z-icon-width: var(--searchbar-button-icon-width);
111
+ --z-icon-height: var(--searchbar-button-icon-width);
112
+ }
113
+
114
+ @media (width < 1152px) {
115
+ .searchbar .searchbar-button > .searchbar-button-label {
116
+ display: none;
117
+ }
118
+ }
119
+
120
+ @media (width >= 768px) {
121
+ .searchbar {
122
+ --searchbar-button-x-padding: 16px;
123
+ --searchbar-button-icon-width: 2rem;
124
+ }
125
+
126
+ .searchbar .input-wrapper {
127
+ gap: 14px;
128
+ }
129
+
130
+ .searchbar button[type='reset'] {
131
+ --z-icon-width: 1.5rem;
132
+ --z-icon-height: 1.5rem;
133
+ }
134
+
135
+ .searchbar input,
136
+ .searchbar .searchbar-button {
137
+ font-size: 1.5rem;
138
+ }
139
+
140
+ .searchbar .searchbar-button {
141
+ padding: 8px var(--searchbar-button-x-padding);
142
+ }
143
+ }
144
+
145
+ @media (width >= 1152px) {
146
+ .searchbar {
147
+ --closed-searchbar-width: 190px;
148
+ }
149
+ }
150
+
151
+ @media (width >= 1366px) {
152
+ .searchbar .searchbar-button {
153
+ border-right: 1px solid #000;
154
+ }
155
+ }
@@ -0,0 +1,176 @@
1
+ import { h } from "@stencil/core";
2
+ import { containsTarget } from "../../../utils";
3
+ export class ZanitSearchForm {
4
+ formElement;
5
+ host;
6
+ /** Indicates whether the searchbar is visible and usable. */
7
+ showSearchbar = false;
8
+ /** Search query to apply. */
9
+ _searchQuery = undefined;
10
+ /** Initial search query */
11
+ searchQuery = undefined;
12
+ onSearchQueryChange() {
13
+ this._searchQuery = this.searchQuery;
14
+ if (this.searchQuery) {
15
+ this.openSearchbar();
16
+ }
17
+ }
18
+ /** Emitted on search form submission. */
19
+ search;
20
+ resetSearch;
21
+ async connectedCallback() {
22
+ this.showSearchbar = !!this.searchQuery;
23
+ this._searchQuery = this.searchQuery;
24
+ }
25
+ /** Close open searchbar when clicking outside. */
26
+ handleOutsideClick(event) {
27
+ if (this.showSearchbar && this.formElement && !containsTarget(this.formElement, event)) {
28
+ this.showSearchbar = false;
29
+ }
30
+ }
31
+ /** Close the menu when pressing Escape or Tab. */
32
+ handleKeydown(event) {
33
+ switch (event.key) {
34
+ case 'Escape':
35
+ this.showSearchbar = false;
36
+ break;
37
+ case 'Tab':
38
+ if (containsTarget(this.host, event)) {
39
+ break;
40
+ }
41
+ this.showSearchbar = false;
42
+ break;
43
+ }
44
+ }
45
+ openSearchbar() {
46
+ this.showSearchbar = true;
47
+ setTimeout(() => {
48
+ const searchbarInput = this.host.shadowRoot.querySelector('#searchbar-input');
49
+ searchbarInput.focus();
50
+ }, 500);
51
+ }
52
+ resetSearchQuery() {
53
+ this.searchQuery = undefined;
54
+ this.resetSearch.emit();
55
+ }
56
+ handleInputChange(event) {
57
+ this._searchQuery = event.target.value;
58
+ if (!this._searchQuery) {
59
+ this.searchQuery = undefined;
60
+ }
61
+ }
62
+ onSearchSubmit(event) {
63
+ event.preventDefault();
64
+ if (!this._searchQuery) {
65
+ return;
66
+ }
67
+ this.showSearchbar = false;
68
+ const searchEv = this.search.emit({ query: this._searchQuery });
69
+ // do not submit the form if the event default behavior was prevented
70
+ if (searchEv.defaultPrevented) {
71
+ return;
72
+ }
73
+ this.formElement.submit();
74
+ }
75
+ render() {
76
+ return (h("form", { key: '7bf580f0811030dea6969498966c42deef752c41', class: { 'searchbar': true, 'searchbar-open': this.showSearchbar }, ref: (el) => (this.formElement = el), role: "search", "aria-label": "Cerca", method: "get", action: "/ricerca", onSubmit: (event) => this.onSearchSubmit(event), onReset: () => this.resetSearchQuery() }, h("div", { key: '4af2bc80acb47f788b258e232b1a945cd3814b6e', class: "input-wrapper", role: "none" }, this.searchQuery && (h("button", { key: '92b37287fb50bbe3587ce24e02db15c071fbbf55', type: "reset", "aria-label": "Svuota campo di ricerca", disabled: !this.showSearchbar }, h("z-icon", { key: '91ad4f9c4a11d0a37de55f6104989a6be3da5c32', name: "multiply-circled" }))), h("input", { key: 'a9ec4ecf6920855c28b3243aa5c866afb4c9cbad', id: "searchbar-input", name: "q", type: "search", disabled: !this.showSearchbar, placeholder: "Cerca per parola chiave o ISBN", onInput: (event) => this.handleInputChange(event), value: this.searchQuery, required: true })), h("button", { key: '9bda2d7aa4f0e6186a810fb7ebaf5273c35976ca', class: "searchbar-button", "aria-label": "Cerca", "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: '9ae6d646027f040a7949e727e19879f572013e1e', name: "search" }))));
77
+ }
78
+ static get is() { return "zanit-search-form"; }
79
+ static get encapsulation() { return "shadow"; }
80
+ static get originalStyleUrls() {
81
+ return {
82
+ "$": ["search-form.css"]
83
+ };
84
+ }
85
+ static get styleUrls() {
86
+ return {
87
+ "$": ["search-form.css"]
88
+ };
89
+ }
90
+ static get properties() {
91
+ return {
92
+ "searchQuery": {
93
+ "type": "string",
94
+ "attribute": "search-query",
95
+ "mutable": true,
96
+ "complexType": {
97
+ "original": "string | undefined",
98
+ "resolved": "string",
99
+ "references": {}
100
+ },
101
+ "required": false,
102
+ "optional": false,
103
+ "docs": {
104
+ "tags": [],
105
+ "text": "Initial search query"
106
+ },
107
+ "getter": false,
108
+ "setter": false,
109
+ "reflect": false,
110
+ "defaultValue": "undefined"
111
+ }
112
+ };
113
+ }
114
+ static get states() {
115
+ return {
116
+ "showSearchbar": {},
117
+ "_searchQuery": {}
118
+ };
119
+ }
120
+ static get events() {
121
+ return [{
122
+ "method": "search",
123
+ "name": "search",
124
+ "bubbles": true,
125
+ "cancelable": true,
126
+ "composed": true,
127
+ "docs": {
128
+ "tags": [],
129
+ "text": "Emitted on search form submission."
130
+ },
131
+ "complexType": {
132
+ "original": "{ query: string }",
133
+ "resolved": "{ query: string; }",
134
+ "references": {}
135
+ }
136
+ }, {
137
+ "method": "resetSearch",
138
+ "name": "resetSearch",
139
+ "bubbles": true,
140
+ "cancelable": true,
141
+ "composed": true,
142
+ "docs": {
143
+ "tags": [],
144
+ "text": ""
145
+ },
146
+ "complexType": {
147
+ "original": "void",
148
+ "resolved": "void",
149
+ "references": {}
150
+ }
151
+ }];
152
+ }
153
+ static get elementRef() { return "host"; }
154
+ static get watchers() {
155
+ return [{
156
+ "propName": "searchQuery",
157
+ "methodName": "onSearchQueryChange"
158
+ }];
159
+ }
160
+ static get listeners() {
161
+ return [{
162
+ "name": "click",
163
+ "method": "handleOutsideClick",
164
+ "target": "document",
165
+ "capture": false,
166
+ "passive": true
167
+ }, {
168
+ "name": "keydown",
169
+ "method": "handleKeydown",
170
+ "target": undefined,
171
+ "capture": false,
172
+ "passive": true
173
+ }];
174
+ }
175
+ }
176
+ //# sourceMappingURL=search-form.js.map