@hyalo/angular 0.0.0-stage → 0.1.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 (83) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/LICENSE +21 -0
  3. package/README.md +32 -3
  4. package/fesm2022/hyalo-angular-accordion.mjs +230 -0
  5. package/fesm2022/hyalo-angular-accordion.mjs.map +1 -0
  6. package/fesm2022/hyalo-angular-button.mjs +203 -0
  7. package/fesm2022/hyalo-angular-button.mjs.map +1 -0
  8. package/fesm2022/hyalo-angular-card.mjs +221 -0
  9. package/fesm2022/hyalo-angular-card.mjs.map +1 -0
  10. package/fesm2022/hyalo-angular-choice.mjs +788 -0
  11. package/fesm2022/hyalo-angular-choice.mjs.map +1 -0
  12. package/fesm2022/hyalo-angular-dialog.mjs +571 -0
  13. package/fesm2022/hyalo-angular-dialog.mjs.map +1 -0
  14. package/fesm2022/hyalo-angular-field.mjs +312 -0
  15. package/fesm2022/hyalo-angular-field.mjs.map +1 -0
  16. package/fesm2022/hyalo-angular-icon.mjs +343 -0
  17. package/fesm2022/hyalo-angular-icon.mjs.map +1 -0
  18. package/fesm2022/hyalo-angular-interaction.mjs +455 -0
  19. package/fesm2022/hyalo-angular-interaction.mjs.map +1 -0
  20. package/fesm2022/hyalo-angular-navbar.mjs +343 -0
  21. package/fesm2022/hyalo-angular-navbar.mjs.map +1 -0
  22. package/fesm2022/hyalo-angular-overlay.mjs +94 -0
  23. package/fesm2022/hyalo-angular-overlay.mjs.map +1 -0
  24. package/fesm2022/hyalo-angular-popover-overlay-kit-6wPwnxln.mjs +3 -0
  25. package/fesm2022/hyalo-angular-popover.mjs +487 -0
  26. package/fesm2022/hyalo-angular-popover.mjs.map +1 -0
  27. package/fesm2022/hyalo-angular-segmented.mjs +223 -0
  28. package/fesm2022/hyalo-angular-segmented.mjs.map +1 -0
  29. package/fesm2022/hyalo-angular-select.mjs +464 -0
  30. package/fesm2022/hyalo-angular-select.mjs.map +1 -0
  31. package/fesm2022/hyalo-angular-tabs.mjs +324 -0
  32. package/fesm2022/hyalo-angular-tabs.mjs.map +1 -0
  33. package/fesm2022/hyalo-angular-theme.mjs +94 -0
  34. package/fesm2022/hyalo-angular-theme.mjs.map +1 -0
  35. package/fesm2022/hyalo-angular-toast.mjs +322 -0
  36. package/fesm2022/hyalo-angular-toast.mjs.map +1 -0
  37. package/fesm2022/hyalo-angular.mjs +473 -0
  38. package/fesm2022/hyalo-angular.mjs.map +1 -0
  39. package/package.json +133 -3
  40. package/styles/hyalo-core.css +25 -0
  41. package/styles/hyalo.css +17 -0
  42. package/styles/overlays/dialog.css +9 -0
  43. package/styles/overlays/popover.css +9 -0
  44. package/styles/overlays/select.css +9 -0
  45. package/styles/overlays/toast.css +8 -0
  46. package/styles/palettes/aurora.css +47 -0
  47. package/styles/palettes/ember.css +47 -0
  48. package/styles/palettes/graphite.css +47 -0
  49. package/styles/palettes/ocean.css +47 -0
  50. package/styles/palettes/orchid.css +47 -0
  51. package/styles/palettes/rose.css +47 -0
  52. package/styles/parts/card.css +49 -0
  53. package/styles/parts/dialog.css +116 -0
  54. package/styles/parts/drawer.css +124 -0
  55. package/styles/parts/field.css +36 -0
  56. package/styles/parts/glass.css +137 -0
  57. package/styles/parts/motion.css +82 -0
  58. package/styles/parts/navbar.css +55 -0
  59. package/styles/parts/popover.css +27 -0
  60. package/styles/parts/presence.css +55 -0
  61. package/styles/parts/reset.css +42 -0
  62. package/styles/parts/select.css +46 -0
  63. package/styles/parts/themes.css +105 -0
  64. package/styles/parts/toast.css +128 -0
  65. package/styles/parts/tokens.css +151 -0
  66. package/styles/parts/typography.css +64 -0
  67. package/types/hyalo-angular-accordion.d.ts +74 -0
  68. package/types/hyalo-angular-button.d.ts +88 -0
  69. package/types/hyalo-angular-card.d.ts +61 -0
  70. package/types/hyalo-angular-choice.d.ts +259 -0
  71. package/types/hyalo-angular-dialog.d.ts +170 -0
  72. package/types/hyalo-angular-field.d.ts +135 -0
  73. package/types/hyalo-angular-icon.d.ts +122 -0
  74. package/types/hyalo-angular-interaction.d.ts +131 -0
  75. package/types/hyalo-angular-navbar.d.ts +110 -0
  76. package/types/hyalo-angular-overlay.d.ts +31 -0
  77. package/types/hyalo-angular-popover.d.ts +142 -0
  78. package/types/hyalo-angular-segmented.d.ts +79 -0
  79. package/types/hyalo-angular-select.d.ts +130 -0
  80. package/types/hyalo-angular-tabs.d.ts +102 -0
  81. package/types/hyalo-angular-theme.d.ts +46 -0
  82. package/types/hyalo-angular-toast.d.ts +79 -0
  83. package/types/hyalo-angular.d.ts +345 -0
