@raqm/ui 0.0.0-stage → 0.1.1

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 (178) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/LICENSE +21 -0
  3. package/NOTICE.md +28 -0
  4. package/README.md +126 -3
  5. package/combobox/README.md +17 -0
  6. package/fesm2022/raqm-ui-accordion.mjs +414 -0
  7. package/fesm2022/raqm-ui-accordion.mjs.map +1 -0
  8. package/fesm2022/raqm-ui-alert-dialog.mjs +457 -0
  9. package/fesm2022/raqm-ui-alert-dialog.mjs.map +1 -0
  10. package/fesm2022/raqm-ui-alert.mjs +195 -0
  11. package/fesm2022/raqm-ui-alert.mjs.map +1 -0
  12. package/fesm2022/raqm-ui-aspect-ratio.mjs +66 -0
  13. package/fesm2022/raqm-ui-aspect-ratio.mjs.map +1 -0
  14. package/fesm2022/raqm-ui-attachment.mjs +435 -0
  15. package/fesm2022/raqm-ui-attachment.mjs.map +1 -0
  16. package/fesm2022/raqm-ui-avatar.mjs +337 -0
  17. package/fesm2022/raqm-ui-avatar.mjs.map +1 -0
  18. package/fesm2022/raqm-ui-badge.mjs +68 -0
  19. package/fesm2022/raqm-ui-badge.mjs.map +1 -0
  20. package/fesm2022/raqm-ui-breadcrumb.mjs +309 -0
  21. package/fesm2022/raqm-ui-breadcrumb.mjs.map +1 -0
  22. package/fesm2022/raqm-ui-button-group.mjs +138 -0
  23. package/fesm2022/raqm-ui-button-group.mjs.map +1 -0
  24. package/fesm2022/raqm-ui-button.mjs +295 -0
  25. package/fesm2022/raqm-ui-button.mjs.map +1 -0
  26. package/fesm2022/raqm-ui-calendar.mjs +1394 -0
  27. package/fesm2022/raqm-ui-calendar.mjs.map +1 -0
  28. package/fesm2022/raqm-ui-card.mjs +331 -0
  29. package/fesm2022/raqm-ui-card.mjs.map +1 -0
  30. package/fesm2022/raqm-ui-carousel.mjs +410 -0
  31. package/fesm2022/raqm-ui-carousel.mjs.map +1 -0
  32. package/fesm2022/raqm-ui-checkbox.mjs +86 -0
  33. package/fesm2022/raqm-ui-checkbox.mjs.map +1 -0
  34. package/fesm2022/raqm-ui-collapsible.mjs +266 -0
  35. package/fesm2022/raqm-ui-collapsible.mjs.map +1 -0
  36. package/fesm2022/raqm-ui-combobox.mjs +1584 -0
  37. package/fesm2022/raqm-ui-combobox.mjs.map +1 -0
  38. package/fesm2022/raqm-ui-command.mjs +1210 -0
  39. package/fesm2022/raqm-ui-command.mjs.map +1 -0
  40. package/fesm2022/raqm-ui-context-menu.mjs +723 -0
  41. package/fesm2022/raqm-ui-context-menu.mjs.map +1 -0
  42. package/fesm2022/raqm-ui-dialog.mjs +1214 -0
  43. package/fesm2022/raqm-ui-dialog.mjs.map +1 -0
  44. package/fesm2022/raqm-ui-drawer.mjs +687 -0
  45. package/fesm2022/raqm-ui-drawer.mjs.map +1 -0
  46. package/fesm2022/raqm-ui-dropdown-menu.mjs +1168 -0
  47. package/fesm2022/raqm-ui-dropdown-menu.mjs.map +1 -0
  48. package/fesm2022/raqm-ui-empty.mjs +272 -0
  49. package/fesm2022/raqm-ui-empty.mjs.map +1 -0
  50. package/fesm2022/raqm-ui-field.mjs +517 -0
  51. package/fesm2022/raqm-ui-field.mjs.map +1 -0
  52. package/fesm2022/raqm-ui-hover-card.mjs +828 -0
  53. package/fesm2022/raqm-ui-hover-card.mjs.map +1 -0
  54. package/fesm2022/raqm-ui-input-group.mjs +270 -0
  55. package/fesm2022/raqm-ui-input-group.mjs.map +1 -0
  56. package/fesm2022/raqm-ui-input-otp.mjs +788 -0
  57. package/fesm2022/raqm-ui-input-otp.mjs.map +1 -0
  58. package/fesm2022/raqm-ui-input.mjs +73 -0
  59. package/fesm2022/raqm-ui-input.mjs.map +1 -0
  60. package/fesm2022/raqm-ui-item.mjs +495 -0
  61. package/fesm2022/raqm-ui-item.mjs.map +1 -0
  62. package/fesm2022/raqm-ui-kbd.mjs +80 -0
  63. package/fesm2022/raqm-ui-kbd.mjs.map +1 -0
  64. package/fesm2022/raqm-ui-label.mjs +44 -0
  65. package/fesm2022/raqm-ui-label.mjs.map +1 -0
  66. package/fesm2022/raqm-ui-menubar.mjs +536 -0
  67. package/fesm2022/raqm-ui-menubar.mjs.map +1 -0
  68. package/fesm2022/raqm-ui-native-select.mjs +131 -0
  69. package/fesm2022/raqm-ui-native-select.mjs.map +1 -0
  70. package/fesm2022/raqm-ui-navigation-menu.mjs +1399 -0
  71. package/fesm2022/raqm-ui-navigation-menu.mjs.map +1 -0
  72. package/fesm2022/raqm-ui-overlay-internal.mjs +185 -0
  73. package/fesm2022/raqm-ui-overlay-internal.mjs.map +1 -0
  74. package/fesm2022/raqm-ui-pagination.mjs +440 -0
  75. package/fesm2022/raqm-ui-pagination.mjs.map +1 -0
  76. package/fesm2022/raqm-ui-popover.mjs +1495 -0
  77. package/fesm2022/raqm-ui-popover.mjs.map +1 -0
  78. package/fesm2022/raqm-ui-progress.mjs +369 -0
  79. package/fesm2022/raqm-ui-progress.mjs.map +1 -0
  80. package/fesm2022/raqm-ui-questionnaire.mjs +1005 -0
  81. package/fesm2022/raqm-ui-questionnaire.mjs.map +1 -0
  82. package/fesm2022/raqm-ui-radio-group.mjs +151 -0
  83. package/fesm2022/raqm-ui-radio-group.mjs.map +1 -0
  84. package/fesm2022/raqm-ui-resizable.mjs +439 -0
  85. package/fesm2022/raqm-ui-resizable.mjs.map +1 -0
  86. package/fesm2022/raqm-ui-scroll-area.mjs +510 -0
  87. package/fesm2022/raqm-ui-scroll-area.mjs.map +1 -0
  88. package/fesm2022/raqm-ui-select.mjs +1073 -0
  89. package/fesm2022/raqm-ui-select.mjs.map +1 -0
  90. package/fesm2022/raqm-ui-separator.mjs +103 -0
  91. package/fesm2022/raqm-ui-separator.mjs.map +1 -0
  92. package/fesm2022/raqm-ui-sheet.mjs +411 -0
  93. package/fesm2022/raqm-ui-sheet.mjs.map +1 -0
  94. package/fesm2022/raqm-ui-sidebar.mjs +1784 -0
  95. package/fesm2022/raqm-ui-sidebar.mjs.map +1 -0
  96. package/fesm2022/raqm-ui-skeleton.mjs +50 -0
  97. package/fesm2022/raqm-ui-skeleton.mjs.map +1 -0
  98. package/fesm2022/raqm-ui-slider.mjs +609 -0
  99. package/fesm2022/raqm-ui-slider.mjs.map +1 -0
  100. package/fesm2022/raqm-ui-spinner.mjs +137 -0
  101. package/fesm2022/raqm-ui-spinner.mjs.map +1 -0
  102. package/fesm2022/raqm-ui-switch.mjs +109 -0
  103. package/fesm2022/raqm-ui-switch.mjs.map +1 -0
  104. package/fesm2022/raqm-ui-table.mjs +271 -0
  105. package/fesm2022/raqm-ui-table.mjs.map +1 -0
  106. package/fesm2022/raqm-ui-tabs.mjs +536 -0
  107. package/fesm2022/raqm-ui-tabs.mjs.map +1 -0
  108. package/fesm2022/raqm-ui-textarea.mjs +37 -0
  109. package/fesm2022/raqm-ui-textarea.mjs.map +1 -0
  110. package/fesm2022/raqm-ui-toast.mjs +918 -0
  111. package/fesm2022/raqm-ui-toast.mjs.map +1 -0
  112. package/fesm2022/raqm-ui-toggle-group.mjs +462 -0
  113. package/fesm2022/raqm-ui-toggle-group.mjs.map +1 -0
  114. package/fesm2022/raqm-ui-toggle.mjs +158 -0
  115. package/fesm2022/raqm-ui-toggle.mjs.map +1 -0
  116. package/fesm2022/raqm-ui-tooltip.mjs +1226 -0
  117. package/fesm2022/raqm-ui-tooltip.mjs.map +1 -0
  118. package/fesm2022/raqm-ui.mjs +50 -0
  119. package/input-otp/README.md +12 -0
  120. package/package.json +275 -3
  121. package/styles/theme.css +4324 -0
  122. package/types/raqm-ui-accordion.d.ts +124 -0
  123. package/types/raqm-ui-alert-dialog.d.ts +81 -0
  124. package/types/raqm-ui-alert.d.ts +29 -0
  125. package/types/raqm-ui-aspect-ratio.d.ts +13 -0
  126. package/types/raqm-ui-attachment.d.ts +72 -0
  127. package/types/raqm-ui-avatar.d.ts +67 -0
  128. package/types/raqm-ui-badge.d.ts +20 -0
  129. package/types/raqm-ui-breadcrumb.d.ts +35 -0
  130. package/types/raqm-ui-button-group.d.ts +27 -0
  131. package/types/raqm-ui-button.d.ts +80 -0
  132. package/types/raqm-ui-calendar.d.ts +359 -0
  133. package/types/raqm-ui-card.d.ts +34 -0
  134. package/types/raqm-ui-carousel.d.ts +81 -0
  135. package/types/raqm-ui-checkbox.d.ts +24 -0
  136. package/types/raqm-ui-collapsible.d.ts +72 -0
  137. package/types/raqm-ui-combobox.d.ts +405 -0
  138. package/types/raqm-ui-command.d.ts +256 -0
  139. package/types/raqm-ui-context-menu.d.ts +196 -0
  140. package/types/raqm-ui-dialog.d.ts +232 -0
  141. package/types/raqm-ui-drawer.d.ts +121 -0
  142. package/types/raqm-ui-dropdown-menu.d.ts +319 -0
  143. package/types/raqm-ui-empty.d.ts +35 -0
  144. package/types/raqm-ui-field.d.ts +88 -0
  145. package/types/raqm-ui-hover-card.d.ts +139 -0
  146. package/types/raqm-ui-input-group.d.ts +45 -0
  147. package/types/raqm-ui-input-otp.d.ts +197 -0
  148. package/types/raqm-ui-input.d.ts +16 -0
  149. package/types/raqm-ui-item.d.ts +71 -0
  150. package/types/raqm-ui-kbd.d.ts +12 -0
  151. package/types/raqm-ui-label.d.ts +6 -0
  152. package/types/raqm-ui-menubar.d.ts +159 -0
  153. package/types/raqm-ui-native-select.d.ts +23 -0
  154. package/types/raqm-ui-navigation-menu.d.ts +230 -0
  155. package/types/raqm-ui-overlay-internal.d.ts +5 -0
  156. package/types/raqm-ui-pagination.d.ts +84 -0
  157. package/types/raqm-ui-popover.d.ts +235 -0
  158. package/types/raqm-ui-progress.d.ts +79 -0
  159. package/types/raqm-ui-questionnaire.d.ts +217 -0
  160. package/types/raqm-ui-radio-group.d.ts +48 -0
  161. package/types/raqm-ui-resizable.d.ts +98 -0
  162. package/types/raqm-ui-scroll-area.d.ts +132 -0
  163. package/types/raqm-ui-select.d.ts +205 -0
  164. package/types/raqm-ui-separator.d.ts +21 -0
  165. package/types/raqm-ui-sheet.d.ts +79 -0
  166. package/types/raqm-ui-sidebar.d.ts +285 -0
  167. package/types/raqm-ui-skeleton.d.ts +6 -0
  168. package/types/raqm-ui-slider.d.ts +129 -0
  169. package/types/raqm-ui-spinner.d.ts +32 -0
  170. package/types/raqm-ui-switch.d.ts +32 -0
  171. package/types/raqm-ui-table.d.ts +36 -0
  172. package/types/raqm-ui-tabs.d.ts +154 -0
  173. package/types/raqm-ui-textarea.d.ts +6 -0
  174. package/types/raqm-ui-toast.d.ts +190 -0
  175. package/types/raqm-ui-toggle-group.d.ts +167 -0
  176. package/types/raqm-ui-toggle.d.ts +42 -0
  177. package/types/raqm-ui-tooltip.d.ts +207 -0
  178. package/types/raqm-ui.d.ts +50 -0
