diff --git a/ts_web/elements/dees-input-datepicker.demo.ts b/ts_web/elements/dees-input-datepicker.demo.ts index c511818..857bcc7 100644 --- a/ts_web/elements/dees-input-datepicker.demo.ts +++ b/ts_web/elements/dees-input-datepicker.demo.ts @@ -97,6 +97,43 @@ export const demoFunc = () => html` + { + // Demonstrate timezone functionality + const timezonePickers = elementArg.querySelectorAll('dees-input-datepicker'); + + timezonePickers.forEach((picker) => { + picker.addEventListener('change', (event: CustomEvent) => { + const target = event.target as DeesInputDatepicker; + console.log(`${target.label} value:`, target.value); + const input = target.shadowRoot?.querySelector('.date-input') as HTMLInputElement; + if (input) { + console.log(`${target.label} formatted:`, input.value); + } + }); + }); + }}> + + + + + + + { // Demonstrate date constraints const futureDatePicker = elementArg.querySelector('dees-input-datepicker'); diff --git a/ts_web/elements/dees-input-datepicker.ts b/ts_web/elements/dees-input-datepicker.ts index 22a74b3..4158163 100644 --- a/ts_web/elements/dees-input-datepicker.ts +++ b/ts_web/elements/dees-input-datepicker.ts @@ -52,6 +52,12 @@ export class DeesInputDatepicker extends DeesInputBase { @property({ type: String }) public placeholder: string = 'YYYY-MM-DD'; + @property({ type: Boolean }) + public enableTimezone: boolean = false; + + @property({ type: String }) + public timezone: string = Intl.DateTimeFormat().resolvedOptions().timeZone; + @state() private isOpened: boolean = false; @@ -114,7 +120,8 @@ export class DeesInputDatepicker extends DeesInputBase { border-color: ${cssManager.bdTheme('hsl(222.2 47.4% 11.2%)', 'hsl(210 20% 98%)')}; outline: 2px solid transparent; outline-offset: 2px; - box-shadow: 0 0 0 2px ${cssManager.bdTheme('hsl(0 0% 100%)', 'hsl(224 71.4% 4.1%)')}, 0 0 0 4px ${cssManager.bdTheme('hsl(222.2 47.4% 11.2% / 0.1)', 'hsl(210 20% 98% / 0.1)')}; + box-shadow: 0 0 0 2px ${cssManager.bdTheme('hsl(0 0% 100%)', 'hsl(224 71.4% 4.1%)')}, + 0 0 0 4px ${cssManager.bdTheme('hsl(222.2 47.4% 11.2% / 0.1)', 'hsl(210 20% 98% / 0.1)')}; } .date-input:disabled { @@ -451,9 +458,71 @@ export class DeesInputDatepicker extends DeesInputBase { .clear-button:active { background: ${cssManager.bdTheme('hsl(0 72.2% 50.6% / 0.2)', 'hsl(0 62.8% 30.6% / 0.2)')}; } + + /* Timezone selector */ + .timezone-selector { + margin-top: 12px; + padding-top: 12px; + border-top: 1px solid ${cssManager.bdTheme('hsl(214.3 31.8% 91.4%)', 'hsl(217.2 32.6% 17.5%)')}; + } + + .timezone-selector-title { + font-size: 12px; + font-weight: 500; + margin-bottom: 8px; + color: ${cssManager.bdTheme('hsl(220 8.9% 46.1%)', 'hsl(215 20.2% 65.1%)')}; + } + + .timezone-select { + width: 100%; + height: 36px; + border: 1px solid ${cssManager.bdTheme('hsl(214.3 31.8% 91.4%)', 'hsl(217.2 32.6% 17.5%)')}; + border-radius: 6px; + padding: 0 12px; + font-size: 14px; + background: ${cssManager.bdTheme('hsl(0 0% 100%)', 'hsl(224 71.4% 4.1%)')}; + color: ${cssManager.bdTheme('hsl(224 71.4% 4.1%)', 'hsl(210 20% 98%)')}; + cursor: pointer; + transition: all 0.2s ease; + } + + .timezone-select:hover { + border-color: ${cssManager.bdTheme('hsl(214.3 31.8% 91.4%)', 'hsl(217.2 32.6% 17.5%)')}; + background: ${cssManager.bdTheme('hsl(210 20% 98%)', 'hsl(215 27.9% 16.9%)')}; + } + + .timezone-select:focus { + outline: none; + border-color: ${cssManager.bdTheme('hsl(222.2 47.4% 11.2%)', 'hsl(210 20% 98%)')}; + box-shadow: 0 0 0 2px ${cssManager.bdTheme('hsl(222.2 47.4% 11.2% / 0.1)', 'hsl(210 20% 98% / 0.1)')}; + } `, ]; + private getTimezones(): { value: string; label: string }[] { + // Common timezones with their display names + return [ + { value: 'UTC', label: 'UTC (Coordinated Universal Time)' }, + { value: 'America/New_York', label: 'Eastern Time (US & Canada)' }, + { value: 'America/Chicago', label: 'Central Time (US & Canada)' }, + { value: 'America/Denver', label: 'Mountain Time (US & Canada)' }, + { value: 'America/Los_Angeles', label: 'Pacific Time (US & Canada)' }, + { value: 'America/Phoenix', label: 'Arizona' }, + { value: 'America/Anchorage', label: 'Alaska' }, + { value: 'Pacific/Honolulu', label: 'Hawaii' }, + { value: 'Europe/London', label: 'London' }, + { value: 'Europe/Paris', label: 'Paris' }, + { value: 'Europe/Berlin', label: 'Berlin' }, + { value: 'Europe/Moscow', label: 'Moscow' }, + { value: 'Asia/Dubai', label: 'Dubai' }, + { value: 'Asia/Kolkata', label: 'India Standard Time' }, + { value: 'Asia/Shanghai', label: 'China Standard Time' }, + { value: 'Asia/Tokyo', label: 'Tokyo' }, + { value: 'Australia/Sydney', label: 'Sydney' }, + { value: 'Pacific/Auckland', label: 'Auckland' }, + ]; + } + render(): TemplateResult { const monthNames = [ 'January', 'February', 'March', 'April', 'May', 'June', @@ -466,6 +535,7 @@ export class DeesInputDatepicker extends DeesInputBase { const days = this.getDaysInMonth(); const isAM = this.selectedHour < 12; + const timezones = this.getTimezones(); return html`
@@ -576,6 +646,24 @@ export class DeesInputDatepicker extends DeesInputBase {
` : ''} + + ${this.enableTimezone ? html` +
+
Timezone
+ +
+ ` : ''} +