@@ -0,0 +1,343 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, DestroyRef, Directive, ElementRef, afterNextRender, booleanAttribute, inject, input, model, numberAttribute, signal, viewChild } from "@angular/core";
3
+ import { HyIcon } from "@hyalo/angular/icon";
4
+ import { HyMaterialDirective, injectId } from "@hyalo/angular";
5
+ var HyNavbarBrand = class HyNavbarBrand {
6
+ static ɵfac = i0.ɵɵngDeclareFactory({
7
+ minVersion: "12.0.0",
8
+ version: "22.2.3",
9
+ ngImport: i0,
10
+ type: HyNavbarBrand,
11
+ deps: [],
12
+ target: i0.ɵɵFactoryTarget.Directive
13
+ });
14
+ static ɵdir = i0.ɵɵngDeclareDirective({
15
+ minVersion: "14.0.0",
16
+ version: "22.2.3",
17
+ type: HyNavbarBrand,
18
+ isStandalone: true,
19
+ selector: "[hyNavbarBrand]",
20
+ host: { classAttribute: "hy-navbar__brand" },
21
+ ngImport: i0
22
+ });
23
+ };
24
+ i0.ɵɵngDeclareClassMetadata({
25
+ minVersion: "12.0.0",
26
+ version: "22.2.3",
27
+ ngImport: i0,
28
+ type: HyNavbarBrand,
29
+ decorators: [{
30
+ type: Directive,
31
+ args: [{
32
+ selector: "[hyNavbarBrand]",
33
+ host: { class: "hy-navbar__brand" }
34
+ }]
35
+ }]
36
+ });
37
+ var HyNavbarActions = class HyNavbarActions {
38
+ static ɵfac = i0.ɵɵngDeclareFactory({
39
+ minVersion: "12.0.0",
40
+ version: "22.2.3",
41
+ ngImport: i0,
42
+ type: HyNavbarActions,
43
+ deps: [],
44
+ target: i0.ɵɵFactoryTarget.Directive
45
+ });
46
+ static ɵdir = i0.ɵɵngDeclareDirective({
47
+ minVersion: "14.0.0",
48
+ version: "22.2.3",
49
+ type: HyNavbarActions,
50
+ isStandalone: true,
51
+ selector: "[hyNavbarActions]",
52
+ host: { classAttribute: "hy-navbar__actions" },
53
+ ngImport: i0
54
+ });
55
+ };
56
+ i0.ɵɵngDeclareClassMetadata({
57
+ minVersion: "12.0.0",
58
+ version: "22.2.3",
59
+ ngImport: i0,
60
+ type: HyNavbarActions,
61
+ decorators: [{
62
+ type: Directive,
63
+ args: [{
64
+ selector: "[hyNavbarActions]",
65
+ host: { class: "hy-navbar__actions" }
66
+ }]
67
+ }]
68
+ });
69
+ var HyNavbar = class HyNavbar {
70
+ toggle = viewChild.required("toggle", ...ngDevMode ? [{ debugName: "toggle" }] : /* istanbul ignore next */ []);
71
+ linksId = injectId("navbar-links");
72
+ label = input("Main", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
73
+ menuLabel = input("Menu", ...ngDevMode ? [{ debugName: "menuLabel" }] : /* istanbul ignore next */ []);
74
+ appearance = input("floating", ...ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []);
75
+ position = input("sticky", ...ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []);
76
+ material = input("", ...ngDevMode ? [{ debugName: "material" }] : /* istanbul ignore next */ []);
77
+ hideOnScroll = input(false, {
78
+ ...ngDevMode ? { debugName: "hideOnScroll" } : /* istanbul ignore next */ {},
79
+ transform: booleanAttribute
80
+ });
81
+ scrollThreshold = input(8, {
82
+ ...ngDevMode ? { debugName: "scrollThreshold" } : /* istanbul ignore next */ {},
83
+ transform: numberAttribute
84
+ });
85
+ menuOpen = model(false, ...ngDevMode ? [{ debugName: "menuOpen" }] : /* istanbul ignore next */ []);
86
+ scrolled = signal(false, ...ngDevMode ? [{ debugName: "scrolled" }] : /* istanbul ignore next */ []);
87
+ hidden = signal(false, ...ngDevMode ? [{ debugName: "hidden" }] : /* istanbul ignore next */ []);
88
+ constructor() {
89
+ const destroyRef = inject(DestroyRef);
90
+ const host = inject(ElementRef).nativeElement;
91
+ afterNextRender(() => {
92
+ const view = host.ownerDocument.defaultView;
93
+ if (!view) return;
94
+ let last = view.scrollY;
95
+ const onScroll = () => {
96
+ const y = view.scrollY;
97
+ this.scrolled.set(y > this.scrollThreshold());
98
+ if (this.hideOnScroll() && !this.menuOpen() && !host.contains(host.ownerDocument.activeElement)) {
99
+ const delta = y - last;
100
+ if (Math.abs(delta) > 6) this.hidden.set(delta > 0 && y > host.offsetHeight * 2);
101
+ } else this.hidden.set(false);
102
+ last = y;
103
+ };
104
+ onScroll();
105
+ view.addEventListener("scroll", onScroll, { passive: true });
106
+ destroyRef.onDestroy(() => view.removeEventListener("scroll", onScroll));
107
+ });
108
+ }
109
+ closeMenu(restoreFocus = false) {
110
+ if (!this.menuOpen()) return;
111
+ this.menuOpen.set(false);
112
+ if (restoreFocus) this.toggle().nativeElement.focus();
113
+ }
114
+ onClick(event) {
115
+ if (event.target?.closest(".hy-navbar__links a")) this.closeMenu();
116
+ }
117
+ static ɵfac = i0.ɵɵngDeclareFactory({
118
+ minVersion: "12.0.0",
119
+ version: "22.2.3",
120
+ ngImport: i0,
121
+ type: HyNavbar,
122
+ deps: [],
123
+ target: i0.ɵɵFactoryTarget.Component
124
+ });
125
+ static ɵcmp = i0.ɵɵngDeclareComponent({
126
+ minVersion: "17.2.0",
127
+ version: "22.2.3",
128
+ type: HyNavbar,
129
+ isStandalone: true,
130
+ selector: "hy-navbar",
131
+ inputs: {
132
+ label: {
133
+ classPropertyName: "label",
134
+ publicName: "label",
135
+ isSignal: true,
136
+ isRequired: false,
137
+ transformFunction: null
138
+ },
139
+ menuLabel: {
140
+ classPropertyName: "menuLabel",
141
+ publicName: "menuLabel",
142
+ isSignal: true,
143
+ isRequired: false,
144
+ transformFunction: null
145
+ },
146
+ appearance: {
147
+ classPropertyName: "appearance",
148
+ publicName: "appearance",
149
+ isSignal: true,
150
+ isRequired: false,
151
+ transformFunction: null
152
+ },
153
+ position: {
154
+ classPropertyName: "position",
155
+ publicName: "position",
156
+ isSignal: true,
157
+ isRequired: false,
158
+ transformFunction: null
159
+ },
160
+ material: {
161
+ classPropertyName: "material",
162
+ publicName: "material",
163
+ isSignal: true,
164
+ isRequired: false,
165
+ transformFunction: null
166
+ },
167
+ hideOnScroll: {
168
+ classPropertyName: "hideOnScroll",
169
+ publicName: "hideOnScroll",
170
+ isSignal: true,
171
+ isRequired: false,
172
+ transformFunction: null
173
+ },
174
+ scrollThreshold: {
175
+ classPropertyName: "scrollThreshold",
176
+ publicName: "scrollThreshold",
177
+ isSignal: true,
178
+ isRequired: false,
179
+ transformFunction: null
180
+ },
181
+ menuOpen: {
182
+ classPropertyName: "menuOpen",
183
+ publicName: "menuOpen",
184
+ isSignal: true,
185
+ isRequired: false,
186
+ transformFunction: null
187
+ }
188
+ },
189
+ outputs: { menuOpen: "menuOpenChange" },
190
+ host: {
191
+ listeners: {
192
+ "keydown.escape": "closeMenu(true)",
193
+ "focusin": "hidden.set(false)",
194
+ "click": "onClick($event)"
195
+ },
196
+ properties: {
197
+ "attr.data-appearance": "appearance()",
198
+ "attr.data-position": "position()",
199
+ "attr.data-scrolled": "scrolled() || null",
200
+ "attr.data-hidden": "hidden() || null",
201
+ "attr.data-menu-open": "menuOpen() || null"
202
+ },
203
+ classAttribute: "hy-navbar"
204
+ },
205
+ viewQueries: [{
206
+ propertyName: "toggle",
207
+ first: true,
208
+ predicate: ["toggle"],
209
+ descendants: true,
210
+ isSignal: true
211
+ }],
212
+ ngImport: i0,
213
+ template: "<div class=\"hy-navbar__bar\" [hyMaterial]=\"material()\">\r\n <ng-content select=\"[hyNavbarBrand]\" />\r\n <nav class=\"hy-navbar__links\" [id]=\"linksId\" [attr.aria-label]=\"label()\">\r\n <ng-content />\r\n </nav>\r\n <ng-content select=\"[hyNavbarActions]\" />\r\n <button\r\n #toggle\r\n type=\"button\"\r\n class=\"hy-navbar__toggle\"\r\n [attr.aria-expanded]=\"menuOpen()\"\r\n [attr.aria-controls]=\"linksId\"\r\n [attr.aria-label]=\"menuLabel()\"\r\n (click)=\"menuOpen.set(!menuOpen())\"\r\n >\r\n <hy-icon [name]=\"menuOpen() ? 'x' : 'menu'\" />\r\n </button>\r\n</div>\r\n",
214
+ styles: [":host{--_inset: var(--hy-space-3);display:block;container:hy-navbar / inline-size;inset-block-start:0;z-index:var(--hy-z-sticky);padding:var(--_inset);transition:translate var(--hy-dur-settle) var(--hy-ease-out)}:host([data-position=\"sticky\"]){position:sticky}:host([data-position=\"fixed\"]){position:fixed;inset-inline:0}:host([data-appearance=\"full\"]){--_inset: 0px}:host([data-hidden]){translate:0 -110%}.hy-navbar__bar{position:relative;display:flex;align-items:center;gap:var(--hy-space-4);max-inline-size:var(--hy-container);margin-inline:auto;min-block-size:var(--hy-navbar-height, 3.5rem);padding-block:var(--hy-space-2);padding-inline:var(--hy-space-5) var(--hy-space-2);border-radius:var(--hy-navbar-radius, var(--hy-radius-pill));transition:min-block-size var(--hy-dur-settle) var(--hy-ease-out),box-shadow var(--hy-dur-settle) var(--hy-ease-out)}:host([data-appearance=\"full\"]) .hy-navbar__bar{max-inline-size:none;border-radius:0;border-width:0;padding-inline:var(--hy-gutter)}:host([data-appearance=\"full\"]) .hy-navbar__bar:after{content:\"\";position:absolute;inset-inline:0;inset-block-start:100%;block-size:var(--hy-space-4);background:linear-gradient(to bottom,var(--hy-line),transparent);opacity:0;pointer-events:none;transition:opacity var(--hy-dur-settle) var(--hy-ease-out)}:host([data-appearance=\"full\"][data-scrolled]) .hy-navbar__bar:after{opacity:1}@media(prefers-contrast:more),(forced-colors:active){:host([data-appearance=\"full\"]) .hy-navbar__bar{border-width:0 0 1px}:host([data-appearance=\"full\"]) .hy-navbar__bar:after{display:none}}:host([data-scrolled]) .hy-navbar__bar{min-block-size:calc(var(--hy-navbar-height, 3.5rem) - .5rem)}.hy-navbar__links{display:flex;align-items:center;gap:var(--hy-space-1);margin-inline:auto}.hy-navbar__toggle{display:none;place-items:center;inline-size:2.5rem;block-size:2.5rem;border:0;border-radius:var(--hy-radius-pill);background:transparent;color:var(--hy-ink);cursor:pointer}.hy-navbar__toggle:focus-visible{outline:none;box-shadow:var(--hy-focus-ring)}@container hy-navbar (max-width: 48rem){.hy-navbar__toggle{display:grid;margin-inline-start:auto}.hy-navbar__bar:has(.hy-navbar__actions) .hy-navbar__toggle{margin-inline-start:0}.hy-navbar__links{position:absolute;inset-block-start:calc(100% + var(--hy-space-2));inset-inline:0;flex-direction:column;align-items:stretch;gap:var(--hy-space-1);margin:0;padding:var(--hy-space-2);border-radius:var(--hy-radius-l);background:var(--hy-surface-1);border:1px solid var(--hy-line);box-shadow:var(--hy-glass-shadow);opacity:0;translate:0 -.5rem;visibility:hidden;transition:opacity var(--hy-dur-settle) var(--hy-ease-out),translate var(--hy-dur-settle) var(--hy-ease-out),visibility 0s linear var(--hy-dur-settle)}:host([data-menu-open]) .hy-navbar__links{opacity:1;translate:0 0;visibility:visible;transition-delay:0s}}\n"],
215
+ dependencies: [{
216
+ kind: "component",
217
+ type: HyIcon,
218
+ selector: "hy-icon",
219
+ inputs: [
220
+ "name",
221
+ "icon",
222
+ "label",
223
+ "size",
224
+ "strokeWidth"
225
+ ]
226
+ }, {
227
+ kind: "directive",
228
+ type: HyMaterialDirective,
229
+ selector: "[hyMaterial]",
230
+ inputs: ["hyMaterial", "thickness"]
231
+ }],
232
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
233
+ });
234
+ };
235
+ i0.ɵɵngDeclareClassMetadata({
236
+ minVersion: "12.0.0",
237
+ version: "22.2.3",
238
+ ngImport: i0,
239
+ type: HyNavbar,
240
+ decorators: [{
241
+ type: Component,
242
+ args: [{
243
+ selector: "hy-navbar",
244
+ imports: [HyIcon, HyMaterialDirective],
245
+ changeDetection: ChangeDetectionStrategy.OnPush,
246
+ host: {
247
+ class: "hy-navbar",
248
+ "[attr.data-appearance]": "appearance()",
249
+ "[attr.data-position]": "position()",
250
+ "[attr.data-scrolled]": "scrolled() || null",
251
+ "[attr.data-hidden]": "hidden() || null",
252
+ "[attr.data-menu-open]": "menuOpen() || null",
253
+ "(keydown.escape)": "closeMenu(true)",
254
+ "(focusin)": "hidden.set(false)",
255
+ "(click)": "onClick($event)"
256
+ },
257
+ template: "<div class=\"hy-navbar__bar\" [hyMaterial]=\"material()\">\r\n <ng-content select=\"[hyNavbarBrand]\" />\r\n <nav class=\"hy-navbar__links\" [id]=\"linksId\" [attr.aria-label]=\"label()\">\r\n <ng-content />\r\n </nav>\r\n <ng-content select=\"[hyNavbarActions]\" />\r\n <button\r\n #toggle\r\n type=\"button\"\r\n class=\"hy-navbar__toggle\"\r\n [attr.aria-expanded]=\"menuOpen()\"\r\n [attr.aria-controls]=\"linksId\"\r\n [attr.aria-label]=\"menuLabel()\"\r\n (click)=\"menuOpen.set(!menuOpen())\"\r\n >\r\n <hy-icon [name]=\"menuOpen() ? 'x' : 'menu'\" />\r\n </button>\r\n</div>\r\n",
258
+ styles: [":host{--_inset: var(--hy-space-3);display:block;container:hy-navbar / inline-size;inset-block-start:0;z-index:var(--hy-z-sticky);padding:var(--_inset);transition:translate var(--hy-dur-settle) var(--hy-ease-out)}:host([data-position=\"sticky\"]){position:sticky}:host([data-position=\"fixed\"]){position:fixed;inset-inline:0}:host([data-appearance=\"full\"]){--_inset: 0px}:host([data-hidden]){translate:0 -110%}.hy-navbar__bar{position:relative;display:flex;align-items:center;gap:var(--hy-space-4);max-inline-size:var(--hy-container);margin-inline:auto;min-block-size:var(--hy-navbar-height, 3.5rem);padding-block:var(--hy-space-2);padding-inline:var(--hy-space-5) var(--hy-space-2);border-radius:var(--hy-navbar-radius, var(--hy-radius-pill));transition:min-block-size var(--hy-dur-settle) var(--hy-ease-out),box-shadow var(--hy-dur-settle) var(--hy-ease-out)}:host([data-appearance=\"full\"]) .hy-navbar__bar{max-inline-size:none;border-radius:0;border-width:0;padding-inline:var(--hy-gutter)}:host([data-appearance=\"full\"]) .hy-navbar__bar:after{content:\"\";position:absolute;inset-inline:0;inset-block-start:100%;block-size:var(--hy-space-4);background:linear-gradient(to bottom,var(--hy-line),transparent);opacity:0;pointer-events:none;transition:opacity var(--hy-dur-settle) var(--hy-ease-out)}:host([data-appearance=\"full\"][data-scrolled]) .hy-navbar__bar:after{opacity:1}@media(prefers-contrast:more),(forced-colors:active){:host([data-appearance=\"full\"]) .hy-navbar__bar{border-width:0 0 1px}:host([data-appearance=\"full\"]) .hy-navbar__bar:after{display:none}}:host([data-scrolled]) .hy-navbar__bar{min-block-size:calc(var(--hy-navbar-height, 3.5rem) - .5rem)}.hy-navbar__links{display:flex;align-items:center;gap:var(--hy-space-1);margin-inline:auto}.hy-navbar__toggle{display:none;place-items:center;inline-size:2.5rem;block-size:2.5rem;border:0;border-radius:var(--hy-radius-pill);background:transparent;color:var(--hy-ink);cursor:pointer}.hy-navbar__toggle:focus-visible{outline:none;box-shadow:var(--hy-focus-ring)}@container hy-navbar (max-width: 48rem){.hy-navbar__toggle{display:grid;margin-inline-start:auto}.hy-navbar__bar:has(.hy-navbar__actions) .hy-navbar__toggle{margin-inline-start:0}.hy-navbar__links{position:absolute;inset-block-start:calc(100% + var(--hy-space-2));inset-inline:0;flex-direction:column;align-items:stretch;gap:var(--hy-space-1);margin:0;padding:var(--hy-space-2);border-radius:var(--hy-radius-l);background:var(--hy-surface-1);border:1px solid var(--hy-line);box-shadow:var(--hy-glass-shadow);opacity:0;translate:0 -.5rem;visibility:hidden;transition:opacity var(--hy-dur-settle) var(--hy-ease-out),translate var(--hy-dur-settle) var(--hy-ease-out),visibility 0s linear var(--hy-dur-settle)}:host([data-menu-open]) .hy-navbar__links{opacity:1;translate:0 0;visibility:visible;transition-delay:0s}}\n"]
259
+ }]
260
+ }],
261
+ ctorParameters: () => [],
262
+ propDecorators: {
263
+ toggle: [{
264
+ type: i0.ViewChild,
265
+ args: ["toggle", { isSignal: true }]
266
+ }],
267
+ label: [{
268
+ type: i0.Input,
269
+ args: [{
270
+ isSignal: true,
271
+ alias: "label",
272
+ required: false
273
+ }]
274
+ }],
275
+ menuLabel: [{
276
+ type: i0.Input,
277
+ args: [{
278
+ isSignal: true,
279
+ alias: "menuLabel",
280
+ required: false
281
+ }]
282
+ }],
283
+ appearance: [{
284
+ type: i0.Input,
285
+ args: [{
286
+ isSignal: true,
287
+ alias: "appearance",
288
+ required: false
289
+ }]
290
+ }],
291
+ position: [{
292
+ type: i0.Input,
293
+ args: [{
294
+ isSignal: true,
295
+ alias: "position",
296
+ required: false
297
+ }]
298
+ }],
299
+ material: [{
300
+ type: i0.Input,
301
+ args: [{
302
+ isSignal: true,
303
+ alias: "material",
304
+ required: false
305
+ }]
306
+ }],
307
+ hideOnScroll: [{
308
+ type: i0.Input,
309
+ args: [{
310
+ isSignal: true,
311
+ alias: "hideOnScroll",
312
+ required: false
313
+ }]
314
+ }],
315
+ scrollThreshold: [{
316
+ type: i0.Input,
317
+ args: [{
318
+ isSignal: true,
319
+ alias: "scrollThreshold",
320
+ required: false
321
+ }]
322
+ }],
323
+ menuOpen: [{
324
+ type: i0.Input,
325
+ args: [{
326
+ isSignal: true,
327
+ alias: "menuOpen",
328
+ required: false
329
+ }]
330
+ }, {
331
+ type: i0.Output,
332
+ args: ["menuOpenChange"]
333
+ }]
334
+ }
335
+ });
336
+ const HY_NAVBAR = [
337
+ HyNavbar,
338
+ HyNavbarBrand,
339
+ HyNavbarActions
340
+ ];
341
+ export { HY_NAVBAR, HyNavbar, HyNavbarActions, HyNavbarBrand };
342
+
343
+ //# sourceMappingURL=hyalo-angular-navbar.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hyalo-angular-navbar.mjs","names":[],"sources":["../../../projects/hyalo/navbar/navbar.ts","../../../projects/hyalo/navbar/navbar.html"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n Directive,\r\n ElementRef,\r\n afterNextRender,\r\n booleanAttribute,\r\n inject,\r\n input,\r\n model,\r\n numberAttribute,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { HyIcon } from '@hyalo/angular/icon';\r\nimport { HyMaterialDirective, injectId } from '@hyalo/angular';\r\n\r\n/** The logo or product name, at the start of the bar. */\r\n@Directive({ selector: '[hyNavbarBrand]', host: { class: 'hy-navbar__brand' } })\r\nexport class HyNavbarBrand {}\r\n\r\n/** Buttons at the end of the bar, such as sign in or a cart. Always visible. */\r\n@Directive({ selector: '[hyNavbarActions]', host: { class: 'hy-navbar__actions' } })\r\nexport class HyNavbarActions {}\r\n\r\n/**\r\n * - `floating`: a detached glass pill with space around it.\r\n * - `full`: a full-width bar. Once content scrolls under it, a soft fade\r\n * at its lower edge separates the two instead of a hard line.\r\n */\r\nexport type HyNavbarAppearance = 'floating' | 'full';\r\n\r\n/**\r\n * A glass app bar. Links go in the default slot and are wrapped in a\r\n * `<nav>`. On narrow screens they collapse behind a menu button and open as\r\n * a panel under the bar. Bind `menuOpen` if you would rather open your own\r\n * drawer.\r\n *\r\n * ```html\r\n * <hy-navbar label=\"Main\">\r\n * <a hyNavbarBrand routerLink=\"/\">Atelier</a>\r\n * <a routerLink=\"/watches\" routerLinkActive=\"active\" ariaCurrentWhenActive=\"page\">Watches</a>\r\n * <a routerLink=\"/journal\">Journal</a>\r\n * <div hyNavbarActions><button hyButton size=\"sm\">Book a visit</button></div>\r\n * </hy-navbar>\r\n * ```\r\n *\r\n * The bar compacts once the page scrolls, and with `hideOnScroll` it slides\r\n * away while scrolling down and returns on the way up. It never hides while\r\n * the menu is open or focus is inside it. The collapse point is a container\r\n * query on the navbar's own width (48rem by default).\r\n */\r\n@Component({\r\n selector: 'hy-navbar',\r\n imports: [HyIcon, HyMaterialDirective],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'hy-navbar',\r\n '[attr.data-appearance]': 'appearance()',\r\n '[attr.data-position]': 'position()',\r\n '[attr.data-scrolled]': 'scrolled() || null',\r\n '[attr.data-hidden]': 'hidden() || null',\r\n '[attr.data-menu-open]': 'menuOpen() || null',\r\n '(keydown.escape)': 'closeMenu(true)',\r\n '(focusin)': 'hidden.set(false)',\r\n '(click)': 'onClick($event)',\r\n },\r\n templateUrl: './navbar.html',\r\n styleUrl: './navbar.css',\r\n})\r\nexport class HyNavbar {\r\n private readonly toggle = viewChild.required<ElementRef<HTMLButtonElement>>('toggle');\r\n protected readonly linksId = injectId('navbar-links');\r\n\r\n /** Accessible name of the `<nav>` landmark. */\r\n readonly label = input('Main');\r\n /** Accessible name of the menu button on narrow screens. */\r\n readonly menuLabel = input('Menu');\r\n /** Visual style of the bar. */\r\n readonly appearance = input<HyNavbarAppearance>('floating');\r\n /** CSS positioning of the navbar. */\r\n readonly position = input<'sticky' | 'fixed' | 'static'>('sticky');\r\n /** Material of the bar. */\r\n readonly material = input<'clear' | 'frosted' | 'tinted' | 'solid' | ''>('');\r\n /** Slide away while scrolling down. */\r\n readonly hideOnScroll = input(false, { transform: booleanAttribute });\r\n /** Scroll distance in pixels after which the bar compacts. */\r\n readonly scrollThreshold = input(8, { transform: numberAttribute });\r\n /** Whether the collapsed menu is open. Two-way bindable. */\r\n readonly menuOpen = model(false);\r\n\r\n protected readonly scrolled = signal(false);\r\n protected readonly hidden = signal(false);\r\n\r\n constructor() {\r\n const destroyRef = inject(DestroyRef);\r\n const host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\r\n afterNextRender(() => {\r\n const view = host.ownerDocument.defaultView;\r\n if (!view) return;\r\n let last = view.scrollY;\r\n const onScroll = (): void => {\r\n const y = view.scrollY;\r\n this.scrolled.set(y > this.scrollThreshold());\r\n if (\r\n this.hideOnScroll() &&\r\n !this.menuOpen() &&\r\n !host.contains(host.ownerDocument.activeElement)\r\n ) {\r\n const delta = y - last;\r\n if (Math.abs(delta) > 6) this.hidden.set(delta > 0 && y > host.offsetHeight * 2);\r\n } else {\r\n this.hidden.set(false);\r\n }\r\n last = y;\r\n };\r\n onScroll();\r\n view.addEventListener('scroll', onScroll, { passive: true });\r\n destroyRef.onDestroy(() => view.removeEventListener('scroll', onScroll));\r\n });\r\n }\r\n\r\n /** Closes the collapsed menu. */\r\n closeMenu(restoreFocus = false): void {\r\n if (!this.menuOpen()) return;\r\n this.menuOpen.set(false);\r\n if (restoreFocus) this.toggle().nativeElement.focus();\r\n }\r\n\r\n protected onClick(event: MouseEvent): void {\r\n if ((event.target as Element | null)?.closest('.hy-navbar__links a')) this.closeMenu();\r\n }\r\n}\r\n\r\n/** Everything needed to build a navbar. */\r\nexport const HY_NAVBAR = [HyNavbar, HyNavbarBrand, HyNavbarActions] as const;\r\n","<div class=\"hy-navbar__bar\" [hyMaterial]=\"material()\">\r\n <ng-content select=\"[hyNavbarBrand]\" />\r\n <nav class=\"hy-navbar__links\" [id]=\"linksId\" [attr.aria-label]=\"label()\">\r\n <ng-content />\r\n </nav>\r\n <ng-content select=\"[hyNavbarActions]\" />\r\n <button\r\n #toggle\r\n type=\"button\"\r\n class=\"hy-navbar__toggle\"\r\n [attr.aria-expanded]=\"menuOpen()\"\r\n [attr.aria-controls]=\"linksId\"\r\n [attr.aria-label]=\"menuLabel()\"\r\n (click)=\"menuOpen.set(!menuOpen())\"\r\n >\r\n <hy-icon [name]=\"menuOpen() ? 'x' : 'menu'\" />\r\n </button>\r\n</div>\r\n"],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ import { MOTION } from "@hyalo/angular";
2
+ const OPPOSITE = {
3
+ top: "bottom",
4
+ bottom: "top",
5
+ start: "end",
6
+ end: "start"
7
+ };
8
+ function position(placement, offset) {
9
+ switch (placement) {
10
+ case "top": return {
11
+ originX: "center",
12
+ originY: "top",
13
+ overlayX: "center",
14
+ overlayY: "bottom",
15
+ offsetY: -offset
16
+ };
17
+ case "bottom": return {
18
+ originX: "center",
19
+ originY: "bottom",
20
+ overlayX: "center",
21
+ overlayY: "top",
22
+ offsetY: offset
23
+ };
24
+ case "start": return {
25
+ originX: "start",
26
+ originY: "center",
27
+ overlayX: "end",
28
+ overlayY: "center",
29
+ offsetX: -offset
30
+ };
31
+ case "end": return {
32
+ originX: "end",
33
+ originY: "center",
34
+ overlayX: "start",
35
+ overlayY: "center",
36
+ offsetX: offset
37
+ };
38
+ }
39
+ }
40
+ function hyConnectedPositions(placement, offset = 8) {
41
+ return [position(placement, offset), position(OPPOSITE[placement], offset)];
42
+ }
43
+ function hyDropdownPositions(offset = 6) {
44
+ return [{
45
+ originX: "start",
46
+ originY: "bottom",
47
+ overlayX: "start",
48
+ overlayY: "top",
49
+ offsetY: offset
50
+ }, {
51
+ originX: "start",
52
+ originY: "top",
53
+ overlayX: "start",
54
+ overlayY: "bottom",
55
+ offsetY: -offset
56
+ }];
57
+ }
58
+ var HyPresence = class {
59
+ cancel = null;
60
+ get leaving() {
61
+ return this.cancel !== null;
62
+ }
63
+ enter(el) {
64
+ if (this.cancel) this.cancel();
65
+ else {
66
+ el.dataset["state"] = "closed";
67
+ el.offsetWidth;
68
+ }
69
+ el.dataset["state"] = "open";
70
+ }
71
+ leave(el, done) {
72
+ if (this.cancel) return;
73
+ el.dataset["state"] = "closing";
74
+ const stop = () => {
75
+ el.removeEventListener("transitionend", onEnd);
76
+ clearTimeout(timer);
77
+ this.cancel = null;
78
+ };
79
+ const onEnd = (event) => {
80
+ if (event.target !== el || event.propertyName !== "opacity") return;
81
+ stop();
82
+ done();
83
+ };
84
+ const timer = setTimeout(() => {
85
+ stop();
86
+ done();
87
+ }, MOTION.quick.duration * 1e3 + 80);
88
+ el.addEventListener("transitionend", onEnd);
89
+ this.cancel = stop;
90
+ }
91
+ };
92
+ export { hyConnectedPositions, hyDropdownPositions, HyPresence as ɵHyPresence };
93
+
94
+ //# sourceMappingURL=hyalo-angular-overlay.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hyalo-angular-overlay.mjs","names":[],"sources":["../../../projects/hyalo/overlay/positions.ts","../../../projects/hyalo/overlay/presence.ts"],"sourcesContent":["import type { ConnectedPosition } from '@angular/cdk/overlay';\r\n\r\n/**\r\n * Where a floating element sits relative to its trigger. `start` and `end`\r\n * follow the text direction, so `end` is on the right in LTR and on the left\r\n * in RTL.\r\n */\r\nexport type HyPlacement = 'top' | 'bottom' | 'start' | 'end';\r\n\r\nconst OPPOSITE: Record<HyPlacement, HyPlacement> = {\r\n top: 'bottom',\r\n bottom: 'top',\r\n start: 'end',\r\n end: 'start',\r\n};\r\n\r\nfunction position(placement: HyPlacement, offset: number): ConnectedPosition {\r\n switch (placement) {\r\n case 'top':\r\n return {\r\n originX: 'center',\r\n originY: 'top',\r\n overlayX: 'center',\r\n overlayY: 'bottom',\r\n offsetY: -offset,\r\n };\r\n case 'bottom':\r\n return {\r\n originX: 'center',\r\n originY: 'bottom',\r\n overlayX: 'center',\r\n overlayY: 'top',\r\n offsetY: offset,\r\n };\r\n case 'start':\r\n return {\r\n originX: 'start',\r\n originY: 'center',\r\n overlayX: 'end',\r\n overlayY: 'center',\r\n offsetX: -offset,\r\n };\r\n case 'end':\r\n return {\r\n originX: 'end',\r\n originY: 'center',\r\n overlayX: 'start',\r\n overlayY: 'center',\r\n offsetX: offset,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * CDK positions for a placement, with the opposite side as the first\r\n * fallback when there is no room.\r\n */\r\nexport function hyConnectedPositions(placement: HyPlacement, offset = 8): ConnectedPosition[] {\r\n return [position(placement, offset), position(OPPOSITE[placement], offset)];\r\n}\r\n\r\n/** Positions for a dropdown that lines up with the trigger's start edge. */\r\nexport function hyDropdownPositions(offset = 6): ConnectedPosition[] {\r\n return [\r\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: offset },\r\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -offset },\r\n ];\r\n}\r\n","import { MOTION } from '@hyalo/angular';\r\n\r\n/**\r\n * @internal Enter and exit for small overlays (tooltips, popovers, select\r\n * panels), driven by `data-state` and CSS transitions.\r\n *\r\n * Transitions start from the current value, so reopening a panel while it\r\n * is still fading out simply turns it around, with no jump.\r\n */\r\nexport class HyPresence {\r\n private cancel: (() => void) | null = null;\r\n\r\n /** True while an exit is playing. */\r\n get leaving(): boolean {\r\n return this.cancel !== null;\r\n }\r\n\r\n /** Shows a panel that was just attached, or turns a leaving one around. */\r\n enter(el: HTMLElement): void {\r\n if (this.cancel) {\r\n this.cancel();\r\n } else {\r\n el.dataset['state'] = 'closed';\r\n // Commit the closed pose so the change to open transitions.\r\n void el.offsetWidth;\r\n }\r\n el.dataset['state'] = 'open';\r\n }\r\n\r\n /** Plays the exit, then calls `done`, unless `enter` turns it around first. */\r\n leave(el: HTMLElement, done: () => void): void {\r\n if (this.cancel) return;\r\n el.dataset['state'] = 'closing';\r\n const stop = (): void => {\r\n el.removeEventListener('transitionend', onEnd);\r\n clearTimeout(timer);\r\n this.cancel = null;\r\n };\r\n const onEnd = (event: TransitionEvent): void => {\r\n if (event.target !== el || event.propertyName !== 'opacity') return;\r\n stop();\r\n done();\r\n };\r\n // A safety net for when transitionend never comes, as with no transition.\r\n const timer = setTimeout(\r\n () => {\r\n stop();\r\n done();\r\n },\r\n MOTION.quick.duration * 1000 + 80,\r\n );\r\n el.addEventListener('transitionend', onEnd);\r\n this.cancel = stop;\r\n }\r\n}\r\n"],"mappings":";AASA,MAAM,WAA6C;CACjD,KAAK;CACL,QAAQ;CACR,OAAO;CACP,KAAK;AACN;AAED,SAAS,SAAS,WAAwB,QAAc;CACtD,QAAQ,WAAR;EACE,KAAK,OACH,OAAO;GACL,SAAS;GACT,SAAS;GACT,UAAU;GACV,UAAU;GACV,SAAS,CAAC;EACX;EACH,KAAK,UACH,OAAO;GACL,SAAS;GACT,SAAS;GACT,UAAU;GACV,UAAU;GACV,SAAS;EACV;EACH,KAAK,SACH,OAAO;GACL,SAAS;GACT,SAAS;GACT,UAAU;GACV,UAAU;GACV,SAAS,CAAC;EACX;EACH,KAAK,OACH,OAAO;GACL,SAAS;GACT,SAAS;GACT,UAAU;GACV,UAAU;GACV,SAAS;EACV;CACL;AACF;AAMA,SAAgB,qBAAqB,WAAwB,SAAS,GAAC;CACrE,OAAO,CAAC,SAAS,WAAW,MAAM,GAAG,SAAS,SAAS,YAAY,MAAM,CAAC;AAC5E;AAGA,SAAgB,oBAAoB,SAAS,GAAC;CAC5C,OAAO,CACL;EAAE,SAAS;EAAS,SAAS;EAAU,UAAU;EAAS,UAAU;EAAO,SAAS;CAAM,GAC1F;EAAE,SAAS;EAAS,SAAS;EAAO,UAAU;EAAS,UAAU;EAAU,SAAS,CAAC;CAAM,CAC5F;AACH;AC1DA,IAAa,aAAb,MAAuB;CACb,SAA8B;CAGtC,IAAI,UAAO;EACT,OAAO,KAAK,WAAW;CACzB;CAGA,MAAM,IAAe;EACnB,IAAI,KAAK,QACP,KAAK,OAAM;OACN;GACL,GAAG,QAAQ,WAAW;GAEtB,AAAK,GAAG;EACV;EACA,GAAG,QAAQ,WAAW;CACxB;CAGA,MAAM,IAAiB,MAAgB;EACrC,IAAI,KAAK,QAAQ;EACjB,GAAG,QAAQ,WAAW;EACtB,MAAM,aAAkB;GACtB,GAAG,oBAAoB,iBAAiB,KAAK;GAC7C,aAAa,KAAK;GAClB,KAAK,SAAS;EAChB;EACA,MAAM,SAAS,UAAgC;GAC7C,IAAI,MAAM,WAAW,MAAM,MAAM,iBAAiB,WAAW;GAC7D,KAAI;GACJ,KAAI;EACN;EAEA,MAAM,QAAQ,iBACP;GACH,KAAI;GACJ,KAAI;EACN,GACA,OAAO,MAAM,WAAW,MAAO,EAAE;EAEnC,GAAG,iBAAiB,iBAAiB,KAAK;EAC1C,KAAK,SAAS;CAChB;AACD"}
@@ -0,0 +1,3 @@
1
+ import { createFlexibleConnectedPositionStrategy, createOverlayRef, createRepositionScrollStrategy } from "@angular/cdk/overlay";
2
+ import { ComponentPortal, TemplatePortal } from "@angular/cdk/portal";
3
+ export { ComponentPortal, TemplatePortal, createFlexibleConnectedPositionStrategy, createOverlayRef, createRepositionScrollStrategy };