@tzslot/angular 0.1.0-beta.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,10 @@
1
+ import * as temporal_spec from 'temporal-spec';
1
2
  import * as _angular_core from '@angular/core';
2
3
  import { InjectionToken, AfterViewInit, OnDestroy } from '@angular/core';
3
- import * as temporal_spec from 'temporal-spec';
4
4
  import { ControlValueAccessor } from '@angular/forms';
5
- import { Slot, Instant, Weekday, ValueShape, PlainDate, DateLike, DailyWindowsSummary } from '@tzslot/core';
6
- import { SlotChoice, TzslotMessages, CalendarView, RenderCell, CalendarButton, YearMonth, FieldMode, DateRangeValue, DateTimeRangeValue, DailyRangeValue } from '@tzslot/dom';
7
- export { CalendarButton, CalendarView, CellRender, DailyRangeValue, DateRangeValue, DateTimeRangeValue, DayCellInfo, EN, FR, FieldMode, RenderCell, SlotChoice, TzslotMessages } from '@tzslot/dom';
5
+ import { ValueShape, Slot, Weekday, Instant, PlainDate, DateLike, DurationLike, ShiftOption, InstantLike, PresetName, PlainTime, ShiftStep, DailyWindowsSummary } from '@tzslot/core';
6
+ import { SlotChoice, TzslotMessages, CalendarView, RenderCell, CalendarButton, YearMonth, FieldMode, TimeLayout, RangeFieldValue, RangePreset, DateRangeValue, DateTimeRangeValue, DailyRangeValue } from '@tzslot/dom';
7
+ export { CalendarButton, CalendarView, CellRender, DailyRangeValue, DateRangeValue, DateTimeRangeValue, DayCellInfo, EN, FR, FieldMode, RangeFieldValue, RangePreset, RenderCell, SlotChoice, TimeLayout, TzslotMessages } from '@tzslot/dom';
8
8
 
9
9
  /**
10
10
  * `<tz-time-slots>` — the slot list from @tzslot/dom, spoken in Angular.
@@ -13,9 +13,21 @@ export { CalendarButton, CalendarView, CellRender, DailyRangeValue, DateRangeVal
13
13
  * clock shows; an instant is when it happened. Only one of those can be stored.
14
14
  */
