@area8975/ui 0.2.2-dev.48 → 0.2.2-dev.50

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 (182) hide show
  1. package/README.md +3 -2
  2. package/fesm2022/area8975-ui-alert.mjs +113 -0
  3. package/fesm2022/area8975-ui-alert.mjs.map +1 -0
  4. package/fesm2022/area8975-ui-avatar.mjs +157 -0
  5. package/fesm2022/area8975-ui-avatar.mjs.map +1 -0
  6. package/fesm2022/area8975-ui-badge.mjs +116 -0
  7. package/fesm2022/area8975-ui-badge.mjs.map +1 -0
  8. package/fesm2022/area8975-ui-button.mjs +314 -0
  9. package/fesm2022/area8975-ui-button.mjs.map +1 -0
  10. package/fesm2022/area8975-ui-calendar.mjs +549 -0
  11. package/fesm2022/area8975-ui-calendar.mjs.map +1 -0
  12. package/fesm2022/area8975-ui-card-header.mjs +96 -0
  13. package/fesm2022/area8975-ui-card-header.mjs.map +1 -0
  14. package/fesm2022/area8975-ui-card.mjs +73 -0
  15. package/fesm2022/area8975-ui-card.mjs.map +1 -0
  16. package/fesm2022/area8975-ui-chart-palette.mjs +225 -0
  17. package/fesm2022/area8975-ui-chart-palette.mjs.map +1 -0
  18. package/fesm2022/area8975-ui-charts.mjs +2813 -0
  19. package/fesm2022/area8975-ui-charts.mjs.map +1 -0
  20. package/fesm2022/area8975-ui-checkbox.mjs +202 -0
  21. package/fesm2022/area8975-ui-checkbox.mjs.map +1 -0
  22. package/fesm2022/area8975-ui-colour.mjs +200 -0
  23. package/fesm2022/area8975-ui-colour.mjs.map +1 -0
  24. package/fesm2022/area8975-ui-container.mjs +40 -0
  25. package/fesm2022/area8975-ui-container.mjs.map +1 -0
  26. package/fesm2022/area8975-ui-counter.mjs +246 -0
  27. package/fesm2022/area8975-ui-counter.mjs.map +1 -0
  28. package/fesm2022/area8975-ui-date-range-picker.mjs +554 -0
  29. package/fesm2022/area8975-ui-date-range-picker.mjs.map +1 -0
  30. package/fesm2022/area8975-ui-datepicker.mjs +547 -0
  31. package/fesm2022/area8975-ui-datepicker.mjs.map +1 -0
  32. package/fesm2022/area8975-ui-disclosure.mjs +279 -0
  33. package/fesm2022/area8975-ui-disclosure.mjs.map +1 -0
  34. package/fesm2022/area8975-ui-drawer.mjs +106 -0
  35. package/fesm2022/area8975-ui-drawer.mjs.map +1 -0
  36. package/fesm2022/area8975-ui-dropdown-button.mjs +141 -0
  37. package/fesm2022/area8975-ui-dropdown-button.mjs.map +1 -0
  38. package/fesm2022/area8975-ui-dropdown-menu.mjs +96 -0
  39. package/fesm2022/area8975-ui-dropdown-menu.mjs.map +1 -0
  40. package/fesm2022/area8975-ui-dropdown.mjs +208 -0
  41. package/fesm2022/area8975-ui-dropdown.mjs.map +1 -0
  42. package/fesm2022/area8975-ui-dropzone.mjs +332 -0
  43. package/fesm2022/area8975-ui-dropzone.mjs.map +1 -0
  44. package/fesm2022/area8975-ui-field.mjs +191 -0
  45. package/fesm2022/area8975-ui-field.mjs.map +1 -0
  46. package/fesm2022/area8975-ui-file-input.mjs +340 -0
  47. package/fesm2022/area8975-ui-file-input.mjs.map +1 -0
  48. package/fesm2022/area8975-ui-file.mjs +47 -0
  49. package/fesm2022/area8975-ui-file.mjs.map +1 -0
  50. package/fesm2022/area8975-ui-format.mjs +70 -0
  51. package/fesm2022/area8975-ui-format.mjs.map +1 -0
  52. package/fesm2022/area8975-ui-input-addon.mjs +42 -0
  53. package/fesm2022/area8975-ui-input-addon.mjs.map +1 -0
  54. package/fesm2022/area8975-ui-input-group.mjs +86 -0
  55. package/fesm2022/area8975-ui-input-group.mjs.map +1 -0
  56. package/fesm2022/area8975-ui-input.mjs +682 -0
  57. package/fesm2022/area8975-ui-input.mjs.map +1 -0
  58. package/fesm2022/area8975-ui-kpi.mjs +167 -0
  59. package/fesm2022/area8975-ui-kpi.mjs.map +1 -0
  60. package/fesm2022/area8975-ui-layout.mjs +63 -0
  61. package/fesm2022/area8975-ui-layout.mjs.map +1 -0
  62. package/fesm2022/area8975-ui-loading.mjs +76 -0
  63. package/fesm2022/area8975-ui-loading.mjs.map +1 -0
  64. package/fesm2022/area8975-ui-modal-close-btn.mjs +89 -0
  65. package/fesm2022/area8975-ui-modal-close-btn.mjs.map +1 -0
  66. package/fesm2022/area8975-ui-modal.mjs +235 -0
  67. package/fesm2022/area8975-ui-modal.mjs.map +1 -0
  68. package/fesm2022/area8975-ui-money.mjs +230 -0
  69. package/fesm2022/area8975-ui-money.mjs.map +1 -0
  70. package/fesm2022/area8975-ui-overlay.mjs +317 -0
  71. package/fesm2022/area8975-ui-overlay.mjs.map +1 -0
  72. package/fesm2022/area8975-ui-pagination.mjs +152 -0
  73. package/fesm2022/area8975-ui-pagination.mjs.map +1 -0
  74. package/fesm2022/area8975-ui-private.mjs +63 -0
  75. package/fesm2022/area8975-ui-private.mjs.map +1 -0
  76. package/fesm2022/area8975-ui-progress.mjs +307 -0
  77. package/fesm2022/area8975-ui-progress.mjs.map +1 -0
  78. package/fesm2022/area8975-ui-radio.mjs +199 -0
  79. package/fesm2022/area8975-ui-radio.mjs.map +1 -0
  80. package/fesm2022/area8975-ui-rich-text-editor.mjs +778 -0
  81. package/fesm2022/area8975-ui-rich-text-editor.mjs.map +1 -0
  82. package/fesm2022/area8975-ui-search.mjs +266 -0
  83. package/fesm2022/area8975-ui-search.mjs.map +1 -0
  84. package/fesm2022/area8975-ui-segmented.mjs +118 -0
  85. package/fesm2022/area8975-ui-segmented.mjs.map +1 -0
  86. package/fesm2022/area8975-ui-select.mjs +926 -0
  87. package/fesm2022/area8975-ui-select.mjs.map +1 -0
  88. package/fesm2022/area8975-ui-sidebar-group.mjs +60 -0
  89. package/fesm2022/area8975-ui-sidebar-group.mjs.map +1 -0
  90. package/fesm2022/area8975-ui-sidebar-item.mjs +107 -0
  91. package/fesm2022/area8975-ui-sidebar-item.mjs.map +1 -0
  92. package/fesm2022/area8975-ui-sidebar.mjs +109 -0
  93. package/fesm2022/area8975-ui-sidebar.mjs.map +1 -0
  94. package/fesm2022/area8975-ui-skeleton.mjs +116 -0
  95. package/fesm2022/area8975-ui-skeleton.mjs.map +1 -0
  96. package/fesm2022/area8975-ui-stat.mjs +55 -0
  97. package/fesm2022/area8975-ui-stat.mjs.map +1 -0
  98. package/fesm2022/area8975-ui-switch.mjs +132 -0
  99. package/fesm2022/area8975-ui-switch.mjs.map +1 -0
  100. package/fesm2022/area8975-ui-tab.mjs +217 -0
  101. package/fesm2022/area8975-ui-tab.mjs.map +1 -0
  102. package/fesm2022/area8975-ui-table-filters.mjs +499 -0
  103. package/fesm2022/area8975-ui-table-filters.mjs.map +1 -0
  104. package/fesm2022/area8975-ui-table.mjs +1237 -0
  105. package/fesm2022/area8975-ui-table.mjs.map +1 -0
  106. package/fesm2022/area8975-ui-textarea.mjs +375 -0
  107. package/fesm2022/area8975-ui-textarea.mjs.map +1 -0
  108. package/fesm2022/area8975-ui-theme.mjs +246 -0
  109. package/fesm2022/area8975-ui-theme.mjs.map +1 -0
  110. package/fesm2022/area8975-ui-time-select.mjs +170 -0
  111. package/fesm2022/area8975-ui-time-select.mjs.map +1 -0
  112. package/fesm2022/area8975-ui-toast.mjs +269 -0
  113. package/fesm2022/area8975-ui-toast.mjs.map +1 -0
  114. package/fesm2022/area8975-ui-toaster.mjs +117 -0
  115. package/fesm2022/area8975-ui-toaster.mjs.map +1 -0
  116. package/fesm2022/area8975-ui-tooltip.mjs +196 -0
  117. package/fesm2022/area8975-ui-tooltip.mjs.map +1 -0
  118. package/fesm2022/area8975-ui-user-menu.mjs +186 -0
  119. package/fesm2022/area8975-ui-user-menu.mjs.map +1 -0
  120. package/fesm2022/area8975-ui.mjs +0 -16269
  121. package/package.json +237 -1
  122. package/types/area8975-ui-alert.d.ts +25 -0
  123. package/types/area8975-ui-avatar.d.ts +40 -0
  124. package/types/area8975-ui-badge.d.ts +31 -0
  125. package/types/area8975-ui-button.d.ts +129 -0
  126. package/types/area8975-ui-calendar.d.ts +177 -0
  127. package/types/area8975-ui-card-header.d.ts +28 -0
  128. package/types/area8975-ui-card.d.ts +18 -0
  129. package/types/area8975-ui-chart-palette.d.ts +176 -0
  130. package/types/area8975-ui-charts.d.ts +747 -0
  131. package/types/area8975-ui-checkbox.d.ts +61 -0
  132. package/types/area8975-ui-colour.d.ts +31 -0
  133. package/types/area8975-ui-container.d.ts +5 -0
  134. package/types/area8975-ui-counter.d.ts +43 -0
  135. package/types/area8975-ui-date-range-picker.d.ts +132 -0
  136. package/types/area8975-ui-datepicker.d.ts +124 -0
  137. package/types/area8975-ui-disclosure.d.ts +79 -0
  138. package/types/area8975-ui-drawer.d.ts +25 -0
  139. package/types/area8975-ui-dropdown-button.d.ts +32 -0
  140. package/types/area8975-ui-dropdown-menu.d.ts +25 -0
  141. package/types/area8975-ui-dropdown.d.ts +56 -0
  142. package/types/area8975-ui-dropzone.d.ts +96 -0
  143. package/types/area8975-ui-field.d.ts +72 -0
  144. package/types/area8975-ui-file-input.d.ts +72 -0
  145. package/types/area8975-ui-file.d.ts +21 -0
  146. package/types/area8975-ui-format.d.ts +37 -0
  147. package/types/area8975-ui-input-addon.d.ts +10 -0
  148. package/types/area8975-ui-input-group.d.ts +18 -0
  149. package/types/area8975-ui-input.d.ts +224 -0
  150. package/types/area8975-ui-kpi.d.ts +36 -0
  151. package/types/area8975-ui-layout.d.ts +7 -0
  152. package/types/area8975-ui-loading.d.ts +16 -0
  153. package/types/area8975-ui-modal-close-btn.d.ts +14 -0
  154. package/types/area8975-ui-modal.d.ts +45 -0
  155. package/types/area8975-ui-money.d.ts +77 -0
  156. package/types/area8975-ui-overlay.d.ts +75 -0
  157. package/types/area8975-ui-pagination.d.ts +27 -0
  158. package/types/area8975-ui-private.d.ts +20 -0
  159. package/types/area8975-ui-progress.d.ts +127 -0
  160. package/types/area8975-ui-radio.d.ts +61 -0
  161. package/types/area8975-ui-rich-text-editor.d.ts +165 -0
  162. package/types/area8975-ui-search.d.ts +56 -0
  163. package/types/area8975-ui-segmented.d.ts +41 -0
  164. package/types/area8975-ui-select.d.ts +293 -0
  165. package/types/area8975-ui-sidebar-group.d.ts +15 -0
  166. package/types/area8975-ui-sidebar-item.d.ts +20 -0
  167. package/types/area8975-ui-sidebar.d.ts +16 -0
  168. package/types/area8975-ui-skeleton.d.ts +35 -0
  169. package/types/area8975-ui-stat.d.ts +13 -0
  170. package/types/area8975-ui-switch.d.ts +32 -0
  171. package/types/area8975-ui-tab.d.ts +45 -0
  172. package/types/area8975-ui-table-filters.d.ts +138 -0
  173. package/types/area8975-ui-table.d.ts +371 -0
  174. package/types/area8975-ui-textarea.d.ts +126 -0
  175. package/types/area8975-ui-theme.d.ts +61 -0
  176. package/types/area8975-ui-time-select.d.ts +35 -0
  177. package/types/area8975-ui-toast.d.ts +78 -0
  178. package/types/area8975-ui-toaster.d.ts +23 -0
  179. package/types/area8975-ui-tooltip.d.ts +47 -0
  180. package/types/area8975-ui-user-menu.d.ts +39 -0
  181. package/types/area8975-ui.d.ts +1 -4464
  182. package/fesm2022/area8975-ui.mjs.map +0 -1
