@lilydesignsystem/angular-time-zone-picker 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -13,7 +13,9 @@ Time` in January and `UTC-04:00 – Eastern Daylight Time` in July, and `Central
|
|
|
13
13
|
|
|
14
14
|
```js
|
|
15
15
|
// What the app does with the choice:
|
|
16
|
-
new Intl.DateTimeFormat(locale, { timeZone: document.documentElement.dataset.timeZone }).format(
|
|
16
|
+
new Intl.DateTimeFormat(locale, { timeZone: document.documentElement.dataset.timeZone }).format(
|
|
17
|
+
date,
|
|
18
|
+
);
|
|
17
19
|
```
|
|
18
20
|
|
|
19
21
|
## Usage
|
|
@@ -26,7 +28,12 @@ import { TimeZonePicker } from "@lilydesignsystem/angular-time-zone-picker";
|
|
|
26
28
|
selector: "app-example",
|
|
27
29
|
standalone: true,
|
|
28
30
|
imports: [TimeZonePicker],
|
|
29
|
-
template: `<lily-time-zone-picker
|
|
31
|
+
template: `<lily-time-zone-picker
|
|
32
|
+
label="Time zone"
|
|
33
|
+
locale="en-GB"
|
|
34
|
+
[(value)]="zone"
|
|
35
|
+
storageKey="lily-time-zone"
|
|
36
|
+
/>`,
|
|
30
37
|
})
|
|
31
38
|
export class Example {
|
|
32
39
|
zone = "";
|
|
@@ -37,25 +44,25 @@ Angular idioms: the selector is `lily-time-zone-picker`; inputs are signal input
|
|
|
37
44
|
|
|
38
45
|
## Props
|
|
39
46
|
|
|
40
|
-
| Prop | Type
|
|
41
|
-
| -------------- |
|
|
42
|
-
| `label` | `string`
|
|
43
|
-
| `locale` | `string`
|
|
44
|
-
| `zones` | `readonly string[]`
|
|
45
|
-
| `date` | `Date`
|
|
46
|
-
| `value` | `string`
|
|
47
|
-
| `defaultValue` | `string`
|
|
48
|
-
| `storageKey` | `string`
|
|
49
|
-
| `name` | `string`
|
|
50
|
-
| `target` | `HTMLElement \| null`
|
|
51
|
-
| `labelFor` | `(zone: ZoneInfo) => string
|
|
52
|
-
| `names` | `ZoneNames`
|
|
53
|
-
| `children` | `Snippet<[ChildArgs]>`
|
|
54
|
-
| `onChange` | `(zone: string) => void`
|
|
55
|
-
| `open` | `boolean`
|
|
56
|
-
| `onOpenChange` | `(open: boolean) => void`
|
|
57
|
-
| `disabled` | `boolean`
|
|
58
|
-
| `className` | `string`
|
|
47
|
+
| Prop | Type | Required | Description |
|
|
48
|
+
| -------------- | ---------------------------- | -------- | -------------------------------------------------------------------------------------------------------------- |
|
|
49
|
+
| `label` | `string` | yes | Accessible name for the button and the listbox; also the tooltip text. |
|
|
50
|
+
| `locale` | `string` | yes | BCP 47 tag the zone names are written in. No default: the picker never picks a language for you. |
|
|
51
|
+
| `zones` | `readonly string[]` | no | IANA ids to offer. Default `DEFAULT_ZONES` (55 representative zones). Shown by offset, not in the order given. |
|
|
52
|
+
| `date` | `Date` | no | The moment offsets and names are worked out for. Default: now, read once. |
|
|
53
|
+
| `value` | `string` | no | Selected IANA id. Two-way bindable. |
|
|
54
|
+
| `defaultValue` | `string` | no | Initial zone when nothing else is supplied. |
|
|
55
|
+
| `storageKey` | `string` | no | If set, persist the zone to `localStorage`. |
|
|
56
|
+
| `name` | `string` | no | `name` of the hidden input (default `"time-zone"`). |
|
|
57
|
+
| `target` | `HTMLElement \| null` | no | Element to receive `data-time-zone`. Default `<html>`. |
|
|
58
|
+
| `labelFor` | `(zone: ZoneInfo) => string` | no | Builds an option's text. Default `UTC+01:00 – Central European Standard Time`. |
|
|
59
|
+
| `names` | `ZoneNames` | no | Zone names by IANA id (a name, or `[standard, daylight]`) that win over `Intl`: the CLDR packs, below. |
|
|
60
|
+
| `children` | `Snippet<[ChildArgs]>` | no | Replaces the clock icon. |
|
|
61
|
+
| `onChange` | `(zone: string) => void` | no | Called once after a new zone is applied. |
|
|
62
|
+
| `open` | `boolean` | no | Is the popup open? Bindable. |
|
|
63
|
+
| `onOpenChange` | `(open: boolean) => void` | no | Fires whenever the open state changes. |
|
|
64
|
+
| `disabled` | `boolean` | no | Disables the button. |
|
|
65
|
+
| `className` | `string` | no | Extra CSS class on the root. |
|
|
59
66
|
|
|
60
67
|
The pure functions are exported too: `orderedZones`, `zoneInfo`, `offsetMinutes`, `formatOffset`, `zoneName`,
|
|
61
68
|
`matchZone`, `systemZone`, `defaultLabel`.
|
|
@@ -22,12 +22,15 @@ const DEFAULT_ZONES = [
|
|
|
22
22
|
"Atlantic/South_Georgia",
|
|
23
23
|
"Atlantic/Azores",
|
|
24
24
|
"UTC",
|
|
25
|
+
"Africa/Abidjan",
|
|
25
26
|
"Europe/London",
|
|
26
27
|
"Europe/Lisbon",
|
|
28
|
+
"Africa/Casablanca",
|
|
27
29
|
"Africa/Lagos",
|
|
28
30
|
"Europe/Paris",
|
|
29
31
|
"Europe/Athens",
|
|
30
32
|
"Africa/Cairo",
|
|
33
|
+
"Africa/Maputo",
|
|
31
34
|
"Africa/Johannesburg",
|
|
32
35
|
"Europe/Moscow",
|
|
33
36
|
"Africa/Nairobi",
|
|
@@ -41,12 +44,17 @@ const DEFAULT_ZONES = [
|
|
|
41
44
|
"Asia/Dhaka",
|
|
42
45
|
"Asia/Yangon",
|
|
43
46
|
"Asia/Bangkok",
|
|
47
|
+
"Asia/Jakarta",
|
|
44
48
|
"Asia/Shanghai",
|
|
45
49
|
"Asia/Singapore",
|
|
50
|
+
"Asia/Kuala_Lumpur",
|
|
51
|
+
"Asia/Manila",
|
|
52
|
+
"Asia/Makassar",
|
|
46
53
|
"Australia/Perth",
|
|
47
54
|
"Australia/Eucla",
|
|
48
55
|
"Asia/Tokyo",
|
|
49
56
|
"Asia/Seoul",
|
|
57
|
+
"Asia/Jayapura",
|
|
50
58
|
"Australia/Darwin",
|
|
51
59
|
"Australia/Adelaide",
|
|
52
60
|
"Australia/Brisbane",
|
|
@@ -165,7 +173,7 @@ var TimeZonePickerIcon = class TimeZonePickerIcon {
|
|
|
165
173
|
static {
|
|
166
174
|
this.ɵfac = i0.ɵɵngDeclareFactory({
|
|
167
175
|
minVersion: "12.0.0",
|
|
168
|
-
version: "22.2.
|
|
176
|
+
version: "22.2.4",
|
|
169
177
|
ngImport: i0,
|
|
170
178
|
type: TimeZonePickerIcon,
|
|
171
179
|
deps: [],
|
|
@@ -175,7 +183,7 @@ var TimeZonePickerIcon = class TimeZonePickerIcon {
|
|
|
175
183
|
static {
|
|
176
184
|
this.ɵdir = i0.ɵɵngDeclareDirective({
|
|
177
185
|
minVersion: "14.0.0",
|
|
178
|
-
version: "22.2.
|
|
186
|
+
version: "22.2.4",
|
|
179
187
|
type: TimeZonePickerIcon,
|
|
180
188
|
isStandalone: true,
|
|
181
189
|
selector: "ng-template[lilyTimeZonePickerIcon]",
|
|
@@ -185,7 +193,7 @@ var TimeZonePickerIcon = class TimeZonePickerIcon {
|
|
|
185
193
|
};
|
|
186
194
|
i0.ɵɵngDeclareClassMetadata({
|
|
187
195
|
minVersion: "12.0.0",
|
|
188
|
-
version: "22.2.
|
|
196
|
+
version: "22.2.4",
|
|
189
197
|
ngImport: i0,
|
|
190
198
|
type: TimeZonePickerIcon,
|
|
191
199
|
decorators: [{
|
|
@@ -373,7 +381,7 @@ var TimeZonePicker = class TimeZonePicker {
|
|
|
373
381
|
static {
|
|
374
382
|
this.ɵfac = i0.ɵɵngDeclareFactory({
|
|
375
383
|
minVersion: "12.0.0",
|
|
376
|
-
version: "22.2.
|
|
384
|
+
version: "22.2.4",
|
|
377
385
|
ngImport: i0,
|
|
378
386
|
type: TimeZonePicker,
|
|
379
387
|
deps: [],
|
|
@@ -383,7 +391,7 @@ var TimeZonePicker = class TimeZonePicker {
|
|
|
383
391
|
static {
|
|
384
392
|
this.ɵcmp = i0.ɵɵngDeclareComponent({
|
|
385
393
|
minVersion: "17.0.0",
|
|
386
|
-
version: "22.2.
|
|
394
|
+
version: "22.2.4",
|
|
387
395
|
type: TimeZonePicker,
|
|
388
396
|
isStandalone: true,
|
|
389
397
|
selector: "lily-time-zone-picker",
|
|
@@ -670,7 +678,7 @@ var TimeZonePicker = class TimeZonePicker {
|
|
|
670
678
|
};
|
|
671
679
|
i0.ɵɵngDeclareClassMetadata({
|
|
672
680
|
minVersion: "12.0.0",
|
|
673
|
-
version: "22.2.
|
|
681
|
+
version: "22.2.4",
|
|
674
682
|
ngImport: i0,
|
|
675
683
|
type: TimeZonePicker,
|
|
676
684
|
decorators: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lilydesignsystem-angular-time-zone-picker.mjs","names":[],"sources":["../../zones.ts","../../time-zone-picker.component.ts"],"sourcesContent":["// The zone logic of the time zone picker: offsets, names and order. Pure and framework-neutral; every name comes\n// from `Intl` in the caller's locale, so there is no English table here and no default locale.\n\n/**\n * A representative zone for each common UTC offset and name, as IANA ids: the ids are identifiers, not words. An\n * app that wants other zones passes its own list. Offsets and names are worked out for a date, so a zone that keeps\n * daylight saving time shows the offset and name in force on that date.\n */\nexport const DEFAULT_ZONES: readonly string[] = [\n \"Pacific/Pago_Pago\",\n \"Pacific/Honolulu\",\n \"Pacific/Marquesas\",\n \"America/Anchorage\",\n \"America/Los_Angeles\",\n \"America/Phoenix\",\n \"America/Denver\",\n \"America/Chicago\",\n \"America/Mexico_City\",\n \"America/New_York\",\n \"America/Bogota\",\n \"America/Halifax\",\n \"America/Caracas\",\n \"America/St_Johns\",\n \"America/Sao_Paulo\",\n \"America/Argentina/Buenos_Aires\",\n \"Atlantic/South_Georgia\",\n \"Atlantic/Azores\",\n \"UTC\",\n \"Europe/London\",\n \"Europe/Lisbon\",\n \"Africa/Lagos\",\n \"Europe/Paris\",\n \"Europe/Athens\",\n \"Africa/Cairo\",\n \"Africa/Johannesburg\",\n \"Europe/Moscow\",\n \"Africa/Nairobi\",\n \"Asia/Riyadh\",\n \"Asia/Tehran\",\n \"Asia/Dubai\",\n \"Asia/Kabul\",\n \"Asia/Karachi\",\n \"Asia/Kolkata\",\n \"Asia/Kathmandu\",\n \"Asia/Dhaka\",\n \"Asia/Yangon\",\n \"Asia/Bangkok\",\n \"Asia/Shanghai\",\n \"Asia/Singapore\",\n \"Australia/Perth\",\n \"Australia/Eucla\",\n \"Asia/Tokyo\",\n \"Asia/Seoul\",\n \"Australia/Darwin\",\n \"Australia/Adelaide\",\n \"Australia/Brisbane\",\n \"Australia/Sydney\",\n \"Australia/Lord_Howe\",\n \"Pacific/Guadalcanal\",\n \"Pacific/Auckland\",\n \"Pacific/Fiji\",\n \"Pacific/Chatham\",\n \"Pacific/Tongatapu\",\n \"Pacific/Kiritimati\",\n];\n\n/** One zone as the picker shows it. */\nexport type ZoneInfo = {\n /** The IANA id, which is the picker's value (`Europe/Paris`). */\n id: string;\n /** Minutes east of UTC on the picker's date (`60`, `-330`). */\n offsetMinutes: number;\n /** The offset as text (`UTC+01:00`, `UTC-03:30`, `UTC+00:00`). */\n offset: string;\n /** The zone's full name in the locale (`Central European Standard Time`). */\n name: string;\n /** What the option shows: `UTC+01:00 – Central European Standard Time`. */\n label: string;\n};\n\n/**\n * Zone names supplied by the caller, by IANA id: one name all year, or `[standard, daylight]`. They win over `Intl`.\n * `zoneNamesFrom()` (in the locale-translations packages) builds one from a CLDR zone-name pack, so a name is the\n * same on every platform and in every runtime, whatever ICU data the browser or server happens to carry.\n */\nexport type ZoneNames = Readonly<Record<string, string | readonly [string, string]>>;\n\nconst offsetFormatters = new Map<string, Intl.DateTimeFormat>();\n\n/** Minutes east of UTC for `zone` at `date`; `undefined` when the runtime does not know the zone. */\nexport function offsetMinutes(zone: string, date: Date): number | undefined {\n try {\n let f = offsetFormatters.get(zone);\n if (!f) {\n f = new Intl.DateTimeFormat(\"en-US\", {\n timeZone: zone,\n hourCycle: \"h23\",\n year: \"numeric\",\n month: \"numeric\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"numeric\",\n second: \"numeric\",\n });\n offsetFormatters.set(zone, f);\n }\n const p: Record<string, string> = {};\n for (const part of f.formatToParts(date)) p[part.type] = part.value;\n const wall = Date.UTC(Number(p[\"year\"]), Number(p[\"month\"]) - 1, Number(p[\"day\"]), Number(p[\"hour\"]), Number(p[\"minute\"]), Number(p[\"second\"]));\n const instant = Math.floor(date.getTime() / 1000) * 1000;\n return Math.round((wall - instant) / 60000);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Is daylight saving time in force in `zone` at `date`? True when its offset is above the lowest it has in that\n * year (compared at 1 January and 1 July), so a zone with no daylight time is never true.\n */\nexport function isDaylightTime(zone: string, date: Date): boolean {\n const now = offsetMinutes(zone, date);\n if (now === undefined) return false;\n const year = date.getUTCFullYear();\n const jan = offsetMinutes(zone, new Date(Date.UTC(year, 0, 1, 12)));\n const jul = offsetMinutes(zone, new Date(Date.UTC(year, 6, 1, 12)));\n if (jan === undefined || jul === undefined) return false;\n return now > Math.min(jan, jul);\n}\n\n/** `330` → `UTC+05:30`, `-210` → `UTC-03:30`, `0` → `UTC+00:00`. ASCII, so it sorts and parses everywhere. */\nexport function formatOffset(minutes: number): string {\n const sign = minutes < 0 ? \"-\" : \"+\";\n const abs = Math.abs(minutes);\n const hh = String(Math.floor(abs / 60)).padStart(2, \"0\");\n const mm = String(abs % 60).padStart(2, \"0\");\n return `UTC${sign}${hh}:${mm}`;\n}\n\n/**\n * The zone's full name in `locale` on `date`: the caller's `names` entry when it has one (the daylight name while\n * daylight time is in force), else `Intl`'s; `undefined` when neither has one.\n */\nexport function zoneName(zone: string, locale: string, date: Date, names?: ZoneNames): string | undefined {\n const given = names?.[zone];\n if (typeof given === \"string\") return given;\n if (given) return isDaylightTime(zone, date) ? given[1] : given[0];\n try {\n const parts = new Intl.DateTimeFormat(locale, { timeZone: zone, timeZoneName: \"long\" }).formatToParts(date);\n return parts.find((p) => p.type === \"timeZoneName\")?.value;\n } catch {\n return undefined;\n }\n}\n\n/** What an option shows by default. */\nexport const defaultLabel = (zone: Pick<ZoneInfo, \"offset\" | \"name\">): string => `${zone.offset} – ${zone.name}`;\n\n/** One zone's info, or `undefined` when the runtime does not know it. */\nexport function zoneInfo(zone: string, locale: string, date: Date, labelFor: (z: ZoneInfo) => string = defaultLabel, names?: ZoneNames): ZoneInfo | undefined {\n const minutes = offsetMinutes(zone, date);\n if (minutes === undefined) return undefined;\n const name = zoneName(zone, locale, date, names) ?? zone;\n const info: ZoneInfo = { id: zone, offsetMinutes: minutes, offset: formatOffset(minutes), name, label: \"\" };\n info.label = labelFor(info);\n return info;\n}\n\n/**\n * The zones that exist, ordered by offset (west to east), then by name, then by id. A repeated id appears once;\n * an id the runtime does not know is left out rather than shown unnamed.\n */\nexport function orderedZones(zones: readonly string[], locale: string, date: Date, labelFor?: (z: ZoneInfo) => string, names?: ZoneNames): ZoneInfo[] {\n const seen = new Set<string>();\n const out: ZoneInfo[] = [];\n for (const id of zones) {\n if (seen.has(id)) continue;\n seen.add(id);\n const info = zoneInfo(id, locale, date, labelFor, names);\n if (info) out.push(info);\n }\n const collator = new Intl.Collator(locale);\n return out.sort((a, b) => a.offsetMinutes - b.offsetMinutes || collator.compare(a.name, b.name) || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));\n}\n\n/** The zone the browser is in, as an IANA id. `undefined` outside a browser or when it cannot be told. */\nexport function systemZone(): string | undefined {\n try {\n return new Intl.DateTimeFormat().resolvedOptions().timeZone || undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Which of `zones` stands for `system`: the zone itself when listed, else the listed zone with the same offset and\n * name (Europe/Berlin → Europe/Paris), else `undefined`.\n */\nexport function matchZone(system: string | undefined, zones: ZoneInfo[], locale: string, date: Date, names?: ZoneNames): string | undefined {\n if (!system) return undefined;\n if (zones.some((z) => z.id === system)) return system;\n const info = zoneInfo(system, locale, date, undefined, names);\n if (!info) return undefined;\n return zones.find((z) => z.offsetMinutes === info.offsetMinutes && z.name === info.name)?.id;\n}\n","import { NgTemplateOutlet } from \"@angular/common\";\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n computed,\n contentChild,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n model,\n output,\n signal,\n TemplateRef,\n viewChild,\n} from \"@angular/core\";\nimport { IconButton, Listbox } from \"@lilydesignsystem/angular-headless\";\nimport { DEFAULT_ZONES, matchZone, orderedZones, systemZone, zoneInfo, type ZoneInfo, type ZoneNames } from \"./zones.js\";\n\nexport { DEFAULT_ZONES };\nexport type { ZoneInfo, ZoneNames };\n\n/** Context passed to a custom icon `<ng-template>` (the button icon). */\nexport type ChildArgs = {\n /** Currently selected zone, an IANA id. */\n value: string;\n /** Is the listbox open? */\n open: boolean;\n /** Offset, name and label of any zone. */\n infoFor: (zone: string) => ZoneInfo | undefined;\n};\n\nlet uid = 0;\n/** Stable per-instance id prefix; SSR-safe (no Math.random / Date.now). */\nexport function nextTimeZonePickerId(): string {\n uid += 1;\n return `time-zone-picker-${uid}`;\n}\n\n/**\n * Optional marker for the projected icon template. Gives consumers typed\n * `let-` variables:\n *\n * ```html\n * <lily-time-zone-picker ...>\n * <ng-template lilyTimeZonePickerIcon let-args>{{ args.infoFor(args.value)?.offset }}</ng-template>\n * </lily-time-zone-picker>\n * ```\n *\n * The component queries any projected `<ng-template>`, so the marker is\n * for type-checking and readability, not for matching.\n */\n@Directive({\n selector: \"ng-template[lilyTimeZonePickerIcon]\",\n standalone: true,\n})\nexport class TimeZonePickerIcon {\n static ngTemplateContextGuard(\n _dir: TimeZonePickerIcon,\n _ctx: unknown,\n ): _ctx is ChildArgs & { $implicit: ChildArgs } {\n return true;\n }\n}\n\n/**\n * TimeZonePicker — `data-time-zone` time-zone picker.\n *\n * Renders an icon button that opens a WAI-ARIA APG listbox of time zones. On\n * every change the component sets `data-time-zone=\"{IANA id}\"` on the\n * document root (or on a consumer-supplied target), with optional\n * `localStorage` persistence. Ships no CSS; the consumer maps each\n * `[data-time-zone=\"…\"]` slug to real typography. See `spec/index.md`\n * for the full contract.\n */\n@Component({\n selector: \"lily-time-zone-picker\",\n standalone: true,\n imports: [NgTemplateOutlet, IconButton, Listbox],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n \"(document:click)\": \"onDocumentClick($event)\",\n },\n template: `\n <div\n #rootEl\n class=\"time-zone-picker {{ className() }}\"\n (focusout)=\"onRootFocusOut($event)\"\n >\n <input type=\"hidden\" [name]=\"name()\" [value]=\"value()\" />\n\n <lily-icon-button\n [disabled]=\"disabled()\"\n #buttonEl\n [label]=\"label()\"\n baseClass=\"time-zone-picker-button\"\n ariaHaspopup=\"listbox\"\n [ariaExpanded]=\"open()\"\n [ariaControls]=\"listId\"\n (click)=\"toggle(); hoverButton.set(false)\"\n (mouseenter)=\"onTooltipButtonEnter()\"\n (mouseleave)=\"hoverButton.set(false)\"\n (focusin)=\"onTooltipButtonFocusIn()\"\n (focusout)=\"onTooltipButtonFocusOut()\"\n (keydown)=\"onButtonKeydown($event); onTooltipKeydown($event)\"\n >\n @if (iconTemplate(); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"childContext()\"\n />\n } @else {\n <svg\n class=\"time-zone-picker-icon\"\n viewBox=\"0 0 16 16\"\n width=\"1.05rem\"\n height=\"1.05rem\"\n aria-hidden=\"true\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.6\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M8 2.5a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zM8 5v3l2 1.5\" />\n </svg>\n }\n </lily-icon-button>\n\n <!-- Purely visual: the same text is already the button's aria-label,\n so it is not wired with aria-describedby (that would announce\n the name twice). -->\n <div\n class=\"time-zone-picker-tooltip\"\n role=\"tooltip\"\n [id]=\"tooltipId\"\n [attr.hidden]=\"tooltipVisible() ? null : ''\"\n (mouseenter)=\"hoverTooltip.set(true)\"\n (mouseleave)=\"hoverTooltip.set(false)\"\n >{{ label() }}</div>\n\n <lily-listbox\n #listEl\n [label]=\"label()\"\n baseClass=\"time-zone-picker-list\"\n [elementId]=\"listId\"\n navigation=\"active-descendant\"\n [clamp]=\"true\"\n [typeahead]=\"true\"\n [pageSize]=\"10\"\n [(activeIndex)]=\"activeIndex\"\n [hidden]=\"!open()\"\n (activate)=\"choose($event)\"\n (escape)=\"closeList()\"\n (tabOut)=\"onListTabOut()\"\n >\n @for (zone of infos(); track zone.id; let i = $index) {\n <li\n class=\"time-zone-picker-option\"\n [id]=\"optionId(i)\"\n role=\"option\"\n [attr.aria-selected]=\"zone.id === value()\"\n [attr.data-active]=\"i === activeIndex() ? '' : null\"\n [attr.data-offset]=\"zone.offset\"\n (click)=\"choose(i)\"\n >\n {{ zone.label }}\n </li>\n }\n </lily-listbox>\n </div>\n `,\n})\nexport class TimeZonePicker {\n readonly label = input.required<string>();\n /** BCP 47 tag the zone names are written in. Required: the picker never picks a language for you. */\n readonly locale = input.required<string>();\n /** IANA zone ids to offer. Default: DEFAULT_ZONES. Shown ordered by offset, not in this order. */\n readonly zones = input<readonly string[]>(DEFAULT_ZONES);\n /** The moment offsets and names are worked out for. Default: now, read once. */\n readonly date = input<Date | undefined>(undefined);\n /** Builds an option's text from its info. Default: `UTC+01:00 – Central European Standard Time`. */\n readonly labelFor = input<((zone: ZoneInfo) => string) | undefined>(undefined);\n /** Zone names by IANA id (one name, or `[standard, daylight]`), which win over `Intl`: from the locale-translations zone-name packs (CLDR) via `zoneNamesFrom()`. */\n readonly names = input<ZoneNames | undefined>(undefined);\n readonly value = model<string>(\"\");\n readonly defaultValue = input<string>(\"\");\n readonly storageKey = input<string>(\"\");\n readonly name = input<string>(\"time-zone\");\n readonly target = input<HTMLElement | null>(null);\n readonly className = input<string>(\"\");\n readonly zoneChange = output<string>();\n\n /** Projected icon template; replaces the default icon when supplied. */\n protected readonly iconTemplate = contentChild(TemplateRef);\n\n private readonly rootRef =\n viewChild.required<ElementRef<HTMLDivElement>>(\"rootEl\");\n // Angular resolves a template-ref-variable on a component tag to the\n // component INSTANCE by default (not its ElementRef) — exactly what's\n // needed to call the headless components' own public `focus()` methods.\n private readonly buttonRef = viewChild.required<IconButton>(\"buttonEl\");\n private readonly listRef = viewChild.required<Listbox>(\"listEl\");\n\n private readonly baseId = nextTimeZonePickerId();\n protected readonly listId = `${this.baseId}-list`;\n\n /** Is the popup open? Two-way bindable: `[(open)]`; `openChange` fires for each change. */\n readonly open = model<boolean>(false);\n /** Disables the button; an open popup closes. */\n readonly disabled = input<boolean>(false);\n private readonly closeWhenDisabled = effect(() => {\n if (this.disabled() && this.open()) this.open.set(false);\n });\n\n // Tooltip: shown while the pointer is over the button or the tooltip\n // itself (hoverable, WCAG 1.4.13) or while the button has keyboard\n // focus; Escape dismisses it without moving focus; never shown while\n // the popup is open, since the popup then explains the control.\n protected readonly tooltipId = `${this.baseId}-tooltip`;\n protected readonly hoverButton = signal(false);\n protected readonly hoverTooltip = signal(false);\n protected readonly focusButton = signal(false);\n protected readonly dismissed = signal(false);\n protected readonly tooltipVisible = computed(\n () =>\n !this.open() &&\n !this.dismissed() &&\n (this.hoverButton() || this.hoverTooltip() || this.focusButton()),\n );\n\n protected onTooltipButtonEnter(): void {\n this.hoverButton.set(true);\n this.dismissed.set(false);\n }\n\n protected onTooltipButtonFocusIn(): void {\n // Keyboard focus only: a mouse click also focuses the button in\n // Chromium, and the tooltip should not stick after a click.\n try {\n this.focusButton.set(\n this.buttonRef().element?.matches(\":focus-visible\") ?? false,\n );\n } catch {\n this.focusButton.set(true); // engine without :focus-visible — err towards showing\n }\n }\n\n protected onTooltipButtonFocusOut(): void {\n this.focusButton.set(false);\n this.dismissed.set(false);\n }\n\n protected onTooltipKeydown(event: KeyboardEvent): void {\n if (event.key === \"Escape\" && this.tooltipVisible()) this.dismissed.set(true);\n }\n\n // WCAG 1.4.13 \"dismissable\": while the tooltip is visible, Escape works\n // wherever focus is (hover-only tooltips have focus elsewhere). The\n // listener exists only while visible; the effect cleanup removes it on\n // hide and on destroy. No preventDefault/stopPropagation, focus untouched.\n private readonly tooltipEscapeListener = effect((onCleanup) => {\n if (!this.tooltipVisible() || typeof document === \"undefined\") return;\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === \"Escape\") this.dismissed.set(true);\n };\n document.addEventListener(\"keydown\", onKey);\n onCleanup(() => document.removeEventListener(\"keydown\", onKey));\n });\n protected readonly activeIndex = signal(-1);\n\n // The zones as the listbox shows them, ordered by offset. The date is read once when none is given: a picker\n // that re-sorted itself while open would move the option under the pointer.\n private readonly whenInitial = new Date();\n private readonly when = computed(() => this.date() ?? this.whenInitial);\n protected readonly infos = computed(() => orderedZones(this.zones(), this.locale(), this.when(), this.labelFor(), this.names()));\n protected readonly ids = computed(() => this.infos().map((z) => z.id));\n infoFor(zone: string): ZoneInfo | undefined {\n return zoneInfo(zone, this.locale(), this.when(), this.labelFor(), this.names());\n }\n\n protected readonly childContext = computed(() => {\n const args: ChildArgs = {\n value: this.value(),\n open: this.open(),\n infoFor: (zone: string) => this.infoFor(zone),\n };\n return { $implicit: args, ...args };\n });\n\n private initialised = false;\n\n constructor() {\n effect(() => {\n const current = this.value();\n\n if (!this.initialised) {\n this.initialised = true;\n let initial = current;\n\n const sk = this.storageKey();\n // A stored zone that is no longer offered is not restored.\n if (!initial && sk) {\n try {\n const stored =\n (typeof localStorage !== \"undefined\"\n ? localStorage.getItem(sk)\n : null) ?? \"\";\n if (this.ids().includes(stored)) initial = stored;\n } catch {\n // ignore privacy errors\n }\n }\n\n if (!initial) {\n const ids = this.ids();\n const dv = this.defaultValue();\n // The reader's own zone when it is listed (or has a listed twin), else UTC, else the first.\n initial =\n dv ||\n matchZone(systemZone(), this.infos(), this.locale(), this.when(), this.names()) ||\n (ids.includes(\"UTC\") ? \"UTC\" : ids[0]) ||\n \"\";\n }\n\n if (initial && initial !== current) {\n this.value.set(initial);\n return;\n }\n }\n\n if (current) this.applyZone(current);\n });\n }\n\n protected optionId(index: number): string {\n return `${this.baseId}-option-${index}`;\n }\n\n // ---------------------------------------------------------------\n // Open / close\n // ---------------------------------------------------------------\n\n /** Under zoneless change detection the signal write that un-hides the\n * list has not reached the DOM when a microtask runs, so focusing the\n * still-hidden list fails silently and Escape lands on the button.\n * Flushing detection first is the Angular equivalent of Svelte's\n * synchronous update (same fix the date-time-picker port recorded). */\n private readonly cdr = inject(ChangeDetectorRef);\n\n protected toggle(): void {\n if (this.open()) this.closeList();\n else this.openList();\n }\n\n /** Open the listbox, activating `startIndex` (default: the selection). */\n openList(startIndex?: number): void {\n const selected = this.ids().indexOf(this.value());\n // An empty list has no option to activate; -1 keeps\n // aria-activedescendant off rather than pointing at an id that\n // does not exist.\n this.activeIndex.set(\n this.ids().length === 0\n ? -1\n : (startIndex ?? (selected >= 0 ? selected : 0)),\n );\n this.open.set(true);\n // Focus moves to the listbox; the active option is conveyed via\n // aria-activedescendant, per the APG listbox pattern.\n this.cdr.detectChanges();\n queueMicrotask(() => {\n this.listRef().focus({ preventScroll: true });\n this.scrollActiveIntoView();\n });\n }\n\n /** Close the listbox; `refocus` returns focus to the button. */\n closeList(refocus = true): void {\n if (!this.open()) return;\n this.open.set(false);\n this.activeIndex.set(-1);\n if (refocus) queueMicrotask(() => this.buttonRef().focus({ preventScroll: true }));\n }\n\n protected choose(index: number): void {\n const slug = this.ids()[index];\n if (slug) this.value.set(slug);\n this.closeList();\n }\n\n private scrollActiveIntoView(): void {\n const i = this.activeIndex();\n if (i < 0) return;\n // getElementById rather than reaching into the composed Listbox's\n // DOM: Listbox exposes behaviour (focus()) and state (activeIndex),\n // not its rendered children, the same \"consumer owns the option\n // elements\" division of responsibility the headless component\n // documents for itself.\n const el = document.getElementById(this.optionId(i));\n // jsdom does not implement scrollIntoView; call it only if present.\n el?.scrollIntoView?.({ block: \"nearest\" });\n }\n\n // Arrow/Home/End/PageUp/PageDown/typeahead/Escape/Tab keyboard handling\n // inside the open list is owned by the composed `lily-listbox`'s\n // `navigation=\"active-descendant\"` mode (see\n // @lilydesignsystem/angular-headless); this component only decides\n // what open/close/choose/scroll mean, and keeps the highlighted option\n // in view whenever activeIndex changes.\n private readonly scrollOnActiveIndexChange = effect(() => {\n this.activeIndex();\n this.scrollActiveIntoView();\n });\n\n // ---------------------------------------------------------------\n // Keyboard\n // ---------------------------------------------------------------\n\n protected onButtonKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case \"ArrowDown\":\n case \"Enter\":\n case \" \":\n event.preventDefault();\n this.openList();\n break;\n case \"ArrowUp\":\n event.preventDefault();\n this.openList(this.ids().length - 1);\n break;\n }\n }\n\n /** `lily-listbox` Tab handling never prevents the key — focus goes to\n * the button FIRST so the browser's default Tab move computes from\n * the picker's position rather than from <body> (hiding the focused\n * list drops focus there, and the browser would otherwise compute the\n * default Tab move from the top of the document). */\n protected onListTabOut(): void {\n this.buttonRef().focus({ preventScroll: true });\n this.closeList(false);\n }\n\n protected onRootFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget as Node | null;\n if (next && this.rootRef().nativeElement.contains(next)) return;\n this.closeList(false);\n }\n\n protected onDocumentClick(event: Event): void {\n if (!this.open()) return;\n const t = event.target as Node | null;\n if (t && !this.rootRef().nativeElement.contains(t)) this.closeList(false);\n }\n\n // ---------------------------------------------------------------\n // Apply\n // ---------------------------------------------------------------\n\n private applyZone(slug: string): void {\n if (typeof document === \"undefined\" || !slug) return;\n (this.target() ?? document.documentElement).setAttribute(\n \"data-time-zone\",\n slug,\n );\n\n const sk = this.storageKey();\n if (sk) {\n try {\n localStorage.setItem(sk, slug);\n } catch {\n // ignore quota / privacy errors\n }\n }\n this.zoneChange.emit(slug);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lilydesignsystem-angular-time-zone-picker.mjs","names":[],"sources":["../../zones.ts","../../time-zone-picker.component.ts"],"sourcesContent":["// The zone logic of the time zone picker: offsets, names and order. Pure and framework-neutral; every name comes\n// from `Intl` in the caller's locale, so there is no English table here and no default locale.\n\n/**\n * A representative zone for each common UTC offset and name, as IANA ids: the ids are identifiers, not words. An\n * app that wants other zones passes its own list. Offsets and names are worked out for a date, so a zone that keeps\n * daylight saving time shows the offset and name in force on that date.\n */\nexport const DEFAULT_ZONES: readonly string[] = [\n \"Pacific/Pago_Pago\",\n \"Pacific/Honolulu\",\n \"Pacific/Marquesas\",\n \"America/Anchorage\",\n \"America/Los_Angeles\",\n \"America/Phoenix\",\n \"America/Denver\",\n \"America/Chicago\",\n \"America/Mexico_City\",\n \"America/New_York\",\n \"America/Bogota\",\n \"America/Halifax\",\n \"America/Caracas\",\n \"America/St_Johns\",\n \"America/Sao_Paulo\",\n \"America/Argentina/Buenos_Aires\",\n \"Atlantic/South_Georgia\",\n \"Atlantic/Azores\",\n \"UTC\",\n \"Africa/Abidjan\",\n \"Europe/London\",\n \"Europe/Lisbon\",\n \"Africa/Casablanca\",\n \"Africa/Lagos\",\n \"Europe/Paris\",\n \"Europe/Athens\",\n \"Africa/Cairo\",\n \"Africa/Maputo\",\n \"Africa/Johannesburg\",\n \"Europe/Moscow\",\n \"Africa/Nairobi\",\n \"Asia/Riyadh\",\n \"Asia/Tehran\",\n \"Asia/Dubai\",\n \"Asia/Kabul\",\n \"Asia/Karachi\",\n \"Asia/Kolkata\",\n \"Asia/Kathmandu\",\n \"Asia/Dhaka\",\n \"Asia/Yangon\",\n \"Asia/Bangkok\",\n \"Asia/Jakarta\",\n \"Asia/Shanghai\",\n \"Asia/Singapore\",\n \"Asia/Kuala_Lumpur\",\n \"Asia/Manila\",\n \"Asia/Makassar\",\n \"Australia/Perth\",\n \"Australia/Eucla\",\n \"Asia/Tokyo\",\n \"Asia/Seoul\",\n \"Asia/Jayapura\",\n \"Australia/Darwin\",\n \"Australia/Adelaide\",\n \"Australia/Brisbane\",\n \"Australia/Sydney\",\n \"Australia/Lord_Howe\",\n \"Pacific/Guadalcanal\",\n \"Pacific/Auckland\",\n \"Pacific/Fiji\",\n \"Pacific/Chatham\",\n \"Pacific/Tongatapu\",\n \"Pacific/Kiritimati\",\n];\n\n/** One zone as the picker shows it. */\nexport type ZoneInfo = {\n /** The IANA id, which is the picker's value (`Europe/Paris`). */\n id: string;\n /** Minutes east of UTC on the picker's date (`60`, `-330`). */\n offsetMinutes: number;\n /** The offset as text (`UTC+01:00`, `UTC-03:30`, `UTC+00:00`). */\n offset: string;\n /** The zone's full name in the locale (`Central European Standard Time`). */\n name: string;\n /** What the option shows: `UTC+01:00 – Central European Standard Time`. */\n label: string;\n};\n\n/**\n * Zone names supplied by the caller, by IANA id: one name all year, or `[standard, daylight]`. They win over `Intl`.\n * `zoneNamesFrom()` (in the locale-translations packages) builds one from a CLDR zone-name pack, so a name is the\n * same on every platform and in every runtime, whatever ICU data the browser or server happens to carry.\n */\nexport type ZoneNames = Readonly<Record<string, string | readonly [string, string]>>;\n\n// One formatter per zone, kept: building an `Intl.DateTimeFormat` is far slower than using one, and the picker asks for the same zones repeatedly.\nconst offsetFormatters = new Map<string, Intl.DateTimeFormat>();\n\n/** Minutes east of UTC for `zone` at `date`; `undefined` when the runtime does not know the zone. */\nexport function offsetMinutes(zone: string, date: Date): number | undefined {\n try {\n let f = offsetFormatters.get(zone);\n if (!f) {\n // `en-US` is used only to get numeric parts; no word from it is shown, so it is not a default locale.\n f = new Intl.DateTimeFormat(\"en-US\", {\n timeZone: zone,\n hourCycle: \"h23\",\n year: \"numeric\",\n month: \"numeric\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"numeric\",\n second: \"numeric\",\n });\n offsetFormatters.set(zone, f);\n }\n const p: Record<string, string> = {};\n for (const part of f.formatToParts(date)) p[part.type] = part.value;\n // The offset is not asked of `Intl` directly. Instead read the zone's wall-clock fields as if they were UTC: the difference from\n // the real instant is the offset, with daylight saving already in it.\n const wall = Date.UTC(\n Number(p[\"year\"]),\n Number(p[\"month\"]) - 1,\n Number(p[\"day\"]),\n Number(p[\"hour\"]),\n Number(p[\"minute\"]),\n Number(p[\"second\"]),\n );\n // The fields have whole-second resolution, so drop the instant's milliseconds before subtracting.\n const instant = Math.floor(date.getTime() / 1000) * 1000;\n return Math.round((wall - instant) / 60000);\n } catch {\n // `Intl` throws a RangeError for an id it does not know.\n return undefined;\n }\n}\n\n/**\n * Is daylight saving time in force in `zone` at `date`? True when its offset is above the lowest it has in that\n * year (compared at 1 January and 1 July), so a zone with no daylight time is never true.\n */\nexport function isDaylightTime(zone: string, date: Date): boolean {\n const now = offsetMinutes(zone, date);\n if (now === undefined) return false;\n // Compared against the year's lowest offset rather than \"July is summer\", so the southern hemisphere, where daylight time runs over\n // the new year, comes out right. Noon UTC keeps the sample day the same date in every zone.\n const year = date.getUTCFullYear();\n const jan = offsetMinutes(zone, new Date(Date.UTC(year, 0, 1, 12)));\n const jul = offsetMinutes(zone, new Date(Date.UTC(year, 6, 1, 12)));\n if (jan === undefined || jul === undefined) return false;\n return now > Math.min(jan, jul);\n}\n\n/** `330` → `UTC+05:30`, `-210` → `UTC-03:30`, `0` → `UTC+00:00`. ASCII, so it sorts and parses everywhere. */\nexport function formatOffset(minutes: number): string {\n // Zero is `+00:00`, never `-00:00`, and the sign comes before the digits so the text sorts and parses without locale rules.\n const sign = minutes < 0 ? \"-\" : \"+\";\n const abs = Math.abs(minutes);\n const hh = String(Math.floor(abs / 60)).padStart(2, \"0\");\n const mm = String(abs % 60).padStart(2, \"0\");\n return `UTC${sign}${hh}:${mm}`;\n}\n\n/**\n * The zone's full name in `locale` on `date`: the caller's `names` entry when it has one (the daylight name while\n * daylight time is in force), else `Intl`'s; `undefined` when neither has one.\n */\nexport function zoneName(\n zone: string,\n locale: string,\n date: Date,\n names?: ZoneNames,\n): string | undefined {\n // A supplied name wins over `Intl`: it is the same in every runtime, whatever ICU data the browser or server carries.\n const given = names?.[zone];\n if (typeof given === \"string\") return given;\n if (given) return isDaylightTime(zone, date) ? given[1] : given[0];\n try {\n // `Intl` has no \"just the zone name\" call, so format a date and pull out the part of type `timeZoneName`.\n const parts = new Intl.DateTimeFormat(locale, {\n timeZone: zone,\n timeZoneName: \"long\",\n }).formatToParts(date);\n return parts.find((p) => p.type === \"timeZoneName\")?.value;\n } catch {\n return undefined;\n }\n}\n\n/** What an option shows by default. */\nexport const defaultLabel = (zone: Pick<ZoneInfo, \"offset\" | \"name\">): string =>\n `${zone.offset} – ${zone.name}`;\n\n/** One zone's info, or `undefined` when the runtime does not know it. */\nexport function zoneInfo(\n zone: string,\n locale: string,\n date: Date,\n labelFor: (z: ZoneInfo) => string = defaultLabel,\n names?: ZoneNames,\n): ZoneInfo | undefined {\n const minutes = offsetMinutes(zone, date);\n if (minutes === undefined) return undefined;\n // A zone with no name in this language shows its IANA id rather than nothing.\n const name = zoneName(zone, locale, date, names) ?? zone;\n const info: ZoneInfo = {\n id: zone,\n offsetMinutes: minutes,\n offset: formatOffset(minutes),\n name,\n label: \"\",\n };\n // The label is made last, from the finished info, so a custom `labelFor` can use any field but `label`.\n info.label = labelFor(info);\n return info;\n}\n\n/**\n * The zones that exist, ordered by offset (west to east), then by name, then by id. A repeated id appears once;\n * an id the runtime does not know is left out rather than shown unnamed.\n */\nexport function orderedZones(\n zones: readonly string[],\n locale: string,\n date: Date,\n labelFor?: (z: ZoneInfo) => string,\n names?: ZoneNames,\n): ZoneInfo[] {\n const seen = new Set<string>();\n const out: ZoneInfo[] = [];\n for (const id of zones) {\n if (seen.has(id)) continue;\n seen.add(id);\n const info = zoneInfo(id, locale, date, labelFor, names);\n if (info) out.push(info);\n }\n // West to east; zones sharing an offset sort by name in the locale's own order, and the id breaks any remaining tie so the order is stable.\n const collator = new Intl.Collator(locale);\n return out.sort(\n (a, b) =>\n a.offsetMinutes - b.offsetMinutes ||\n collator.compare(a.name, b.name) ||\n (a.id < b.id ? -1 : a.id > b.id ? 1 : 0),\n );\n}\n\n/** The zone the browser is in, as an IANA id. `undefined` outside a browser or when it cannot be told. */\nexport function systemZone(): string | undefined {\n try {\n return new Intl.DateTimeFormat().resolvedOptions().timeZone || undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Which of `zones` stands for `system`: the zone itself when listed, else the listed zone with the same offset and\n * name (Europe/Berlin → Europe/Paris), else `undefined`.\n */\nexport function matchZone(\n system: string | undefined,\n zones: ZoneInfo[],\n locale: string,\n date: Date,\n names?: ZoneNames,\n): string | undefined {\n if (!system) return undefined;\n if (zones.some((z) => z.id === system)) return system;\n // An unlisted zone borrows a listed one only if both offset and name agree (Berlin keeps time with Paris), so the picker never\n // selects a zone that would show different time or a different name.\n const info = zoneInfo(system, locale, date, undefined, names);\n if (!info) return undefined;\n return zones.find((z) => z.offsetMinutes === info.offsetMinutes && z.name === info.name)?.id;\n}\n","import { NgTemplateOutlet } from \"@angular/common\";\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n computed,\n contentChild,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n model,\n output,\n signal,\n TemplateRef,\n viewChild,\n} from \"@angular/core\";\nimport { IconButton, Listbox } from \"@lilydesignsystem/angular-headless\";\nimport {\n DEFAULT_ZONES,\n matchZone,\n orderedZones,\n systemZone,\n zoneInfo,\n type ZoneInfo,\n type ZoneNames,\n} from \"./zones.js\";\n\nexport { DEFAULT_ZONES };\nexport type { ZoneInfo, ZoneNames };\n\n/** Context passed to a custom icon `<ng-template>` (the button icon). */\nexport type ChildArgs = {\n /** Currently selected zone, an IANA id. */\n value: string;\n /** Is the listbox open? */\n open: boolean;\n /** Offset, name and label of any zone. */\n infoFor: (zone: string) => ZoneInfo | undefined;\n};\n\nlet uid = 0;\n/** Stable per-instance id prefix; SSR-safe (no Math.random / Date.now). */\nexport function nextTimeZonePickerId(): string {\n uid += 1;\n return `time-zone-picker-${uid}`;\n}\n\n/**\n * Optional marker for the projected icon template. Gives consumers typed\n * `let-` variables:\n *\n * ```html\n * <lily-time-zone-picker ...>\n * <ng-template lilyTimeZonePickerIcon let-args>{{ args.infoFor(args.value)?.offset }}</ng-template>\n * </lily-time-zone-picker>\n * ```\n *\n * The component queries any projected `<ng-template>`, so the marker is\n * for type-checking and readability, not for matching.\n */\n@Directive({\n selector: \"ng-template[lilyTimeZonePickerIcon]\",\n standalone: true,\n})\nexport class TimeZonePickerIcon {\n static ngTemplateContextGuard(\n _dir: TimeZonePickerIcon,\n _ctx: unknown,\n ): _ctx is ChildArgs & { $implicit: ChildArgs } {\n return true;\n }\n}\n\n/**\n * TimeZonePicker — `data-time-zone` time-zone picker.\n *\n * Renders an icon button that opens a WAI-ARIA APG listbox of time zones. On\n * every change the component sets `data-time-zone=\"{IANA id}\"` on the\n * document root (or on a consumer-supplied target), with optional\n * `localStorage` persistence. Ships no CSS; the consumer maps each\n * `[data-time-zone=\"…\"]` slug to real typography. See `spec/index.md`\n * for the full contract.\n */\n@Component({\n selector: \"lily-time-zone-picker\",\n standalone: true,\n imports: [NgTemplateOutlet, IconButton, Listbox],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n \"(document:click)\": \"onDocumentClick($event)\",\n },\n template: `\n <div\n #rootEl\n class=\"time-zone-picker {{ className() }}\"\n (focusout)=\"onRootFocusOut($event)\"\n >\n <input type=\"hidden\" [name]=\"name()\" [value]=\"value()\" />\n\n <lily-icon-button\n [disabled]=\"disabled()\"\n #buttonEl\n [label]=\"label()\"\n baseClass=\"time-zone-picker-button\"\n ariaHaspopup=\"listbox\"\n [ariaExpanded]=\"open()\"\n [ariaControls]=\"listId\"\n (click)=\"toggle(); hoverButton.set(false)\"\n (mouseenter)=\"onTooltipButtonEnter()\"\n (mouseleave)=\"hoverButton.set(false)\"\n (focusin)=\"onTooltipButtonFocusIn()\"\n (focusout)=\"onTooltipButtonFocusOut()\"\n (keydown)=\"onButtonKeydown($event); onTooltipKeydown($event)\"\n >\n @if (iconTemplate(); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"childContext()\"\n />\n } @else {\n <svg\n class=\"time-zone-picker-icon\"\n viewBox=\"0 0 16 16\"\n width=\"1.05rem\"\n height=\"1.05rem\"\n aria-hidden=\"true\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.6\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M8 2.5a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zM8 5v3l2 1.5\" />\n </svg>\n }\n </lily-icon-button>\n\n <!-- Purely visual: the same text is already the button's aria-label,\n so it is not wired with aria-describedby (that would announce\n the name twice). -->\n <div\n class=\"time-zone-picker-tooltip\"\n role=\"tooltip\"\n [id]=\"tooltipId\"\n [attr.hidden]=\"tooltipVisible() ? null : ''\"\n (mouseenter)=\"hoverTooltip.set(true)\"\n (mouseleave)=\"hoverTooltip.set(false)\"\n >{{ label() }}</div>\n\n <lily-listbox\n #listEl\n [label]=\"label()\"\n baseClass=\"time-zone-picker-list\"\n [elementId]=\"listId\"\n navigation=\"active-descendant\"\n [clamp]=\"true\"\n [typeahead]=\"true\"\n [pageSize]=\"10\"\n [(activeIndex)]=\"activeIndex\"\n [hidden]=\"!open()\"\n (activate)=\"choose($event)\"\n (escape)=\"closeList()\"\n (tabOut)=\"onListTabOut()\"\n >\n @for (zone of infos(); track zone.id; let i = $index) {\n <li\n class=\"time-zone-picker-option\"\n [id]=\"optionId(i)\"\n role=\"option\"\n [attr.aria-selected]=\"zone.id === value()\"\n [attr.data-active]=\"i === activeIndex() ? '' : null\"\n [attr.data-offset]=\"zone.offset\"\n (click)=\"choose(i)\"\n >\n {{ zone.label }}\n </li>\n }\n </lily-listbox>\n </div>\n `,\n})\nexport class TimeZonePicker {\n readonly label = input.required<string>();\n /** BCP 47 tag the zone names are written in. Required: the picker never picks a language for you. */\n readonly locale = input.required<string>();\n /** IANA zone ids to offer. Default: DEFAULT_ZONES. Shown ordered by offset, not in this order. */\n readonly zones = input<readonly string[]>(DEFAULT_ZONES);\n /** The moment offsets and names are worked out for. Default: now, read once. */\n readonly date = input<Date | undefined>(undefined);\n /** Builds an option's text from its info. Default: `UTC+01:00 – Central European Standard Time`. */\n readonly labelFor = input<((zone: ZoneInfo) => string) | undefined>(undefined);\n /** Zone names by IANA id (one name, or `[standard, daylight]`), which win over `Intl`: from the locale-translations zone-name packs (CLDR) via `zoneNamesFrom()`. */\n readonly names = input<ZoneNames | undefined>(undefined);\n readonly value = model<string>(\"\");\n readonly defaultValue = input<string>(\"\");\n readonly storageKey = input<string>(\"\");\n readonly name = input<string>(\"time-zone\");\n readonly target = input<HTMLElement | null>(null);\n readonly className = input<string>(\"\");\n readonly zoneChange = output<string>();\n\n /** Projected icon template; replaces the default icon when supplied. */\n protected readonly iconTemplate = contentChild(TemplateRef);\n\n private readonly rootRef = viewChild.required<ElementRef<HTMLDivElement>>(\"rootEl\");\n // Angular resolves a template-ref-variable on a component tag to the\n // component INSTANCE by default (not its ElementRef) — exactly what's\n // needed to call the headless components' own public `focus()` methods.\n private readonly buttonRef = viewChild.required<IconButton>(\"buttonEl\");\n private readonly listRef = viewChild.required<Listbox>(\"listEl\");\n\n private readonly baseId = nextTimeZonePickerId();\n protected readonly listId = `${this.baseId}-list`;\n\n /** Is the popup open? Two-way bindable: `[(open)]`; `openChange` fires for each change. */\n readonly open = model<boolean>(false);\n /** Disables the button; an open popup closes. */\n readonly disabled = input<boolean>(false);\n private readonly closeWhenDisabled = effect(() => {\n if (this.disabled() && this.open()) this.open.set(false);\n });\n\n // Tooltip: shown while the pointer is over the button or the tooltip\n // itself (hoverable, WCAG 1.4.13) or while the button has keyboard\n // focus; Escape dismisses it without moving focus; never shown while\n // the popup is open, since the popup then explains the control.\n protected readonly tooltipId = `${this.baseId}-tooltip`;\n protected readonly hoverButton = signal(false);\n protected readonly hoverTooltip = signal(false);\n protected readonly focusButton = signal(false);\n protected readonly dismissed = signal(false);\n protected readonly tooltipVisible = computed(\n () =>\n !this.open() &&\n !this.dismissed() &&\n (this.hoverButton() || this.hoverTooltip() || this.focusButton()),\n );\n\n protected onTooltipButtonEnter(): void {\n this.hoverButton.set(true);\n this.dismissed.set(false);\n }\n\n protected onTooltipButtonFocusIn(): void {\n // Keyboard focus only: a mouse click also focuses the button in\n // Chromium, and the tooltip should not stick after a click.\n try {\n this.focusButton.set(this.buttonRef().element?.matches(\":focus-visible\") ?? false);\n } catch {\n this.focusButton.set(true); // engine without :focus-visible — err towards showing\n }\n }\n\n protected onTooltipButtonFocusOut(): void {\n this.focusButton.set(false);\n this.dismissed.set(false);\n }\n\n protected onTooltipKeydown(event: KeyboardEvent): void {\n if (event.key === \"Escape\" && this.tooltipVisible()) this.dismissed.set(true);\n }\n\n // WCAG 1.4.13 \"dismissable\": while the tooltip is visible, Escape works\n // wherever focus is (hover-only tooltips have focus elsewhere). The\n // listener exists only while visible; the effect cleanup removes it on\n // hide and on destroy. No preventDefault/stopPropagation, focus untouched.\n private readonly tooltipEscapeListener = effect((onCleanup) => {\n if (!this.tooltipVisible() || typeof document === \"undefined\") return;\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === \"Escape\") this.dismissed.set(true);\n };\n document.addEventListener(\"keydown\", onKey);\n onCleanup(() => document.removeEventListener(\"keydown\", onKey));\n });\n protected readonly activeIndex = signal(-1);\n\n // The zones as the listbox shows them, ordered by offset. The date is read once when none is given: a picker\n // that re-sorted itself while open would move the option under the pointer.\n private readonly whenInitial = new Date();\n private readonly when = computed(() => this.date() ?? this.whenInitial);\n protected readonly infos = computed(() =>\n orderedZones(this.zones(), this.locale(), this.when(), this.labelFor(), this.names()),\n );\n protected readonly ids = computed(() => this.infos().map((z) => z.id));\n infoFor(zone: string): ZoneInfo | undefined {\n return zoneInfo(zone, this.locale(), this.when(), this.labelFor(), this.names());\n }\n\n protected readonly childContext = computed(() => {\n const args: ChildArgs = {\n value: this.value(),\n open: this.open(),\n infoFor: (zone: string) => this.infoFor(zone),\n };\n return { $implicit: args, ...args };\n });\n\n private initialised = false;\n\n constructor() {\n effect(() => {\n const current = this.value();\n\n if (!this.initialised) {\n this.initialised = true;\n let initial = current;\n\n const sk = this.storageKey();\n // A stored zone that is no longer offered is not restored.\n if (!initial && sk) {\n try {\n const stored =\n (typeof localStorage !== \"undefined\"\n ? localStorage.getItem(sk)\n : null) ?? \"\";\n if (this.ids().includes(stored)) initial = stored;\n } catch {\n // ignore privacy errors\n }\n }\n\n if (!initial) {\n const ids = this.ids();\n const dv = this.defaultValue();\n // The reader's own zone when it is listed (or has a listed twin), else UTC, else the first.\n initial =\n dv ||\n matchZone(\n systemZone(),\n this.infos(),\n this.locale(),\n this.when(),\n this.names(),\n ) ||\n (ids.includes(\"UTC\") ? \"UTC\" : ids[0]) ||\n \"\";\n }\n\n if (initial && initial !== current) {\n this.value.set(initial);\n return;\n }\n }\n\n if (current) this.applyZone(current);\n });\n }\n\n protected optionId(index: number): string {\n return `${this.baseId}-option-${index}`;\n }\n\n // ---------------------------------------------------------------\n // Open / close\n // ---------------------------------------------------------------\n\n /** Under zoneless change detection the signal write that un-hides the\n * list has not reached the DOM when a microtask runs, so focusing the\n * still-hidden list fails silently and Escape lands on the button.\n * Flushing detection first is the Angular equivalent of Svelte's\n * synchronous update (same fix the date-time-picker port recorded). */\n private readonly cdr = inject(ChangeDetectorRef);\n\n protected toggle(): void {\n if (this.open()) this.closeList();\n else this.openList();\n }\n\n /** Open the listbox, activating `startIndex` (default: the selection). */\n openList(startIndex?: number): void {\n const selected = this.ids().indexOf(this.value());\n // An empty list has no option to activate; -1 keeps\n // aria-activedescendant off rather than pointing at an id that\n // does not exist.\n this.activeIndex.set(\n this.ids().length === 0 ? -1 : (startIndex ?? (selected >= 0 ? selected : 0)),\n );\n this.open.set(true);\n // Focus moves to the listbox; the active option is conveyed via\n // aria-activedescendant, per the APG listbox pattern.\n this.cdr.detectChanges();\n queueMicrotask(() => {\n this.listRef().focus({ preventScroll: true });\n this.scrollActiveIntoView();\n });\n }\n\n /** Close the listbox; `refocus` returns focus to the button. */\n closeList(refocus = true): void {\n if (!this.open()) return;\n this.open.set(false);\n this.activeIndex.set(-1);\n if (refocus) queueMicrotask(() => this.buttonRef().focus({ preventScroll: true }));\n }\n\n protected choose(index: number): void {\n const slug = this.ids()[index];\n if (slug) this.value.set(slug);\n this.closeList();\n }\n\n private scrollActiveIntoView(): void {\n const i = this.activeIndex();\n if (i < 0) return;\n // getElementById rather than reaching into the composed Listbox's\n // DOM: Listbox exposes behaviour (focus()) and state (activeIndex),\n // not its rendered children, the same \"consumer owns the option\n // elements\" division of responsibility the headless component\n // documents for itself.\n const el = document.getElementById(this.optionId(i));\n // jsdom does not implement scrollIntoView; call it only if present.\n el?.scrollIntoView?.({ block: \"nearest\" });\n }\n\n // Arrow/Home/End/PageUp/PageDown/typeahead/Escape/Tab keyboard handling\n // inside the open list is owned by the composed `lily-listbox`'s\n // `navigation=\"active-descendant\"` mode (see\n // @lilydesignsystem/angular-headless); this component only decides\n // what open/close/choose/scroll mean, and keeps the highlighted option\n // in view whenever activeIndex changes.\n private readonly scrollOnActiveIndexChange = effect(() => {\n this.activeIndex();\n this.scrollActiveIntoView();\n });\n\n // ---------------------------------------------------------------\n // Keyboard\n // ---------------------------------------------------------------\n\n protected onButtonKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case \"ArrowDown\":\n case \"Enter\":\n case \" \":\n event.preventDefault();\n this.openList();\n break;\n case \"ArrowUp\":\n event.preventDefault();\n this.openList(this.ids().length - 1);\n break;\n }\n }\n\n /** `lily-listbox` Tab handling never prevents the key — focus goes to\n * the button FIRST so the browser's default Tab move computes from\n * the picker's position rather than from <body> (hiding the focused\n * list drops focus there, and the browser would otherwise compute the\n * default Tab move from the top of the document). */\n protected onListTabOut(): void {\n this.buttonRef().focus({ preventScroll: true });\n this.closeList(false);\n }\n\n protected onRootFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget as Node | null;\n if (next && this.rootRef().nativeElement.contains(next)) return;\n this.closeList(false);\n }\n\n protected onDocumentClick(event: Event): void {\n if (!this.open()) return;\n const t = event.target as Node | null;\n if (t && !this.rootRef().nativeElement.contains(t)) this.closeList(false);\n }\n\n // ---------------------------------------------------------------\n // Apply\n // ---------------------------------------------------------------\n\n private applyZone(slug: string): void {\n if (typeof document === \"undefined\" || !slug) return;\n (this.target() ?? document.documentElement).setAttribute(\"data-time-zone\", slug);\n\n const sk = this.storageKey();\n if (sk) {\n try {\n localStorage.setItem(sk, slug);\n } catch {\n // ignore quota / privacy errors\n }\n }\n this.zoneChange.emit(slug);\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lilydesignsystem/angular-time-zone-picker",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"engines": {
|
|
5
5
|
"node": ">=26"
|
|
6
6
|
},
|
|
7
7
|
"description": "Lily Design System Angular 20 time zone picker: an icon button opening an APG listbox that sets data-time-zone on the document. Headless, SSR-safe, no CSS.",
|
|
8
8
|
"dependencies": {
|
|
9
|
-
"@lilydesignsystem/angular-headless": "^0.
|
|
9
|
+
"@lilydesignsystem/angular-headless": "^0.8.0",
|
|
10
10
|
"tslib": "^2.3.0"
|
|
11
11
|
},
|
|
12
12
|
"peerDependencies": {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lilydesignsystem-angular-time-zone-picker.d.ts","names":[],"sources":["../../zones.ts","../../time-zone-picker.component.ts"],"mappings":";;;;;;;qBAQa;;
|
|
1
|
+
{"version":3,"file":"lilydesignsystem-angular-time-zone-picker.d.ts","names":[],"sources":["../../zones.ts","../../time-zone-picker.component.ts"],"mappings":";;;;;;;qBAQa;;KAmED;;EAER;;EAEA;;EAEA;;EAEA;;EAEA;;;;;;;KAQQ,YAAY,SAAS;;wBAMjB,cAAc,cAAc,MAAM;;wBAuDlC,aAAa;;;;;wBAab,SACZ,cACA,gBACA,MAAM,MACN,QAAQ;;qBAmBC,eAAgB,MAAM,KAAK;;wBAIxB,SACZ,cACA,gBACA,MAAM,MACN,YAAW,GAAG,qBACd,QAAQ,YACT;;;;;wBAqBa,aACZ,0BACA,gBACA,MAAM,MACN,YAAY,GAAG,qBACf,QAAQ,YACT;;wBAoBa;;;;;wBAYA,UACZ,4BACA,OAAO,YACP,gBACA,MAAM,MACN,QAAQ;;KCvOA;;EAER;;EAEA;;EAEA,UAAU,iBAAiB;;;wBAKf;;;;;;;;;;;;;;qBAsBH;SACF,uBACH,MAAM,oBACN,gBACD,QAAQ;IAAc,WAAW;;SAJ3B,MAAA,GAAA,qBAAA;SAAA,MAAA,GAAA,uBAAA;;;;;;;;;;;;qBAqHA;WACA,6CAAK;;WAEL,8CAAM;;WAEN,6CAAK;;WAEL,4CAAI,YAAA;;WAEJ,gDAAQ,cAAA,MAAiB;;WAEzB,6CAAK,YAAA,SAAA;WACL,6CAAK;WACL,oDAAY;WACZ,kDAAU;WACV,4CAAI;WACJ,8CAAM,YAAA;WACN,iDAAS;WACT,wDAAU;;qBAGA,mFAAY,OAAA;mBAEd;mBAIA;mBACA;mBAEA;qBACE;;WAGV,4CAAI;;WAEJ,gDAAQ;mBACA;qBAQE;qBACA,kFAAW;qBACX,mFAAY;qBACZ,kFAAW;qBACX,gFAAS;qBACT,qFAAc;YAOvB;YAKA;YAUA;YAKA,iBAAiB,OAAO;mBAQjB;qBAQE,kFAAW;mBAIb;mBACA;qBACE,4EAAK,OAAA;qBAGL,0EAAG;EACtB,QAAQ,eAAe;qBAIJ,mFAAY;;IA/PxB;;IAED;;IAEG,UAAC,iBAAiB;;;UAoQnB;;YAmDE,SAAS;;;;;;mBAaF;YAEP;;EAMV,SAAS;;EAmBT,UAAU;YAOA,OAAO;UAMT;mBAmBS;YASP,gBAAgB,OAAO;;;;;;YAoBvB;YAKA,eAAe,OAAO;YAMtB,gBAAgB,OAAO;UAUzB;SAjSC,MAAA,GAAA,qBAAA;SAAA,MAAA,GAAA,uBAAA;IAAc;MAAA;MAAA;MAAA;;IAAA;MAAA;MAAA;MAAA;;IAAA;MAAA;MAAA;MAAA;;IAAA;MAAA;MAAA;MAAA;;IAAA;MAAA;MAAA;MAAA;;IAAA;MAAA;MAAA;MAAA;;IAAA;MAAA;MAAA;MAAA;;IAAA;MAAA;MAAA;MAAA;;IAAA;MAAA;MAAA;MAAA;;IAAA;MAAA;MAAA;MAAA;;IAAA;MAAA;MAAA;MAAA;;IAAA;MAAA;MAAA;MAAA;;IAAA;MAAA;MAAA;MAAA;;IAAA;MAAA;MAAA;MAAA;;;IAAA;IAAA;IAAA"}
|