15
15
  declare class TimeSlotPicker implements ControlValueAccessor {
16
+ /** Set once for the application with provideTzslot(); a binding still wins. */
17
+ private readonly defaults;
16
18
  /** The day to list, as a PlainDate or an ISO date string. */
19
+ /**
20
+ * What the form control holds. `'utc'` gives an ISO string; the default
21
+ * gives an Instant.
22
+ */
23
+ readonly valueAs: _angular_core.InputSignal<ValueShape>;
17
24
  readonly date: _angular_core.InputSignal<string | temporal_spec.Temporal.PlainDate>;
18
- /** An IANA identifier — 'Europe/Paris', not an offset. Offsets change twice a year. */
25
+ /**
26
+ * An IANA identifier. Required in spirit: given here, it wins; left out, it
27
+ * is the zone provideTzslot() settled for the application, and only when
28
+ * nothing was settled anywhere does it fall back to the browser's — which
29
+ * is a guess, and the one thing this library exists not to do silently.
30
+ */
19
31
  readonly timeZone: _angular_core.InputSignal<string>;
20
32
  readonly stepMinutes: _angular_core.InputSignal<number>;
21
33
  /** The working day. Slots outside these bounds are not produced at all. */
@@ -46,12 +58,13 @@ declare class TimeSlotPicker implements ControlValueAccessor {
46
58
  clear(): void;
47
59
  private onChange;
48
60
  private onTouched;
49
- writeValue(value: Instant | null): void;
50
- registerOnChange(fn: (value: Instant | null) => void): void;
61
+ /** Typed `unknown`: a form holds what the application put there. */
62
+ writeValue(value: unknown): void;
63
+ registerOnChange(fn: (value: unknown) => void): void;
51
64
  registerOnTouched(fn: () => void): void;
52
65
  setDisabledState(isDisabled: boolean): void;
53
66
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TimeSlotPicker, never>;
54
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TimeSlotPicker, "tz-time-slots", never, { "date": { "alias": "date"; "required": true; "isSignal": true; }; "timeZone": { "alias": "timeZone"; "required": true; "isSignal": true; }; "stepMinutes": { "alias": "stepMinutes"; "required": false; "isSignal": true; }; "minTime": { "alias": "minTime"; "required": false; "isSignal": true; }; "maxTime": { "alias": "maxTime"; "required": false; "isSignal": true; }; "isDisabled": { "alias": "isDisabled"; "required": false; "isSignal": true; }; "skipNonExistent": { "alias": "skipNonExistent"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "missingLabel": { "alias": "missingLabel"; "required": false; "isSignal": true; }; "emptyLabel": { "alias": "emptyLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
67
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TimeSlotPicker, "tz-time-slots", never, { "valueAs": { "alias": "valueAs"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": true; "isSignal": true; }; "timeZone": { "alias": "timeZone"; "required": false; "isSignal": true; }; "stepMinutes": { "alias": "stepMinutes"; "required": false; "isSignal": true; }; "minTime": { "alias": "minTime"; "required": false; "isSignal": true; }; "maxTime": { "alias": "maxTime"; "required": false; "isSignal": true; }; "isDisabled": { "alias": "isDisabled"; "required": false; "isSignal": true; }; "skipNonExistent": { "alias": "skipNonExistent"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "missingLabel": { "alias": "missingLabel"; "required": false; "isSignal": true; }; "emptyLabel": { "alias": "emptyLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
55
68
  }
56
69
 
57
70
  declare const TZSLOT_MESSAGES: InjectionToken<TzslotMessages>;
@@ -61,6 +74,73 @@ declare function provideTzslotMessages(messages: TzslotMessages): {
61
74
  useValue: TzslotMessages;
62
75
  };
63
76
 
77
+ /**
78
+ * The conventions an application settles once.
79
+ *
80
+ * A zone, a locale, the shape values leave in: these are decisions about the
81
+ * application, not about the field. Repeating them on every tag is how one
82
+ * screen ends up handing a `Date` to a back end that stores instants, and how
83
+ * a reviewer has to read every template to find out which one.
84
+ *
85
+ * Anything set on a component still wins — this is the default, not the law.
86
+ */
87
+ interface TzslotDefaults {
88
+ /**
89
+ * What every component that holds a moment or a day hands to its form
90
+ * control. `'utc'` is the useful one here: an instant, written as an ISO
91
+ * string ending in Z, whatever the widget is. A date-only field gives the
92
+ * midnight that opens that day in `timeZone`, so a back end that stores
93
+ * instants gets one from it too.
94
+ *
95
+ * `<tz-daily-range>` is the exception, and not an oversight: its value is a
96
+ * *pattern* — two days and two clock faces repeated over them — which is
97
+ * not a moment and has no UTC form. It always hands out Temporal objects.
98
+ */
99
+ readonly valueAs?: ValueShape;
100
+ /**
101
+ * The IANA zone the screen is read in — and the one a day is turned into a
102
+ * moment on. Components that take a `timeZone` of their own use this when
103
+ * none is given.
104
+ */
105
+ readonly timeZone?: string;
106
+ readonly locale?: string;
107
+ readonly firstDayOfWeek?: Weekday;
108
+ /** The words. The same thing `provideTzslotMessages` does, in one call. */
109
+ readonly messages?: TzslotMessages;
110
+ }
111
+ declare const TZSLOT_DEFAULTS: InjectionToken<TzslotDefaults>;
112
+ /**
113
+ * `providers: [provideTzslot({ valueAs: 'utc', timeZone: 'Europe/Paris' })]`
114
+ *
115
+ * In an application: `bootstrapApplication(App, { providers: [provideTzslot({ … })] })`.
116
+ */
117
+ declare function provideTzslot(defaults: TzslotDefaults): {
118
+ provide: unknown;
119
+ useValue: unknown;
120
+ }[];
121
+
122
+ /**
123
+ * A period, as a form holds it.
124
+ *
125
+ * The single-value components have spoken `valueAs` since the beginning; the
126
+ * ones holding two moments did not, so `provideTzslot({ valueAs: 'utc' })`
127
+ * gave ISO strings from one tag and Temporal objects from the one beside it.
128
+ * Worse, their `writeValue` was typed as if a form could only ever contain
129
+ * the library's own objects, and threw on the ISO string a real back end
130
+ * sends.
131
+ */
132
+ interface MomentPair<T> {
133
+ readonly start: T | null;
134
+ readonly end: T | null;
135
+ }
136
+ /** Whatever the form holds, as two moments. */
137
+ declare function pairIn(value: unknown): MomentPair<Instant>;
138
+ /** And back out, in the shape the application asked for. */
139
+ declare function pairOut<Extra extends object>(pair: MomentPair<Instant>, shape: ValueShape, extra: Extra): Extra & {
140
+ start: unknown;
141
+ end: unknown;
142
+ };
143
+
64
144
  /**
65
145
  * `<tz-calendar>` — the calendar from @tzslot/dom, spoken in Angular.
66
146
  *
@@ -69,10 +149,13 @@ declare function provideTzslotMessages(messages: TzslotMessages): {
69
149
  * into `valueChange` and form notifications, projected content into icons.
70
150
  */
71
151
  declare class Calendar implements ControlValueAccessor, AfterViewInit, OnDestroy {
152
+ /** Set once for the application with provideTzslot(); a binding still wins. */
153
+ private readonly defaults;
72
154
  /** The selected day. Two-way: `[(value)]`. */
73
155
  readonly value: _angular_core.ModelSignal<temporal_spec.Temporal.PlainDate | null>;
74
156
  /** Monday by default, as ISO-8601 numbers the week. */
75
- readonly firstDayOfWeek: _angular_core.InputSignal<Weekday>;
157
+ /** Left out, the locale decides — see `provideTzslot` to settle it once. */
158
+ readonly firstDayOfWeek: _angular_core.InputSignal<Weekday | undefined>;
76
159
  /** A BCP-47 tag for the month and weekday names. Defaults to the browser's. */
77
160
  readonly locale: _angular_core.InputSignal<string | undefined>;
78
161
  readonly min: _angular_core.InputSignal<temporal_spec.Temporal.PlainDate | null>;
@@ -103,6 +186,8 @@ declare class Calendar implements ControlValueAccessor, AfterViewInit, OnDestroy
103
186
  readonly minView: _angular_core.InputSignal<CalendarView>;
104
187
  /** Adds to each day: a price, places left, a class, a reason to rule it out. */
105
188
  readonly renderCell: _angular_core.InputSignal<RenderCell | undefined>;
189
+ /** A column of ISO week numbers down the left. */
190
+ readonly weekNumbers: _angular_core.InputSignal<boolean>;
106
191
  /** Buttons under the grid: `['today', 'clear']`. None by default. */
107
192
  readonly buttons: _angular_core.InputSignal<readonly CalendarButton[]>;
108
193
  private readonly host;
@@ -134,7 +219,7 @@ declare class Calendar implements ControlValueAccessor, AfterViewInit, OnDestroy
134
219
  registerOnTouched(fn: () => void): void;
135
220
  setDisabledState(isDisabled: boolean): void;
136
221
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<Calendar, never>;
137
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<Calendar, "tz-calendar", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "valueAs": { "alias": "valueAs"; "required": false; "isSignal": true; }; "valueTimeZone": { "alias": "valueTimeZone"; "required": false; "isSignal": true; }; "isDateDisabled": { "alias": "isDateDisabled"; "required": false; "isSignal": true; }; "today": { "alias": "today"; "required": false; "isSignal": true; }; "view": { "alias": "view"; "required": false; "isSignal": true; }; "minView": { "alias": "minView"; "required": false; "isSignal": true; }; "renderCell": { "alias": "renderCell"; "required": false; "isSignal": true; }; "buttons": { "alias": "buttons"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "view": "viewChange"; }, never, ["[tzPrev]", "[tzNext]"], true, never>;
222
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Calendar, "tz-calendar", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "valueAs": { "alias": "valueAs"; "required": false; "isSignal": true; }; "valueTimeZone": { "alias": "valueTimeZone"; "required": false; "isSignal": true; }; "isDateDisabled": { "alias": "isDateDisabled"; "required": false; "isSignal": true; }; "today": { "alias": "today"; "required": false; "isSignal": true; }; "view": { "alias": "view"; "required": false; "isSignal": true; }; "minView": { "alias": "minView"; "required": false; "isSignal": true; }; "renderCell": { "alias": "renderCell"; "required": false; "isSignal": true; }; "weekNumbers": { "alias": "weekNumbers"; "required": false; "isSignal": true; }; "buttons": { "alias": "buttons"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "view": "viewChange"; }, never, ["[tzPrev]", "[tzNext]"], true, never>;
138
223
  }
139
224
 
140
225
  /**
@@ -146,12 +231,15 @@ declare class Calendar implements ControlValueAccessor, AfterViewInit, OnDestroy
146
231
  * `[tzIcon]` to the field's icon.
147
232
  */
148
233
  declare class DateField implements ControlValueAccessor, AfterViewInit {
234
+ /** Set once for the application with provideTzslot(); a binding still wins. */
235
+ private readonly defaults;
149
236
  readonly value: _angular_core.ModelSignal<temporal_spec.Temporal.PlainDate | null>;
150
237
  readonly mode: _angular_core.InputSignal<FieldMode>;
151
238
  readonly placeholder: _angular_core.InputSignal<string | undefined>;
152
239
  readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
153
240
  readonly locale: _angular_core.InputSignal<string | undefined>;
154
- readonly firstDayOfWeek: _angular_core.InputSignal<Weekday>;
241
+ /** Left out, the locale decides — see `provideTzslot` to settle it once. */
242
+ readonly firstDayOfWeek: _angular_core.InputSignal<Weekday | undefined>;
155
243
  readonly min: _angular_core.InputSignal<temporal_spec.Temporal.PlainDate | null>;
156
244
  readonly max: _angular_core.InputSignal<temporal_spec.Temporal.PlainDate | null>;
157
245
  readonly isDateDisabled: _angular_core.InputSignal<((date: PlainDate) => boolean) | undefined>;
@@ -172,6 +260,8 @@ declare class DateField implements ControlValueAccessor, AfterViewInit {
172
260
  readonly displayWith: _angular_core.InputSignal<((date: PlainDate) => string) | undefined>;
173
261
  /** Passed to the calendar in the panel. */
174
262
  readonly renderCell: _angular_core.InputSignal<RenderCell | undefined>;
263
+ /** A column of ISO week numbers down the left. */
264
+ readonly weekNumbers: _angular_core.InputSignal<boolean>;
175
265
  /** Under the panel's grid: `['today', 'clear']`. Choosing either closes it. */
176
266
  readonly buttons: _angular_core.InputSignal<readonly CalendarButton[]>;
177
267
  readonly opened: _angular_core.OutputEmitterRef<void>;
@@ -179,6 +269,8 @@ declare class DateField implements ControlValueAccessor, AfterViewInit {
179
269
  /** Whether the panel is showing. Readable from a ViewChild. */
180
270
  readonly isOpen: _angular_core.WritableSignal<boolean>;
181
271
  protected readonly formDisabled: _angular_core.WritableSignal<boolean>;
272
+ /** Set while the component is being destroyed, so no output fires after it. */
273
+ private gone;
182
274
  private readonly host;
183
275
  private readonly messages;
184
276
  private readonly iconSlot;
@@ -203,13 +295,272 @@ declare class DateField implements ControlValueAccessor, AfterViewInit {
203
295
  registerOnTouched(fn: () => void): void;
204
296
  setDisabledState(isDisabled: boolean): void;
205
297
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DateField, never>;
206
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DateField, "tz-date-field", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "isDateDisabled": { "alias": "isDateDisabled"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "valueAs": { "alias": "valueAs"; "required": false; "isSignal": true; }; "valueTimeZone": { "alias": "valueTimeZone"; "required": false; "isSignal": true; }; "displayWith": { "alias": "displayWith"; "required": false; "isSignal": true; }; "renderCell": { "alias": "renderCell"; "required": false; "isSignal": true; }; "buttons": { "alias": "buttons"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "opened": "opened"; "closed": "closed"; }, never, ["[tzIcon]"], true, never>;
298
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DateField, "tz-date-field", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "isDateDisabled": { "alias": "isDateDisabled"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "valueAs": { "alias": "valueAs"; "required": false; "isSignal": true; }; "valueTimeZone": { "alias": "valueTimeZone"; "required": false; "isSignal": true; }; "displayWith": { "alias": "displayWith"; "required": false; "isSignal": true; }; "renderCell": { "alias": "renderCell"; "required": false; "isSignal": true; }; "weekNumbers": { "alias": "weekNumbers"; "required": false; "isSignal": true; }; "buttons": { "alias": "buttons"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "opened": "opened"; "closed": "closed"; }, never, ["[tzIcon]"], true, never>;
299
+ }
300
+
301
+ /**
302
+ * `<tz-datetime-field>` — a field that opens a calendar and a time, from
303
+ * @tzslot/dom, spoken in Angular.
304
+ *
305
+ * Its value is an Instant, so it says which moment was meant even when the
306
+ * clock face does not: a time the zone skips is moved on and explained, and
307
+ * one that happens twice is offered by its two offsets rather than guessed.
308
+ */
309
+ declare class DateTimeField implements ControlValueAccessor, AfterViewInit {
310
+ /** Set once for the application with provideTzslot(); a binding still wins. */
311
+ private readonly defaults;
312
+ readonly value: _angular_core.ModelSignal<temporal_spec.Temporal.Instant | null>;
313
+ /**
314
+ * An IANA identifier. Required in spirit: given here, it wins; left out, it
315
+ * is the zone provideTzslot() settled for the application, and only when
316
+ * nothing was settled anywhere does it fall back to the browser's — which
317
+ * is a guess, and the one thing this library exists not to do silently.
318
+ */
319
+ readonly timeZone: _angular_core.InputSignal<string>;
320
+ readonly mode: _angular_core.InputSignal<FieldMode>;
321
+ readonly placeholder: _angular_core.InputSignal<string | undefined>;
322
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
323
+ readonly locale: _angular_core.InputSignal<string | undefined>;
324
+ /** Left out, the locale decides — see `provideTzslot` to settle it once. */
325
+ readonly firstDayOfWeek: _angular_core.InputSignal<Weekday | undefined>;
326
+ readonly min: _angular_core.InputSignal<temporal_spec.Temporal.PlainDate | null>;
327
+ readonly max: _angular_core.InputSignal<temporal_spec.Temporal.PlainDate | null>;
328
+ readonly isDateDisabled: _angular_core.InputSignal<((date: PlainDate) => boolean) | undefined>;
329
+ /** 'input' (default) for a compact time field, 'list' for the day's times. */
330
+ /**
331
+ * Whether a time is asked for at all. False leaves a field that chooses a
332
+ * day and holds the moment it starts.
333
+ */
334
+ readonly showTime: _angular_core.InputSignal<boolean>;
335
+ readonly timeLayout: _angular_core.InputSignal<TimeLayout>;
336
+ /**
337
+ * Move a typed time to the nearest mark of this grid — 15 for quarter-hour
338
+ * appointments, ties upward. Off by default: a screen that accepts any
339
+ * minute must not have them quietly moved.
340
+ */
341
+ readonly snapMinutes: _angular_core.InputSignal<number | null>;
342
+ /**
343
+ * Arrows beside the field that step the chosen moment without opening the
344
+ * panel: `{ hours: 1 }`, `{ days: 1 }`. `false` — the default — draws none.
345
+ * Counted on the zone's clocks, so a day is 23 or 25 hours when they change.
346
+ */
347
+ readonly shift: _angular_core.InputSignal<false | DurationLike | readonly ShiftOption[]>;
348
+ readonly stepMinutes: _angular_core.InputSignal<number>;
349
+ /** With timeLayout 'select': minutes between the options. Every minute by default. */
350
+ readonly minuteStep: _angular_core.InputSignal<number>;
351
+ readonly minTime: _angular_core.InputSignal<string | temporal_spec.Temporal.PlainTime | undefined>;
352
+ readonly maxTime: _angular_core.InputSignal<string | temporal_spec.Temporal.PlainTime | undefined>;
353
+ /** Only with timeLayout 'list': rules out slots while still showing them. */
354
+ readonly isSlotDisabled: _angular_core.InputSignal<((slot: Omit<Slot, "disabled">) => boolean) | undefined>;
355
+ readonly hour12: _angular_core.InputSignal<boolean | undefined>;
356
+ /** The time a newly chosen day starts at. Midnight by default. */
357
+ readonly defaultTime: _angular_core.InputSignal<string | temporal_spec.Temporal.PlainTime>;
358
+ readonly disabled: _angular_core.InputSignal<boolean>;
359
+ /** The text can be typed as well as chosen. On by default. */
360
+ readonly editable: _angular_core.InputSignal<boolean>;
361
+ /** Separators appear as the figures are typed, like a card number. On by default. */
362
+ readonly mask: _angular_core.InputSignal<boolean>;
363
+ /** A pattern — `yyyy-MM-dd HH:mm` — when the shape matters more than the reader. */
364
+ readonly format: _angular_core.InputSignal<string | undefined>;
365
+ /** Used when the field is not typable and no pattern is given. */
366
+ readonly dateStyle: _angular_core.InputSignal<"full" | "long" | "medium" | "short">;
367
+ readonly timeStyle: _angular_core.InputSignal<"full" | "long" | "medium" | "short">;
368
+ /** The last word on the text. Given both, this one wins. */
369
+ readonly displayWith: _angular_core.InputSignal<((value: Instant, timeZone: string) => string) | undefined>;
370
+ readonly today: _angular_core.InputSignal<temporal_spec.Temporal.PlainDate>;
371
+ readonly renderCell: _angular_core.InputSignal<RenderCell | undefined>;
372
+ /** A column of ISO week numbers down the left. */
373
+ readonly weekNumbers: _angular_core.InputSignal<boolean>;
374
+ readonly buttons: _angular_core.InputSignal<readonly CalendarButton[]>;
375
+ /** What the form control holds: a Temporal Instant, a Date, or an ISO string. */
376
+ readonly valueAs: _angular_core.InputSignal<ValueShape>;
377
+ readonly opened: _angular_core.OutputEmitterRef<void>;
378
+ readonly closed: _angular_core.OutputEmitterRef<void>;
379
+ /** Whether the panel is showing. Readable from a ViewChild. */
380
+ readonly isOpen: _angular_core.WritableSignal<boolean>;
381
+ protected readonly formDisabled: _angular_core.WritableSignal<boolean>;
382
+ /** Set while the component is being destroyed, so no output fires after it. */
383
+ private gone;
384
+ private readonly host;
385
+ private readonly messages;
386
+ private readonly iconSlot;
387
+ private readonly settings;
388
+ /** Created before the required timeZone is bound; the first change detection fills it in. */
389
+ private readonly field;
390
+ constructor();
391
+ ngAfterViewInit(): void;
392
+ toggle(): void;
393
+ /** No-op when already open. */
394
+ open(): void;
395
+ close(): void;
396
+ /** Clears the selection and tells any form control about it. */
397
+ clear(): void;
398
+ private onChange;
399
+ private onTouched;
400
+ writeValue(value: InstantLike | null): void;
401
+ registerOnChange(fn: (value: unknown) => void): void;
402
+ registerOnTouched(fn: () => void): void;
403
+ setDisabledState(isDisabled: boolean): void;
404
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DateTimeField, never>;
405
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DateTimeField, "tz-datetime-field", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "timeZone": { "alias": "timeZone"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "isDateDisabled": { "alias": "isDateDisabled"; "required": false; "isSignal": true; }; "showTime": { "alias": "showTime"; "required": false; "isSignal": true; }; "timeLayout": { "alias": "timeLayout"; "required": false; "isSignal": true; }; "snapMinutes": { "alias": "snapMinutes"; "required": false; "isSignal": true; }; "shift": { "alias": "shift"; "required": false; "isSignal": true; }; "stepMinutes": { "alias": "stepMinutes"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "minTime": { "alias": "minTime"; "required": false; "isSignal": true; }; "maxTime": { "alias": "maxTime"; "required": false; "isSignal": true; }; "isSlotDisabled": { "alias": "isSlotDisabled"; "required": false; "isSignal": true; }; "hour12": { "alias": "hour12"; "required": false; "isSignal": true; }; "defaultTime": { "alias": "defaultTime"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "mask": { "alias": "mask"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "dateStyle": { "alias": "dateStyle"; "required": false; "isSignal": true; }; "timeStyle": { "alias": "timeStyle"; "required": false; "isSignal": true; }; "displayWith": { "alias": "displayWith"; "required": false; "isSignal": true; }; "today": { "alias": "today"; "required": false; "isSignal": true; }; "renderCell": { "alias": "renderCell"; "required": false; "isSignal": true; }; "weekNumbers": { "alias": "weekNumbers"; "required": false; "isSignal": true; }; "buttons": { "alias": "buttons"; "required": false; "isSignal": true; }; "valueAs": { "alias": "valueAs"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "opened": "opened"; "closed": "closed"; }, never, ["[tzIcon]"], true, never>;
406
+ }
407
+
408
+ /**
409
+ * `<tz-range-field>` — one field for a period, from @tzslot/dom, spoken in
410
+ * Angular. Named ranges beside the calendar, months side by side, and whole
411
+ * days or moments.
412
+ */
413
+ declare class RangeField implements ControlValueAccessor {
414
+ /** Set once for the application with provideTzslot(); a binding still wins. */
415
+ private readonly defaults;
416
+ readonly value: _angular_core.ModelSignal<RangeFieldValue>;
417
+ /**
418
+ * What the form control holds. `'utc'` gives two ISO strings; the default
419
+ * gives the library's own moments. Settled for a whole application with
420
+ * provideTzslot(), which documents it as applying to every component — and
421
+ * this one did not listen.
422
+ */
423
+ readonly valueAs: _angular_core.InputSignal<ValueShape>;
424
+ /**
425
+ * An IANA identifier. Required in spirit: given here, it wins; left out, it
426
+ * is the zone provideTzslot() settled for the application, and only when
427
+ * nothing was settled anywhere does it fall back to the browser's — which
428
+ * is a guess, and the one thing this library exists not to do silently.
429
+ */
430
+ readonly timeZone: _angular_core.InputSignal<string>;
431
+ /** Named ranges beside the calendar: the built-in names, or your own. */
432
+ readonly presets: _angular_core.InputSignal<readonly (PresetName | RangePreset)[]>;
433
+ /**
434
+ * Lets a period stop at one end — "from 14 September", "until the 20th".
435
+ * The panel then offers Between / From / Until, and each chosen end can be
436
+ * dropped with the cross beside it. Off by default: a booking form must not
437
+ * accept a period with no end.
438
+ */
439
+ readonly openEnded: _angular_core.InputSignal<boolean>;
440
+ /** A word or two saying what is being chosen — "Travel dates". */
441
+ readonly title: _angular_core.InputSignal<string | undefined>;
442
+ /** How an hour is asked for: two menus (default), or figures with arrows. */
443
+ readonly timeLayout: _angular_core.InputSignal<"input" | "select">;
444
+ /**
445
+ * Whether the period carries times as well as days — the screen's decision,
446
+ * not the reader's. There is no "all day" switch: on, every chosen day
447
+ * starts at `defaultTimes`.
448
+ */
449
+ readonly showTime: _angular_core.InputSignal<boolean>;
450
+ /**
451
+ * The hours a newly chosen day is given: midnight unless the screen knows
452
+ * better — `{ start: '09:00', end: '18:00' }` for a working day. A value
453
+ * handed to the field keeps its own hours.
454
+ */
455
+ readonly defaultTimes: _angular_core.InputSignal<{
456
+ start?: PlainTime | string;
457
+ end?: PlainTime | string;
458
+ }>;
459
+ readonly stepMinutes: _angular_core.InputSignal<number>;
460
+ /**
461
+ * Move a time typed by hand to the nearest mark of this grid — 15 for
462
+ * quarter-hour appointments, ties upward. Off by default.
463
+ */
464
+ readonly snapMinutes: _angular_core.InputSignal<number | null>;
465
+ /**
466
+ * How long the period may be, and how short — `'30d'`, `{ hours: 2 }`.
467
+ * Moving one end pushes the other rather than refusing the move.
468
+ */
469
+ readonly maxSpan: _angular_core.InputSignal<DurationLike | null>;
470
+ readonly minSpan: _angular_core.InputSignal<DurationLike | null>;
471
+ /** Minutes between the options of the hour menu. Five by default. */
472
+ readonly minuteStep: _angular_core.InputSignal<number>;
473
+ /** Nothing is reported until Apply is pressed. */
474
+ readonly confirm: _angular_core.InputSignal<boolean>;
475
+ /**
476
+ * Arrows that step the whole period without opening the panel. `false` —
477
+ * the default — draws none. `'auto'` moves by what is selected; a duration
478
+ * such as `{ months: 3 }` imposes the step.
479
+ */
480
+ readonly shift: _angular_core.InputSignal<false | readonly ShiftOption[] | ShiftStep>;
481
+ readonly months: _angular_core.InputSignal<number>;
482
+ readonly weekNumbers: _angular_core.InputSignal<boolean>;
483
+ /** Left out, the locale decides — see `provideTzslot` to settle it once. */
484
+ readonly firstDayOfWeek: _angular_core.InputSignal<Weekday | undefined>;
485
+ readonly mode: _angular_core.InputSignal<FieldMode>;
486
+ readonly placeholder: _angular_core.InputSignal<string | undefined>;
487
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
488
+ readonly locale: _angular_core.InputSignal<string | undefined>;
489
+ readonly min: _angular_core.InputSignal<temporal_spec.Temporal.PlainDate | null>;
490
+ readonly max: _angular_core.InputSignal<temporal_spec.Temporal.PlainDate | null>;
491
+ readonly isDateDisabled: _angular_core.InputSignal<((date: PlainDate) => boolean) | undefined>;
492
+ readonly renderCell: _angular_core.InputSignal<RenderCell | undefined>;
493
+ readonly today: _angular_core.InputSignal<temporal_spec.Temporal.PlainDate>;
494
+ /** The moment the shortcuts shorter than a day are counted from. The clock by default. */
495
+ readonly now: _angular_core.InputSignal<temporal_spec.Temporal.Instant | null>;
496
+ /**
497
+ * The whole field, or one end of it: `{ end: true }` for a period whose end
498
+ * the screen works out itself. A locked end is read-only rather than
499
+ * disabled — still readable, still reachable by the keyboard.
500
+ */
501
+ readonly disabled: _angular_core.InputSignal<boolean | {
502
+ start?: boolean;
503
+ end?: boolean;
504
+ }>;
505
+ /** A pattern for each end — `yyyy-MM-dd`. */
506
+ readonly format: _angular_core.InputSignal<string | undefined>;
507
+ /**
508
+ * What is written above the panel's two fields, and between them. Words by
509
+ * default; `{ start: null, end: null, between: '»' }` for a screen that
510
+ * prefers a mark. A DOM node is taken as it is.
511
+ */
512
+ /**
513
+ * The mark inside the panel's two fields — a calendar by default, `null`
514
+ * for none, or a node of your own.
515
+ */
516
+ readonly fieldIcon: _angular_core.InputSignal<string | Node | null | undefined>;
517
+ readonly fieldIconSide: _angular_core.InputSignal<"start" | "end">;
518
+ readonly labels: _angular_core.InputSignal<{
519
+ start?: Node | string | null;
520
+ end?: Node | string | null;
521
+ between?: Node | string | null;
522
+ }>;
523
+ /** Separators appear as figures are typed in those fields. */
524
+ readonly mask: _angular_core.InputSignal<boolean>;
525
+ readonly displayWith: _angular_core.InputSignal<((value: RangeFieldValue, timeZone: string) => string) | undefined>;
526
+ readonly opened: _angular_core.OutputEmitterRef<void>;
527
+ readonly closed: _angular_core.OutputEmitterRef<void>;
528
+ /** Whether the panel is showing. Readable from a ViewChild. */
529
+ readonly isOpen: _angular_core.WritableSignal<boolean>;
530
+ protected readonly formDisabled: _angular_core.WritableSignal<boolean>;
531
+ private gone;
532
+ private readonly messages;
533
+ private readonly settings;
534
+ /** Created before the required timeZone is bound; the first change detection fills it in. */
535
+ private readonly field;
536
+ constructor();
537
+ open(): void;
538
+ close(): void;
539
+ toggle(): void;
540
+ /** Empties the period and tells any form control about it. */
541
+ clear(): void;
542
+ private onChange;
543
+ private onTouched;
544
+ /**
545
+ * Typed `unknown` because that is what a form control holds: a string from
546
+ * a back end, a Date from older code, or the library's own objects. It was
547
+ * typed `RangeFieldValue | null` and threw on the first of those.
548
+ */
549
+ writeValue(value: unknown): void;
550
+ registerOnChange(fn: (value: unknown) => void): void;
551
+ registerOnTouched(fn: () => void): void;
552
+ setDisabledState(isDisabled: boolean): void;
553
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RangeField, never>;
554
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RangeField, "tz-range-field", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "valueAs": { "alias": "valueAs"; "required": false; "isSignal": true; }; "timeZone": { "alias": "timeZone"; "required": false; "isSignal": true; }; "presets": { "alias": "presets"; "required": false; "isSignal": true; }; "openEnded": { "alias": "openEnded"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "timeLayout": { "alias": "timeLayout"; "required": false; "isSignal": true; }; "showTime": { "alias": "showTime"; "required": false; "isSignal": true; }; "defaultTimes": { "alias": "defaultTimes"; "required": false; "isSignal": true; }; "stepMinutes": { "alias": "stepMinutes"; "required": false; "isSignal": true; }; "snapMinutes": { "alias": "snapMinutes"; "required": false; "isSignal": true; }; "maxSpan": { "alias": "maxSpan"; "required": false; "isSignal": true; }; "minSpan": { "alias": "minSpan"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "confirm": { "alias": "confirm"; "required": false; "isSignal": true; }; "shift": { "alias": "shift"; "required": false; "isSignal": true; }; "months": { "alias": "months"; "required": false; "isSignal": true; }; "weekNumbers": { "alias": "weekNumbers"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "isDateDisabled": { "alias": "isDateDisabled"; "required": false; "isSignal": true; }; "renderCell": { "alias": "renderCell"; "required": false; "isSignal": true; }; "today": { "alias": "today"; "required": false; "isSignal": true; }; "now": { "alias": "now"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "fieldIcon": { "alias": "fieldIcon"; "required": false; "isSignal": true; }; "fieldIconSide": { "alias": "fieldIconSide"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "mask": { "alias": "mask"; "required": false; "isSignal": true; }; "displayWith": { "alias": "displayWith"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "opened": "opened"; "closed": "closed"; }, never, never, true, never>;
207
555
  }
208
556
 
209
557
  /** `<tz-date-range>` — the range from @tzslot/dom, spoken in Angular. */
210
558
  declare class DateRange implements ControlValueAccessor, AfterViewInit {
559
+ /** Set once for the application with provideTzslot(); a binding still wins. */
560
+ private readonly defaults;
211
561
  readonly value: _angular_core.ModelSignal<DateRangeValue>;
212
- readonly firstDayOfWeek: _angular_core.InputSignal<Weekday>;
562
+ /** Left out, the locale decides — see `provideTzslot` to settle it once. */
563
+ readonly firstDayOfWeek: _angular_core.InputSignal<Weekday | undefined>;
213
564
  readonly locale: _angular_core.InputSignal<string | undefined>;
214
565
  readonly min: _angular_core.InputSignal<temporal_spec.Temporal.PlainDate | null>;
215
566
  readonly max: _angular_core.InputSignal<temporal_spec.Temporal.PlainDate | null>;
@@ -218,6 +569,10 @@ declare class DateRange implements ControlValueAccessor, AfterViewInit {
218
569
  readonly today: _angular_core.InputSignal<temporal_spec.Temporal.PlainDate>;
219
570
  /** Refuse a range that steps over a day isDateDisabled rules out. On by default. */
220
571
  readonly blockAcrossDisabled: _angular_core.InputSignal<boolean>;
572
+ /** A column of ISO week numbers down the left. */
573
+ readonly weekNumbers: _angular_core.InputSignal<boolean>;
574
+ /** How many months to show side by side. Two is what most ranges want. */
575
+ readonly months: _angular_core.InputSignal<number>;
221
576
  /** Adds to each day: a price per night, places left, a class of your own. */
222
577
  readonly renderCell: _angular_core.InputSignal<RenderCell | undefined>;
223
578
  /** Overrides the bundle for this one instance. */
@@ -240,7 +595,7 @@ declare class DateRange implements ControlValueAccessor, AfterViewInit {
240
595
  registerOnTouched(fn: () => void): void;
241
596
  setDisabledState(isDisabled: boolean): void;
242
597
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DateRange, never>;
243
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DateRange, "tz-date-range", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "isDateDisabled": { "alias": "isDateDisabled"; "required": false; "isSignal": true; }; "today": { "alias": "today"; "required": false; "isSignal": true; }; "blockAcrossDisabled": { "alias": "blockAcrossDisabled"; "required": false; "isSignal": true; }; "renderCell": { "alias": "renderCell"; "required": false; "isSignal": true; }; "rangeSpansBlockedMessage": { "alias": "rangeSpansBlockedMessage"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[tzPrev]", "[tzNext]"], true, never>;
598
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DateRange, "tz-date-range", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "isDateDisabled": { "alias": "isDateDisabled"; "required": false; "isSignal": true; }; "today": { "alias": "today"; "required": false; "isSignal": true; }; "blockAcrossDisabled": { "alias": "blockAcrossDisabled"; "required": false; "isSignal": true; }; "weekNumbers": { "alias": "weekNumbers"; "required": false; "isSignal": true; }; "months": { "alias": "months"; "required": false; "isSignal": true; }; "renderCell": { "alias": "renderCell"; "required": false; "isSignal": true; }; "rangeSpansBlockedMessage": { "alias": "rangeSpansBlockedMessage"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[tzPrev]", "[tzNext]"], true, never>;
244
599
  }
245
600
 
246
601
  /**
@@ -250,9 +605,53 @@ declare class DateRange implements ControlValueAccessor, AfterViewInit {
250
605
  * faces the widget says so in words.
251
606
  */
252
607
  declare class DateTimeRange implements ControlValueAccessor {
608
+ /** Set once for the application with provideTzslot(); a binding still wins. */
609
+ private readonly defaults;
253
610
  readonly value: _angular_core.ModelSignal<DateTimeRangeValue>;
611
+ /**
612
+ * An IANA identifier. Required in spirit: given here, it wins; left out, it
613
+ * is the zone provideTzslot() settled for the application, and only when
614
+ * nothing was settled anywhere does it fall back to the browser's — which
615
+ * is a guess, and the one thing this library exists not to do silently.
616
+ */
254
617
  readonly timeZone: _angular_core.InputSignal<string>;
618
+ /**
619
+ * Whole days rather than moments. Two-way: the switch inside the widget
620
+ * sets it, and so can you.
621
+ */
622
+ /**
623
+ * What the form control holds. `'utc'` gives two ISO strings; the default
624
+ * gives the library's own moments.
625
+ */
626
+ readonly valueAs: _angular_core.InputSignal<ValueShape>;
627
+ readonly allDay: _angular_core.ModelSignal<boolean>;
628
+ /** Whether that switch is shown at all. */
629
+ readonly allDaySwitch: _angular_core.InputSignal<boolean>;
630
+ /**
631
+ * Lets the interval stop at one end. The summary then says what it means —
632
+ * "From 14 Sept 2026, 09:00" — instead of going blank, which reads as
633
+ * nothing chosen. Off by default.
634
+ */
635
+ readonly openEnded: _angular_core.InputSignal<boolean>;
636
+ /** How each end asks for its time: 'input', 'select' or 'list'. */
637
+ readonly timeLayout: _angular_core.InputSignal<TimeLayout>;
255
638
  readonly stepMinutes: _angular_core.InputSignal<number>;
639
+ /** With 'select': minutes between the options. Every minute by default. */
640
+ readonly minuteStep: _angular_core.InputSignal<number>;
641
+ readonly hour12: _angular_core.InputSignal<boolean | undefined>;
642
+ /** The time a newly chosen day starts at. Midnight by default. */
643
+ readonly defaultTime: _angular_core.InputSignal<string | temporal_spec.Temporal.PlainTime>;
644
+ /** Both ends can be typed into as well as chosen from. */
645
+ readonly editable: _angular_core.InputSignal<boolean>;
646
+ /** A pattern for both ends — `yyyy-MM-dd HH:mm`. */
647
+ readonly format: _angular_core.InputSignal<string | undefined>;
648
+ readonly isDateDisabled: _angular_core.InputSignal<((date: PlainDate) => boolean) | undefined>;
649
+ /** Which day is today, in both panels. */
650
+ readonly today: _angular_core.InputSignal<temporal_spec.Temporal.PlainDate>;
651
+ readonly renderCell: _angular_core.InputSignal<RenderCell | undefined>;
652
+ /** A column of ISO week numbers down the left. */
653
+ readonly weekNumbers: _angular_core.InputSignal<boolean>;
654
+ readonly buttons: _angular_core.InputSignal<readonly CalendarButton[]>;
256
655
  readonly minTime: _angular_core.InputSignal<string | undefined>;
257
656
  readonly maxTime: _angular_core.InputSignal<string | undefined>;
258
657
  readonly isSlotDisabled: _angular_core.InputSignal<((slot: Omit<Slot, "disabled">) => boolean) | undefined>;
@@ -273,12 +672,16 @@ declare class DateTimeRange implements ControlValueAccessor {
273
672
  clear(): void;
274
673
  private onChange;
275
674
  private onTouched;
276
- writeValue(value: DateTimeRangeValue | null): void;
277
- registerOnChange(fn: (value: DateTimeRangeValue) => void): void;
675
+ /**
676
+ * Typed `unknown` because that is what a form control holds: a string from
677
+ * a back end, a Date from older code, or the library's own objects.
678
+ */
679
+ writeValue(value: unknown): void;
680
+ registerOnChange(fn: (value: unknown) => void): void;
278
681
  registerOnTouched(fn: () => void): void;
279
682
  setDisabledState(isDisabled: boolean): void;
280
683
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DateTimeRange, never>;
281
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DateTimeRange, "tz-datetime-range", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "timeZone": { "alias": "timeZone"; "required": true; "isSignal": true; }; "stepMinutes": { "alias": "stepMinutes"; "required": false; "isSignal": true; }; "minTime": { "alias": "minTime"; "required": false; "isSignal": true; }; "maxTime": { "alias": "maxTime"; "required": false; "isSignal": true; }; "isSlotDisabled": { "alias": "isSlotDisabled"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "startLabel": { "alias": "startLabel"; "required": false; "isSignal": true; }; "endLabel": { "alias": "endLabel"; "required": false; "isSignal": true; }; "endBeforeStartMessage": { "alias": "endBeforeStartMessage"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
684
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DateTimeRange, "tz-datetime-range", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "timeZone": { "alias": "timeZone"; "required": false; "isSignal": true; }; "valueAs": { "alias": "valueAs"; "required": false; "isSignal": true; }; "allDay": { "alias": "allDay"; "required": false; "isSignal": true; }; "allDaySwitch": { "alias": "allDaySwitch"; "required": false; "isSignal": true; }; "openEnded": { "alias": "openEnded"; "required": false; "isSignal": true; }; "timeLayout": { "alias": "timeLayout"; "required": false; "isSignal": true; }; "stepMinutes": { "alias": "stepMinutes"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "hour12": { "alias": "hour12"; "required": false; "isSignal": true; }; "defaultTime": { "alias": "defaultTime"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "isDateDisabled": { "alias": "isDateDisabled"; "required": false; "isSignal": true; }; "today": { "alias": "today"; "required": false; "isSignal": true; }; "renderCell": { "alias": "renderCell"; "required": false; "isSignal": true; }; "weekNumbers": { "alias": "weekNumbers"; "required": false; "isSignal": true; }; "buttons": { "alias": "buttons"; "required": false; "isSignal": true; }; "minTime": { "alias": "minTime"; "required": false; "isSignal": true; }; "maxTime": { "alias": "maxTime"; "required": false; "isSignal": true; }; "isSlotDisabled": { "alias": "isSlotDisabled"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "startLabel": { "alias": "startLabel"; "required": false; "isSignal": true; }; "endLabel": { "alias": "endLabel"; "required": false; "isSignal": true; }; "endBeforeStartMessage": { "alias": "endBeforeStartMessage"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "allDay": "allDayChange"; }, never, never, true, never>;
282
685
  }
283
686
 
284
687
  /**
@@ -286,14 +689,28 @@ declare class DateTimeRange implements ControlValueAccessor {
286
689
  * @tzslot/dom, spoken in Angular. "The 3rd to the 7th, 09:00 to 17:00."
287
690
  */
288
691
  declare class DailyRange implements ControlValueAccessor {
692
+ /** Set once for the application with provideTzslot(); a binding still wins. */
693
+ private readonly defaults;
289
694
  readonly value: _angular_core.ModelSignal<DailyRangeValue>;
290
- /** An IANA identifier. The hours are read on the clocks of this zone. */
695
+ /**
696
+ * An IANA identifier. Required in spirit: given here, it wins; left out, it
697
+ * is the zone provideTzslot() settled for the application, and only when
698
+ * nothing was settled anywhere does it fall back to the browser's — which
699
+ * is a guess, and the one thing this library exists not to do silently.
700
+ */
291
701
  readonly timeZone: _angular_core.InputSignal<string>;
292
702
  readonly stepMinutes: _angular_core.InputSignal<number>;
703
+ /** 'input' (default) for two compact fields, 'list' for times to click. */
704
+ readonly timeLayout: _angular_core.InputSignal<TimeLayout>;
705
+ /** 12-hour fields with an AM/PM button; the locale decides when unset. */
706
+ readonly hour12: _angular_core.InputSignal<boolean | undefined>;
707
+ /** With timeLayout 'columns': minutes between the options. Every minute by default. */
708
+ readonly minuteStep: _angular_core.InputSignal<number>;
293
709
  /** The first and last times offered. */
294
710
  readonly minTime: _angular_core.InputSignal<string | undefined>;
295
711
  readonly maxTime: _angular_core.InputSignal<string | undefined>;
296
- readonly firstDayOfWeek: _angular_core.InputSignal<Weekday>;
712
+ /** Left out, the locale decides — see `provideTzslot` to settle it once. */
713
+ readonly firstDayOfWeek: _angular_core.InputSignal<Weekday | undefined>;
297
714
  readonly locale: _angular_core.InputSignal<string | undefined>;
298
715
  readonly min: _angular_core.InputSignal<temporal_spec.Temporal.PlainDate | null>;
299
716
  readonly max: _angular_core.InputSignal<temporal_spec.Temporal.PlainDate | null>;
@@ -313,12 +730,17 @@ declare class DailyRange implements ControlValueAccessor {
313
730
  clear(): void;
314
731
  private onChange;
315
732
  private onTouched;
733
+ /**
734
+ * A pattern, not a moment: two days and the clock faces repeated over them.
735
+ * `valueAs` has nothing to convert here, which is why this component does
736
+ * not take it — see the note on TzslotDefaults.
737
+ */
316
738
  writeValue(value: DailyRangeValue | null): void;
317
739
  registerOnChange(fn: (value: DailyRangeValue) => void): void;
318
740
  registerOnTouched(fn: () => void): void;
319
741
  setDisabledState(isDisabled: boolean): void;
320
742
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DailyRange, never>;
321
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DailyRange, "tz-daily-range", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "timeZone": { "alias": "timeZone"; "required": true; "isSignal": true; }; "stepMinutes": { "alias": "stepMinutes"; "required": false; "isSignal": true; }; "minTime": { "alias": "minTime"; "required": false; "isSignal": true; }; "maxTime": { "alias": "maxTime"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "isDateDisabled": { "alias": "isDateDisabled"; "required": false; "isSignal": true; }; "renderCell": { "alias": "renderCell"; "required": false; "isSignal": true; }; "today": { "alias": "today"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
743
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DailyRange, "tz-daily-range", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "timeZone": { "alias": "timeZone"; "required": false; "isSignal": true; }; "stepMinutes": { "alias": "stepMinutes"; "required": false; "isSignal": true; }; "timeLayout": { "alias": "timeLayout"; "required": false; "isSignal": true; }; "hour12": { "alias": "hour12"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "minTime": { "alias": "minTime"; "required": false; "isSignal": true; }; "maxTime": { "alias": "maxTime"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "isDateDisabled": { "alias": "isDateDisabled"; "required": false; "isSignal": true; }; "renderCell": { "alias": "renderCell"; "required": false; "isSignal": true; }; "today": { "alias": "today"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
322
744
  }
323
745
 
324
746
  /**
@@ -326,11 +748,14 @@ declare class DailyRange implements ControlValueAccessor {
326
748
  * @tzslot/dom, spoken in Angular. The value is always in date order.
327
749
  */
328
750
  declare class MultiDate implements ControlValueAccessor, AfterViewInit {
751
+ /** Set once for the application with provideTzslot(); a binding still wins. */
752
+ private readonly defaults;
329
753
  /** The chosen days, in date order. Two-way: `[(value)]`. */
330
754
  readonly value: _angular_core.ModelSignal<readonly temporal_spec.Temporal.PlainDate[]>;
331
755
  /** Once this many are chosen, the other days stop taking clicks. */
332
756
  readonly maxDates: _angular_core.InputSignal<number | undefined>;
333
- readonly firstDayOfWeek: _angular_core.InputSignal<Weekday>;
757
+ /** Left out, the locale decides — see `provideTzslot` to settle it once. */
758
+ readonly firstDayOfWeek: _angular_core.InputSignal<Weekday | undefined>;
334
759
  readonly locale: _angular_core.InputSignal<string | undefined>;
335
760
  readonly min: _angular_core.InputSignal<temporal_spec.Temporal.PlainDate | null>;
336
761
  readonly max: _angular_core.InputSignal<temporal_spec.Temporal.PlainDate | null>;
@@ -339,6 +764,8 @@ declare class MultiDate implements ControlValueAccessor, AfterViewInit {
339
764
  readonly today: _angular_core.InputSignal<temporal_spec.Temporal.PlainDate>;
340
765
  readonly view: _angular_core.ModelSignal<CalendarView>;
341
766
  readonly renderCell: _angular_core.InputSignal<RenderCell | undefined>;
767
+ /** A column of ISO week numbers down the left. */
768
+ readonly weekNumbers: _angular_core.InputSignal<boolean>;
342
769
  readonly buttons: _angular_core.InputSignal<readonly CalendarButton[]>;
343
770
  /** What the form control holds, each day as a Temporal date, a Date, or an ISO string. */
344
771
  readonly valueAs: _angular_core.InputSignal<ValueShape>;
@@ -364,7 +791,8 @@ declare class MultiDate implements ControlValueAccessor, AfterViewInit {
364
791
  registerOnTouched(fn: () => void): void;
365
792
  setDisabledState(isDisabled: boolean): void;
366
793
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MultiDate, never>;
367
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<MultiDate, "tz-multi-date", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "maxDates": { "alias": "maxDates"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "isDateDisabled": { "alias": "isDateDisabled"; "required": false; "isSignal": true; }; "today": { "alias": "today"; "required": false; "isSignal": true; }; "view": { "alias": "view"; "required": false; "isSignal": true; }; "renderCell": { "alias": "renderCell"; "required": false; "isSignal": true; }; "buttons": { "alias": "buttons"; "required": false; "isSignal": true; }; "valueAs": { "alias": "valueAs"; "required": false; "isSignal": true; }; "valueTimeZone": { "alias": "valueTimeZone"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "view": "viewChange"; }, never, ["[tzPrev]", "[tzNext]"], true, never>;
794
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MultiDate, "tz-multi-date", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "maxDates": { "alias": "maxDates"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "isDateDisabled": { "alias": "isDateDisabled"; "required": false; "isSignal": true; }; "today": { "alias": "today"; "required": false; "isSignal": true; }; "view": { "alias": "view"; "required": false; "isSignal": true; }; "renderCell": { "alias": "renderCell"; "required": false; "isSignal": true; }; "weekNumbers": { "alias": "weekNumbers"; "required": false; "isSignal": true; }; "buttons": { "alias": "buttons"; "required": false; "isSignal": true; }; "valueAs": { "alias": "valueAs"; "required": false; "isSignal": true; }; "valueTimeZone": { "alias": "valueTimeZone"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "view": "viewChange"; }, never, ["[tzPrev]", "[tzNext]"], true, never>;
368
795
  }
369
796
 
370
- export { Calendar, DailyRange, DateField, DateRange, DateTimeRange, MultiDate, TZSLOT_MESSAGES, TimeSlotPicker, provideTzslotMessages };
797
+ export { Calendar, DailyRange, DateField, DateRange, DateTimeField, DateTimeRange, MultiDate, RangeField, TZSLOT_DEFAULTS, TZSLOT_MESSAGES, TimeSlotPicker, pairIn, pairOut, provideTzslot, provideTzslotMessages };
798
+ export type { MomentPair, TzslotDefaults };