@@ -0,0 +1,554 @@
1
+ import * as i0 from "@angular/core";
2
+ import { Component, ElementRef, Injector, afterNextRender, booleanAttribute, computed, inject, input, model, signal, viewChild } from "@angular/core";
3
+ import { UiCalendarComponent, addDays, parseIsoDate, toIsoDate } from "@area8975/ui/calendar";
4
+ import { UiDropdownComponent, UiDropdownDirective } from "@area8975/ui/dropdown";
5
+ import { UiInputComponent } from "@area8975/ui/input";
6
+ import { NgIcon, provideIcons } from "@ng-icons/core";
7
+ import { heroCalendarDateRange, heroXMark } from "@ng-icons/heroicons/outline";
8
+ const OPEN_KEYS = [
9
+ "Enter",
10
+ " ",
11
+ "ArrowDown"
12
+ ];
13
+ var UiDateRangePickerComponent = class UiDateRangePickerComponent {
14
+ host = inject(ElementRef);
15
+ injector = inject(Injector);
16
+ value = model({
17
+ start: null,
18
+ end: null
19
+ }, ...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
20
+ id = input("", ...ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []);
21
+ placeholder = input("Select dates", ...ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []);
22
+ disabled = input(false, {
23
+ ...ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {},
24
+ transform: booleanAttribute
25
+ });
26
+ clearable = input(true, {
27
+ ...ngDevMode ? { debugName: "clearable" } : /* istanbul ignore next */ {},
28
+ transform: booleanAttribute
29
+ });
30
+ validationState = input(null, ...ngDevMode ? [{ debugName: "validationState" }] : /* istanbul ignore next */ []);
31
+ describedBy = input("", ...ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []);
32
+ min = input(null, ...ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []);
33
+ max = input(null, ...ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []);
34
+ isDateDisabled = input(() => false, ...ngDevMode ? [{ debugName: "isDateDisabled" }] : /* istanbul ignore next */ []);
35
+ weekStart = input(1, ...ngDevMode ? [{ debugName: "weekStart" }] : /* istanbul ignore next */ []);
36
+ locale = input("en-GB", ...ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []);
37
+ format = input({ dateStyle: "medium" }, ...ngDevMode ? [{ debugName: "format" }] : /* istanbul ignore next */ []);
38
+ presets = input([], ...ngDevMode ? [{ debugName: "presets" }] : /* istanbul ignore next */ []);
39
+ isOpen = signal(false, ...ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []);
40
+ calendar = viewChild(UiCalendarComponent, ...ngDevMode ? [{ debugName: "calendar" }] : /* istanbul ignore next */ []);
41
+ hasValue = computed(() => !!this.value().start, ...ngDevMode ? [{ debugName: "hasValue" }] : /* istanbul ignore next */ []);
42
+ presetRanges = computed(() => this.isOpen() ? this.presets().map((preset) => this.clamp(preset.range())) : [], ...ngDevMode ? [{ debugName: "presetRanges" }] : /* istanbul ignore next */ []);
43
+ activePreset = computed(() => {
44
+ const { start, end } = this.value();
45
+ return this.presetRanges().findIndex((range) => range.start === start && range.end === end);
46
+ }, ...ngDevMode ? [{ debugName: "activePreset" }] : /* istanbul ignore next */ []);
47
+ display = computed(() => {
48
+ const start = parseIsoDate(this.value().start);
49
+ const end = parseIsoDate(this.value().end);
50
+ const format = new Intl.DateTimeFormat(this.locale(), this.format());
51
+ if (!start) return "";
52
+ return end ? format.formatRange(start, end) : `${format.format(start)} – …`;
53
+ }, ...ngDevMode ? [{ debugName: "display" }] : /* istanbul ignore next */ []);
54
+ toggle() {
55
+ if (!this.disabled()) this.isOpen.update((open) => !open);
56
+ }
57
+ handleInputKeydown(event) {
58
+ if (this.disabled() || !OPEN_KEYS.includes(event.key)) return;
59
+ event.preventDefault();
60
+ this.isOpen.set(true);
61
+ afterNextRender(() => this.calendar()?.focusActiveDate(), { injector: this.injector });
62
+ }
63
+ handleRange(range) {
64
+ if (range.start && range.end) {
65
+ this.isOpen.set(false);
66
+ this.focusInput();
67
+ }
68
+ }
69
+ choosePreset(preset) {
70
+ this.value.set(this.clamp(preset.range()));
71
+ this.isOpen.set(false);
72
+ this.focusInput();
73
+ }
74
+ handlePanelKeydown(event) {
75
+ if (event.key === "Escape") this.focusInput();
76
+ }
77
+ clear(event) {
78
+ event.stopPropagation();
79
+ this.value.set({
80
+ start: null,
81
+ end: null
82
+ });
83
+ this.focusInput();
84
+ }
85
+ clamp({ start, end }) {
86
+ const min = this.min();
87
+ const max = this.max();
88
+ return {
89
+ start: start && min && start < min ? min : start,
90
+ end: end && max && end > max ? max : end
91
+ };
92
+ }
93
+ focusInput() {
94
+ this.host.nativeElement.querySelector("input")?.focus();
95
+ }
96
+ static ɵfac = i0.ɵɵngDeclareFactory({
97
+ minVersion: "12.0.0",
98
+ version: "22.2.1",
99
+ ngImport: i0,
100
+ type: UiDateRangePickerComponent,
101
+ deps: [],
102
+ target: i0.ɵɵFactoryTarget.Component
103
+ });
104
+ static ɵcmp = i0.ɵɵngDeclareComponent({
105
+ minVersion: "17.0.0",
106
+ version: "22.2.1",
107
+ type: UiDateRangePickerComponent,
108
+ isStandalone: true,
109
+ selector: "ui-date-range-picker",
110
+ inputs: {
111
+ value: {
112
+ classPropertyName: "value",
113
+ publicName: "value",
114
+ isSignal: true,
115
+ isRequired: false,
116
+ transformFunction: null
117
+ },
118
+ id: {
119
+ classPropertyName: "id",
120
+ publicName: "id",
121
+ isSignal: true,
122
+ isRequired: false,
123
+ transformFunction: null
124
+ },
125
+ placeholder: {
126
+ classPropertyName: "placeholder",
127
+ publicName: "placeholder",
128
+ isSignal: true,
129
+ isRequired: false,
130
+ transformFunction: null
131
+ },
132
+ disabled: {
133
+ classPropertyName: "disabled",
134
+ publicName: "disabled",
135
+ isSignal: true,
136
+ isRequired: false,
137
+ transformFunction: null
138
+ },
139
+ clearable: {
140
+ classPropertyName: "clearable",
141
+ publicName: "clearable",
142
+ isSignal: true,
143
+ isRequired: false,
144
+ transformFunction: null
145
+ },
146
+ validationState: {
147
+ classPropertyName: "validationState",
148
+ publicName: "validationState",
149
+ isSignal: true,
150
+ isRequired: false,
151
+ transformFunction: null
152
+ },
153
+ describedBy: {
154
+ classPropertyName: "describedBy",
155
+ publicName: "describedBy",
156
+ isSignal: true,
157
+ isRequired: false,
158
+ transformFunction: null
159
+ },
160
+ min: {
161
+ classPropertyName: "min",
162
+ publicName: "min",
163
+ isSignal: true,
164
+ isRequired: false,
165
+ transformFunction: null
166
+ },
167
+ max: {
168
+ classPropertyName: "max",
169
+ publicName: "max",
170
+ isSignal: true,
171
+ isRequired: false,
172
+ transformFunction: null
173
+ },
174
+ isDateDisabled: {
175
+ classPropertyName: "isDateDisabled",
176
+ publicName: "isDateDisabled",
177
+ isSignal: true,
178
+ isRequired: false,
179
+ transformFunction: null
180
+ },
181
+ weekStart: {
182
+ classPropertyName: "weekStart",
183
+ publicName: "weekStart",
184
+ isSignal: true,
185
+ isRequired: false,
186
+ transformFunction: null
187
+ },
188
+ locale: {
189
+ classPropertyName: "locale",
190
+ publicName: "locale",
191
+ isSignal: true,
192
+ isRequired: false,
193
+ transformFunction: null
194
+ },
195
+ format: {
196
+ classPropertyName: "format",
197
+ publicName: "format",
198
+ isSignal: true,
199
+ isRequired: false,
200
+ transformFunction: null
201
+ },
202
+ presets: {
203
+ classPropertyName: "presets",
204
+ publicName: "presets",
205
+ isSignal: true,
206
+ isRequired: false,
207
+ transformFunction: null
208
+ }
209
+ },
210
+ outputs: { value: "valueChange" },
211
+ host: {
212
+ properties: { "attr.id": "null" },
213
+ classAttribute: "block"
214
+ },
215
+ providers: [provideIcons({
216
+ heroCalendarDateRange,
217
+ heroXMark
218
+ })],
219
+ viewQueries: [{
220
+ propertyName: "calendar",
221
+ first: true,
222
+ predicate: UiCalendarComponent,
223
+ descendants: true,
224
+ isSignal: true
225
+ }],
226
+ ngImport: i0,
227
+ template: "<ui-dropdown\n [isOpen]=\"isOpen\"\n placement=\"bottom-start\"\n closeBehaviour=\"whenClickOutside\"\n class=\"w-full\"\n>\n <ui-input\n [value]=\"display()\"\n [id]=\"id()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [describedBy]=\"describedBy()\"\n [ariaExpanded]=\"isOpen()\"\n ariaHasPopup=\"dialog\"\n [validationState]=\"validationState()\"\n classes=\"cursor-pointer\"\n autocomplete=\"off\"\n readonly\n (click)=\"toggle()\"\n (keydown)=\"handleInputKeydown($event)\"\n >\n <ng-template #leading>\n <ng-icon\n name=\"heroCalendarDateRange\"\n class=\"ms-3 text-muted-foreground-1 shrink-0\"\n />\n </ng-template>\n\n <ng-template #trailing>\n @if (clearable() && hasValue() && !disabled()) {\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center w-8 self-stretch text-muted-foreground-1 hover:text-foreground\"\n aria-label=\"Clear dates\"\n (click)=\"clear($event)\"\n >\n <ng-icon name=\"heroXMark\" class=\"shrink-0\" />\n </button>\n }\n </ng-template>\n </ui-input>\n\n @if (isOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <div class=\"ui-date-range-panel\">\n @if (presets().length) {\n <div class=\"ui-date-range-presets\" role=\"group\" aria-label=\"Quick ranges\">\n @for (preset of presets(); track preset.label; let index = $index) {\n <button\n type=\"button\"\n class=\"ui-date-range-preset ui-text-body-alt\"\n [attr.aria-pressed]=\"index === activePreset()\"\n (click)=\"choosePreset(preset)\"\n (keydown)=\"handlePanelKeydown($event)\"\n >\n {{ preset.label }}\n </button>\n }\n </div>\n }\n\n <ui-calendar\n class=\"p-3\"\n mode=\"range\"\n [(range)]=\"value\"\n [min]=\"min()\"\n [max]=\"max()\"\n [isDateDisabled]=\"isDateDisabled()\"\n [weekStart]=\"weekStart()\"\n [locale]=\"locale()\"\n (rangeChange)=\"handleRange($event)\"\n (keydown)=\"handlePanelKeydown($event)\"\n />\n </div>\n </div>\n }\n</ui-dropdown>\n",
228
+ styles: ["@layer properties;@layer components{:host{width:100%}}.ui-date-range-panel{display:flex;border-radius:var(--radius-xl, .75rem);border-style:var(--tw-border-style);border-width:1px;border-color:var(--border-line-2);background-color:var(--layer);--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ui-date-range-presets{display:flex;min-width:calc(var(--spacing, .25rem) * 36);flex-direction:column;row-gap:calc(var(--spacing, .25rem) * .5);border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px;border-color:var(--border-line-2);padding:calc(var(--spacing, .25rem) * 2)}.ui-date-range-preset{border-radius:var(--radius-lg, .5rem);padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2);text-align:left;white-space:nowrap;color:var(--foreground)}.ui-date-range-preset:focus{--tw-outline-style: none;outline-style:none}.ui-date-range-preset:focus-visible{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ui-date-range-preset:focus-visible{--tw-ring-color: color-mix(in srgb, oklch(88.2% .059 254.128) 50%, transparent)}@supports (color: color-mix(in lab,red,red)){.ui-date-range-preset:focus-visible{--tw-ring-color: color-mix(in oklab, var(--color-primary-200, var(--color-blue-200)) 50%, transparent)}}.ui-date-range-preset:hover,.ui-date-range-preset:focus-visible{background-color:var(--surface)}.ui-date-range-preset[aria-pressed=true]{background-color:var(--color-primary-50, var(--color-blue-50));color:var(--color-primary-700, var(--color-blue-700))}.ui-date-range-preset[aria-pressed=true]:hover,.ui-date-range-preset[aria-pressed=true]:focus-visible{background-color:var(--color-primary-100, var(--color-blue-100))}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"],
229
+ dependencies: [
230
+ {
231
+ kind: "component",
232
+ type: UiInputComponent,
233
+ selector: "ui-input",
234
+ inputs: [
235
+ "value",
236
+ "classes",
237
+ "type",
238
+ "id",
239
+ "name",
240
+ "placeholder",
241
+ "autocomplete",
242
+ "inputmode",
243
+ "required",
244
+ "disabled",
245
+ "readonly",
246
+ "validationState",
247
+ "min",
248
+ "max",
249
+ "step",
250
+ "pattern",
251
+ "minlength",
252
+ "maxlength",
253
+ "autofocus",
254
+ "spellcheck",
255
+ "revealable",
256
+ "list",
257
+ "ariaLabel",
258
+ "describedBy",
259
+ "inputRole",
260
+ "ariaExpanded",
261
+ "ariaControls",
262
+ "ariaActiveDescendant",
263
+ "ariaAutocomplete",
264
+ "ariaHasPopup"
265
+ ],
266
+ outputs: [
267
+ "valueChange",
268
+ "validationStateChange",
269
+ "focused",
270
+ "blurred"
271
+ ]
272
+ },
273
+ {
274
+ kind: "component",
275
+ type: UiCalendarComponent,
276
+ selector: "ui-calendar",
277
+ inputs: [
278
+ "mode",
279
+ "value",
280
+ "range",
281
+ "min",
282
+ "max",
283
+ "isDateDisabled",
284
+ "weekStart",
285
+ "locale",
286
+ "dayClass",
287
+ "hideSelection"
288
+ ],
289
+ outputs: [
290
+ "valueChange",
291
+ "rangeChange",
292
+ "dayClick",
293
+ "monthChange"
294
+ ]
295
+ },
296
+ {
297
+ kind: "component",
298
+ type: UiDropdownComponent,
299
+ selector: "ui-dropdown",
300
+ inputs: [
301
+ "isOpen",
302
+ "placement",
303
+ "closeBehaviour",
304
+ "offset",
305
+ "viewportPadding",
306
+ "matchWidth"
307
+ ],
308
+ exportAs: ["uiDropdown"]
309
+ },
310
+ {
311
+ kind: "directive",
312
+ type: UiDropdownDirective,
313
+ selector: "[uiDropdownContent]"
314
+ },
315
+ {
316
+ kind: "component",
317
+ type: NgIcon,
318
+ selector: "ng-icon",
319
+ inputs: [
320
+ "name",
321
+ "svg",
322
+ "size",
323
+ "strokeWidth",
324
+ "color"
325
+ ]
326
+ }
327
+ ]
328
+ });
329
+ };
330
+ i0.ɵɵngDeclareClassMetadata({
331
+ minVersion: "12.0.0",
332
+ version: "22.2.1",
333
+ ngImport: i0,
334
+ type: UiDateRangePickerComponent,
335
+ decorators: [{
336
+ type: Component,
337
+ args: [{
338
+ selector: "ui-date-range-picker",
339
+ imports: [
340
+ UiInputComponent,
341
+ UiCalendarComponent,
342
+ UiDropdownComponent,
343
+ UiDropdownDirective,
344
+ NgIcon
345
+ ],
346
+ host: {
347
+ class: "block",
348
+ "[attr.id]": "null"
349
+ },
350
+ providers: [provideIcons({
351
+ heroCalendarDateRange,
352
+ heroXMark
353
+ })],
354
+ template: "<ui-dropdown\n [isOpen]=\"isOpen\"\n placement=\"bottom-start\"\n closeBehaviour=\"whenClickOutside\"\n class=\"w-full\"\n>\n <ui-input\n [value]=\"display()\"\n [id]=\"id()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [describedBy]=\"describedBy()\"\n [ariaExpanded]=\"isOpen()\"\n ariaHasPopup=\"dialog\"\n [validationState]=\"validationState()\"\n classes=\"cursor-pointer\"\n autocomplete=\"off\"\n readonly\n (click)=\"toggle()\"\n (keydown)=\"handleInputKeydown($event)\"\n >\n <ng-template #leading>\n <ng-icon\n name=\"heroCalendarDateRange\"\n class=\"ms-3 text-muted-foreground-1 shrink-0\"\n />\n </ng-template>\n\n <ng-template #trailing>\n @if (clearable() && hasValue() && !disabled()) {\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center w-8 self-stretch text-muted-foreground-1 hover:text-foreground\"\n aria-label=\"Clear dates\"\n (click)=\"clear($event)\"\n >\n <ng-icon name=\"heroXMark\" class=\"shrink-0\" />\n </button>\n }\n </ng-template>\n </ui-input>\n\n @if (isOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <div class=\"ui-date-range-panel\">\n @if (presets().length) {\n <div class=\"ui-date-range-presets\" role=\"group\" aria-label=\"Quick ranges\">\n @for (preset of presets(); track preset.label; let index = $index) {\n <button\n type=\"button\"\n class=\"ui-date-range-preset ui-text-body-alt\"\n [attr.aria-pressed]=\"index === activePreset()\"\n (click)=\"choosePreset(preset)\"\n (keydown)=\"handlePanelKeydown($event)\"\n >\n {{ preset.label }}\n </button>\n }\n </div>\n }\n\n <ui-calendar\n class=\"p-3\"\n mode=\"range\"\n [(range)]=\"value\"\n [min]=\"min()\"\n [max]=\"max()\"\n [isDateDisabled]=\"isDateDisabled()\"\n [weekStart]=\"weekStart()\"\n [locale]=\"locale()\"\n (rangeChange)=\"handleRange($event)\"\n (keydown)=\"handlePanelKeydown($event)\"\n />\n </div>\n </div>\n }\n</ui-dropdown>\n",
355
+ styles: ["@layer properties;@layer components{:host{width:100%}}.ui-date-range-panel{display:flex;border-radius:var(--radius-xl, .75rem);border-style:var(--tw-border-style);border-width:1px;border-color:var(--border-line-2);background-color:var(--layer);--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ui-date-range-presets{display:flex;min-width:calc(var(--spacing, .25rem) * 36);flex-direction:column;row-gap:calc(var(--spacing, .25rem) * .5);border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px;border-color:var(--border-line-2);padding:calc(var(--spacing, .25rem) * 2)}.ui-date-range-preset{border-radius:var(--radius-lg, .5rem);padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2);text-align:left;white-space:nowrap;color:var(--foreground)}.ui-date-range-preset:focus{--tw-outline-style: none;outline-style:none}.ui-date-range-preset:focus-visible{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ui-date-range-preset:focus-visible{--tw-ring-color: color-mix(in srgb, oklch(88.2% .059 254.128) 50%, transparent)}@supports (color: color-mix(in lab,red,red)){.ui-date-range-preset:focus-visible{--tw-ring-color: color-mix(in oklab, var(--color-primary-200, var(--color-blue-200)) 50%, transparent)}}.ui-date-range-preset:hover,.ui-date-range-preset:focus-visible{background-color:var(--surface)}.ui-date-range-preset[aria-pressed=true]{background-color:var(--color-primary-50, var(--color-blue-50));color:var(--color-primary-700, var(--color-blue-700))}.ui-date-range-preset[aria-pressed=true]:hover,.ui-date-range-preset[aria-pressed=true]:focus-visible{background-color:var(--color-primary-100, var(--color-blue-100))}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"]
356
+ }]
357
+ }],
358
+ propDecorators: {
359
+ value: [{
360
+ type: i0.Input,
361
+ args: [{
362
+ isSignal: true,
363
+ alias: "value",
364
+ required: false
365
+ }]
366
+ }, {
367
+ type: i0.Output,
368
+ args: ["valueChange"]
369
+ }],
370
+ id: [{
371
+ type: i0.Input,
372
+ args: [{
373
+ isSignal: true,
374
+ alias: "id",
375
+ required: false
376
+ }]
377
+ }],
378
+ placeholder: [{
379
+ type: i0.Input,
380
+ args: [{
381
+ isSignal: true,
382
+ alias: "placeholder",
383
+ required: false
384
+ }]
385
+ }],
386
+ disabled: [{
387
+ type: i0.Input,
388
+ args: [{
389
+ isSignal: true,
390
+ alias: "disabled",
391
+ required: false
392
+ }]
393
+ }],
394
+ clearable: [{
395
+ type: i0.Input,
396
+ args: [{
397
+ isSignal: true,
398
+ alias: "clearable",
399
+ required: false
400
+ }]
401
+ }],
402
+ validationState: [{
403
+ type: i0.Input,
404
+ args: [{
405
+ isSignal: true,
406
+ alias: "validationState",
407
+ required: false
408
+ }]
409
+ }],
410
+ describedBy: [{
411
+ type: i0.Input,
412
+ args: [{
413
+ isSignal: true,
414
+ alias: "describedBy",
415
+ required: false
416
+ }]
417
+ }],
418
+ min: [{
419
+ type: i0.Input,
420
+ args: [{
421
+ isSignal: true,
422
+ alias: "min",
423
+ required: false
424
+ }]
425
+ }],
426
+ max: [{
427
+ type: i0.Input,
428
+ args: [{
429
+ isSignal: true,
430
+ alias: "max",
431
+ required: false
432
+ }]
433
+ }],
434
+ isDateDisabled: [{
435
+ type: i0.Input,
436
+ args: [{
437
+ isSignal: true,
438
+ alias: "isDateDisabled",
439
+ required: false
440
+ }]
441
+ }],
442
+ weekStart: [{
443
+ type: i0.Input,
444
+ args: [{
445
+ isSignal: true,
446
+ alias: "weekStart",
447
+ required: false
448
+ }]
449
+ }],
450
+ locale: [{
451
+ type: i0.Input,
452
+ args: [{
453
+ isSignal: true,
454
+ alias: "locale",
455
+ required: false
456
+ }]
457
+ }],
458
+ format: [{
459
+ type: i0.Input,
460
+ args: [{
461
+ isSignal: true,
462
+ alias: "format",
463
+ required: false
464
+ }]
465
+ }],
466
+ presets: [{
467
+ type: i0.Input,
468
+ args: [{
469
+ isSignal: true,
470
+ alias: "presets",
471
+ required: false
472
+ }]
473
+ }],
474
+ calendar: [{
475
+ type: i0.ViewChild,
476
+ args: [i0.forwardRef(() => UiCalendarComponent), { isSignal: true }]
477
+ }]
478
+ }
479
+ });
480
+ const today = () => {
481
+ const now = /* @__PURE__ */ new Date();
482
+ return new Date(now.getFullYear(), now.getMonth(), now.getDate());
483
+ };
484
+ const between = (start, end) => ({
485
+ start: toIsoDate(start),
486
+ end: toIsoDate(end)
487
+ });
488
+ function todayPreset(label = "Today") {
489
+ return {
490
+ label,
491
+ range: () => between(today(), today())
492
+ };
493
+ }
494
+ function lastDaysPreset(days, label = `Last ${days} days`) {
495
+ return {
496
+ label,
497
+ range: () => between(addDays(today(), 1 - days), today())
498
+ };
499
+ }
500
+ function thisWeekPreset(weekStart = 1, label = "This week") {
501
+ return {
502
+ label,
503
+ range: () => {
504
+ const offset = (today().getDay() - weekStart + 7) % 7;
505
+ const start = addDays(today(), -offset);
506
+ return between(start, addDays(start, 6));
507
+ }
508
+ };
509
+ }
510
+ function monthPreset(offset = 0, label = offset ? "Last month" : "This month") {
511
+ return {
512
+ label,
513
+ range: () => {
514
+ const now = today();
515
+ return between(new Date(now.getFullYear(), now.getMonth() + offset, 1), new Date(now.getFullYear(), now.getMonth() + offset + 1, 0));
516
+ }
517
+ };
518
+ }
519
+ function yearPreset(offset = 0, label = offset ? "Last year" : "This year") {
520
+ return {
521
+ label,
522
+ range: () => {
523
+ const year = today().getFullYear() + offset;
524
+ return between(new Date(year, 0, 1), new Date(year, 11, 31));
525
+ }
526
+ };
527
+ }
528
+ function financialYearPreset(startMonth, startDay, offset = 0, label = offset ? "Last financial year" : "This financial year") {
529
+ return {
530
+ label,
531
+ range: () => {
532
+ const now = today();
533
+ const startYear = now >= new Date(now.getFullYear(), startMonth, startDay) ? now.getFullYear() : now.getFullYear() - 1;
534
+ const start = new Date(startYear + offset, startMonth, startDay);
535
+ const end = addDays(new Date(startYear + offset + 1, startMonth, startDay), -1);
536
+ return between(start, end);
537
+ }
538
+ };
539
+ }
540
+ function defaultDateRangePresets(weekStart = 1) {
541
+ return [
542
+ todayPreset(),
543
+ lastDaysPreset(7),
544
+ lastDaysPreset(30),
545
+ thisWeekPreset(weekStart),
546
+ monthPreset(0),
547
+ monthPreset(-1),
548
+ yearPreset(0),
549
+ yearPreset(-1)
550
+ ];
551
+ }
552
+ export { UiDateRangePickerComponent, defaultDateRangePresets, financialYearPreset, lastDaysPreset, monthPreset, thisWeekPreset, todayPreset, yearPreset };
553
+
554
+ //# sourceMappingURL=area8975-ui-date-range-picker.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"area8975-ui-date-range-picker.mjs","names":[],"sources":["../../../projects/ui/date-range-picker/date-range-picker.component.ts","../../../projects/ui/date-range-picker/date-range-picker.component.html","../../../projects/ui/date-range-picker/date-range-presets.ts"],"sourcesContent":["import {\n afterNextRender,\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n signal,\n viewChild\n} from '@angular/core';\n\nimport type {\n DateRange,\n IsoDate,\n WeekStart\n} from '@area8975/ui/calendar';\nimport { UiCalendarComponent } from '@area8975/ui/calendar';\nimport { parseIsoDate } from '@area8975/ui/calendar';\nimport { UiDropdownComponent } from '@area8975/ui/dropdown';\nimport { UiDropdownDirective } from '@area8975/ui/dropdown';\nimport type { InputValidation } from '@area8975/ui/input';\nimport { UiInputComponent } from '@area8975/ui/input';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroCalendarDateRange, heroXMark } from '@ng-icons/heroicons/outline';\n\nimport type { DateRangePreset } from './date-range-picker.types';\n\n\nconst OPEN_KEYS = ['Enter', ' ', 'ArrowDown'];\n\n@Component({\n selector: 'ui-date-range-picker',\n templateUrl: './date-range-picker.component.html',\n styleUrl: './date-range-picker.component.css',\n imports: [\n UiInputComponent,\n UiCalendarComponent,\n UiDropdownComponent,\n UiDropdownDirective,\n NgIcon\n ],\n host: { class: 'block', '[attr.id]': 'null' },\n providers: [provideIcons({ heroCalendarDateRange, heroXMark })]\n})\nexport class UiDateRangePickerComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n\n readonly value = model<DateRange>({ start: null, end: null });\n\n readonly id = input<string>('');\n readonly placeholder = input<string>('Select dates');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly clearable = input(true, { transform: booleanAttribute });\n readonly validationState = input<InputValidation>(null);\n readonly describedBy = input<string>('');\n\n readonly min = input<IsoDate | null>(null);\n readonly max = input<IsoDate | null>(null);\n readonly isDateDisabled = input<(date: IsoDate) => boolean>(() => false);\n readonly weekStart = input<WeekStart>(1);\n readonly locale = input<string>('en-GB');\n\n /** Intl options for the dates shown in the input. */\n readonly format = input<Intl.DateTimeFormatOptions>({\n dateStyle: 'medium'\n });\n\n /** Quick picks beside the calendar, see date-range-presets.ts for ready made ones. */\n readonly presets = input<DateRangePreset[]>([]);\n\n protected readonly isOpen = signal(false);\n\n private readonly calendar = viewChild(UiCalendarComponent);\n\n protected readonly hasValue = computed(() => !!this.value().start);\n\n // worked out on open so \"today\" is never stale\n protected readonly presetRanges = computed(() =>\n this.isOpen()\n ? this.presets().map(preset => this.clamp(preset.range()))\n : []\n );\n\n protected readonly activePreset = computed(() => {\n const { start, end } = this.value();\n\n return this.presetRanges().findIndex(range =>\n range.start === start && range.end === end\n );\n });\n\n protected readonly display = computed(() => {\n const start = parseIsoDate(this.value().start);\n const end = parseIsoDate(this.value().end);\n const format = new Intl.DateTimeFormat(this.locale(), this.format());\n\n if (!start) {\n return '';\n }\n\n // formatRange shares the month/year, e.g. \"1 – 7 Sept 2026\"\n return end\n ? format.formatRange(start, end)\n : `${format.format(start)} – …`;\n });\n\n protected toggle(): void {\n if (!this.disabled()) {\n this.isOpen.update(open => !open);\n }\n }\n\n protected handleInputKeydown(event: KeyboardEvent): void {\n if (this.disabled() || !OPEN_KEYS.includes(event.key)) {\n return;\n }\n\n event.preventDefault();\n this.isOpen.set(true);\n\n afterNextRender(() => this.calendar()?.focusActiveDate(), {\n injector: this.injector\n });\n }\n\n protected handleRange(range: DateRange): void {\n // only close once both ends are picked\n if (range.start && range.end) {\n this.isOpen.set(false);\n this.focusInput();\n }\n }\n\n protected choosePreset(preset: DateRangePreset): void {\n this.value.set(this.clamp(preset.range()));\n this.isOpen.set(false);\n this.focusInput();\n }\n\n protected handlePanelKeydown(event: KeyboardEvent): void {\n // the overlay closes itself on escape, we just put focus back\n if (event.key === 'Escape') {\n this.focusInput();\n }\n }\n\n protected clear(event: Event): void {\n // stop the input underneath from opening the calendar\n event.stopPropagation();\n\n this.value.set({ start: null, end: null });\n this.focusInput();\n }\n\n // keeps presets inside min/max, e.g. \"This year\" stops at today when max is today\n private clamp({ start, end }: DateRange): DateRange {\n const min = this.min();\n const max = this.max();\n\n return {\n start: start && min && start < min ? min : start,\n end: end && max && end > max ? max : end\n };\n }\n\n private focusInput(): void {\n this.host.nativeElement.querySelector('input')?.focus();\n }\n}\n","<ui-dropdown\n [isOpen]=\"isOpen\"\n placement=\"bottom-start\"\n closeBehaviour=\"whenClickOutside\"\n class=\"w-full\"\n>\n <ui-input\n [value]=\"display()\"\n [id]=\"id()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [describedBy]=\"describedBy()\"\n [ariaExpanded]=\"isOpen()\"\n ariaHasPopup=\"dialog\"\n [validationState]=\"validationState()\"\n classes=\"cursor-pointer\"\n autocomplete=\"off\"\n readonly\n (click)=\"toggle()\"\n (keydown)=\"handleInputKeydown($event)\"\n >\n <ng-template #leading>\n <ng-icon\n name=\"heroCalendarDateRange\"\n class=\"ms-3 text-muted-foreground-1 shrink-0\"\n />\n </ng-template>\n\n <ng-template #trailing>\n @if (clearable() && hasValue() && !disabled()) {\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center w-8 self-stretch text-muted-foreground-1 hover:text-foreground\"\n aria-label=\"Clear dates\"\n (click)=\"clear($event)\"\n >\n <ng-icon name=\"heroXMark\" class=\"shrink-0\" />\n </button>\n }\n </ng-template>\n </ui-input>\n\n @if (isOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <div class=\"ui-date-range-panel\">\n @if (presets().length) {\n <div class=\"ui-date-range-presets\" role=\"group\" aria-label=\"Quick ranges\">\n @for (preset of presets(); track preset.label; let index = $index) {\n <button\n type=\"button\"\n class=\"ui-date-range-preset ui-text-body-alt\"\n [attr.aria-pressed]=\"index === activePreset()\"\n (click)=\"choosePreset(preset)\"\n (keydown)=\"handlePanelKeydown($event)\"\n >\n {{ preset.label }}\n </button>\n }\n </div>\n }\n\n <ui-calendar\n class=\"p-3\"\n mode=\"range\"\n [(range)]=\"value\"\n [min]=\"min()\"\n [max]=\"max()\"\n [isDateDisabled]=\"isDateDisabled()\"\n [weekStart]=\"weekStart()\"\n [locale]=\"locale()\"\n (rangeChange)=\"handleRange($event)\"\n (keydown)=\"handlePanelKeydown($event)\"\n />\n </div>\n </div>\n }\n</ui-dropdown>\n","import type { WeekStart } from '@area8975/ui/calendar';\nimport { addDays, toIsoDate } from '@area8975/ui/calendar';\n\nimport type { DateRangePreset } from './date-range-picker.types';\n\n\n// everything is relative to the moment it's clicked, not when the page loaded\nconst today = () => {\n const now = new Date();\n\n return new Date(now.getFullYear(), now.getMonth(), now.getDate());\n};\n\nconst between = (start: Date, end: Date) => ({\n start: toIsoDate(start),\n end: toIsoDate(end)\n});\n\nexport function todayPreset(label = 'Today'): DateRangePreset {\n return { label, range: () => between(today(), today()) };\n}\n\n/** The last `days` days, counting today. */\nexport function lastDaysPreset(days: number, label = `Last ${days} days`): DateRangePreset {\n return { label, range: () => between(addDays(today(), 1 - days), today()) };\n}\n\nexport function thisWeekPreset(weekStart: WeekStart = 1, label = 'This week'): DateRangePreset {\n return {\n label,\n range: () => {\n const offset = (today().getDay() - weekStart + 7) % 7;\n const start = addDays(today(), -offset);\n\n return between(start, addDays(start, 6));\n }\n };\n}\n\n/** A calendar month, 0 is this month, -1 is last month. */\nexport function monthPreset(offset = 0, label = offset ? 'Last month' : 'This month'): DateRangePreset {\n return {\n label,\n range: () => {\n const now = today();\n\n return between(\n new Date(now.getFullYear(), now.getMonth() + offset, 1),\n new Date(now.getFullYear(), now.getMonth() + offset + 1, 0)\n );\n }\n };\n}\n\n/** A calendar year, 0 is this year, -1 is last year. */\nexport function yearPreset(offset = 0, label = offset ? 'Last year' : 'This year'): DateRangePreset {\n return {\n label,\n range: () => {\n const year = today().getFullYear() + offset;\n\n return between(new Date(year, 0, 1), new Date(year, 11, 31));\n }\n };\n}\n\n/**\n * A financial year starting on the given day, e.g. the UK tax year is\n * `financialYearPreset(3, 6)` for 6 April. 0 is the current one, -1 the one before.\n */\nexport function financialYearPreset(\n startMonth: number,\n startDay: number,\n offset = 0,\n label = offset ? 'Last financial year' : 'This financial year'\n): DateRangePreset {\n return {\n label,\n range: () => {\n const now = today();\n const thisYearsStart = new Date(now.getFullYear(), startMonth, startDay);\n\n // before this year's start date we're still in the one that began last year\n const startYear = now >= thisYearsStart ? now.getFullYear() : now.getFullYear() - 1;\n const start = new Date(startYear + offset, startMonth, startDay);\n const end = addDays(new Date(startYear + offset + 1, startMonth, startDay), -1);\n\n return between(start, end);\n }\n };\n}\n\n/** A sensible starting set, pass your own list to change it. */\nexport function defaultDateRangePresets(weekStart: WeekStart = 1): DateRangePreset[] {\n return [\n todayPreset(),\n lastDaysPreset(7),\n lastDaysPreset(30),\n thisWeekPreset(weekStart),\n monthPreset(0),\n monthPreset(-1),\n yearPreset(0),\n yearPreset(-1)\n ];\n}\n"],"mappings":"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"}