@@ -0,0 +1,510 @@
1
+ import { CdkScrollable } from "@angular/cdk/scrolling";
2
+ import { RtlScrollAxisType, getRtlScrollAxisType } from "@angular/cdk/platform";
3
+ import * as i0 from "@angular/core";
4
+ import { ChangeDetectionStrategy, Component, DestroyRef, ElementRef, InjectionToken, afterNextRender, booleanAttribute, computed, contentChildren, forwardRef, inject, input, signal, viewChild } from "@angular/core";
5
+ const SCROLL_AREA = new InjectionToken("RAQM_SCROLL_AREA");
6
+ var RaqmScrollBarComponent = class RaqmScrollBarComponent {
7
+ vertical = input(true, {
8
+ ...ngDevMode ? { debugName: "vertical" } : /* istanbul ignore next */ {},
9
+ transform: booleanAttribute
10
+ });
11
+ keepMounted = input(false, {
12
+ ...ngDevMode ? { debugName: "keepMounted" } : /* istanbul ignore next */ {},
13
+ transform: booleanAttribute
14
+ });
15
+ area = inject(SCROLL_AREA);
16
+ host = inject(ElementRef);
17
+ destroyRef = inject(DestroyRef);
18
+ trackSize = signal(0, ...ngDevMode ? [{ debugName: "trackSize" }] : /* istanbul ignore next */ []);
19
+ drag = null;
20
+ overflow = computed(() => {
21
+ const m = this.area.metrics();
22
+ return this.vertical() ? m.scrollHeight > m.height : m.scrollWidth > m.width;
23
+ }, ...ngDevMode ? [{ debugName: "overflow" }] : /* istanbul ignore next */ []);
24
+ geometry = computed(() => {
25
+ const m = this.area.metrics();
26
+ const vertical = this.vertical();
27
+ const viewport = vertical ? m.height : m.width;
28
+ const content = vertical ? m.scrollHeight : m.scrollWidth;
29
+ const track = this.trackSize();
30
+ const thumb = Math.min(track, Math.max(16, content ? track * viewport / content : track));
31
+ const max = Math.max(0, content - viewport);
32
+ return {
33
+ thumb,
34
+ travel: track - thumb,
35
+ max,
36
+ offset: vertical ? m.y : m.x
37
+ };
38
+ }, ...ngDevMode ? [{ debugName: "geometry" }] : /* istanbul ignore next */ []);
39
+ thumbStyle = computed(() => {
40
+ const g = this.geometry();
41
+ const position = g.max ? g.offset / g.max * g.travel : 0;
42
+ return this.vertical() ? {
43
+ "block-size": `${g.thumb}px`,
44
+ "inset-block-start": `${position}px`
45
+ } : {
46
+ "inline-size": `${g.thumb}px`,
47
+ "inset-inline-start": `${position}px`
48
+ };
49
+ }, ...ngDevMode ? [{ debugName: "thumbStyle" }] : /* istanbul ignore next */ []);
50
+ constructor() {
51
+ afterNextRender(() => {
52
+ const resize = new ResizeObserver(() => this.measure());
53
+ resize.observe(this.host.nativeElement);
54
+ this.measure();
55
+ const track = this.host.nativeElement;
56
+ const wheel = (event) => this.onTrackWheel(event);
57
+ track.addEventListener("wheel", wheel, { passive: false });
58
+ this.destroyRef.onDestroy(() => {
59
+ resize.disconnect();
60
+ track.removeEventListener("wheel", wheel);
61
+ });
62
+ });
63
+ this.destroyRef.onDestroy(() => this.endDrag());
64
+ }
65
+ onTrackWheel(event) {
66
+ if (event.ctrlKey || event.defaultPrevented || !event.cancelable) return;
67
+ const vertical = this.vertical();
68
+ const delta = vertical ? event.deltaY : event.deltaX;
69
+ if (!Number.isFinite(delta) || delta === 0) return;
70
+ this.area.refresh();
71
+ const metrics = this.area.metrics();
72
+ const css = getComputedStyle(this.host.nativeElement);
73
+ const lineHeight = parseFloat(css.lineHeight) || parseFloat(css.fontSize) * 1.2 || 16;
74
+ const change = delta * (event.deltaMode === WheelEvent.DOM_DELTA_LINE ? lineHeight : event.deltaMode === WheelEvent.DOM_DELTA_PAGE ? vertical ? metrics.height : metrics.width : 1) * (!vertical && metrics.rtl ? -1 : 1);
75
+ const before = vertical ? metrics.y : metrics.x;
76
+ this.area.scrollTo(this.vertical() ? "vertical" : "horizontal", before + change);
77
+ const after = this.area.metrics();
78
+ if ((vertical ? after.y : after.x) !== before) event.preventDefault();
79
+ }
80
+ measure() {
81
+ const el = this.host.nativeElement;
82
+ const css = getComputedStyle(el);
83
+ const vertical = this.vertical();
84
+ this.trackSize.set(Math.max(0, (vertical ? el.clientHeight : el.clientWidth) - parseFloat(vertical ? css.paddingTop : css.paddingLeft) - parseFloat(vertical ? css.paddingBottom : css.paddingRight)));
85
+ }
86
+ coordinate(event) {
87
+ const el = this.host.nativeElement;
88
+ const rect = el.getBoundingClientRect();
89
+ const css = getComputedStyle(el);
90
+ if (this.vertical()) return event.clientY - rect.top - el.clientTop - parseFloat(css.paddingTop);
91
+ return this.area.metrics().rtl ? rect.right - event.clientX - parseFloat(css.borderRightWidth) - parseFloat(css.paddingRight) : event.clientX - rect.left - el.clientLeft - parseFloat(css.paddingLeft);
92
+ }
93
+ onPointerDown(event) {
94
+ if (!event.isPrimary || event.button !== 0 || !this.overflow() || this.drag) return;
95
+ event.preventDefault();
96
+ this.area.refresh();
97
+ this.measure();
98
+ const g = this.geometry();
99
+ const position = g.max ? g.offset / g.max * g.travel : 0;
100
+ const coordinate = this.coordinate(event);
101
+ const onThumb = coordinate >= position && coordinate <= position + g.thumb;
102
+ this.drag = {
103
+ pointer: event.pointerId,
104
+ grab: onThumb ? coordinate - position : g.thumb / 2
105
+ };
106
+ this.host.nativeElement.setPointerCapture(event.pointerId);
107
+ if (!onThumb) this.onPointerMove(event);
108
+ }
109
+ onPointerMove(event) {
110
+ if (this.drag?.pointer !== event.pointerId) return;
111
+ const g = this.geometry();
112
+ if (g.travel > 0) this.area.scrollTo(this.vertical() ? "vertical" : "horizontal", (this.coordinate(event) - this.drag.grab) / g.travel * g.max);
113
+ }
114
+ endPointer(event) {
115
+ if (event.pointerId === this.drag?.pointer) this.endDrag();
116
+ }
117
+ endDrag() {
118
+ const drag = this.drag;
119
+ this.drag = null;
120
+ if (drag && this.host.nativeElement.hasPointerCapture(drag.pointer)) this.host.nativeElement.releasePointerCapture(drag.pointer);
121
+ }
122
+ static ɵfac = i0.ɵɵngDeclareFactory({
123
+ minVersion: "12.0.0",
124
+ version: "22.2.2",
125
+ ngImport: i0,
126
+ type: RaqmScrollBarComponent,
127
+ deps: [],
128
+ target: i0.ɵɵFactoryTarget.Component
129
+ });
130
+ static ɵcmp = i0.ɵɵngDeclareComponent({
131
+ minVersion: "17.0.0",
132
+ version: "22.2.2",
133
+ type: RaqmScrollBarComponent,
134
+ isStandalone: true,
135
+ selector: "raqm-scroll-bar",
136
+ inputs: {
137
+ vertical: {
138
+ classPropertyName: "vertical",
139
+ publicName: "vertical",
140
+ isSignal: true,
141
+ isRequired: false,
142
+ transformFunction: null
143
+ },
144
+ keepMounted: {
145
+ classPropertyName: "keepMounted",
146
+ publicName: "keepMounted",
147
+ isSignal: true,
148
+ isRequired: false,
149
+ transformFunction: null
150
+ }
151
+ },
152
+ host: {
153
+ attributes: {
154
+ "data-slot": "scroll-area-scrollbar",
155
+ "aria-hidden": "true"
156
+ },
157
+ listeners: {
158
+ "pointerdown": "onPointerDown($event)",
159
+ "pointermove": "onPointerMove($event)",
160
+ "pointerup": "endPointer($event)",
161
+ "pointercancel": "endPointer($event)",
162
+ "lostpointercapture": "endPointer($event)"
163
+ },
164
+ properties: {
165
+ "attr.data-raqm-vertical": "vertical() ? \"\" : null",
166
+ "attr.data-raqm-overflow": "overflow() ? \"\" : null",
167
+ "attr.data-raqm-keep-mounted": "keepMounted() ? \"\" : null",
168
+ "attr.data-raqm-corner": "area.horizontal() && area.vertical() ? \"\" : null",
169
+ "attr.data-raqm-scrolling": "area.scrolling() ? \"\" : null",
170
+ "attr.data-raqm-hovering": "area.hovering() ? \"\" : null",
171
+ "attr.data-raqm-has-overflow-x": "area.metrics().scrollWidth > area.metrics().width ? \"\" : null",
172
+ "attr.data-raqm-has-overflow-y": "area.vertical() ? \"\" : null",
173
+ "attr.data-raqm-overflow-x-start": "area.edges().xStart ? \"\" : null",
174
+ "attr.data-raqm-overflow-x-end": "area.edges().xEnd ? \"\" : null",
175
+ "attr.data-raqm-overflow-y-start": "area.edges().yStart ? \"\" : null",
176
+ "attr.data-raqm-overflow-y-end": "area.edges().yEnd ? \"\" : null"
177
+ },
178
+ classAttribute: "raqm-scroll-bar"
179
+ },
180
+ ngImport: i0,
181
+ template: "@if (overflow() || keepMounted()) {\r\n <div\r\n class=\"raqm-scroll-bar__thumb\"\r\n data-slot=\"scroll-area-thumb\"\r\n [attr.data-raqm-vertical]=\"vertical() ? '' : null\"\r\n [attr.data-raqm-scrolling]=\"area.scrolling() ? '' : null\"\r\n [style]=\"thumbStyle()\"\r\n ></div>\r\n}\r\n",
182
+ styles: [":host{position:absolute;display:flex;box-sizing:border-box;touch-action:none;-webkit-user-select:none;user-select:none;padding:1px;transition:color .15s,background-color .15s;visibility:hidden}:host([data-raqm-overflow]),:host([data-raqm-keep-mounted]){visibility:visible}:host([data-raqm-vertical]){inset-block:0;inset-inline-end:0;inline-size:calc(var(--raqm-spacing) * 2.5);border-inline-start:1px solid transparent}:host(:not([data-raqm-vertical])){inset-inline:0;inset-block-end:0;block-size:calc(var(--raqm-spacing) * 2.5);flex-direction:column;border-block-start:1px solid transparent}:host([data-raqm-vertical][data-raqm-corner]){inset-block-end:calc(var(--raqm-spacing) * 2.5)}:host(:not([data-raqm-vertical])[data-raqm-corner]){inset-inline-end:calc(var(--raqm-spacing) * 2.5)}.raqm-scroll-bar__thumb{position:relative;flex-shrink:0;background:var(--raqm-border);border-radius:9999px}:host([data-raqm-vertical]) .raqm-scroll-bar__thumb{inline-size:100%}:host(:not([data-raqm-vertical])) .raqm-scroll-bar__thumb{block-size:100%}@media(prefers-reduced-motion:reduce){:host{transition:none}}@media(forced-colors:active){:host{display:none}}\n"],
183
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
184
+ });
185
+ };
186
+ i0.ɵɵngDeclareClassMetadata({
187
+ minVersion: "12.0.0",
188
+ version: "22.2.2",
189
+ ngImport: i0,
190
+ type: RaqmScrollBarComponent,
191
+ decorators: [{
192
+ type: Component,
193
+ args: [{
194
+ selector: "raqm-scroll-bar",
195
+ changeDetection: ChangeDetectionStrategy.OnPush,
196
+ host: {
197
+ class: "raqm-scroll-bar",
198
+ "data-slot": "scroll-area-scrollbar",
199
+ "aria-hidden": "true",
200
+ "[attr.data-raqm-vertical]": "vertical() ? \"\" : null",
201
+ "[attr.data-raqm-overflow]": "overflow() ? \"\" : null",
202
+ "[attr.data-raqm-keep-mounted]": "keepMounted() ? \"\" : null",
203
+ "[attr.data-raqm-corner]": "area.horizontal() && area.vertical() ? \"\" : null",
204
+ "[attr.data-raqm-scrolling]": "area.scrolling() ? \"\" : null",
205
+ "[attr.data-raqm-hovering]": "area.hovering() ? \"\" : null",
206
+ "[attr.data-raqm-has-overflow-x]": "area.metrics().scrollWidth > area.metrics().width ? \"\" : null",
207
+ "[attr.data-raqm-has-overflow-y]": "area.vertical() ? \"\" : null",
208
+ "[attr.data-raqm-overflow-x-start]": "area.edges().xStart ? \"\" : null",
209
+ "[attr.data-raqm-overflow-x-end]": "area.edges().xEnd ? \"\" : null",
210
+ "[attr.data-raqm-overflow-y-start]": "area.edges().yStart ? \"\" : null",
211
+ "[attr.data-raqm-overflow-y-end]": "area.edges().yEnd ? \"\" : null",
212
+ "(pointerdown)": "onPointerDown($event)",
213
+ "(pointermove)": "onPointerMove($event)",
214
+ "(pointerup)": "endPointer($event)",
215
+ "(pointercancel)": "endPointer($event)",
216
+ "(lostpointercapture)": "endPointer($event)"
217
+ },
218
+ template: "@if (overflow() || keepMounted()) {\r\n <div\r\n class=\"raqm-scroll-bar__thumb\"\r\n data-slot=\"scroll-area-thumb\"\r\n [attr.data-raqm-vertical]=\"vertical() ? '' : null\"\r\n [attr.data-raqm-scrolling]=\"area.scrolling() ? '' : null\"\r\n [style]=\"thumbStyle()\"\r\n ></div>\r\n}\r\n",
219
+ styles: [":host{position:absolute;display:flex;box-sizing:border-box;touch-action:none;-webkit-user-select:none;user-select:none;padding:1px;transition:color .15s,background-color .15s;visibility:hidden}:host([data-raqm-overflow]),:host([data-raqm-keep-mounted]){visibility:visible}:host([data-raqm-vertical]){inset-block:0;inset-inline-end:0;inline-size:calc(var(--raqm-spacing) * 2.5);border-inline-start:1px solid transparent}:host(:not([data-raqm-vertical])){inset-inline:0;inset-block-end:0;block-size:calc(var(--raqm-spacing) * 2.5);flex-direction:column;border-block-start:1px solid transparent}:host([data-raqm-vertical][data-raqm-corner]){inset-block-end:calc(var(--raqm-spacing) * 2.5)}:host(:not([data-raqm-vertical])[data-raqm-corner]){inset-inline-end:calc(var(--raqm-spacing) * 2.5)}.raqm-scroll-bar__thumb{position:relative;flex-shrink:0;background:var(--raqm-border);border-radius:9999px}:host([data-raqm-vertical]) .raqm-scroll-bar__thumb{inline-size:100%}:host(:not([data-raqm-vertical])) .raqm-scroll-bar__thumb{block-size:100%}@media(prefers-reduced-motion:reduce){:host{transition:none}}@media(forced-colors:active){:host{display:none}}\n"]
220
+ }]
221
+ }],
222
+ ctorParameters: () => [],
223
+ propDecorators: {
224
+ vertical: [{
225
+ type: i0.Input,
226
+ args: [{
227
+ isSignal: true,
228
+ alias: "vertical",
229
+ required: false
230
+ }]
231
+ }],
232
+ keepMounted: [{
233
+ type: i0.Input,
234
+ args: [{
235
+ isSignal: true,
236
+ alias: "keepMounted",
237
+ required: false
238
+ }]
239
+ }]
240
+ }
241
+ });
242
+ var RaqmScrollAreaComponent = class RaqmScrollAreaComponent {
243
+ viewportLabel = input.required(...ngDevMode ? [{ debugName: "viewportLabel" }] : /* istanbul ignore next */ []);
244
+ overflowEdgeThreshold = input(0, ...ngDevMode ? [{ debugName: "overflowEdgeThreshold" }] : /* istanbul ignore next */ []);
245
+ viewport = viewChild.required("viewport", ...ngDevMode ? [{ debugName: "viewport" }] : /* istanbul ignore next */ []);
246
+ content = viewChild.required("content", ...ngDevMode ? [{ debugName: "content" }] : /* istanbul ignore next */ []);
247
+ host = inject(ElementRef);
248
+ destroyRef = inject(DestroyRef);
249
+ bars = contentChildren(RaqmScrollBarComponent, ...ngDevMode ? [{ debugName: "bars" }] : /* istanbul ignore next */ []);
250
+ defaultVertical = computed(() => !this.bars().some((bar) => bar.vertical()), ...ngDevMode ? [{ debugName: "defaultVertical" }] : /* istanbul ignore next */ []);
251
+ metrics = signal({
252
+ width: 0,
253
+ height: 0,
254
+ scrollWidth: 0,
255
+ scrollHeight: 0,
256
+ x: 0,
257
+ y: 0,
258
+ rtl: false
259
+ }, ...ngDevMode ? [{ debugName: "metrics" }] : /* istanbul ignore next */ []);
260
+ horizontal = computed(() => this.bars().some((bar) => !bar.vertical()) && this.metrics().scrollWidth > this.metrics().width, ...ngDevMode ? [{ debugName: "horizontal" }] : /* istanbul ignore next */ []);
261
+ vertical = computed(() => this.metrics().scrollHeight > this.metrics().height, ...ngDevMode ? [{ debugName: "vertical" }] : /* istanbul ignore next */ []);
262
+ scrolling = signal(false, ...ngDevMode ? [{ debugName: "scrolling" }] : /* istanbul ignore next */ []);
263
+ hovering = signal(false, ...ngDevMode ? [{ debugName: "hovering" }] : /* istanbul ignore next */ []);
264
+ scrollTimer;
265
+ edges = computed(() => {
266
+ const m = this.metrics();
267
+ const threshold = this.overflowEdgeThreshold();
268
+ const edge = (key) => Math.max(0, typeof threshold === "number" ? threshold : threshold[key] ?? 0);
269
+ return {
270
+ xStart: m.x > edge("xStart"),
271
+ xEnd: m.scrollWidth - m.width - m.x > edge("xEnd"),
272
+ yStart: m.y > edge("yStart"),
273
+ yEnd: m.scrollHeight - m.height - m.y > edge("yEnd")
274
+ };
275
+ }, ...ngDevMode ? [{ debugName: "edges" }] : /* istanbul ignore next */ []);
276
+ constructor() {
277
+ this.destroyRef.onDestroy(() => clearTimeout(this.scrollTimer));
278
+ afterNextRender(() => {
279
+ const viewport = this.viewport().nativeElement;
280
+ const content = this.content().nativeElement;
281
+ const resize = new ResizeObserver(() => this.refresh());
282
+ resize.observe(viewport);
283
+ resize.observe(content);
284
+ const direction = new MutationObserver(() => this.refresh());
285
+ for (let element = this.host.nativeElement; element; element = element.parentElement) direction.observe(element, {
286
+ attributes: true,
287
+ attributeFilter: [
288
+ "dir",
289
+ "class",
290
+ "style"
291
+ ]
292
+ });
293
+ const mutation = new MutationObserver(() => this.refresh());
294
+ mutation.observe(content, {
295
+ subtree: true,
296
+ childList: true,
297
+ characterData: true,
298
+ attributes: true
299
+ });
300
+ const load = () => this.refresh();
301
+ content.addEventListener("load", load, true);
302
+ this.destroyRef.onDestroy(() => {
303
+ resize.disconnect();
304
+ mutation.disconnect();
305
+ direction.disconnect();
306
+ content.removeEventListener("load", load, true);
307
+ });
308
+ this.refresh();
309
+ });
310
+ }
311
+ onScroll() {
312
+ this.refresh();
313
+ this.scrolling.set(true);
314
+ clearTimeout(this.scrollTimer);
315
+ this.scrollTimer = setTimeout(() => this.scrolling.set(false), 100);
316
+ }
317
+ refresh() {
318
+ const viewport = this.viewport().nativeElement;
319
+ const rtl = getComputedStyle(viewport).direction === "rtl";
320
+ const max = Math.max(0, viewport.scrollWidth - viewport.clientWidth);
321
+ let x = viewport.scrollLeft;
322
+ if (rtl) switch (getRtlScrollAxisType()) {
323
+ case RtlScrollAxisType.NEGATED:
324
+ x = -x;
325
+ break;
326
+ case RtlScrollAxisType.NORMAL: x = max - x;
327
+ }
328
+ const next = {
329
+ width: viewport.clientWidth,
330
+ height: viewport.clientHeight,
331
+ scrollWidth: viewport.scrollWidth,
332
+ scrollHeight: viewport.scrollHeight,
333
+ x: Math.max(0, Math.min(max, x)),
334
+ y: Math.max(0, viewport.scrollTop),
335
+ rtl
336
+ };
337
+ const previous = this.metrics();
338
+ if (Object.keys(next).some((key) => next[key] !== previous[key])) this.metrics.set(next);
339
+ }
340
+ scrollTo(orientation, offset) {
341
+ const viewport = this.viewport().nativeElement;
342
+ this.refresh();
343
+ const metrics = this.metrics();
344
+ const max = orientation === "horizontal" ? metrics.scrollWidth - metrics.width : metrics.scrollHeight - metrics.height;
345
+ let value = Math.max(0, Math.min(max, offset));
346
+ if (orientation === "vertical") viewport.scrollTop = value;
347
+ else {
348
+ if (metrics.rtl) switch (getRtlScrollAxisType()) {
349
+ case RtlScrollAxisType.NEGATED:
350
+ value = -value;
351
+ break;
352
+ case RtlScrollAxisType.NORMAL: value = max - value;
353
+ }
354
+ viewport.scrollLeft = value;
355
+ }
356
+ this.refresh();
357
+ }
358
+ static ɵfac = i0.ɵɵngDeclareFactory({
359
+ minVersion: "12.0.0",
360
+ version: "22.2.2",
361
+ ngImport: i0,
362
+ type: RaqmScrollAreaComponent,
363
+ deps: [],
364
+ target: i0.ɵɵFactoryTarget.Component
365
+ });
366
+ static ɵcmp = i0.ɵɵngDeclareComponent({
367
+ minVersion: "17.0.0",
368
+ version: "22.2.2",
369
+ type: RaqmScrollAreaComponent,
370
+ isStandalone: true,
371
+ selector: "raqm-scroll-area",
372
+ inputs: {
373
+ viewportLabel: {
374
+ classPropertyName: "viewportLabel",
375
+ publicName: "viewportLabel",
376
+ isSignal: true,
377
+ isRequired: true,
378
+ transformFunction: null
379
+ },
380
+ overflowEdgeThreshold: {
381
+ classPropertyName: "overflowEdgeThreshold",
382
+ publicName: "overflowEdgeThreshold",
383
+ isSignal: true,
384
+ isRequired: false,
385
+ transformFunction: null
386
+ }
387
+ },
388
+ host: {
389
+ attributes: { "data-slot": "scroll-area" },
390
+ listeners: {
391
+ "pointerenter": "hovering.set(true)",
392
+ "pointerleave": "hovering.set(false)"
393
+ },
394
+ properties: {
395
+ "attr.data-raqm-has-overflow-x": "metrics().scrollWidth > metrics().width ? \"\" : null",
396
+ "attr.data-raqm-has-overflow-y": "vertical() ? \"\" : null",
397
+ "attr.data-raqm-overflow-x-start": "edges().xStart ? \"\" : null",
398
+ "attr.data-raqm-overflow-x-end": "edges().xEnd ? \"\" : null",
399
+ "attr.data-raqm-overflow-y-start": "edges().yStart ? \"\" : null",
400
+ "attr.data-raqm-overflow-y-end": "edges().yEnd ? \"\" : null",
401
+ "attr.data-raqm-scrolling": "scrolling() ? \"\" : null"
402
+ },
403
+ classAttribute: "raqm-scroll-area"
404
+ },
405
+ providers: [{
406
+ provide: SCROLL_AREA,
407
+ useExisting: forwardRef(() => RaqmScrollAreaComponent)
408
+ }],
409
+ queries: [{
410
+ propertyName: "bars",
411
+ predicate: RaqmScrollBarComponent,
412
+ isSignal: true
413
+ }],
414
+ viewQueries: [{
415
+ propertyName: "viewport",
416
+ first: true,
417
+ predicate: ["viewport"],
418
+ descendants: true,
419
+ isSignal: true
420
+ }, {
421
+ propertyName: "content",
422
+ first: true,
423
+ predicate: ["content"],
424
+ descendants: true,
425
+ isSignal: true
426
+ }],
427
+ ngImport: i0,
428
+ template: "<div\r\n #viewport\r\n cdkScrollable\r\n class=\"raqm-scroll-area__viewport\"\r\n data-slot=\"scroll-area-viewport\"\r\n tabindex=\"0\"\r\n role=\"region\"\r\n [attr.aria-label]=\"viewportLabel()\"\r\n (scroll)=\"onScroll()\"\r\n>\r\n <div #content class=\"raqm-scroll-area__content\"><ng-content /></div>\r\n</div>\r\n<ng-content select=\"raqm-scroll-bar\" />\r\n@if (defaultVertical()) {\r\n <raqm-scroll-bar />\r\n}\r\n@if (horizontal() && vertical()) {\r\n <div class=\"raqm-scroll-area__corner\" aria-hidden=\"true\"></div>\r\n}\r\n",
429
+ styles: [":host{display:block;position:relative;min-inline-size:0;min-block-size:0}.raqm-scroll-area__viewport{inline-size:100%;block-size:100%;overflow:auto;border-radius:inherit;scrollbar-width:none;outline:none;transition:color .15s,box-shadow .15s}.raqm-scroll-area__viewport::-webkit-scrollbar{display:none}.raqm-scroll-area__viewport:focus-visible{outline:1px solid var(--raqm-ring);box-shadow:0 0 0 3px color-mix(in srgb,var(--raqm-ring) 50%,transparent)}.raqm-scroll-area__content{display:table;min-inline-size:100%}.raqm-scroll-area__corner{position:absolute;inset-inline-end:0;inset-block-end:0;inline-size:calc(var(--raqm-spacing) * 2.5);block-size:calc(var(--raqm-spacing) * 2.5)}@media(prefers-reduced-motion:reduce){.raqm-scroll-area__viewport{transition:none}}@media(forced-colors:active){.raqm-scroll-area__viewport{scrollbar-width:auto}.raqm-scroll-area__viewport::-webkit-scrollbar{display:initial}}\n"],
430
+ dependencies: [{
431
+ kind: "directive",
432
+ type: CdkScrollable,
433
+ selector: "[cdk-scrollable], [cdkScrollable]"
434
+ }, {
435
+ kind: "component",
436
+ type: RaqmScrollBarComponent,
437
+ selector: "raqm-scroll-bar",
438
+ inputs: ["vertical", "keepMounted"]
439
+ }],
440
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
441
+ });
442
+ };
443
+ i0.ɵɵngDeclareClassMetadata({
444
+ minVersion: "12.0.0",
445
+ version: "22.2.2",
446
+ ngImport: i0,
447
+ type: RaqmScrollAreaComponent,
448
+ decorators: [{
449
+ type: Component,
450
+ args: [{
451
+ selector: "raqm-scroll-area",
452
+ imports: [CdkScrollable, RaqmScrollBarComponent],
453
+ changeDetection: ChangeDetectionStrategy.OnPush,
454
+ providers: [{
455
+ provide: SCROLL_AREA,
456
+ useExisting: forwardRef(() => RaqmScrollAreaComponent)
457
+ }],
458
+ host: {
459
+ class: "raqm-scroll-area",
460
+ "data-slot": "scroll-area",
461
+ "[attr.data-raqm-has-overflow-x]": "metrics().scrollWidth > metrics().width ? \"\" : null",
462
+ "[attr.data-raqm-has-overflow-y]": "vertical() ? \"\" : null",
463
+ "[attr.data-raqm-overflow-x-start]": "edges().xStart ? \"\" : null",
464
+ "[attr.data-raqm-overflow-x-end]": "edges().xEnd ? \"\" : null",
465
+ "[attr.data-raqm-overflow-y-start]": "edges().yStart ? \"\" : null",
466
+ "[attr.data-raqm-overflow-y-end]": "edges().yEnd ? \"\" : null",
467
+ "[attr.data-raqm-scrolling]": "scrolling() ? \"\" : null",
468
+ "(pointerenter)": "hovering.set(true)",
469
+ "(pointerleave)": "hovering.set(false)"
470
+ },
471
+ template: "<div\r\n #viewport\r\n cdkScrollable\r\n class=\"raqm-scroll-area__viewport\"\r\n data-slot=\"scroll-area-viewport\"\r\n tabindex=\"0\"\r\n role=\"region\"\r\n [attr.aria-label]=\"viewportLabel()\"\r\n (scroll)=\"onScroll()\"\r\n>\r\n <div #content class=\"raqm-scroll-area__content\"><ng-content /></div>\r\n</div>\r\n<ng-content select=\"raqm-scroll-bar\" />\r\n@if (defaultVertical()) {\r\n <raqm-scroll-bar />\r\n}\r\n@if (horizontal() && vertical()) {\r\n <div class=\"raqm-scroll-area__corner\" aria-hidden=\"true\"></div>\r\n}\r\n",
472
+ styles: [":host{display:block;position:relative;min-inline-size:0;min-block-size:0}.raqm-scroll-area__viewport{inline-size:100%;block-size:100%;overflow:auto;border-radius:inherit;scrollbar-width:none;outline:none;transition:color .15s,box-shadow .15s}.raqm-scroll-area__viewport::-webkit-scrollbar{display:none}.raqm-scroll-area__viewport:focus-visible{outline:1px solid var(--raqm-ring);box-shadow:0 0 0 3px color-mix(in srgb,var(--raqm-ring) 50%,transparent)}.raqm-scroll-area__content{display:table;min-inline-size:100%}.raqm-scroll-area__corner{position:absolute;inset-inline-end:0;inset-block-end:0;inline-size:calc(var(--raqm-spacing) * 2.5);block-size:calc(var(--raqm-spacing) * 2.5)}@media(prefers-reduced-motion:reduce){.raqm-scroll-area__viewport{transition:none}}@media(forced-colors:active){.raqm-scroll-area__viewport{scrollbar-width:auto}.raqm-scroll-area__viewport::-webkit-scrollbar{display:initial}}\n"]
473
+ }]
474
+ }],
475
+ ctorParameters: () => [],
476
+ propDecorators: {
477
+ viewportLabel: [{
478
+ type: i0.Input,
479
+ args: [{
480
+ isSignal: true,
481
+ alias: "viewportLabel",
482
+ required: true
483
+ }]
484
+ }],
485
+ overflowEdgeThreshold: [{
486
+ type: i0.Input,
487
+ args: [{
488
+ isSignal: true,
489
+ alias: "overflowEdgeThreshold",
490
+ required: false
491
+ }]
492
+ }],
493
+ viewport: [{
494
+ type: i0.ViewChild,
495
+ args: ["viewport", { isSignal: true }]
496
+ }],
497
+ content: [{
498
+ type: i0.ViewChild,
499
+ args: ["content", { isSignal: true }]
500
+ }],
501
+ bars: [{
502
+ type: i0.ContentChildren,
503
+ args: [i0.forwardRef(() => RaqmScrollBarComponent), { isSignal: true }]
504
+ }]
505
+ }
506
+ });
507
+ const RaqmScrollArea = [RaqmScrollAreaComponent, RaqmScrollBarComponent];
508
+ export { RaqmScrollArea, RaqmScrollAreaComponent, RaqmScrollBarComponent };
509
+
510
+ //# sourceMappingURL=raqm-ui-scroll-area.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raqm-ui-scroll-area.mjs","names":[],"sources":["../../../projects/ui/scroll-area/scroll-area-context.ts","../../../projects/ui/scroll-area/scroll-bar.ts","../../../projects/ui/scroll-area/scroll-bar.html","../../../projects/ui/scroll-area/scroll-area.ts","../../../projects/ui/scroll-area/scroll-area.html","../../../projects/ui/scroll-area/public-api.ts"],"sourcesContent":["import { InjectionToken, Signal } from '@angular/core';\r\n\r\nexport interface ScrollAreaMetrics {\r\n width: number;\r\n height: number;\r\n scrollWidth: number;\r\n scrollHeight: number;\r\n x: number;\r\n y: number;\r\n rtl: boolean;\r\n}\r\n\r\n/** Internal root contract; the token avoids a circular component dependency. */\r\nexport const SCROLL_AREA = new InjectionToken<{\r\n metrics: Signal<ScrollAreaMetrics>;\r\n horizontal: Signal<boolean>;\r\n vertical: Signal<boolean>;\r\n scrolling: Signal<boolean>;\r\n hovering: Signal<boolean>;\r\n edges: Signal<{ xStart: boolean; xEnd: boolean; yStart: boolean; yEnd: boolean }>;\r\n refresh(): void;\r\n scrollTo(orientation: 'horizontal' | 'vertical', offset: number): void;\r\n}>('RAQM_SCROLL_AREA');\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n afterNextRender,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { SCROLL_AREA } from './scroll-area-context';\r\n\r\n/** Scroll bar overlay; `aria-hidden` and not a tab stop, because the viewport handles keyboard/AT scrolling. */\r\n@Component({\r\n selector: 'raqm-scroll-bar',\r\n templateUrl: './scroll-bar.html',\r\n styleUrl: './scroll-bar.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'raqm-scroll-bar',\r\n 'data-slot': 'scroll-area-scrollbar',\r\n 'aria-hidden': 'true',\r\n '[attr.data-raqm-vertical]': 'vertical() ? \"\" : null',\r\n '[attr.data-raqm-overflow]': 'overflow() ? \"\" : null',\r\n '[attr.data-raqm-keep-mounted]': 'keepMounted() ? \"\" : null',\r\n '[attr.data-raqm-corner]': 'area.horizontal() && area.vertical() ? \"\" : null',\r\n '[attr.data-raqm-scrolling]': 'area.scrolling() ? \"\" : null',\r\n '[attr.data-raqm-hovering]': 'area.hovering() ? \"\" : null',\r\n '[attr.data-raqm-has-overflow-x]':\r\n 'area.metrics().scrollWidth > area.metrics().width ? \"\" : null',\r\n '[attr.data-raqm-has-overflow-y]': 'area.vertical() ? \"\" : null',\r\n '[attr.data-raqm-overflow-x-start]': 'area.edges().xStart ? \"\" : null',\r\n '[attr.data-raqm-overflow-x-end]': 'area.edges().xEnd ? \"\" : null',\r\n '[attr.data-raqm-overflow-y-start]': 'area.edges().yStart ? \"\" : null',\r\n '[attr.data-raqm-overflow-y-end]': 'area.edges().yEnd ? \"\" : null',\r\n '(pointerdown)': 'onPointerDown($event)',\r\n '(pointermove)': 'onPointerMove($event)',\r\n '(pointerup)': 'endPointer($event)',\r\n '(pointercancel)': 'endPointer($event)',\r\n '(lostpointercapture)': 'endPointer($event)',\r\n },\r\n})\r\nexport class RaqmScrollBarComponent {\r\n readonly vertical = input(true, { transform: booleanAttribute });\r\n /** Keeps the internal thumb mounted without overflow; the Angular host always exists. */\r\n readonly keepMounted = input(false, { transform: booleanAttribute });\r\n protected readonly area = inject(SCROLL_AREA);\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly trackSize = signal(0);\r\n private drag: { pointer: number; grab: number } | null = null;\r\n protected readonly overflow = computed(() => {\r\n const m = this.area.metrics();\r\n return this.vertical() ? m.scrollHeight > m.height : m.scrollWidth > m.width;\r\n });\r\n private readonly geometry = computed(() => {\r\n const m = this.area.metrics();\r\n const vertical = this.vertical();\r\n const viewport = vertical ? m.height : m.width;\r\n const content = vertical ? m.scrollHeight : m.scrollWidth;\r\n const track = this.trackSize();\r\n const thumb = Math.min(track, Math.max(16, content ? (track * viewport) / content : track));\r\n const max = Math.max(0, content - viewport);\r\n return { thumb, travel: track - thumb, max, offset: vertical ? m.y : m.x };\r\n });\r\n protected readonly thumbStyle = computed(() => {\r\n const g = this.geometry();\r\n const position = g.max ? (g.offset / g.max) * g.travel : 0;\r\n return this.vertical()\r\n ? { 'block-size': `${g.thumb}px`, 'inset-block-start': `${position}px` }\r\n : { 'inline-size': `${g.thumb}px`, 'inset-inline-start': `${position}px` };\r\n });\r\n\r\n constructor() {\r\n afterNextRender(() => {\r\n const resize = new ResizeObserver(() => this.measure());\r\n resize.observe(this.host.nativeElement);\r\n this.measure();\r\n const track = this.host.nativeElement;\r\n const wheel = (event: WheelEvent) => this.onTrackWheel(event);\r\n track.addEventListener('wheel', wheel, { passive: false });\r\n this.destroyRef.onDestroy(() => {\r\n resize.disconnect();\r\n track.removeEventListener('wheel', wheel);\r\n });\r\n });\r\n this.destroyRef.onDestroy(() => this.endDrag());\r\n }\r\n\r\n /** Bridges only overlay-track wheel input; viewport wheel/touch remain native. */\r\n private onTrackWheel(event: WheelEvent): void {\r\n if (event.ctrlKey || event.defaultPrevented || !event.cancelable) return;\r\n const vertical = this.vertical();\r\n const delta = vertical ? event.deltaY : event.deltaX;\r\n if (!Number.isFinite(delta) || delta === 0) return;\r\n this.area.refresh();\r\n const metrics = this.area.metrics();\r\n const css = getComputedStyle(this.host.nativeElement);\r\n // Computed line-height may be `normal`: use the inherited font's usual 1.2 ratio.\r\n const lineHeight = parseFloat(css.lineHeight) || parseFloat(css.fontSize) * 1.2 || 16;\r\n const unit =\r\n event.deltaMode === WheelEvent.DOM_DELTA_LINE\r\n ? lineHeight\r\n : event.deltaMode === WheelEvent.DOM_DELTA_PAGE\r\n ? vertical\r\n ? metrics.height\r\n : metrics.width\r\n : 1;\r\n // Wheel deltaX is physical; the root's public offset is measured from logical start.\r\n const change = delta * unit * (!vertical && metrics.rtl ? -1 : 1);\r\n const before = vertical ? metrics.y : metrics.x;\r\n this.area.scrollTo(this.vertical() ? 'vertical' : 'horizontal', before + change);\r\n const after = this.area.metrics();\r\n if ((vertical ? after.y : after.x) !== before) event.preventDefault();\r\n }\r\n\r\n private measure(): void {\r\n const el = this.host.nativeElement;\r\n const css = getComputedStyle(el);\r\n const vertical = this.vertical();\r\n this.trackSize.set(\r\n Math.max(\r\n 0,\r\n (vertical ? el.clientHeight : el.clientWidth) -\r\n parseFloat(vertical ? css.paddingTop : css.paddingLeft) -\r\n parseFloat(vertical ? css.paddingBottom : css.paddingRight),\r\n ),\r\n );\r\n }\r\n\r\n private coordinate(event: PointerEvent): number {\r\n const el = this.host.nativeElement;\r\n const rect = el.getBoundingClientRect();\r\n const css = getComputedStyle(el);\r\n if (this.vertical())\r\n return event.clientY - rect.top - el.clientTop - parseFloat(css.paddingTop);\r\n return this.area.metrics().rtl\r\n ? rect.right - event.clientX - parseFloat(css.borderRightWidth) - parseFloat(css.paddingRight)\r\n : event.clientX - rect.left - el.clientLeft - parseFloat(css.paddingLeft);\r\n }\r\n\r\n protected onPointerDown(event: PointerEvent): void {\r\n if (!event.isPrimary || event.button !== 0 || !this.overflow() || this.drag) return;\r\n event.preventDefault();\r\n this.area.refresh();\r\n this.measure();\r\n const g = this.geometry();\r\n const position = g.max ? (g.offset / g.max) * g.travel : 0;\r\n const coordinate = this.coordinate(event);\r\n const onThumb = coordinate >= position && coordinate <= position + g.thumb;\r\n this.drag = { pointer: event.pointerId, grab: onThumb ? coordinate - position : g.thumb / 2 };\r\n this.host.nativeElement.setPointerCapture(event.pointerId);\r\n if (!onThumb) this.onPointerMove(event);\r\n }\r\n\r\n protected onPointerMove(event: PointerEvent): void {\r\n if (this.drag?.pointer !== event.pointerId) return;\r\n const g = this.geometry();\r\n if (g.travel > 0)\r\n this.area.scrollTo(\r\n this.vertical() ? 'vertical' : 'horizontal',\r\n ((this.coordinate(event) - this.drag.grab) / g.travel) * g.max,\r\n );\r\n }\r\n\r\n protected endPointer(event: PointerEvent): void {\r\n if (event.pointerId === this.drag?.pointer) this.endDrag();\r\n }\r\n\r\n private endDrag(): void {\r\n const drag = this.drag;\r\n this.drag = null;\r\n if (drag && this.host.nativeElement.hasPointerCapture(drag.pointer))\r\n this.host.nativeElement.releasePointerCapture(drag.pointer);\r\n }\r\n}\r\n","@if (overflow() || keepMounted()) {\r\n <div\r\n class=\"raqm-scroll-bar__thumb\"\r\n data-slot=\"scroll-area-thumb\"\r\n [attr.data-raqm-vertical]=\"vertical() ? '' : null\"\r\n [attr.data-raqm-scrolling]=\"area.scrolling() ? '' : null\"\r\n [style]=\"thumbStyle()\"\r\n ></div>\r\n}\r\n","import { CdkScrollable } from '@angular/cdk/scrolling';\r\nimport { getRtlScrollAxisType, RtlScrollAxisType } from '@angular/cdk/platform';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n afterNextRender,\r\n computed,\r\n contentChildren,\r\n forwardRef,\r\n inject,\r\n input,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { RaqmScrollBarComponent } from './scroll-bar';\r\nimport { SCROLL_AREA, ScrollAreaMetrics } from './scroll-area-context';\r\n\r\n/** Scroll area; the labelled native viewport is the sole keyboard/AT target and the overlay bars are `aria-hidden` and pointer-only. */\r\n@Component({\r\n selector: 'raqm-scroll-area',\r\n imports: [CdkScrollable, RaqmScrollBarComponent],\r\n templateUrl: './scroll-area.html',\r\n styleUrl: './scroll-area.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [{ provide: SCROLL_AREA, useExisting: forwardRef(() => RaqmScrollAreaComponent) }],\r\n host: {\r\n class: 'raqm-scroll-area',\r\n 'data-slot': 'scroll-area',\r\n '[attr.data-raqm-has-overflow-x]': 'metrics().scrollWidth > metrics().width ? \"\" : null',\r\n '[attr.data-raqm-has-overflow-y]': 'vertical() ? \"\" : null',\r\n '[attr.data-raqm-overflow-x-start]': 'edges().xStart ? \"\" : null',\r\n '[attr.data-raqm-overflow-x-end]': 'edges().xEnd ? \"\" : null',\r\n '[attr.data-raqm-overflow-y-start]': 'edges().yStart ? \"\" : null',\r\n '[attr.data-raqm-overflow-y-end]': 'edges().yEnd ? \"\" : null',\r\n '[attr.data-raqm-scrolling]': 'scrolling() ? \"\" : null',\r\n '(pointerenter)': 'hovering.set(true)',\r\n '(pointerleave)': 'hovering.set(false)',\r\n },\r\n})\r\nexport class RaqmScrollAreaComponent {\r\n /** Required accessible name for the keyboard-focusable native viewport. */\r\n readonly viewportLabel = input.required<string>();\r\n readonly overflowEdgeThreshold = input<\r\n number | Partial<Record<'xStart' | 'xEnd' | 'yStart' | 'yEnd', number>>\r\n >(0);\r\n readonly viewport = viewChild.required<ElementRef<HTMLElement>>('viewport');\r\n private readonly content = viewChild.required<ElementRef<HTMLElement>>('content');\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly bars = contentChildren(RaqmScrollBarComponent);\r\n protected readonly defaultVertical = computed(() => !this.bars().some((bar) => bar.vertical()));\r\n readonly metrics = signal<ScrollAreaMetrics>({\r\n width: 0,\r\n height: 0,\r\n scrollWidth: 0,\r\n scrollHeight: 0,\r\n x: 0,\r\n y: 0,\r\n rtl: false,\r\n });\r\n readonly horizontal = computed(\r\n () =>\r\n this.bars().some((bar) => !bar.vertical()) &&\r\n this.metrics().scrollWidth > this.metrics().width,\r\n );\r\n readonly vertical = computed(() => this.metrics().scrollHeight > this.metrics().height);\r\n readonly scrolling = signal(false);\r\n readonly hovering = signal(false);\r\n private scrollTimer: ReturnType<typeof setTimeout> | undefined;\r\n readonly edges = computed(() => {\r\n const m = this.metrics();\r\n const threshold = this.overflowEdgeThreshold();\r\n const edge = (key: 'xStart' | 'xEnd' | 'yStart' | 'yEnd') =>\r\n Math.max(0, typeof threshold === 'number' ? threshold : (threshold[key] ?? 0));\r\n return {\r\n xStart: m.x > edge('xStart'),\r\n xEnd: m.scrollWidth - m.width - m.x > edge('xEnd'),\r\n yStart: m.y > edge('yStart'),\r\n yEnd: m.scrollHeight - m.height - m.y > edge('yEnd'),\r\n };\r\n });\r\n\r\n constructor() {\r\n this.destroyRef.onDestroy(() => clearTimeout(this.scrollTimer));\r\n afterNextRender(() => {\r\n const viewport = this.viewport().nativeElement;\r\n const content = this.content().nativeElement;\r\n const resize = new ResizeObserver(() => this.refresh());\r\n resize.observe(viewport);\r\n resize.observe(content);\r\n // Direction can change on any ancestor without changing viewport size.\r\n const direction = new MutationObserver(() => this.refresh());\r\n for (\r\n let element: HTMLElement | null = this.host.nativeElement;\r\n element;\r\n element = element.parentElement\r\n ) {\r\n direction.observe(element, {\r\n attributes: true,\r\n attributeFilter: ['dir', 'class', 'style'],\r\n });\r\n }\r\n const mutation = new MutationObserver(() => this.refresh());\r\n mutation.observe(content, {\r\n subtree: true,\r\n childList: true,\r\n characterData: true,\r\n attributes: true,\r\n });\r\n const load = () => this.refresh();\r\n content.addEventListener('load', load, true);\r\n this.destroyRef.onDestroy(() => {\r\n resize.disconnect();\r\n mutation.disconnect();\r\n direction.disconnect();\r\n content.removeEventListener('load', load, true);\r\n });\r\n this.refresh();\r\n });\r\n }\r\n\r\n /** Tracks the native scroll lifecycle without changing wheel or touch events. */\r\n protected onScroll(): void {\r\n this.refresh();\r\n this.scrolling.set(true);\r\n clearTimeout(this.scrollTimer);\r\n this.scrollTimer = setTimeout(() => this.scrolling.set(false), 100);\r\n }\r\n\r\n refresh(): void {\r\n const viewport = this.viewport().nativeElement;\r\n const rtl = getComputedStyle(viewport).direction === 'rtl';\r\n const max = Math.max(0, viewport.scrollWidth - viewport.clientWidth);\r\n let x = viewport.scrollLeft;\r\n if (rtl) {\r\n switch (getRtlScrollAxisType()) {\r\n case RtlScrollAxisType.NEGATED:\r\n x = -x;\r\n break;\r\n case RtlScrollAxisType.NORMAL:\r\n x = max - x;\r\n break;\r\n }\r\n }\r\n const next = {\r\n width: viewport.clientWidth,\r\n height: viewport.clientHeight,\r\n scrollWidth: viewport.scrollWidth,\r\n scrollHeight: viewport.scrollHeight,\r\n x: Math.max(0, Math.min(max, x)),\r\n y: Math.max(0, viewport.scrollTop),\r\n rtl,\r\n };\r\n const previous = this.metrics();\r\n if (\r\n Object.keys(next).some(\r\n (key) => next[key as keyof ScrollAreaMetrics] !== previous[key as keyof ScrollAreaMetrics],\r\n )\r\n )\r\n this.metrics.set(next);\r\n }\r\n\r\n /** Sets a clamped native offset measured from the logical start of the chosen axis. */\r\n scrollTo(orientation: 'horizontal' | 'vertical', offset: number): void {\r\n const viewport = this.viewport().nativeElement;\r\n this.refresh();\r\n const metrics = this.metrics();\r\n const max =\r\n orientation === 'horizontal'\r\n ? metrics.scrollWidth - metrics.width\r\n : metrics.scrollHeight - metrics.height;\r\n let value = Math.max(0, Math.min(max, offset));\r\n if (orientation === 'vertical') {\r\n viewport.scrollTop = value;\r\n } else {\r\n if (metrics.rtl) {\r\n switch (getRtlScrollAxisType()) {\r\n case RtlScrollAxisType.NEGATED:\r\n value = -value;\r\n break;\r\n case RtlScrollAxisType.NORMAL:\r\n value = max - value;\r\n break;\r\n }\r\n }\r\n viewport.scrollLeft = value;\r\n }\r\n this.refresh();\r\n }\r\n}\r\n","<div\r\n #viewport\r\n cdkScrollable\r\n class=\"raqm-scroll-area__viewport\"\r\n data-slot=\"scroll-area-viewport\"\r\n tabindex=\"0\"\r\n role=\"region\"\r\n [attr.aria-label]=\"viewportLabel()\"\r\n (scroll)=\"onScroll()\"\r\n>\r\n <div #content class=\"raqm-scroll-area__content\"><ng-content /></div>\r\n</div>\r\n<ng-content select=\"raqm-scroll-bar\" />\r\n@if (defaultVertical()) {\r\n <raqm-scroll-bar />\r\n}\r\n@if (horizontal() && vertical()) {\r\n <div class=\"raqm-scroll-area__corner\" aria-hidden=\"true\"></div>\r\n}\r\n","import { RaqmScrollAreaComponent } from './scroll-area';\r\nimport { RaqmScrollBarComponent } from './scroll-bar';\r\n\r\nexport { RaqmScrollAreaComponent, RaqmScrollBarComponent };\r\n\r\nexport const RaqmScrollArea = [RaqmScrollAreaComponent, RaqmScrollBarComponent] as const;\r\n"],"mappings":"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"}