Summary
Add field.timezone(label) — a specialized select with a curated IANA timezone list, current-offset display, city grouping, and a "use my timezone" button.
Why this would help
- Scheduling, calendar settings, profile preferences, automation triggers.
- Every app reimplements the timezone list; having one canonical, opinionated list shipped with runilib avoids the drift between projects.
- Live offset display ("Europe/Paris · UTC+02:00") makes selection less ambiguous.
Proposed API
field.timezone('Timezone')
.format('iana') // 'iana' | 'offset'
.preferred(['Europe/Paris', 'America/New_York'])
.useMyTimezoneButton(true);
Suggested implementation areas
src/core/field-descriptors/timezone/TimezoneFieldBuilder.ts (new) — built on top of SelectFieldBuilder
src/core/field-descriptors/timezone/data.ts — curated IANA list (ship a sensible subset)
src/core/field-descriptors/field.ts
src/renderers/web/ — offset live-computed via Intl.DateTimeFormat
src/renderers/native/ — same behavior, native picker styling
Acceptance Criteria
Summary
Add
field.timezone(label)— a specialized select with a curated IANA timezone list, current-offset display, city grouping, and a "use my timezone" button.Why this would help
Proposed API
Suggested implementation areas
src/core/field-descriptors/timezone/TimezoneFieldBuilder.ts(new) — built on top ofSelectFieldBuildersrc/core/field-descriptors/timezone/data.ts— curated IANA list (ship a sensible subset)src/core/field-descriptors/field.tssrc/renderers/web/— offset live-computed viaIntl.DateTimeFormatsrc/renderers/native/— same behavior, native picker stylingAcceptance Criteria
field.timezone()returns IANA strings ('Europe/Paris') by defaultformat('offset')returns'UTC+02:00'-style valuesIntlreflects DST correctlyIntl.DateTimeFormat().resolvedOptions().timeZone