@api-client/ui 0.5.5 → 0.5.7
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/.cursor/rules/html-and-css-best-practices.mdc +63 -0
- package/.cursor/rules/lit-best-practices.mdc +78 -0
- package/.github/instructions/html-and-css-best-practices.instructions.md +70 -0
- package/.github/instructions/lit-best-practices.instructions.md +86 -0
- package/build/src/elements/currency/currency-picker.d.ts +10 -0
- package/build/src/elements/currency/currency-picker.d.ts.map +1 -0
- package/build/src/elements/currency/currency-picker.js +27 -0
- package/build/src/elements/currency/currency-picker.js.map +1 -0
- package/build/src/elements/currency/internals/Picker.d.ts +311 -0
- package/build/src/elements/currency/internals/Picker.d.ts.map +1 -0
- package/build/src/elements/currency/internals/Picker.js +857 -0
- package/build/src/elements/currency/internals/Picker.js.map +1 -0
- package/build/src/elements/currency/internals/Picker.styles.d.ts +3 -0
- package/build/src/elements/currency/internals/Picker.styles.d.ts.map +1 -0
- package/build/src/elements/currency/internals/Picker.styles.js +58 -0
- package/build/src/elements/currency/internals/Picker.styles.js.map +1 -0
- package/build/src/elements/highlight/MarkdownStyles.d.ts.map +1 -1
- package/build/src/elements/highlight/MarkdownStyles.js +0 -13
- package/build/src/elements/highlight/MarkdownStyles.js.map +1 -1
- package/build/src/elements/http/BodyEditor.d.ts +0 -13
- package/build/src/elements/http/BodyEditor.d.ts.map +1 -1
- package/build/src/elements/http/BodyEditor.js +0 -13
- package/build/src/elements/http/BodyEditor.js.map +1 -1
- package/build/src/elements/http/BodyTextEditor.d.ts +0 -13
- package/build/src/elements/http/BodyTextEditor.d.ts.map +1 -1
- package/build/src/elements/http/BodyTextEditor.js +0 -13
- package/build/src/elements/http/BodyTextEditor.js.map +1 -1
- package/build/src/elements/http/BodyUrlEncodedEditor.d.ts +0 -13
- package/build/src/elements/http/BodyUrlEncodedEditor.d.ts.map +1 -1
- package/build/src/elements/http/BodyUrlEncodedEditor.js +0 -13
- package/build/src/elements/http/BodyUrlEncodedEditor.js.map +1 -1
- package/build/src/elements/http/UrlInput.d.ts +0 -13
- package/build/src/elements/http/UrlInput.d.ts.map +1 -1
- package/build/src/elements/http/UrlInput.js +0 -13
- package/build/src/elements/http/UrlInput.js.map +1 -1
- package/build/src/index.d.ts +2 -0
- package/build/src/index.d.ts.map +1 -1
- package/build/src/index.js +2 -0
- package/build/src/index.js.map +1 -1
- package/build/src/md/button/internals/base.d.ts +1 -0
- package/build/src/md/button/internals/base.d.ts.map +1 -1
- package/build/src/md/button/internals/base.js +7 -0
- package/build/src/md/button/internals/base.js.map +1 -1
- package/build/src/md/button/internals/button.styles.js +1 -1
- package/build/src/md/button/internals/button.styles.js.map +1 -1
- package/build/src/md/date/internals/DateTime.d.ts +0 -13
- package/build/src/md/date/internals/DateTime.d.ts.map +1 -1
- package/build/src/md/date/internals/DateTime.js +0 -13
- package/build/src/md/date/internals/DateTime.js.map +1 -1
- package/build/src/md/date-picker/index.d.ts +13 -0
- package/build/src/md/date-picker/index.d.ts.map +1 -0
- package/build/src/md/date-picker/index.js +13 -0
- package/build/src/md/date-picker/index.js.map +1 -0
- package/build/src/md/date-picker/internals/DatePicker.styles.d.ts +4 -0
- package/build/src/md/date-picker/internals/DatePicker.styles.d.ts.map +1 -0
- package/build/src/md/date-picker/internals/DatePicker.styles.js +409 -0
- package/build/src/md/date-picker/internals/DatePicker.styles.js.map +1 -0
- package/build/src/md/date-picker/internals/DatePickerCalendar.d.ts +272 -0
- package/build/src/md/date-picker/internals/DatePickerCalendar.d.ts.map +1 -0
- package/build/src/md/date-picker/internals/DatePickerCalendar.js +1062 -0
- package/build/src/md/date-picker/internals/DatePickerCalendar.js.map +1 -0
- package/build/src/md/date-picker/internals/DatePickerUtils.d.ts +93 -0
- package/build/src/md/date-picker/internals/DatePickerUtils.d.ts.map +1 -0
- package/build/src/md/date-picker/internals/DatePickerUtils.js +221 -0
- package/build/src/md/date-picker/internals/DatePickerUtils.js.map +1 -0
- package/build/src/md/date-picker/ui-date-picker-input.d.ts +160 -0
- package/build/src/md/date-picker/ui-date-picker-input.d.ts.map +1 -0
- package/build/src/md/date-picker/ui-date-picker-input.js +464 -0
- package/build/src/md/date-picker/ui-date-picker-input.js.map +1 -0
- package/build/src/md/date-picker/ui-date-picker-modal-input.d.ts +178 -0
- package/build/src/md/date-picker/ui-date-picker-modal-input.d.ts.map +1 -0
- package/build/src/md/date-picker/ui-date-picker-modal-input.js +538 -0
- package/build/src/md/date-picker/ui-date-picker-modal-input.js.map +1 -0
- package/build/src/md/date-picker/ui-date-picker-modal.d.ts +156 -0
- package/build/src/md/date-picker/ui-date-picker-modal.d.ts.map +1 -0
- package/build/src/md/date-picker/ui-date-picker-modal.js +423 -0
- package/build/src/md/date-picker/ui-date-picker-modal.js.map +1 -0
- package/build/src/md/dialog/internals/Dialog.styles.d.ts.map +1 -1
- package/build/src/md/dialog/internals/Dialog.styles.js +1 -0
- package/build/src/md/dialog/internals/Dialog.styles.js.map +1 -1
- package/demo/elements/currency/index.html +91 -0
- package/demo/elements/currency/index.ts +272 -0
- package/demo/elements/har/har2.json +1 -1
- package/demo/elements/index.html +3 -0
- package/demo/md/date-picker/date-picker.ts +336 -0
- package/demo/md/date-picker/index.html +171 -0
- package/demo/md/index.html +2 -0
- package/package.json +1 -1
- package/src/elements/currency/currency-picker.ts +14 -0
- package/src/elements/currency/internals/Picker.styles.ts +58 -0
- package/src/elements/currency/internals/Picker.ts +846 -0
- package/src/elements/highlight/MarkdownStyles.ts +0 -13
- package/src/elements/http/BodyEditor.ts +0 -13
- package/src/elements/http/BodyTextEditor.ts +0 -13
- package/src/elements/http/BodyUrlEncodedEditor.ts +0 -13
- package/src/elements/http/UrlInput.ts +0 -13
- package/src/index.ts +17 -0
- package/src/md/button/internals/base.ts +7 -0
- package/src/md/button/internals/button.styles.ts +1 -1
- package/src/md/date/internals/DateTime.ts +0 -14
- package/src/md/date-picker/README.md +184 -0
- package/src/md/date-picker/index.ts +17 -0
- package/src/md/date-picker/internals/DatePicker.styles.ts +411 -0
- package/src/md/date-picker/internals/DatePickerCalendar.ts +1031 -0
- package/src/md/date-picker/internals/DatePickerUtils.ts +288 -0
- package/src/md/date-picker/ui-date-picker-input.ts +333 -0
- package/src/md/date-picker/ui-date-picker-modal-input.ts +440 -0
- package/src/md/date-picker/ui-date-picker-modal.ts +346 -0
- package/src/md/dialog/internals/Dialog.styles.ts +1 -0
- package/test/README.md +3 -2
- package/test/elements/currency/CurrencyPicker.accessibility.test.ts +328 -0
- package/test/elements/currency/CurrencyPicker.core.test.ts +318 -0
- package/test/elements/currency/CurrencyPicker.integration.test.ts +482 -0
- package/test/elements/currency/CurrencyPicker.test.ts +486 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatePickerCalendar.js","sourceRoot":"","sources":["../../../../../src/md/date-picker/internals/DatePickerCalendar.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html, TemplateResult, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { calendarStyles } from './DatePicker.styles.js'\nimport {\n CalendarMonth,\n CalendarDay,\n DateRange,\n generateCalendarMonth,\n addMonths,\n getMonthNames,\n isSameDay,\n formatDate,\n addDays,\n} from './DatePickerUtils.js'\nimport '../../../md/icons/ui-icon.js'\nimport '../../../md/button/ui-button.js'\nimport '../../../md/icon-button/ui-icon-button.js'\n\n/**\n * Event dispatched when a single date is selected in immediate mode\n * or confirmed in pending mode.\n */\nexport interface DateSelectEvent {\n date: Date\n formattedDate: string\n}\n\n/**\n * Event dispatched when a date range is completed in immediate mode.\n * Only fired when both start and end dates are selected.\n */\nexport interface DateRangeSelectEvent {\n range: DateRange\n formattedRange: {\n start: string | null\n end: string | null\n }\n}\n\n/**\n * Event dispatched when a date range selection is confirmed\n * via the OK button in pending mode.\n */\nexport interface DateRangeConfirmEvent {\n range: DateRange | null\n formattedRange: {\n start: string | null\n end: string | null\n }\n}\n\n/**\n * Event dispatched when user cancels a pending selection\n * via the Cancel button or Escape key.\n */\nexport interface DateCancelEvent {\n reason?: string\n}\n\n/**\n * A calendar grid component for date selection.\n * Supports single date selection and date range selection with full keyboard navigation.\n *\n * ## Features\n * - Single date and date range selection\n * - Keyboard navigation support (arrow keys, home, end, page up/down)\n * - Configurable date restrictions (min/max dates, disabled dates)\n * - Localization support for date formatting and month/day names\n * - Optional action buttons for pending selections\n * - Accessible design with proper ARIA attributes\n *\n * ## Events\n * - `date-select`: Fired when a single date is selected/confirmed\n * - `date-range-select`: Fired when a date range is completed (immediate mode)\n * - `date-range-confirm`: Fired when a date range is confirmed (pending mode)\n * - `date-cancel`: Fired when a pending selection is cancelled\n *\n * ## Usage\n *\n * ```html\n * <ui-date-picker-calendar></ui-date-picker-calendar>\n * ```\n *\n * ### Single date selection\n * ```html\n * <ui-date-picker-calendar\n * .selectedDate=${new Date()}\n * @date-select=${this.handleDateSelect}\n * ></ui-date-picker-calendar>\n * ```\n *\n * ### Date range selection\n * ```html\n * <ui-date-picker-calendar\n * rangeSelection\n * .rangeStart=${new Date()}\n * .rangeEnd=${null}\n * @date-range-select=${this.handleRangeSelect}\n * ></ui-date-picker-calendar>\n * ```\n *\n * ### With action buttons and restrictions\n * ```html\n * <ui-date-picker-calendar\n * rangeSelection\n * showActions\n * .minDate=${new Date()}\n * .maxDate=${new Date(Date.now() + 365 * 24 * 60 * 60 * 1000)}\n * @date-range-confirm=${this.handleRangeConfirm}\n * @date-cancel=${this.handleCancel}\n * ></ui-date-picker-calendar>\n * ```\n */\n@customElement('ui-date-picker-calendar')\nexport class UiDatePickerCalendar extends LitElement {\n static override styles = calendarStyles\n\n /**\n * The currently displayed year\n */\n @property({ type: Number }) accessor year = new Date().getFullYear()\n\n /**\n * The currently displayed month (0-indexed, where 0 = January)\n */\n @property({ type: Number }) accessor month = new Date().getMonth()\n\n /**\n * The currently selected date for single selection mode.\n * Set to null for no selection.\n */\n @property({ type: Object }) accessor selectedDate: Date | null = null\n\n /**\n * The start date of the selected range for range selection mode.\n * Used in combination with rangeEnd to define a date range.\n */\n @property({ type: Object }) accessor rangeStart: Date | null = null\n\n /**\n * The end date of the selected range for range selection mode.\n * Used in combination with rangeStart to define a date range.\n */\n @property({ type: Object }) accessor rangeEnd: Date | null = null\n\n /**\n * Enable range selection mode. When true, users can select date ranges\n * instead of single dates. Affects event dispatching and UI behavior.\n */\n @property({ type: Boolean }) accessor rangeSelection = false\n\n /**\n * Minimum selectable date. Dates before this will be disabled.\n * Set to undefined for no minimum restriction.\n */\n @property({ type: Object }) accessor minDate: Date | undefined = undefined\n\n /**\n * Maximum selectable date. Dates after this will be disabled.\n * Set to undefined for no maximum restriction.\n */\n @property({ type: Object }) accessor maxDate: Date | undefined = undefined\n\n /**\n * Array of specific dates to disable. These dates will not be selectable\n * regardless of minDate and maxDate settings.\n */\n @property({ type: Array }) accessor disabledDates: Date[] | undefined = undefined\n\n /**\n * Locale for date formatting and month/day names (e.g., 'en-US', 'fr-FR').\n * Defaults to browser locale if not specified.\n */\n @property({ type: String }) accessor locale: string | undefined = undefined\n\n /**\n * Whether to show navigation controls (previous/next month and year buttons).\n * When false, users can only navigate using keyboard or programmatically.\n */\n @property({ type: Boolean }) accessor showNavigation = true\n\n /**\n * Whether to show action buttons (OK/Cancel). When true, selections are pending\n * until confirmed with the OK button. When false, selections are immediate.\n */\n @property({ type: Boolean }) accessor showActions = false\n\n /**\n * Text label for the OK/confirm button. Only visible when showActions is true.\n */\n @property({ type: String }) accessor okButtonText = 'OK'\n\n /**\n * Text label for the Cancel button. Only visible when showActions is true.\n */\n @property({ type: String }) accessor cancelButtonText = 'Cancel'\n\n @state() private accessor calendarData: CalendarMonth | undefined = undefined\n\n @state() private accessor monthNames: string[] = []\n\n @state() private accessor showMonthDropdown = false\n\n @state() private accessor showYearDropdown = false\n\n @state() private accessor pendingDate: Date | null = null\n\n @state() private accessor pendingRangeStart: Date | null = null\n\n @state() private accessor pendingRangeEnd: Date | null = null\n\n @state() private accessor focusedDate: Date | null = null\n\n override connectedCallback(): void {\n super.connectedCallback()\n this.updateCalendar()\n this.updateMonthNames()\n this.initializeFocusedDate()\n }\n\n override firstUpdated(): void {\n // Set initial focus to the calendar container\n this.updateFocus()\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback()\n }\n\n override willUpdate(changedProperties: Map<string | number | symbol, unknown>): void {\n if (\n changedProperties.has('year') ||\n changedProperties.has('month') ||\n changedProperties.has('selectedDate') ||\n changedProperties.has('rangeStart') ||\n changedProperties.has('rangeEnd') ||\n changedProperties.has('disabledDates') ||\n changedProperties.has('locale')\n ) {\n this.updateCalendar()\n }\n\n if (changedProperties.has('locale')) {\n this.updateMonthNames()\n }\n\n // Update focused date when month/year changes via navigation\n if (changedProperties.has('year') || changedProperties.has('month')) {\n this.updateFocusedDateForMonthChange()\n }\n }\n\n override updated(changedProperties: Map<string | number | symbol, unknown>): void {\n if (changedProperties.has('showYearDropdown') && this.showYearDropdown) {\n // Scroll selected year into view\n this.scrollSelectedYearIntoView()\n }\n\n if (changedProperties.has('focusedDate')) {\n this.updateFocus()\n }\n }\n\n private updateFocus(): void {\n if (!this.focusedDate) return\n\n // Find the button for the focused date and set focus\n const dateString = this.focusedDate.toISOString().split('T')[0]\n const focusedButton = this.shadowRoot?.querySelector(`[data-date=\"${dateString}\"]`) as HTMLElement\n if (focusedButton && !focusedButton.hasAttribute('disabled')) {\n // Use requestAnimationFrame to ensure DOM is updated\n requestAnimationFrame(() => {\n focusedButton.focus()\n })\n }\n }\n\n private scrollSelectedYearIntoView(): void {\n // Wait for next frame to ensure DOM is updated\n requestAnimationFrame(() => {\n const selectedYearButton = this.shadowRoot?.querySelector('.year-option.selected') as HTMLElement\n if (selectedYearButton) {\n selectedYearButton.scrollIntoView({\n behavior: 'auto',\n block: 'center',\n })\n }\n })\n }\n\n private updateFocusedDateForMonthChange(): void {\n if (!this.focusedDate) {\n this.initializeFocusedDate()\n return\n }\n\n // Keep the same day of month if possible\n const targetDay = this.focusedDate.getDate()\n const newDate = new Date(this.year, this.month, targetDay)\n\n // Check if the target date exists in the new month and is not disabled\n if (newDate.getMonth() === this.month && !this.isDateDisabled(newDate)) {\n this.focusedDate = newDate\n } else {\n // Find the closest available date\n this.focusedDate = this.findFirstAvailableDate()\n }\n }\n\n private updateCalendar(): void {\n const selectedRange = this.rangeStart || this.rangeEnd ? { start: this.rangeStart, end: this.rangeEnd } : null\n this.calendarData = generateCalendarMonth(\n this.year,\n this.month,\n this.selectedDate,\n selectedRange,\n this.disabledDates,\n this.locale\n )\n }\n\n private updateMonthNames(): void {\n this.monthNames = getMonthNames(this.locale)\n }\n\n private navigateMonth(delta: number): void {\n const newDate = addMonths(new Date(this.year, this.month), delta)\n this.year = newDate.getFullYear()\n this.month = newDate.getMonth()\n }\n\n private handlePrevMonth(): void {\n this.navigateMonth(-1)\n }\n\n private handleNextMonth(): void {\n this.navigateMonth(1)\n }\n\n private handlePrevYear(): void {\n this.year = this.year - 1\n }\n\n private handleNextYear(): void {\n this.year = this.year + 1\n }\n\n private handleMonthClick(): void {\n this.showMonthDropdown = !this.showMonthDropdown\n this.showYearDropdown = false\n }\n\n private handleYearClick(): void {\n this.showYearDropdown = !this.showYearDropdown\n this.showMonthDropdown = false\n }\n\n private handleMonthSelect(selectedMonth: number): void {\n this.month = selectedMonth\n this.showMonthDropdown = false\n }\n\n private handleYearSelect(selectedYear: number): void {\n this.year = selectedYear\n this.showYearDropdown = false\n }\n\n private closeDropdowns(): void {\n this.showMonthDropdown = false\n this.showYearDropdown = false\n }\n\n private navigateDate(delta: number): void {\n if (!this.focusedDate) return\n\n const newDate = addDays(this.focusedDate, delta)\n\n // Check if new date is in current month or if we should navigate to next/previous month\n if (newDate.getMonth() !== this.month || newDate.getFullYear() !== this.year) {\n // Navigate to next/previous month\n if (delta > 0) {\n this.navigateMonth(1)\n } else {\n this.navigateMonth(-1)\n }\n // Set focused date to the target date in the new month\n this.focusedDate = newDate\n return\n }\n\n // Check if new date is disabled\n if (this.isDateDisabled(newDate)) {\n // Try to find next available date\n const availableDate = this.findNextAvailableDate(newDate, delta > 0)\n if (availableDate) {\n this.focusedDate = availableDate\n }\n } else {\n this.focusedDate = newDate\n }\n }\n\n private findNextAvailableDate(startDate: Date, forward: boolean): Date | null {\n const direction = forward ? 1 : -1\n for (let i = 1; i <= 31; i++) {\n const date = addDays(startDate, i * direction)\n if (date.getMonth() !== this.month) break // Out of current month\n if (!this.isDateDisabled(date)) {\n return date\n }\n }\n return null\n }\n\n private focusFirstDayOfMonth(): void {\n const firstDay = new Date(this.year, this.month, 1)\n if (!this.isDateDisabled(firstDay)) {\n this.focusedDate = firstDay\n } else {\n this.focusedDate = this.findFirstAvailableDate()\n }\n }\n\n private focusLastDayOfMonth(): void {\n const lastDay = new Date(this.year, this.month + 1, 0)\n if (!this.isDateDisabled(lastDay)) {\n this.focusedDate = lastDay\n } else {\n // Find last available date in month\n for (let i = lastDay.getDate(); i >= 1; i--) {\n const date = new Date(this.year, this.month, i)\n if (!this.isDateDisabled(date)) {\n this.focusedDate = date\n break\n }\n }\n }\n }\n\n private selectFocusedDate(): void {\n if (!this.focusedDate || this.isDateDisabled(this.focusedDate)) return\n\n if (this.rangeSelection) {\n this.handleRangeSelection(this.focusedDate)\n } else {\n this.handleSingleSelection(this.focusedDate)\n }\n }\n\n private handleDayClick(day: CalendarDay): void {\n if (day.isDisabled) return\n\n // Update focused date to clicked date\n this.focusedDate = day.date\n\n if (this.rangeSelection) {\n this.handleRangeSelection(day.date)\n } else {\n this.handleSingleSelection(day.date)\n }\n }\n\n private handleSingleSelection(date: Date): void {\n if (this.showActions) {\n // Use pending state when actions are enabled\n this.pendingDate = date\n } else {\n // Immediate selection when no actions\n this.selectedDate = date\n this.dispatchDateEvent(date)\n }\n }\n\n private handleRangeSelection(date: Date): void {\n const isImmediate = !this.showActions\n const { start, end } = this.getCurrentRange()\n\n // If we have a complete range, start a new one\n if (start && end) {\n this.setRangeValues(date, null, isImmediate)\n return\n }\n\n // If we have a start but no end, complete the range\n if (start && !end) {\n const sortedRange = start <= date ? { start, end: date } : { start: date, end: start }\n this.setRangeValues(sortedRange.start, sortedRange.end, isImmediate)\n\n if (isImmediate) {\n this.dispatchRangeEvent(sortedRange)\n }\n return\n }\n\n // Start new range\n this.setRangeValues(date, null, isImmediate)\n }\n\n /**\n * Helper to get the current range state (either immediate or pending)\n */\n private getCurrentRange(): { start: Date | null; end: Date | null } {\n const isImmediate = !this.showActions\n return {\n start: isImmediate ? this.rangeStart : this.pendingRangeStart,\n end: isImmediate ? this.rangeEnd : this.pendingRangeEnd,\n }\n }\n\n /**\n * Helper to check if we have a complete range in the current mode\n */\n private hasCompleteRange(): boolean {\n const { start, end } = this.getCurrentRange()\n return !!(start && end)\n }\n\n private setRangeValues(start: Date | null, end: Date | null, isImmediate: boolean): void {\n if (isImmediate) {\n this.rangeStart = start\n this.rangeEnd = end\n } else {\n this.pendingRangeStart = start\n this.pendingRangeEnd = end\n }\n }\n\n /**\n * Helper to dispatch date selection events\n */\n private dispatchDateEvent(date: Date): void {\n const event: DateSelectEvent = {\n date,\n formattedDate: formatDate(date, this.locale),\n }\n\n this.dispatchEvent(\n new CustomEvent('date-select', {\n detail: event,\n bubbles: true,\n composed: true,\n })\n )\n }\n\n /**\n * Helper to dispatch range selection events\n */\n private dispatchRangeEvent(range: { start: Date; end: Date }): void {\n const event: DateRangeSelectEvent = {\n range,\n formattedRange: {\n start: formatDate(range.start, this.locale),\n end: formatDate(range.end, this.locale),\n },\n }\n\n this.dispatchEvent(\n new CustomEvent('date-range-select', {\n detail: event,\n bubbles: true,\n composed: true,\n })\n )\n }\n\n /**\n * Helper to dispatch range confirmation events\n */\n private dispatchRangeConfirmEvent(range: DateRange | null): void {\n const event: DateRangeConfirmEvent = {\n range,\n formattedRange: {\n start: range?.start ? formatDate(range.start, this.locale) : null,\n end: range?.end ? formatDate(range.end, this.locale) : null,\n },\n }\n\n this.dispatchEvent(\n new CustomEvent('date-range-confirm', {\n detail: event,\n bubbles: true,\n composed: true,\n })\n )\n }\n\n /**\n * Helper to dispatch cancel events\n */\n private dispatchCancelEvent(reason = 'user_cancelled'): void {\n const event: DateCancelEvent = { reason }\n\n this.dispatchEvent(\n new CustomEvent('date-cancel', {\n detail: event,\n bubbles: true,\n composed: true,\n })\n )\n }\n\n private isDateDisabled(date: Date): boolean {\n if (this.minDate && date < this.minDate) return true\n if (this.maxDate && date > this.maxDate) return true\n if (this.disabledDates?.some((disabledDate) => isSameDay(date, disabledDate))) return true\n return false\n }\n\n private handleConfirm(): void {\n if (this.rangeSelection) {\n if (this.pendingRangeStart || this.pendingRangeEnd) {\n this.rangeStart = this.pendingRangeStart\n this.rangeEnd = this.pendingRangeEnd\n\n const range = this.rangeStart || this.rangeEnd ? { start: this.rangeStart, end: this.rangeEnd } : null\n\n // Reset pending state after confirmation\n this.pendingRangeStart = null\n this.pendingRangeEnd = null\n\n this.dispatchRangeConfirmEvent(range)\n }\n } else {\n if (this.pendingDate) {\n this.selectedDate = this.pendingDate\n\n // Reset pending state after confirmation\n this.pendingDate = null\n\n this.dispatchDateEvent(this.selectedDate)\n }\n }\n }\n\n private handleCancel(): void {\n // Reset pending state\n this.pendingDate = null\n this.pendingRangeStart = null\n this.pendingRangeEnd = null\n\n this.dispatchCancelEvent()\n }\n\n /**\n * Helper to render navigation buttons\n */\n private renderNavButton(\n direction: 'prev' | 'next',\n onClick: () => void,\n ariaLabel: string,\n icon: 'chevronLeft' | 'chevronRight'\n ): TemplateResult | typeof nothing {\n if (!this.showNavigation || this.showMonthDropdown || this.showYearDropdown) {\n return nothing\n }\n\n return html`<ui-icon-button\n class=\"nav-button\"\n size=\"xs\"\n @click=${onClick}\n aria-label=${ariaLabel}\n title=${ariaLabel}\n >\n <ui-icon icon=${icon}></ui-icon>\n </ui-icon-button>`\n }\n\n private renderNavigation(): TemplateResult {\n const monthName = this.monthNames[this.month] || ''\n\n return html`\n <div class=\"header\">\n <div class=\"month-year\">\n <div class=\"month-selector\">\n ${this.renderNavButton('prev', this.handlePrevMonth, 'Previous month', 'chevronLeft')}\n <ui-button\n class=\"month-button\"\n color=\"text\"\n size=\"xs\"\n @click=${this.handleMonthClick}\n aria-label=\"Select month\"\n aria-expanded=${this.showMonthDropdown}\n trailingIcon\n >\n ${monthName}\n <ui-icon icon=\"arrowDropDown\" slot=\"icon\"></ui-icon>\n </ui-button>\n ${this.renderNavButton('next', this.handleNextMonth, 'Next month', 'chevronRight')}\n </div>\n <div class=\"year-selector\">\n ${this.renderNavButton('prev', this.handlePrevYear, 'Previous year', 'chevronLeft')}\n <ui-button\n class=\"year-button\"\n color=\"text\"\n size=\"xs\"\n @click=${this.handleYearClick}\n aria-label=\"Select year\"\n aria-expanded=${this.showYearDropdown}\n trailingIcon\n >\n ${this.year}\n <ui-icon icon=\"arrowDropDown\" slot=\"icon\"></ui-icon>\n </ui-button>\n ${this.renderNavButton('next', this.handleNextYear, 'Next year', 'chevronRight')}\n </div>\n </div>\n </div>\n `\n }\n\n private renderWeekdays(): TemplateResult {\n if (!this.calendarData) return html``\n\n return html`\n <div class=\"weekdays\" role=\"row\">\n ${this.calendarData.weekdays.map((weekday) => html`<div class=\"weekday\" role=\"columnheader\">${weekday}</div>`)}\n </div>\n `\n }\n\n /**\n * Helper to determine day selection state for rendering\n */\n private getDaySelectionState(day: CalendarDay): {\n isSelected: boolean\n isRangeStart: boolean\n isRangeEnd: boolean\n isInRange: boolean\n } {\n if (this.showActions) {\n // Use pending state\n const isPendingSelected = this.pendingDate && isSameDay(day.date, this.pendingDate)\n const isPendingRangeStart = this.pendingRangeStart && isSameDay(day.date, this.pendingRangeStart)\n const isPendingRangeEnd = this.pendingRangeEnd && isSameDay(day.date, this.pendingRangeEnd)\n const isPendingInRange =\n this.pendingRangeStart &&\n this.pendingRangeEnd &&\n day.date >= this.pendingRangeStart &&\n day.date <= this.pendingRangeEnd &&\n !isPendingRangeStart &&\n !isPendingRangeEnd\n\n return {\n isSelected: !!isPendingSelected,\n isRangeStart: !!isPendingRangeStart,\n isRangeEnd: !!isPendingRangeEnd,\n isInRange: !!isPendingInRange,\n }\n } else {\n // Use immediate state\n return {\n isSelected: day.isSelected,\n isRangeStart: day.isRangeStart,\n isRangeEnd: day.isRangeEnd,\n isInRange: day.isInRange,\n }\n }\n }\n\n /**\n * Helper to determine button color for a day\n */\n private getDayButtonColor(\n day: CalendarDay,\n selectionState: ReturnType<typeof this.getDaySelectionState>\n ): 'elevated' | 'filled' | 'outlined' | 'text' | 'tonal' {\n if (selectionState.isRangeStart || selectionState.isRangeEnd || selectionState.isSelected) {\n return 'filled'\n }\n\n if (selectionState.isInRange) {\n return 'text'\n }\n\n if (day.isToday) {\n return 'outlined'\n }\n\n return 'text'\n }\n\n private renderDay(day: CalendarDay): TemplateResult {\n const selectionState = this.getDaySelectionState(day)\n const color = this.getDayButtonColor(day, selectionState)\n\n const classes = {\n 'day-cell': true,\n 'other-month': !day.isCurrentMonth,\n 'today': day.isToday,\n 'in-range': selectionState.isInRange,\n 'range-start': selectionState.isRangeStart,\n 'range-end': selectionState.isRangeEnd,\n 'has-complete-range': this.hasCompleteRange(),\n }\n\n const isFocused = this.focusedDate && isSameDay(day.date, this.focusedDate)\n\n return html`\n <div class=${classMap(classes)} role=\"gridcell\">\n <ui-button\n class=\"day-button\"\n color=${color}\n size=\"s\"\n data-date=${day.date.toISOString().split('T')[0]}\n tabindex=${isFocused && !(day.isDisabled || this.isDateDisabled(day.date)) ? '0' : '-1'}\n aria-label=${formatDate(day.date, this.locale)}\n aria-selected=${selectionState.isSelected || selectionState.isRangeStart || selectionState.isRangeEnd}\n @click=${() => this.handleDayClick(day)}\n ?disabled=${day.isDisabled || this.isDateDisabled(day.date)}\n >\n ${day.date.getDate()}\n </ui-button>\n </div>\n `\n }\n\n private renderDays(): TemplateResult {\n if (!this.calendarData) return html``\n\n return html`<div class=\"days\">${this.calendarData.days.map((day) => this.renderDay(day))}</div>`\n }\n\n private renderActions(): TemplateResult | typeof nothing {\n if (!this.showActions) return nothing\n\n const hasSelection = this.rangeSelection ? this.pendingRangeStart : this.pendingDate\n\n return html`\n <div class=\"actions\">\n <ui-button size=\"s\" color=\"text\" @click=${this.handleCancel}>${this.cancelButtonText}</ui-button>\n <ui-button size=\"s\" color=\"text\" @click=${this.handleConfirm} ?disabled=${!hasSelection}>\n ${this.okButtonText}\n </ui-button>\n </div>\n `\n }\n\n /**\n * Helper to render dropdown option buttons\n */\n private renderDropdownOption(\n value: string | number,\n label: string,\n isSelected: boolean,\n onClick: () => void,\n className = ''\n ): TemplateResult {\n return html`\n <ui-button\n class=\"dropdown-option ${className} ${isSelected ? 'selected' : ''}\"\n color=${isSelected ? 'filled' : 'text'}\n size=\"s\"\n @click=${onClick}\n aria-label=${label}\n >\n ${label}\n </ui-button>\n `\n }\n\n private renderMonthDropdown(): TemplateResult {\n return html`\n <div class=\"dropdown-view\">\n <div class=\"month-list\">\n ${this.monthNames.map((monthName, index) =>\n this.renderDropdownOption(index, monthName, index === this.month, () => this.handleMonthSelect(index))\n )}\n </div>\n </div>\n `\n }\n\n private renderYearDropdown(): TemplateResult {\n const currentYear = this.year\n const startYear = currentYear - 50\n const endYear = currentYear + 50\n const years: number[] = []\n\n for (let year = startYear; year <= endYear; year++) {\n years.push(year)\n }\n\n return html`\n <div class=\"dropdown-view\">\n <div class=\"year-grid\">\n ${years.map((year) =>\n this.renderDropdownOption(\n year,\n year.toString(),\n year === this.year,\n () => this.handleYearSelect(year),\n 'year-option'\n )\n )}\n </div>\n </div>\n `\n }\n\n private findFirstAvailableDate(): Date {\n const firstDayOfMonth = new Date(this.year, this.month, 1)\n for (let i = 0; i < 31; i++) {\n const date = addDays(firstDayOfMonth, i)\n if (date.getMonth() !== this.month) break // Next month\n if (!this.isDateDisabled(date)) {\n return date\n }\n }\n return firstDayOfMonth // Fallback\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n // Prevent default behavior for navigation keys\n const navigationKeys = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End', 'PageUp', 'PageDown', ' ']\n if (navigationKeys.includes(event.key)) {\n event.preventDefault()\n }\n\n switch (event.key) {\n case 'ArrowLeft':\n this.navigateDate(-1)\n break\n case 'ArrowRight':\n this.navigateDate(1)\n break\n case 'ArrowUp':\n this.navigateDate(-7)\n break\n case 'ArrowDown':\n this.navigateDate(7)\n break\n case 'Enter':\n case ' ':\n this.selectFocusedDate()\n break\n case 'Home':\n this.focusFirstDayOfMonth()\n break\n case 'End':\n this.focusLastDayOfMonth()\n break\n case 'PageUp':\n if (event.shiftKey) {\n this.handlePrevYear()\n } else {\n this.navigateMonth(-1)\n }\n break\n case 'PageDown':\n if (event.shiftKey) {\n this.handleNextYear()\n } else {\n this.navigateMonth(1)\n }\n break\n case 'Escape':\n this.closeDropdowns()\n break\n }\n }\n\n /**\n * Helper to check if a date is in the current month and not disabled\n */\n private isDateAvailable(date: Date): boolean {\n return date.getMonth() === this.month && date.getFullYear() === this.year && !this.isDateDisabled(date)\n }\n\n private initializeFocusedDate(): void {\n // Priority: selectedDate, rangeStart, today, first available date\n const candidates = [this.selectedDate, this.rangeStart, new Date()].filter(Boolean) as Date[]\n\n for (const candidate of candidates) {\n if (this.isDateAvailable(candidate)) {\n this.focusedDate = candidate\n return\n }\n }\n\n // Fallback to first available date in current month\n this.focusedDate = this.findFirstAvailableDate()\n }\n\n override render(): TemplateResult {\n // Show dropdown views instead of calendar when dropdowns are open\n if (this.showMonthDropdown) {\n return html`\n <div class=\"calendar\" role=\"grid\" aria-label=\"Month selection for ${this.year}\">\n ${this.renderNavigation()} ${this.renderMonthDropdown()}\n </div>\n `\n }\n\n if (this.showYearDropdown) {\n return html`\n <div class=\"calendar\" role=\"grid\" aria-label=\"Year selection\">\n ${this.renderNavigation()} ${this.renderYearDropdown()}\n </div>\n `\n }\n\n // Default calendar view\n return html`\n <div\n class=\"calendar\"\n role=\"grid\"\n aria-label=\"Calendar for ${this.monthNames[this.month]} ${this.year}\"\n aria-roledescription=\"Calendar grid\"\n tabindex=\"0\"\n @keydown=${this.handleKeyDown}\n >\n ${this.renderNavigation()} ${this.renderWeekdays()} ${this.renderDays()} ${this.renderActions()}\n </div>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ui-date-picker-calendar': UiDatePickerCalendar\n }\n\n interface HTMLElementEventMap {\n 'date-select': CustomEvent<DateSelectEvent>\n 'date-range-select': CustomEvent<DateRangeSelectEvent>\n 'date-range-confirm': CustomEvent<DateRangeConfirmEvent>\n 'date-cancel': CustomEvent<DateCancelEvent>\n }\n}\n"]}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
export interface DateRange {
|
|
2
|
+
start: Date | null;
|
|
3
|
+
end: Date | null;
|
|
4
|
+
}
|
|
5
|
+
export interface CalendarDay {
|
|
6
|
+
date: Date;
|
|
7
|
+
isCurrentMonth: boolean;
|
|
8
|
+
isToday: boolean;
|
|
9
|
+
isSelected: boolean;
|
|
10
|
+
isInRange: boolean;
|
|
11
|
+
isRangeStart: boolean;
|
|
12
|
+
isRangeEnd: boolean;
|
|
13
|
+
isDisabled: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface CalendarMonth {
|
|
16
|
+
year: number;
|
|
17
|
+
month: number;
|
|
18
|
+
days: CalendarDay[];
|
|
19
|
+
weekdays: string[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get the current date with time set to midnight
|
|
23
|
+
*/
|
|
24
|
+
export declare function today(): Date;
|
|
25
|
+
/**
|
|
26
|
+
* Create a new date with time set to midnight
|
|
27
|
+
*/
|
|
28
|
+
export declare function normalizeDate(date: Date): Date;
|
|
29
|
+
/**
|
|
30
|
+
* Check if two dates are the same day
|
|
31
|
+
*/
|
|
32
|
+
export declare function isSameDay(date1: Date, date2: Date): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Check if a date is between two other dates (inclusive)
|
|
35
|
+
*/
|
|
36
|
+
export declare function isBetween(date: Date, start: Date, end: Date): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Add months to a date
|
|
39
|
+
*/
|
|
40
|
+
export declare function addMonths(date: Date, months: number): Date;
|
|
41
|
+
/**
|
|
42
|
+
* Add days to a date
|
|
43
|
+
*/
|
|
44
|
+
export declare function addDays(date: Date, days: number): Date;
|
|
45
|
+
/**
|
|
46
|
+
* Get the first day of the month
|
|
47
|
+
*/
|
|
48
|
+
export declare function getFirstDayOfMonth(year: number, month: number): Date;
|
|
49
|
+
/**
|
|
50
|
+
* Get the last day of the month
|
|
51
|
+
*/
|
|
52
|
+
export declare function getLastDayOfMonth(year: number, month: number): Date;
|
|
53
|
+
/**
|
|
54
|
+
* Get the number of days in a month
|
|
55
|
+
*/
|
|
56
|
+
export declare function getDaysInMonth(year: number, month: number): number;
|
|
57
|
+
/**
|
|
58
|
+
* Get weekday names for the current locale
|
|
59
|
+
*/
|
|
60
|
+
export declare function getWeekdayNames(locale?: string): string[];
|
|
61
|
+
/**
|
|
62
|
+
* Get month names for the current locale
|
|
63
|
+
*/
|
|
64
|
+
export declare function getMonthNames(locale?: string): string[];
|
|
65
|
+
/**
|
|
66
|
+
* Format a date according to locale
|
|
67
|
+
*/
|
|
68
|
+
export declare function formatDate(date: Date, locale?: string, options?: Intl.DateTimeFormatOptions): string;
|
|
69
|
+
/**
|
|
70
|
+
* Parse a date string in various formats
|
|
71
|
+
*/
|
|
72
|
+
export declare function parseDate(dateString: string): Date | null;
|
|
73
|
+
/**
|
|
74
|
+
* Generate calendar data for a specific month
|
|
75
|
+
*/
|
|
76
|
+
export declare function generateCalendarMonth(year: number, month: number, selectedDate?: Date | null, selectedRange?: DateRange | null, disabledDates?: Date[], locale?: string): CalendarMonth;
|
|
77
|
+
/**
|
|
78
|
+
* Get the ISO string for a date (YYYY-MM-DD format)
|
|
79
|
+
*/
|
|
80
|
+
export declare function toISODateString(date: Date): string;
|
|
81
|
+
/**
|
|
82
|
+
* Create a date from ISO string (YYYY-MM-DD format)
|
|
83
|
+
*/
|
|
84
|
+
export declare function fromISODateString(isoString: string): Date | null;
|
|
85
|
+
/**
|
|
86
|
+
* Validate if a date range is valid (start <= end)
|
|
87
|
+
*/
|
|
88
|
+
export declare function isValidRange(range: DateRange): boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Get the number of days between two dates
|
|
91
|
+
*/
|
|
92
|
+
export declare function getDaysBetween(start: Date, end: Date): number;
|
|
93
|
+
//# sourceMappingURL=DatePickerUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatePickerUtils.d.ts","sourceRoot":"","sources":["../../../../../src/md/date-picker/internals/DatePickerUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get the current date with time set to midnight
|
|
3
|
+
*/
|
|
4
|
+
export function today() {
|
|
5
|
+
const now = new Date();
|
|
6
|
+
return new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Create a new date with time set to midnight
|
|
10
|
+
*/
|
|
11
|
+
export function normalizeDate(date) {
|
|
12
|
+
return new Date(date.getFullYear(), date.getMonth(), date.getDate());
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Check if two dates are the same day
|
|
16
|
+
*/
|
|
17
|
+
export function isSameDay(date1, date2) {
|
|
18
|
+
return (date1.getFullYear() === date2.getFullYear() &&
|
|
19
|
+
date1.getMonth() === date2.getMonth() &&
|
|
20
|
+
date1.getDate() === date2.getDate());
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Check if a date is between two other dates (inclusive)
|
|
24
|
+
*/
|
|
25
|
+
export function isBetween(date, start, end) {
|
|
26
|
+
const normalizedDate = normalizeDate(date);
|
|
27
|
+
const normalizedStart = normalizeDate(start);
|
|
28
|
+
const normalizedEnd = normalizeDate(end);
|
|
29
|
+
return normalizedDate >= normalizedStart && normalizedDate <= normalizedEnd;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Add months to a date
|
|
33
|
+
*/
|
|
34
|
+
export function addMonths(date, months) {
|
|
35
|
+
const result = new Date(date);
|
|
36
|
+
result.setMonth(result.getMonth() + months);
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Add days to a date
|
|
41
|
+
*/
|
|
42
|
+
export function addDays(date, days) {
|
|
43
|
+
const result = new Date(date);
|
|
44
|
+
result.setDate(result.getDate() + days);
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get the first day of the month
|
|
49
|
+
*/
|
|
50
|
+
export function getFirstDayOfMonth(year, month) {
|
|
51
|
+
return new Date(year, month, 1);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get the last day of the month
|
|
55
|
+
*/
|
|
56
|
+
export function getLastDayOfMonth(year, month) {
|
|
57
|
+
return new Date(year, month + 1, 0);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get the number of days in a month
|
|
61
|
+
*/
|
|
62
|
+
export function getDaysInMonth(year, month) {
|
|
63
|
+
return new Date(year, month + 1, 0).getDate();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get weekday names for the current locale
|
|
67
|
+
*/
|
|
68
|
+
export function getWeekdayNames(locale) {
|
|
69
|
+
const formatter = new Intl.DateTimeFormat(locale, { weekday: 'short' });
|
|
70
|
+
const days = [];
|
|
71
|
+
// Start from Sunday and get all 7 days
|
|
72
|
+
const date = new Date(2024, 0, 7); // January 7, 2024 is a Sunday
|
|
73
|
+
for (let i = 0; i < 7; i++) {
|
|
74
|
+
days.push(formatter.format(new Date(date.getTime() + i * 24 * 60 * 60 * 1000)));
|
|
75
|
+
}
|
|
76
|
+
return days;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get month names for the current locale
|
|
80
|
+
*/
|
|
81
|
+
export function getMonthNames(locale) {
|
|
82
|
+
const formatter = new Intl.DateTimeFormat(locale, { month: 'short' });
|
|
83
|
+
const months = [];
|
|
84
|
+
for (let i = 0; i < 12; i++) {
|
|
85
|
+
months.push(formatter.format(new Date(2024, i, 1)));
|
|
86
|
+
}
|
|
87
|
+
return months;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Format a date according to locale
|
|
91
|
+
*/
|
|
92
|
+
export function formatDate(date, locale, options) {
|
|
93
|
+
const defaultOptions = {
|
|
94
|
+
year: 'numeric',
|
|
95
|
+
month: 'short',
|
|
96
|
+
day: 'numeric',
|
|
97
|
+
};
|
|
98
|
+
return new Intl.DateTimeFormat(locale, { ...defaultOptions, ...options }).format(date);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Parse a date string in various formats
|
|
102
|
+
*/
|
|
103
|
+
export function parseDate(dateString) {
|
|
104
|
+
if (!dateString)
|
|
105
|
+
return null;
|
|
106
|
+
// Try ISO format first
|
|
107
|
+
const isoDate = new Date(dateString);
|
|
108
|
+
if (!isNaN(isoDate.getTime())) {
|
|
109
|
+
return normalizeDate(isoDate);
|
|
110
|
+
}
|
|
111
|
+
// Try other common formats
|
|
112
|
+
const formats = [
|
|
113
|
+
/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/, // MM/DD/YYYY or M/D/YYYY
|
|
114
|
+
/^(\d{1,2})-(\d{1,2})-(\d{4})$/, // MM-DD-YYYY or M-D-YYYY
|
|
115
|
+
/^(\d{4})-(\d{1,2})-(\d{1,2})$/, // YYYY-MM-DD or YYYY-M-D
|
|
116
|
+
];
|
|
117
|
+
for (const format of formats) {
|
|
118
|
+
const match = dateString.match(format);
|
|
119
|
+
if (match) {
|
|
120
|
+
const [, part1, part2, part3] = match;
|
|
121
|
+
let year, month, day;
|
|
122
|
+
if (format === formats[2]) {
|
|
123
|
+
// YYYY-MM-DD
|
|
124
|
+
year = parseInt(part1, 10);
|
|
125
|
+
month = parseInt(part2, 10) - 1; // Convert to 0-indexed
|
|
126
|
+
day = parseInt(part3, 10);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
// MM/DD/YYYY or MM-DD-YYYY
|
|
130
|
+
year = parseInt(part3, 10);
|
|
131
|
+
month = parseInt(part1, 10) - 1; // Convert to 0-indexed
|
|
132
|
+
day = parseInt(part2, 10);
|
|
133
|
+
}
|
|
134
|
+
const date = new Date(year, month, day);
|
|
135
|
+
if (!isNaN(date.getTime())) {
|
|
136
|
+
return date;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Generate calendar data for a specific month
|
|
144
|
+
*/
|
|
145
|
+
export function generateCalendarMonth(year, month, selectedDate, selectedRange, disabledDates, locale) {
|
|
146
|
+
const firstDay = getFirstDayOfMonth(year, month);
|
|
147
|
+
const todayDate = today();
|
|
148
|
+
// Get the first day of the week (0 = Sunday, 1 = Monday)
|
|
149
|
+
const firstDayOfWeek = firstDay.getDay();
|
|
150
|
+
// Calculate start date (might be from previous month)
|
|
151
|
+
const startDate = addDays(firstDay, -firstDayOfWeek);
|
|
152
|
+
// Calculate end date (might be from next month)
|
|
153
|
+
const daysToShow = 42; // 6 weeks * 7 days
|
|
154
|
+
const endDate = addDays(startDate, daysToShow - 1);
|
|
155
|
+
const days = [];
|
|
156
|
+
const currentDate = new Date(startDate);
|
|
157
|
+
while (currentDate <= endDate) {
|
|
158
|
+
const isCurrentMonth = currentDate.getMonth() === month;
|
|
159
|
+
const isToday = isSameDay(currentDate, todayDate);
|
|
160
|
+
const isSelected = selectedDate ? isSameDay(currentDate, selectedDate) : false;
|
|
161
|
+
let isInRange = false;
|
|
162
|
+
let isRangeStart = false;
|
|
163
|
+
let isRangeEnd = false;
|
|
164
|
+
if (selectedRange?.start && selectedRange?.end) {
|
|
165
|
+
isRangeStart = isSameDay(currentDate, selectedRange.start);
|
|
166
|
+
isRangeEnd = isSameDay(currentDate, selectedRange.end);
|
|
167
|
+
isInRange = isBetween(currentDate, selectedRange.start, selectedRange.end);
|
|
168
|
+
}
|
|
169
|
+
const isDisabled = disabledDates?.some((disabledDate) => isSameDay(currentDate, disabledDate)) || false;
|
|
170
|
+
days.push({
|
|
171
|
+
date: new Date(currentDate),
|
|
172
|
+
isCurrentMonth,
|
|
173
|
+
isToday,
|
|
174
|
+
isSelected,
|
|
175
|
+
isInRange,
|
|
176
|
+
isRangeStart,
|
|
177
|
+
isRangeEnd,
|
|
178
|
+
isDisabled,
|
|
179
|
+
});
|
|
180
|
+
currentDate.setDate(currentDate.getDate() + 1);
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
year,
|
|
184
|
+
month,
|
|
185
|
+
days,
|
|
186
|
+
weekdays: getWeekdayNames(locale),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Get the ISO string for a date (YYYY-MM-DD format)
|
|
191
|
+
*/
|
|
192
|
+
export function toISODateString(date) {
|
|
193
|
+
return date.toISOString().split('T')[0];
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Create a date from ISO string (YYYY-MM-DD format)
|
|
197
|
+
*/
|
|
198
|
+
export function fromISODateString(isoString) {
|
|
199
|
+
const match = isoString.match(/^(\d{4})-(\d{2})-(\d{2})$/);
|
|
200
|
+
if (!match)
|
|
201
|
+
return null;
|
|
202
|
+
const [, year, month, day] = match;
|
|
203
|
+
return new Date(parseInt(year, 10), parseInt(month, 10) - 1, parseInt(day, 10));
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Validate if a date range is valid (start <= end)
|
|
207
|
+
*/
|
|
208
|
+
export function isValidRange(range) {
|
|
209
|
+
if (!range.start || !range.end)
|
|
210
|
+
return true;
|
|
211
|
+
return range.start <= range.end;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Get the number of days between two dates
|
|
215
|
+
*/
|
|
216
|
+
export function getDaysBetween(start, end) {
|
|
217
|
+
const startTime = normalizeDate(start).getTime();
|
|
218
|
+
const endTime = normalizeDate(end).getTime();
|
|
219
|
+
return Math.abs(Math.floor((endTime - startTime) / (24 * 60 * 60 * 1000)));
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=DatePickerUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatePickerUtils.js","sourceRoot":"","sources":["../../../../../src/md/date-picker/internals/DatePickerUtils.ts"],"names":[],"mappings":"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","sourcesContent":["export interface DateRange {\n start: Date | null\n end: Date | null\n}\n\nexport interface CalendarDay {\n date: Date\n isCurrentMonth: boolean\n isToday: boolean\n isSelected: boolean\n isInRange: boolean\n isRangeStart: boolean\n isRangeEnd: boolean\n isDisabled: boolean\n}\n\nexport interface CalendarMonth {\n year: number\n month: number // 0-indexed (0 = January)\n days: CalendarDay[]\n weekdays: string[]\n}\n\n/**\n * Get the current date with time set to midnight\n */\nexport function today(): Date {\n const now = new Date()\n return new Date(now.getFullYear(), now.getMonth(), now.getDate())\n}\n\n/**\n * Create a new date with time set to midnight\n */\nexport function normalizeDate(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate())\n}\n\n/**\n * Check if two dates are the same day\n */\nexport function isSameDay(date1: Date, date2: Date): boolean {\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n )\n}\n\n/**\n * Check if a date is between two other dates (inclusive)\n */\nexport function isBetween(date: Date, start: Date, end: Date): boolean {\n const normalizedDate = normalizeDate(date)\n const normalizedStart = normalizeDate(start)\n const normalizedEnd = normalizeDate(end)\n return normalizedDate >= normalizedStart && normalizedDate <= normalizedEnd\n}\n\n/**\n * Add months to a date\n */\nexport function addMonths(date: Date, months: number): Date {\n const result = new Date(date)\n result.setMonth(result.getMonth() + months)\n return result\n}\n\n/**\n * Add days to a date\n */\nexport function addDays(date: Date, days: number): Date {\n const result = new Date(date)\n result.setDate(result.getDate() + days)\n return result\n}\n\n/**\n * Get the first day of the month\n */\nexport function getFirstDayOfMonth(year: number, month: number): Date {\n return new Date(year, month, 1)\n}\n\n/**\n * Get the last day of the month\n */\nexport function getLastDayOfMonth(year: number, month: number): Date {\n return new Date(year, month + 1, 0)\n}\n\n/**\n * Get the number of days in a month\n */\nexport function getDaysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate()\n}\n\n/**\n * Get weekday names for the current locale\n */\nexport function getWeekdayNames(locale?: string): string[] {\n const formatter = new Intl.DateTimeFormat(locale, { weekday: 'short' })\n const days: string[] = []\n\n // Start from Sunday and get all 7 days\n const date = new Date(2024, 0, 7) // January 7, 2024 is a Sunday\n for (let i = 0; i < 7; i++) {\n days.push(formatter.format(new Date(date.getTime() + i * 24 * 60 * 60 * 1000)))\n }\n\n return days\n}\n\n/**\n * Get month names for the current locale\n */\nexport function getMonthNames(locale?: string): string[] {\n const formatter = new Intl.DateTimeFormat(locale, { month: 'short' })\n const months: string[] = []\n\n for (let i = 0; i < 12; i++) {\n months.push(formatter.format(new Date(2024, i, 1)))\n }\n\n return months\n}\n\n/**\n * Format a date according to locale\n */\nexport function formatDate(date: Date, locale?: string, options?: Intl.DateTimeFormatOptions): string {\n const defaultOptions: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n }\n\n return new Intl.DateTimeFormat(locale, { ...defaultOptions, ...options }).format(date)\n}\n\n/**\n * Parse a date string in various formats\n */\nexport function parseDate(dateString: string): Date | null {\n if (!dateString) return null\n\n // Try ISO format first\n const isoDate = new Date(dateString)\n if (!isNaN(isoDate.getTime())) {\n return normalizeDate(isoDate)\n }\n\n // Try other common formats\n const formats = [\n /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/, // MM/DD/YYYY or M/D/YYYY\n /^(\\d{1,2})-(\\d{1,2})-(\\d{4})$/, // MM-DD-YYYY or M-D-YYYY\n /^(\\d{4})-(\\d{1,2})-(\\d{1,2})$/, // YYYY-MM-DD or YYYY-M-D\n ]\n\n for (const format of formats) {\n const match = dateString.match(format)\n if (match) {\n const [, part1, part2, part3] = match\n let year: number, month: number, day: number\n\n if (format === formats[2]) {\n // YYYY-MM-DD\n year = parseInt(part1, 10)\n month = parseInt(part2, 10) - 1 // Convert to 0-indexed\n day = parseInt(part3, 10)\n } else {\n // MM/DD/YYYY or MM-DD-YYYY\n year = parseInt(part3, 10)\n month = parseInt(part1, 10) - 1 // Convert to 0-indexed\n day = parseInt(part2, 10)\n }\n\n const date = new Date(year, month, day)\n if (!isNaN(date.getTime())) {\n return date\n }\n }\n }\n\n return null\n}\n\n/**\n * Generate calendar data for a specific month\n */\nexport function generateCalendarMonth(\n year: number,\n month: number,\n selectedDate?: Date | null,\n selectedRange?: DateRange | null,\n disabledDates?: Date[],\n locale?: string\n): CalendarMonth {\n const firstDay = getFirstDayOfMonth(year, month)\n const todayDate = today()\n\n // Get the first day of the week (0 = Sunday, 1 = Monday)\n const firstDayOfWeek = firstDay.getDay()\n\n // Calculate start date (might be from previous month)\n const startDate = addDays(firstDay, -firstDayOfWeek)\n\n // Calculate end date (might be from next month)\n const daysToShow = 42 // 6 weeks * 7 days\n const endDate = addDays(startDate, daysToShow - 1)\n\n const days: CalendarDay[] = []\n const currentDate = new Date(startDate)\n\n while (currentDate <= endDate) {\n const isCurrentMonth = currentDate.getMonth() === month\n const isToday = isSameDay(currentDate, todayDate)\n const isSelected = selectedDate ? isSameDay(currentDate, selectedDate) : false\n\n let isInRange = false\n let isRangeStart = false\n let isRangeEnd = false\n\n if (selectedRange?.start && selectedRange?.end) {\n isRangeStart = isSameDay(currentDate, selectedRange.start)\n isRangeEnd = isSameDay(currentDate, selectedRange.end)\n isInRange = isBetween(currentDate, selectedRange.start, selectedRange.end)\n }\n\n const isDisabled = disabledDates?.some((disabledDate) => isSameDay(currentDate, disabledDate)) || false\n\n days.push({\n date: new Date(currentDate),\n isCurrentMonth,\n isToday,\n isSelected,\n isInRange,\n isRangeStart,\n isRangeEnd,\n isDisabled,\n })\n\n currentDate.setDate(currentDate.getDate() + 1)\n }\n\n return {\n year,\n month,\n days,\n weekdays: getWeekdayNames(locale),\n }\n}\n\n/**\n * Get the ISO string for a date (YYYY-MM-DD format)\n */\nexport function toISODateString(date: Date): string {\n return date.toISOString().split('T')[0]\n}\n\n/**\n * Create a date from ISO string (YYYY-MM-DD format)\n */\nexport function fromISODateString(isoString: string): Date | null {\n const match = isoString.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/)\n if (!match) return null\n\n const [, year, month, day] = match\n return new Date(parseInt(year, 10), parseInt(month, 10) - 1, parseInt(day, 10))\n}\n\n/**\n * Validate if a date range is valid (start <= end)\n */\nexport function isValidRange(range: DateRange): boolean {\n if (!range.start || !range.end) return true\n return range.start <= range.end\n}\n\n/**\n * Get the number of days between two dates\n */\nexport function getDaysBetween(start: Date, end: Date): number {\n const startTime = normalizeDate(start).getTime()\n const endTime = normalizeDate(end).getTime()\n return Math.abs(Math.floor((endTime - startTime) / (24 * 60 * 60 * 1000)))\n}\n"]}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { LitElement, TemplateResult } from 'lit';
|
|
2
|
+
import './internals/DatePickerCalendar.js';
|
|
3
|
+
import '../../md/text-field/ui-outlined-text-field.js';
|
|
4
|
+
import '../../md/icons/ui-icon.js';
|
|
5
|
+
/**
|
|
6
|
+
* A docked date picker that opens from a text field input.
|
|
7
|
+
* Ideal for forms and date selection in medium to large layouts.
|
|
8
|
+
*
|
|
9
|
+
* ## Features
|
|
10
|
+
* - Text field input with calendar dropdown
|
|
11
|
+
* - Keyboard navigation support (Arrow Down, Enter, Escape)
|
|
12
|
+
* - Custom date formatting
|
|
13
|
+
* - Input validation and error handling
|
|
14
|
+
* - Min/max date constraints
|
|
15
|
+
* - Disabled dates support
|
|
16
|
+
* - Accessible design with proper ARIA attributes
|
|
17
|
+
* - CSS Anchor Positioning API for dropdown placement
|
|
18
|
+
*
|
|
19
|
+
* ## Events
|
|
20
|
+
*
|
|
21
|
+
* ### `change`
|
|
22
|
+
* Fired when the selected date changes.
|
|
23
|
+
*
|
|
24
|
+
* **Detail:**
|
|
25
|
+
* ```typescript
|
|
26
|
+
* {
|
|
27
|
+
* value: Date | null,
|
|
28
|
+
* formattedValue: string
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* ## Usage
|
|
33
|
+
*
|
|
34
|
+
* ### Basic usage
|
|
35
|
+
* ```html
|
|
36
|
+
* <ui-date-picker-input
|
|
37
|
+
* label="Select date"
|
|
38
|
+
* name="birthDate"
|
|
39
|
+
* placeholder="MM/DD/YYYY"
|
|
40
|
+
* .value=${new Date()}
|
|
41
|
+
* @change=${this.handleDateChange}
|
|
42
|
+
* ></ui-date-picker-input>
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* ### With validation
|
|
46
|
+
* ```html
|
|
47
|
+
* <ui-date-picker-input
|
|
48
|
+
* label="Birth date"
|
|
49
|
+
* name="birthDate"
|
|
50
|
+
* required
|
|
51
|
+
* .error=${this.hasError}
|
|
52
|
+
* .errorMessage=${"Please select a valid date"}
|
|
53
|
+
* .minDate=${new Date('1900-01-01')}
|
|
54
|
+
* .maxDate=${new Date()}
|
|
55
|
+
* ></ui-date-picker-input>
|
|
56
|
+
* ```
|
|
57
|
+
*
|
|
58
|
+
* ### Custom date format
|
|
59
|
+
* ```html
|
|
60
|
+
* <ui-date-picker-input
|
|
61
|
+
* label="Birth date"
|
|
62
|
+
* .dateFormat=${date => date.toLocaleDateString('en-GB')}
|
|
63
|
+
* ></ui-date-picker-input>
|
|
64
|
+
* ```
|
|
65
|
+
*
|
|
66
|
+
* ### With disabled dates
|
|
67
|
+
* ```html
|
|
68
|
+
* <ui-date-picker-input
|
|
69
|
+
* label="Appointment date"
|
|
70
|
+
* .disabledDates=${[new Date('2024-12-25'), new Date('2024-01-01')]}
|
|
71
|
+
* ></ui-date-picker-input>
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export declare class UiDatePickerInput extends LitElement {
|
|
75
|
+
static styles: import("lit").CSSResult;
|
|
76
|
+
static shadowRootOptions: ShadowRootInit;
|
|
77
|
+
/**
|
|
78
|
+
* The label for the input field
|
|
79
|
+
*/
|
|
80
|
+
accessor label: string;
|
|
81
|
+
/**
|
|
82
|
+
* The name attribute for the input field (for form handling)
|
|
83
|
+
*/
|
|
84
|
+
accessor name: string;
|
|
85
|
+
/**
|
|
86
|
+
* Placeholder text for the input
|
|
87
|
+
*/
|
|
88
|
+
accessor placeholder: string;
|
|
89
|
+
/**
|
|
90
|
+
* The currently selected date
|
|
91
|
+
*/
|
|
92
|
+
accessor value: Date | null;
|
|
93
|
+
/**
|
|
94
|
+
* Whether the date picker is disabled
|
|
95
|
+
*/
|
|
96
|
+
accessor disabled: boolean;
|
|
97
|
+
/**
|
|
98
|
+
* Whether the input is required
|
|
99
|
+
*/
|
|
100
|
+
accessor required: boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Error message to display
|
|
103
|
+
*/
|
|
104
|
+
accessor errorMessage: string;
|
|
105
|
+
/**
|
|
106
|
+
* Whether the input has an error state
|
|
107
|
+
*/
|
|
108
|
+
accessor error: boolean;
|
|
109
|
+
/**
|
|
110
|
+
* Minimum selectable date
|
|
111
|
+
*/
|
|
112
|
+
accessor minDate: Date | undefined;
|
|
113
|
+
/**
|
|
114
|
+
* Maximum selectable date
|
|
115
|
+
*/
|
|
116
|
+
accessor maxDate: Date | undefined;
|
|
117
|
+
/**
|
|
118
|
+
* Array of disabled dates
|
|
119
|
+
*/
|
|
120
|
+
accessor disabledDates: Date[] | undefined;
|
|
121
|
+
/**
|
|
122
|
+
* Locale for date formatting
|
|
123
|
+
*/
|
|
124
|
+
accessor locale: string | undefined;
|
|
125
|
+
/**
|
|
126
|
+
* Custom date format function
|
|
127
|
+
*/
|
|
128
|
+
accessor dateFormat: ((date: Date) => string) | undefined;
|
|
129
|
+
private accessor isOpen;
|
|
130
|
+
private accessor inputValue;
|
|
131
|
+
private accessor textField;
|
|
132
|
+
constructor();
|
|
133
|
+
connectedCallback(): void;
|
|
134
|
+
disconnectedCallback(): void;
|
|
135
|
+
willUpdate(changedProperties: Map<string | number | symbol, unknown>): void;
|
|
136
|
+
updated(changedProperties: Map<string | number | symbol, unknown>): void;
|
|
137
|
+
private updateInputValue;
|
|
138
|
+
private handleDocumentClick;
|
|
139
|
+
private handleInputClick;
|
|
140
|
+
private handleInputChange;
|
|
141
|
+
private handleCalendarDateSelect;
|
|
142
|
+
private handleCalendarDateCancel;
|
|
143
|
+
private handleKeyDown;
|
|
144
|
+
private dispatchChangeEvent;
|
|
145
|
+
private renderCalendarIcon;
|
|
146
|
+
private renderDropdown;
|
|
147
|
+
render(): TemplateResult;
|
|
148
|
+
}
|
|
149
|
+
declare global {
|
|
150
|
+
interface HTMLElementTagNameMap {
|
|
151
|
+
'ui-date-picker-input': UiDatePickerInput;
|
|
152
|
+
}
|
|
153
|
+
interface HTMLElementEventMap {
|
|
154
|
+
change: CustomEvent<{
|
|
155
|
+
value: Date | null;
|
|
156
|
+
formattedValue: string;
|
|
157
|
+
}>;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=ui-date-picker-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-date-picker-input.d.ts","sourceRoot":"","sources":["../../../../src/md/date-picker/ui-date-picker-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,cAAc,EAAE,MAAM,KAAK,CAAA;AAKtD,OAAO,mCAAmC,CAAA;AAC1C,OAAO,+CAA+C,CAAA;AACtD,OAAO,2BAA2B,CAAA;AAElC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoEG;AACH,qBACa,iBAAkB,SAAQ,UAAU;IAC/C,OAAgB,MAAM,0BAAc;IACpC,OAAgB,iBAAiB,EAAE,cAAc,CAGhD;IAED;;OAEG;IACyB,QAAQ,CAAC,KAAK,SAAK;IAE/C;;OAEG;IACyB,QAAQ,CAAC,IAAI,SAAK;IAE9C;;OAEG;IACyB,QAAQ,CAAC,WAAW,SAAe;IAE/D;;OAEG;IACyB,QAAQ,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,CAAO;IAE9D;;OAEG;IAC0B,QAAQ,CAAC,QAAQ,UAAQ;IAEtD;;OAEG;IAC0B,QAAQ,CAAC,QAAQ,UAAQ;IAEtD;;OAEG;IACyB,QAAQ,CAAC,YAAY,SAAK;IAEtD;;OAEG;IAC0B,QAAQ,CAAC,KAAK,UAAQ;IAEnD;;OAEG;IACyB,QAAQ,CAAC,OAAO,EAAE,IAAI,GAAG,SAAS,CAAY;IAE1E;;OAEG;IACyB,QAAQ,CAAC,OAAO,EAAE,IAAI,GAAG,SAAS,CAAY;IAE1E;;OAEG;IACwB,QAAQ,CAAC,aAAa,EAAE,IAAI,EAAE,GAAG,SAAS,CAAY;IAEjF;;OAEG;IACyB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAY;IAE3E;;OAEG;IACyB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,GAAG,SAAS,CAAY;IAExF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAE/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAK;IAER,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;;IAUhE,iBAAiB,IAAI,IAAI;IAMzB,oBAAoB,IAAI,IAAI;IAK5B,UAAU,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM3E,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAUjF,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,wBAAwB;IAMhC,OAAO,CAAC,wBAAwB;IAIhC,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,cAAc;IAuBb,MAAM,IAAI,cAAc;CAwBlC;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,sBAAsB,EAAE,iBAAiB,CAAA;KAC1C;IAED,UAAU,mBAAmB;QAC3B,MAAM,EAAE,WAAW,CAAC;YAClB,KAAK,EAAE,IAAI,GAAG,IAAI,CAAA;YAClB,cAAc,EAAE,MAAM,CAAA;SACvB,CAAC,CAAA;KACH;CACF"}
|