@raintonic/formaui 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +145 -0
- package/fesm2022/raintonic-formaui-cdk-drag-drop.mjs +806 -0
- package/fesm2022/raintonic-formaui-cdk-drag-drop.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-cdk-form-field.mjs +86 -0
- package/fesm2022/raintonic-formaui-cdk-form-field.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-cdk-overlay.mjs +1757 -0
- package/fesm2022/raintonic-formaui-cdk-overlay.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-cdk-virtual-scroll.mjs +287 -0
- package/fesm2022/raintonic-formaui-cdk-virtual-scroll.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-accordion.mjs +217 -0
- package/fesm2022/raintonic-formaui-components-accordion.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-alert.mjs +161 -0
- package/fesm2022/raintonic-formaui-components-alert.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-autocomplete.mjs +726 -0
- package/fesm2022/raintonic-formaui-components-autocomplete.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-avatar.mjs +92 -0
- package/fesm2022/raintonic-formaui-components-avatar.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-badge.mjs +107 -0
- package/fesm2022/raintonic-formaui-components-badge.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-big-menu.mjs +68 -0
- package/fesm2022/raintonic-formaui-components-big-menu.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-breadcrumb.mjs +55 -0
- package/fesm2022/raintonic-formaui-components-breadcrumb.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-button-group.mjs +103 -0
- package/fesm2022/raintonic-formaui-components-button-group.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-button.mjs +241 -0
- package/fesm2022/raintonic-formaui-components-button.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-card.mjs +270 -0
- package/fesm2022/raintonic-formaui-components-card.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-checkbox.mjs +295 -0
- package/fesm2022/raintonic-formaui-components-checkbox.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-data-table.mjs +631 -0
- package/fesm2022/raintonic-formaui-components-data-table.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-date-picker.mjs +1331 -0
- package/fesm2022/raintonic-formaui-components-date-picker.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-divider.mjs +41 -0
- package/fesm2022/raintonic-formaui-components-divider.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-drawer.mjs +190 -0
- package/fesm2022/raintonic-formaui-components-drawer.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-dynamic-form.mjs +266 -0
- package/fesm2022/raintonic-formaui-components-dynamic-form.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-empty-state.mjs +33 -0
- package/fesm2022/raintonic-formaui-components-empty-state.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-file-upload.mjs +246 -0
- package/fesm2022/raintonic-formaui-components-file-upload.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-form-field.mjs +482 -0
- package/fesm2022/raintonic-formaui-components-form-field.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-icon.mjs +117 -0
- package/fesm2022/raintonic-formaui-components-icon.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-input.mjs +327 -0
- package/fesm2022/raintonic-formaui-components-input.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-list.mjs +149 -0
- package/fesm2022/raintonic-formaui-components-list.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-menu.mjs +896 -0
- package/fesm2022/raintonic-formaui-components-menu.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-number-input.mjs +345 -0
- package/fesm2022/raintonic-formaui-components-number-input.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-paginator.mjs +139 -0
- package/fesm2022/raintonic-formaui-components-paginator.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-password-input.mjs +306 -0
- package/fesm2022/raintonic-formaui-components-password-input.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-popover.mjs +451 -0
- package/fesm2022/raintonic-formaui-components-popover.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-progressbar.mjs +148 -0
- package/fesm2022/raintonic-formaui-components-progressbar.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-radio.mjs +260 -0
- package/fesm2022/raintonic-formaui-components-radio.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-select.mjs +1011 -0
- package/fesm2022/raintonic-formaui-components-select.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-side-panel.mjs +150 -0
- package/fesm2022/raintonic-formaui-components-side-panel.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-sidebar.mjs +257 -0
- package/fesm2022/raintonic-formaui-components-sidebar.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-skeleton.mjs +50 -0
- package/fesm2022/raintonic-formaui-components-skeleton.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-slider.mjs +347 -0
- package/fesm2022/raintonic-formaui-components-slider.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-spinner.mjs +63 -0
- package/fesm2022/raintonic-formaui-components-spinner.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-stepper.mjs +317 -0
- package/fesm2022/raintonic-formaui-components-stepper.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-tab.mjs +197 -0
- package/fesm2022/raintonic-formaui-components-tab.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-tag.mjs +78 -0
- package/fesm2022/raintonic-formaui-components-tag.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-time-picker.mjs +644 -0
- package/fesm2022/raintonic-formaui-components-time-picker.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-toggle.mjs +171 -0
- package/fesm2022/raintonic-formaui-components-toggle.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-toolbar.mjs +140 -0
- package/fesm2022/raintonic-formaui-components-toolbar.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-tooltip.mjs +555 -0
- package/fesm2022/raintonic-formaui-components-tooltip.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-tree-select.mjs +314 -0
- package/fesm2022/raintonic-formaui-components-tree-select.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-tree-table.mjs +103 -0
- package/fesm2022/raintonic-formaui-components-tree-table.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-tree.mjs +430 -0
- package/fesm2022/raintonic-formaui-components-tree.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-core.mjs +62 -0
- package/fesm2022/raintonic-formaui-core.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-services-dialog.mjs +798 -0
- package/fesm2022/raintonic-formaui-services-dialog.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-services-notification.mjs +391 -0
- package/fesm2022/raintonic-formaui-services-notification.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-services-theme.mjs +248 -0
- package/fesm2022/raintonic-formaui-services-theme.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-test-utils.mjs +66 -0
- package/fesm2022/raintonic-formaui-test-utils.mjs.map +1 -0
- package/fesm2022/raintonic-formaui.mjs +15 -0
- package/fesm2022/raintonic-formaui.mjs.map +1 -0
- package/llms-full.txt +1627 -0
- package/llms.txt +60 -0
- package/package.json +251 -0
- package/styles/_fonts-entry.scss +3 -0
- package/styles/fonts/dm-mono-400-latin.woff2 +0 -0
- package/styles/fonts/inter-tight-latin-italic.woff2 +0 -0
- package/styles/fonts/inter-tight-latin.woff2 +0 -0
- package/styles/index.scss +127 -0
- package/styles/partials/_constants.scss +29 -0
- package/styles/partials/_fonts.scss +36 -0
- package/styles/partials/_grid.scss +171 -0
- package/styles/partials/_mixins.scss +145 -0
- package/styles/partials/_motion.scss +252 -0
- package/styles/partials/_theme.scss +275 -0
- package/styles/partials/_typography.scss +112 -0
- package/styles/partials/_utilities.scss +480 -0
- package/styles/partials/themes/_dark.scss +254 -0
- package/styles/partials/themes/_light.scss +254 -0
- package/types/raintonic-formaui-cdk-drag-drop.d.ts +196 -0
- package/types/raintonic-formaui-cdk-drag-drop.d.ts.map +1 -0
- package/types/raintonic-formaui-cdk-form-field.d.ts +62 -0
- package/types/raintonic-formaui-cdk-form-field.d.ts.map +1 -0
- package/types/raintonic-formaui-cdk-overlay.d.ts +843 -0
- package/types/raintonic-formaui-cdk-overlay.d.ts.map +1 -0
- package/types/raintonic-formaui-cdk-virtual-scroll.d.ts +112 -0
- package/types/raintonic-formaui-cdk-virtual-scroll.d.ts.map +1 -0
- package/types/raintonic-formaui-components-accordion.d.ts +124 -0
- package/types/raintonic-formaui-components-accordion.d.ts.map +1 -0
- package/types/raintonic-formaui-components-alert.d.ts +143 -0
- package/types/raintonic-formaui-components-alert.d.ts.map +1 -0
- package/types/raintonic-formaui-components-autocomplete.d.ts +193 -0
- package/types/raintonic-formaui-components-autocomplete.d.ts.map +1 -0
- package/types/raintonic-formaui-components-avatar.d.ts +52 -0
- package/types/raintonic-formaui-components-avatar.d.ts.map +1 -0
- package/types/raintonic-formaui-components-badge.d.ts +47 -0
- package/types/raintonic-formaui-components-badge.d.ts.map +1 -0
- package/types/raintonic-formaui-components-big-menu.d.ts +62 -0
- package/types/raintonic-formaui-components-big-menu.d.ts.map +1 -0
- package/types/raintonic-formaui-components-breadcrumb.d.ts +26 -0
- package/types/raintonic-formaui-components-breadcrumb.d.ts.map +1 -0
- package/types/raintonic-formaui-components-button-group.d.ts +61 -0
- package/types/raintonic-formaui-components-button-group.d.ts.map +1 -0
- package/types/raintonic-formaui-components-button.d.ts +116 -0
- package/types/raintonic-formaui-components-button.d.ts.map +1 -0
- package/types/raintonic-formaui-components-card.d.ts +191 -0
- package/types/raintonic-formaui-components-card.d.ts.map +1 -0
- package/types/raintonic-formaui-components-checkbox.d.ts +132 -0
- package/types/raintonic-formaui-components-checkbox.d.ts.map +1 -0
- package/types/raintonic-formaui-components-data-table.d.ts +368 -0
- package/types/raintonic-formaui-components-data-table.d.ts.map +1 -0
- package/types/raintonic-formaui-components-date-picker.d.ts +341 -0
- package/types/raintonic-formaui-components-date-picker.d.ts.map +1 -0
- package/types/raintonic-formaui-components-divider.d.ts +21 -0
- package/types/raintonic-formaui-components-divider.d.ts.map +1 -0
- package/types/raintonic-formaui-components-drawer.d.ts +48 -0
- package/types/raintonic-formaui-components-drawer.d.ts.map +1 -0
- package/types/raintonic-formaui-components-dynamic-form.d.ts +412 -0
- package/types/raintonic-formaui-components-dynamic-form.d.ts.map +1 -0
- package/types/raintonic-formaui-components-empty-state.d.ts +14 -0
- package/types/raintonic-formaui-components-empty-state.d.ts.map +1 -0
- package/types/raintonic-formaui-components-file-upload.d.ts +77 -0
- package/types/raintonic-formaui-components-file-upload.d.ts.map +1 -0
- package/types/raintonic-formaui-components-form-field.d.ts +271 -0
- package/types/raintonic-formaui-components-form-field.d.ts.map +1 -0
- package/types/raintonic-formaui-components-icon.d.ts +61 -0
- package/types/raintonic-formaui-components-icon.d.ts.map +1 -0
- package/types/raintonic-formaui-components-input.d.ts +149 -0
- package/types/raintonic-formaui-components-input.d.ts.map +1 -0
- package/types/raintonic-formaui-components-list.d.ts +48 -0
- package/types/raintonic-formaui-components-list.d.ts.map +1 -0
- package/types/raintonic-formaui-components-menu.d.ts +403 -0
- package/types/raintonic-formaui-components-menu.d.ts.map +1 -0
- package/types/raintonic-formaui-components-number-input.d.ts +127 -0
- package/types/raintonic-formaui-components-number-input.d.ts.map +1 -0
- package/types/raintonic-formaui-components-paginator.d.ts +37 -0
- package/types/raintonic-formaui-components-paginator.d.ts.map +1 -0
- package/types/raintonic-formaui-components-password-input.d.ts +111 -0
- package/types/raintonic-formaui-components-password-input.d.ts.map +1 -0
- package/types/raintonic-formaui-components-popover.d.ts +131 -0
- package/types/raintonic-formaui-components-popover.d.ts.map +1 -0
- package/types/raintonic-formaui-components-progressbar.d.ts +111 -0
- package/types/raintonic-formaui-components-progressbar.d.ts.map +1 -0
- package/types/raintonic-formaui-components-radio.d.ts +95 -0
- package/types/raintonic-formaui-components-radio.d.ts.map +1 -0
- package/types/raintonic-formaui-components-select.d.ts +307 -0
- package/types/raintonic-formaui-components-select.d.ts.map +1 -0
- package/types/raintonic-formaui-components-side-panel.d.ts +51 -0
- package/types/raintonic-formaui-components-side-panel.d.ts.map +1 -0
- package/types/raintonic-formaui-components-sidebar.d.ts +174 -0
- package/types/raintonic-formaui-components-sidebar.d.ts.map +1 -0
- package/types/raintonic-formaui-components-skeleton.d.ts +20 -0
- package/types/raintonic-formaui-components-skeleton.d.ts.map +1 -0
- package/types/raintonic-formaui-components-slider.d.ts +108 -0
- package/types/raintonic-formaui-components-slider.d.ts.map +1 -0
- package/types/raintonic-formaui-components-spinner.d.ts +42 -0
- package/types/raintonic-formaui-components-spinner.d.ts.map +1 -0
- package/types/raintonic-formaui-components-stepper.d.ts +126 -0
- package/types/raintonic-formaui-components-stepper.d.ts.map +1 -0
- package/types/raintonic-formaui-components-tab.d.ts +96 -0
- package/types/raintonic-formaui-components-tab.d.ts.map +1 -0
- package/types/raintonic-formaui-components-tag.d.ts +34 -0
- package/types/raintonic-formaui-components-tag.d.ts.map +1 -0
- package/types/raintonic-formaui-components-time-picker.d.ts +172 -0
- package/types/raintonic-formaui-components-time-picker.d.ts.map +1 -0
- package/types/raintonic-formaui-components-toggle.d.ts +70 -0
- package/types/raintonic-formaui-components-toggle.d.ts.map +1 -0
- package/types/raintonic-formaui-components-toolbar.d.ts +128 -0
- package/types/raintonic-formaui-components-toolbar.d.ts.map +1 -0
- package/types/raintonic-formaui-components-tooltip.d.ts +268 -0
- package/types/raintonic-formaui-components-tooltip.d.ts.map +1 -0
- package/types/raintonic-formaui-components-tree-select.d.ts +80 -0
- package/types/raintonic-formaui-components-tree-select.d.ts.map +1 -0
- package/types/raintonic-formaui-components-tree-table.d.ts +90 -0
- package/types/raintonic-formaui-components-tree-table.d.ts.map +1 -0
- package/types/raintonic-formaui-components-tree.d.ts +104 -0
- package/types/raintonic-formaui-components-tree.d.ts.map +1 -0
- package/types/raintonic-formaui-core.d.ts +115 -0
- package/types/raintonic-formaui-core.d.ts.map +1 -0
- package/types/raintonic-formaui-services-dialog.d.ts +451 -0
- package/types/raintonic-formaui-services-dialog.d.ts.map +1 -0
- package/types/raintonic-formaui-services-notification.d.ts +221 -0
- package/types/raintonic-formaui-services-notification.d.ts.map +1 -0
- package/types/raintonic-formaui-services-theme.d.ts +126 -0
- package/types/raintonic-formaui-services-theme.d.ts.map +1 -0
- package/types/raintonic-formaui-test-utils.d.ts +24 -0
- package/types/raintonic-formaui-test-utils.d.ts.map +1 -0
- package/types/raintonic-formaui.d.ts +4 -0
- package/types/raintonic-formaui.d.ts.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raintonic-formaui-components-date-picker.mjs","sources":["../../../lib/components/date-picker/date-picker.utils.ts","../../../lib/components/date-picker/calendar/calendar.component.ts","../../../lib/components/date-picker/calendar/calendar.component.html","../../../lib/components/date-picker/date-picker.types.ts","../../../lib/components/date-picker/date-picker.component.ts","../../../lib/components/date-picker/date-picker.component.html","../../../lib/components/date-picker/raintonic-formaui-components-date-picker.ts"],"sourcesContent":["/**\n * Normalize a date to noon to avoid DST edge cases.\n */\nexport function normalizeDate(date: Date): Date {\n const d = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 12, 0, 0, 0);\n return d;\n}\n\n/**\n * Check if two dates are the same day (ignoring time).\n */\nexport function isSameDay(a: Date | null | undefined, b: Date | null | undefined): boolean {\n if (!a || !b) return false;\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n}\n\n/**\n * Check if a date is within [min, max] bounds (day-level).\n */\nexport function isDateInRange(date: Date, min: Date | null, max: Date | null): boolean {\n const d = normalizeDate(date).getTime();\n if (min && normalizeDate(min).getTime() > d) return false;\n if (max && normalizeDate(max).getTime() < d) return false;\n return true;\n}\n\n/**\n * Get number of days in a given month.\n */\nexport function getDaysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate();\n}\n\n/**\n * Get localized weekday labels.\n * @param firstDayOfWeek 0=Sunday, 1=Monday, etc.\n * @param format 'short' | 'narrow'\n */\nexport function getWeekdayLabels(firstDayOfWeek = 1, format: 'short' | 'narrow' = 'narrow'): string[] {\n const formatter = new Intl.DateTimeFormat(undefined, { weekday: format });\n const labels: string[] = [];\n // Jan 4, 2024 is a Thursday — use a known date to map\n // Instead, iterate from a known Sunday (Jan 7, 2024)\n const sunday = new Date(2024, 0, 7); // Known Sunday\n for (let i = 0; i < 7; i++) {\n const dayIndex = (firstDayOfWeek + i) % 7;\n const date = new Date(sunday);\n date.setDate(sunday.getDate() + dayIndex);\n labels.push(formatter.format(date));\n }\n return labels;\n}\n\n/**\n * Get localized month label.\n */\nexport function getMonthLabel(year: number, month: number, format: 'long' | 'short' = 'long'): string {\n const formatter = new Intl.DateTimeFormat(undefined, { month: format, year: 'numeric' });\n return formatter.format(new Date(year, month, 1));\n}\n\n/**\n * Get short month name (for month view grid).\n */\nexport function getShortMonthName(month: number): string {\n const formatter = new Intl.DateTimeFormat(undefined, { month: 'short' });\n return formatter.format(new Date(2024, month, 1));\n}\n\n/**\n * Build a 6x7 calendar grid for a given month.\n * @returns 6 rows of 7 Date objects each.\n */\nexport function buildCalendarGrid(year: number, month: number, firstDayOfWeek = 1): Date[][] {\n const firstOfMonth = new Date(year, month, 1);\n const dayOfWeek = firstOfMonth.getDay();\n // How many days to show from the previous month\n const offset = (dayOfWeek - firstDayOfWeek + 7) % 7;\n const startDate = new Date(year, month, 1 - offset);\n\n const weeks: Date[][] = [];\n const current = new Date(startDate);\n for (let week = 0; week < 6; week++) {\n const row: Date[] = [];\n for (let day = 0; day < 7; day++) {\n row.push(normalizeDate(new Date(current)));\n current.setDate(current.getDate() + 1);\n }\n weeks.push(row);\n }\n return weeks;\n}\n\n// --- Format / Parse ---\n\nfunction getSeparator(format: string): string {\n // Find first non-letter character\n const match = /[^dMyy]/.exec(format);\n return match ? match[0] : '/';\n}\n\n/**\n * Format a Date to a string using the given format pattern.\n * Supported tokens: dd, d, MM, M, yyyy, yy\n */\nexport function formatDate(date: Date | null, format: string): string {\n if (!date || isNaN(date.getTime())) return '';\n const day = date.getDate();\n const month = date.getMonth() + 1;\n const year = date.getFullYear();\n\n let result = format;\n // Replace in order of longest token first to avoid partial matches\n result = result.replace('dd', String(day).padStart(2, '0'));\n result = result.replace(/\\bd\\b/, String(day));\n result = result.replace('MM', String(month).padStart(2, '0'));\n result = result.replace(/\\bM\\b/, String(month));\n result = result.replace('yyyy', String(year).padStart(4, '0'));\n result = result.replace('yy', String(year % 100).padStart(2, '0'));\n return result;\n}\n\n/**\n * Parse a date string to a Date using the given format.\n * Returns null on failure.\n */\nexport function parseDate(text: string, format: string): Date | null {\n if (!text?.trim()) return null;\n\n const sep = getSeparator(format);\n const parts = text.split(sep);\n\n // Build a map of token → position in split parts\n let day = -1;\n let month = -1;\n let year = -1;\n\n // Build expected parts from format\n const formatParts = format.split(sep);\n if (parts.length !== formatParts.length) return null;\n\n for (let i = 0; i < formatParts.length; i++) {\n const fp = formatParts[i];\n const val = parseInt(parts[i], 10);\n if (isNaN(val)) return null;\n\n if (fp === 'dd' || fp === 'd') {\n day = val;\n } else if (fp === 'MM' || fp === 'M') {\n month = val;\n } else if (fp === 'yyyy') {\n year = val;\n } else if (fp === 'yy') {\n year = val < 50 ? 2000 + val : 1900 + val;\n }\n }\n\n if (day < 1 || day > 31 || month < 1 || month > 12 || year < 0) return null;\n\n // Validate day for the given month\n const daysInMonth = getDaysInMonth(year, month - 1);\n if (day > daysInMonth) return null;\n\n return normalizeDate(new Date(year, month - 1, day));\n}\n\n/**\n * Apply date mask to raw input as user types.\n * Returns the masked value and corrected cursor position.\n */\nexport function applyDateMask(rawInput: string, format: string): { masked: string; cursor: number } {\n const sep = getSeparator(format);\n const digits = rawInput.replace(/\\D/g, '');\n\n // Build a pattern of digit counts from format tokens\n // e.g., 'dd/MM/yyyy' → [2, 2, 4] with separators at positions 2, 5\n const formatParts = format.split(sep);\n const digitCounts = formatParts.map((p) => p.length);\n const maxDigits = digitCounts.reduce((a, b) => a + b, 0);\n\n const capped = digits.substring(0, maxDigits);\n\n let masked = '';\n let digitIndex = 0;\n\n for (let partIdx = 0; partIdx < digitCounts.length; partIdx++) {\n const count = digitCounts[partIdx];\n const partDigits = capped.substring(digitIndex, digitIndex + count);\n\n if (partDigits.length === 0) break;\n\n if (partIdx > 0) {\n masked += sep;\n }\n masked += partDigits;\n digitIndex += partDigits.length;\n\n // Auto-insert separator when part is complete and there are more digits\n if (partDigits.length === count && digitIndex < capped.length && partIdx < digitCounts.length - 1) {\n // separator will be added in next iteration\n }\n }\n\n return { masked, cursor: masked.length };\n}\n\n/**\n * Check if date a is before date b (day-level).\n */\nexport function isBefore(a: Date, b: Date): boolean {\n return normalizeDate(a).getTime() < normalizeDate(b).getTime();\n}\n\n/**\n * Check if date a is after date b (day-level).\n */\nexport function isAfter(a: Date, b: Date): boolean {\n return normalizeDate(a).getTime() > normalizeDate(b).getTime();\n}\n\n/**\n * Check if date is between start and end (inclusive, day-level).\n */\nexport function isBetween(date: Date, start: Date | null, end: Date | null): boolean {\n if (!start || !end) return false;\n const d = normalizeDate(date).getTime();\n const s = normalizeDate(start).getTime();\n const e = normalizeDate(end).getTime();\n const min = Math.min(s, e);\n const max = Math.max(s, e);\n return d >= min && d <= max;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n output,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\nimport { CalendarDay, CalendarMonth, CalendarView, CalendarYear, DateFilterFn } from '../date-picker.types';\nimport {\n buildCalendarGrid,\n getDaysInMonth,\n getShortMonthName,\n getWeekdayLabels,\n isAfter,\n isBefore,\n isBetween,\n isDateInRange,\n isSameDay,\n normalizeDate,\n} from '../date-picker.utils';\n\n/**\n * @component FuiCalendarComponent\n * @selector fui-calendar\n * @description Internal calendar grid used by `fui-date-picker`. Renders day, month,\n * and year views with full keyboard navigation (Arrow keys, Home, End, PageUp/Down,\n * Enter, Escape). Supports single-date selection and range highlighting with hover preview.\n *\n * @input selected - Currently selected date for single mode (Date | null)\n * @input rangeStart - Start date of a range selection (Date | null)\n * @input rangeEnd - End date of a range selection (Date | null)\n * @input range - Whether range mode is active (default: false)\n * @input min - Minimum selectable date (Date | null)\n * @input max - Maximum selectable date (Date | null)\n * @input dateFilter - Custom filter function to disable specific dates (DateFilterFn | null)\n * @input startAt - Initial date to display when the calendar opens (Date | null)\n * @input firstDayOfWeek - First day of the week: 0 = Sunday, 1 = Monday (default: 1)\n * @input hoveredDate - Currently hovered date for range preview (Date | null)\n *\n * @output dateSelected - Emits the Date when a day cell is clicked or confirmed via keyboard\n * @output dateHovered - Emits the hovered Date or null on mouse enter/leave\n * @output monthChanged - Emits the new view Date when navigating months/years\n *\n * @example\n * <fui-calendar\n * [selected]=\"selectedDate\"\n * [min]=\"minDate\"\n * [max]=\"maxDate\"\n * (dateSelected)=\"onDateSelected($event)\">\n * </fui-calendar>\n */\n@Component({\n selector: 'fui-calendar',\n standalone: true,\n imports: [FuiIconComponent],\n templateUrl: './calendar.component.html',\n styleUrls: ['./calendar.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'fui-calendar',\n tabindex: '0',\n role: 'application',\n 'aria-label': 'Calendar',\n },\n})\nexport class FuiCalendarComponent {\n // Inputs\n readonly selected = input<Date | null>(null);\n readonly rangeStart = input<Date | null>(null);\n readonly rangeEnd = input<Date | null>(null);\n readonly range = input(false);\n readonly min = input<Date | null>(null);\n readonly max = input<Date | null>(null);\n readonly dateFilter = input<DateFilterFn | null>(null);\n readonly startAt = input<Date | null>(null);\n readonly firstDayOfWeek = input(1);\n readonly hoveredDate = input<Date | null>(null);\n\n // Outputs\n readonly dateSelected = output<Date>();\n readonly dateHovered = output<Date | null>();\n readonly monthChanged = output<Date>();\n\n // Internal state\n readonly currentView = signal<CalendarView>('days');\n readonly viewDate = signal(normalizeDate(new Date()));\n readonly activeDate = signal(normalizeDate(new Date()));\n\n // Computed: weekday header labels\n readonly weekDayHeaders = computed(() => getWeekdayLabels(this.firstDayOfWeek(), 'narrow'));\n\n // Computed: month/year labels for header\n readonly monthYearLabel = computed(() => {\n const d = this.viewDate();\n const formatter = new Intl.DateTimeFormat(undefined, { month: 'long', year: 'numeric' });\n return formatter.format(d);\n });\n\n readonly yearLabel = computed(() => {\n return String(this.viewDate().getFullYear());\n });\n\n readonly decadeLabel = computed(() => {\n const year = this.viewDate().getFullYear();\n const start = year - (year % 12);\n return `${start} \\u2013 ${start + 11}`;\n });\n\n // Accessible navigation button labels\n readonly prevButtonLabel = computed(() => {\n switch (this.currentView()) {\n case 'days':\n return 'Previous month';\n case 'months':\n return 'Previous year';\n case 'years':\n return 'Previous decade';\n }\n });\n\n readonly nextButtonLabel = computed(() => {\n switch (this.currentView()) {\n case 'days':\n return 'Next month';\n case 'months':\n return 'Next year';\n case 'years':\n return 'Next decade';\n }\n });\n\n readonly headerButtonLabel = computed(() => {\n switch (this.currentView()) {\n case 'days':\n return 'Switch to month view';\n case 'months':\n return 'Switch to year view';\n case 'years':\n return this.decadeLabel();\n }\n });\n\n // Computed: 6x7 calendar day grid\n readonly weeks = computed<CalendarDay[][]>(() => {\n const vd = this.viewDate();\n const grid = buildCalendarGrid(vd.getFullYear(), vd.getMonth(), this.firstDayOfWeek());\n const today = normalizeDate(new Date());\n const sel = this.selected();\n const rStart = this.rangeStart();\n const rEnd = this.rangeEnd();\n const hovered = this.hoveredDate();\n const isRange = this.range();\n const minDate = this.min();\n const maxDate = this.max();\n const filter = this.dateFilter();\n\n return grid.map((week) =>\n week.map((date) => {\n const isCurrentMonth = date.getMonth() === vd.getMonth();\n const isDisabled = !isDateInRange(date, minDate, maxDate) || (filter ? !filter(date) : false);\n const isSelected = !isRange ? isSameDay(date, sel) : isSameDay(date, rStart) || isSameDay(date, rEnd);\n const isRangeStart = isRange && isSameDay(date, rStart);\n const isRangeEnd = isRange && rEnd ? isSameDay(date, rEnd) : false;\n const isInRange =\n isRange && rStart && rEnd ? isBetween(date, rStart, rEnd) && !isRangeStart && !isRangeEnd : false;\n const isRangePreview =\n isRange && rStart && !rEnd && hovered\n ? isBetween(date, rStart, hovered) && !isSameDay(date, rStart) && !isSameDay(date, hovered)\n : false;\n\n return {\n date,\n day: date.getDate(),\n isCurrentMonth,\n isToday: isSameDay(date, today),\n isSelected,\n isDisabled,\n isRangeStart,\n isRangeEnd,\n isInRange,\n isRangePreview,\n } satisfies CalendarDay;\n }),\n );\n });\n\n // Computed: 3x4 months grid\n readonly monthsGrid = computed<CalendarMonth[][]>(() => {\n const vd = this.viewDate();\n const currentYear = vd.getFullYear();\n const now = new Date();\n const sel = this.selected();\n const rStart = this.rangeStart();\n const minDate = this.min();\n const maxDate = this.max();\n\n const months: CalendarMonth[] = [];\n for (let m = 0; m < 12; m++) {\n const isDisabled = this._isMonthDisabled(currentYear, m, minDate, maxDate);\n const isSelected = sel ? sel.getFullYear() === currentYear && sel.getMonth() === m : false;\n months.push({\n month: m,\n label: getShortMonthName(m),\n isCurrentMonth: now.getFullYear() === currentYear && now.getMonth() === m,\n isSelected: isSelected || (rStart ? rStart.getFullYear() === currentYear && rStart.getMonth() === m : false),\n isDisabled,\n });\n }\n\n // Arrange in 4 rows of 3\n const grid: CalendarMonth[][] = [];\n for (let i = 0; i < 12; i += 3) {\n grid.push(months.slice(i, i + 3));\n }\n return grid;\n });\n\n // Computed: 3x4 years grid\n readonly yearsGrid = computed<CalendarYear[][]>(() => {\n const vd = this.viewDate();\n const baseYear = vd.getFullYear();\n const startYear = baseYear - (baseYear % 12);\n const now = new Date();\n const sel = this.selected();\n const rStart = this.rangeStart();\n const minDate = this.min();\n const maxDate = this.max();\n\n const years: CalendarYear[] = [];\n for (let i = 0; i < 12; i++) {\n const year = startYear + i;\n const isDisabled = this._isYearDisabled(year, minDate, maxDate);\n const isSelected = sel ? sel.getFullYear() === year : false;\n years.push({\n year,\n isCurrentYear: now.getFullYear() === year,\n isSelected: isSelected || (rStart ? rStart.getFullYear() === year : false),\n isDisabled,\n });\n }\n\n const grid: CalendarYear[][] = [];\n for (let i = 0; i < 12; i += 3) {\n grid.push(years.slice(i, i + 3));\n }\n return grid;\n });\n\n private readonly _elementRef = inject(ElementRef);\n\n constructor() {\n // Initialize viewDate from startAt or selected or now\n const initial = this.startAt() ?? this.selected() ?? new Date();\n this.viewDate.set(normalizeDate(initial));\n this.activeDate.set(normalizeDate(initial));\n }\n\n // --- Header actions ---\n\n onHeaderLabelClick(): void {\n const view = this.currentView();\n if (view === 'days') {\n this.currentView.set('months');\n } else if (view === 'months') {\n this.currentView.set('years');\n }\n }\n\n onPrev(): void {\n const view = this.currentView();\n const vd = this.viewDate();\n if (view === 'days') {\n this.viewDate.set(new Date(vd.getFullYear(), vd.getMonth() - 1, 1, 12));\n } else if (view === 'months') {\n this.viewDate.set(new Date(vd.getFullYear() - 1, vd.getMonth(), 1, 12));\n } else {\n this.viewDate.set(new Date(vd.getFullYear() - 12, vd.getMonth(), 1, 12));\n }\n this.monthChanged.emit(this.viewDate());\n }\n\n onNext(): void {\n const view = this.currentView();\n const vd = this.viewDate();\n if (view === 'days') {\n this.viewDate.set(new Date(vd.getFullYear(), vd.getMonth() + 1, 1, 12));\n } else if (view === 'months') {\n this.viewDate.set(new Date(vd.getFullYear() + 1, vd.getMonth(), 1, 12));\n } else {\n this.viewDate.set(new Date(vd.getFullYear() + 12, vd.getMonth(), 1, 12));\n }\n this.monthChanged.emit(this.viewDate());\n }\n\n // --- Day view actions ---\n\n onDayClick(day: CalendarDay): void {\n if (day.isDisabled) return;\n this.dateSelected.emit(day.date);\n }\n\n onDayMouseEnter(day: CalendarDay): void {\n if (day.isDisabled) return;\n this.dateHovered.emit(day.date);\n }\n\n onDayMouseLeave(): void {\n this.dateHovered.emit(null);\n }\n\n // --- Month/year view actions ---\n\n onMonthClick(month: CalendarMonth): void {\n if (month.isDisabled) return;\n const vd = this.viewDate();\n this.viewDate.set(new Date(vd.getFullYear(), month.month, 1, 12));\n this.currentView.set('days');\n }\n\n onYearClick(year: CalendarYear): void {\n if (year.isDisabled) return;\n const vd = this.viewDate();\n this.viewDate.set(new Date(year.year, vd.getMonth(), 1, 12));\n this.currentView.set('months');\n }\n\n // --- Keyboard navigation ---\n\n onKeydown(event: KeyboardEvent): void {\n const view = this.currentView();\n if (view === 'days') {\n this._handleDayKeydown(event);\n } else if (view === 'months') {\n this._handleMonthKeydown(event);\n } else {\n this._handleYearKeydown(event);\n }\n }\n\n private _handleDayKeydown(event: KeyboardEvent): void {\n const active = this.activeDate();\n let newDate: Date | null = null;\n\n switch (event.key) {\n case 'ArrowLeft':\n newDate = new Date(active.getFullYear(), active.getMonth(), active.getDate() - 1, 12);\n break;\n case 'ArrowRight':\n newDate = new Date(active.getFullYear(), active.getMonth(), active.getDate() + 1, 12);\n break;\n case 'ArrowUp':\n newDate = new Date(active.getFullYear(), active.getMonth(), active.getDate() - 7, 12);\n break;\n case 'ArrowDown':\n newDate = new Date(active.getFullYear(), active.getMonth(), active.getDate() + 7, 12);\n break;\n case 'Home':\n newDate = new Date(active.getFullYear(), active.getMonth(), 1, 12);\n break;\n case 'End':\n newDate = new Date(\n active.getFullYear(),\n active.getMonth(),\n getDaysInMonth(active.getFullYear(), active.getMonth()),\n 12,\n );\n break;\n case 'PageUp':\n if (event.shiftKey) {\n newDate = new Date(active.getFullYear() - 1, active.getMonth(), active.getDate(), 12);\n } else {\n newDate = new Date(active.getFullYear(), active.getMonth() - 1, active.getDate(), 12);\n }\n break;\n case 'PageDown':\n if (event.shiftKey) {\n newDate = new Date(active.getFullYear() + 1, active.getMonth(), active.getDate(), 12);\n } else {\n newDate = new Date(active.getFullYear(), active.getMonth() + 1, active.getDate(), 12);\n }\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (isDateInRange(active, this.min(), this.max())) {\n const filter = this.dateFilter();\n if (!filter || filter(active)) {\n this.dateSelected.emit(active);\n }\n }\n return;\n case 'Escape':\n // Let parent handle\n return;\n default:\n return;\n }\n\n if (newDate) {\n event.preventDefault();\n this.activeDate.set(normalizeDate(newDate));\n // If the new active date is in a different month, update viewDate\n if (\n newDate.getMonth() !== this.viewDate().getMonth() ||\n newDate.getFullYear() !== this.viewDate().getFullYear()\n ) {\n this.viewDate.set(new Date(newDate.getFullYear(), newDate.getMonth(), 1, 12));\n this.monthChanged.emit(this.viewDate());\n }\n }\n }\n\n private _handleMonthKeydown(event: KeyboardEvent): void {\n // Simple arrow key handling for month grid (3 columns)\n const vd = this.viewDate();\n let month = vd.getMonth();\n\n switch (event.key) {\n case 'ArrowLeft':\n month--;\n break;\n case 'ArrowRight':\n month++;\n break;\n case 'ArrowUp':\n month -= 3;\n break;\n case 'ArrowDown':\n month += 3;\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.viewDate.set(new Date(vd.getFullYear(), month, 1, 12));\n this.currentView.set('days');\n return;\n case 'Escape':\n this.currentView.set('days');\n return;\n default:\n return;\n }\n\n event.preventDefault();\n if (month < 0) {\n this.viewDate.set(new Date(vd.getFullYear() - 1, 11, 1, 12));\n } else if (month > 11) {\n this.viewDate.set(new Date(vd.getFullYear() + 1, 0, 1, 12));\n } else {\n this.viewDate.set(new Date(vd.getFullYear(), month, 1, 12));\n }\n }\n\n private _handleYearKeydown(event: KeyboardEvent): void {\n const vd = this.viewDate();\n let year = vd.getFullYear();\n\n switch (event.key) {\n case 'ArrowLeft':\n year--;\n break;\n case 'ArrowRight':\n year++;\n break;\n case 'ArrowUp':\n year -= 3;\n break;\n case 'ArrowDown':\n year += 3;\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.viewDate.set(new Date(year, vd.getMonth(), 1, 12));\n this.currentView.set('months');\n return;\n case 'Escape':\n this.currentView.set('months');\n return;\n default:\n return;\n }\n\n event.preventDefault();\n this.viewDate.set(new Date(year, vd.getMonth(), 1, 12));\n }\n\n // Track by functions\n trackByWeek(_index: number, _week: CalendarDay[]): number {\n return _index;\n }\n\n trackByDay(_index: number, day: CalendarDay): number {\n return day.date.getTime();\n }\n\n trackByMonth(_index: number, month: CalendarMonth): number {\n return month.month;\n }\n\n trackByYear(_index: number, year: CalendarYear): number {\n return year.year;\n }\n\n trackByRow(_index: number): number {\n return _index;\n }\n\n // Helper: is entire month disabled?\n private _isMonthDisabled(year: number, month: number, min: Date | null, max: Date | null): boolean {\n if (min) {\n const lastOfMonth = new Date(year, month + 1, 0);\n if (isBefore(lastOfMonth, min) && !isSameDay(lastOfMonth, min)) return true;\n }\n if (max) {\n const firstOfMonth = new Date(year, month, 1);\n if (isAfter(firstOfMonth, max) && !isSameDay(firstOfMonth, max)) return true;\n }\n return false;\n }\n\n // Helper: is entire year disabled?\n private _isYearDisabled(year: number, min: Date | null, max: Date | null): boolean {\n if (min && year < min.getFullYear()) return true;\n if (max && year > max.getFullYear()) return true;\n return false;\n }\n\n // Public: focus the calendar for keyboard nav\n focus(): void {\n this._elementRef.nativeElement.focus();\n }\n}\n","<!-- Calendar Header -->\n<div class=\"fui-calendar__header\">\n <button type=\"button\" class=\"fui-calendar__nav-btn\" (click)=\"onPrev()\" [attr.aria-label]=\"prevButtonLabel()\">\n <fui-icon name=\"caret-left\" size=\"sm\" />\n </button>\n\n <button\n type=\"button\"\n class=\"fui-calendar__header-label\"\n (click)=\"onHeaderLabelClick()\"\n [attr.aria-label]=\"headerButtonLabel()\"\n >\n @switch (currentView()) {\n @case ('days') {\n {{ monthYearLabel() }}\n }\n @case ('months') {\n {{ yearLabel() }}\n }\n @case ('years') {\n {{ decadeLabel() }}\n }\n }\n </button>\n\n <button type=\"button\" class=\"fui-calendar__nav-btn\" (click)=\"onNext()\" [attr.aria-label]=\"nextButtonLabel()\">\n <fui-icon name=\"caret-right\" size=\"sm\" />\n </button>\n</div>\n\n<!-- Day View -->\n@if (currentView() === 'days') {\n <table class=\"fui-calendar__grid\" role=\"grid\" [attr.aria-label]=\"monthYearLabel()\" (keydown)=\"onKeydown($event)\">\n <thead>\n <tr>\n @for (header of weekDayHeaders(); track header) {\n <th class=\"fui-calendar__weekday\" scope=\"col\">{{ header }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (week of weeks(); track trackByWeek($index, week)) {\n <tr>\n @for (day of week; track trackByDay($index, day)) {\n <td\n class=\"fui-calendar__cell\"\n [class.--today]=\"day.isToday\"\n [class.--selected]=\"day.isSelected\"\n [class.--outside]=\"!day.isCurrentMonth\"\n [class.--disabled]=\"day.isDisabled\"\n [class.--range-start]=\"day.isRangeStart\"\n [class.--range-end]=\"day.isRangeEnd\"\n [class.--in-range]=\"day.isInRange\"\n [class.--range-preview]=\"day.isRangePreview\"\n role=\"gridcell\"\n [attr.aria-selected]=\"day.isSelected\"\n [attr.aria-disabled]=\"day.isDisabled\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.tabindex]=\"day.isCurrentMonth && !day.isDisabled ? 0 : -1\"\n (click)=\"onDayClick(day)\"\n (mouseenter)=\"onDayMouseEnter(day)\"\n (mouseleave)=\"onDayMouseLeave()\"\n >\n <span class=\"fui-calendar__day\">{{ day.day }}</span>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n}\n\n<!-- Month View -->\n@if (currentView() === 'months') {\n <div class=\"fui-calendar__months\" role=\"grid\" [attr.aria-label]=\"yearLabel()\" (keydown)=\"onKeydown($event)\">\n @for (row of monthsGrid(); track trackByRow($index)) {\n <div class=\"fui-calendar__months-row\" role=\"row\">\n @for (month of row; track trackByMonth($index, month)) {\n <button\n type=\"button\"\n class=\"fui-calendar__month-cell\"\n [class.--current]=\"month.isCurrentMonth\"\n [class.--selected]=\"month.isSelected\"\n [class.--disabled]=\"month.isDisabled\"\n role=\"gridcell\"\n [attr.aria-selected]=\"month.isSelected\"\n [attr.aria-disabled]=\"month.isDisabled\"\n [disabled]=\"month.isDisabled\"\n (click)=\"onMonthClick(month)\"\n >\n {{ month.label }}\n </button>\n }\n </div>\n }\n </div>\n}\n\n<!-- Year View -->\n@if (currentView() === 'years') {\n <div class=\"fui-calendar__years\" role=\"grid\" [attr.aria-label]=\"decadeLabel()\" (keydown)=\"onKeydown($event)\">\n @for (row of yearsGrid(); track trackByRow($index)) {\n <div class=\"fui-calendar__years-row\" role=\"row\">\n @for (year of row; track trackByYear($index, year)) {\n <button\n type=\"button\"\n class=\"fui-calendar__year-cell\"\n [class.--current]=\"year.isCurrentYear\"\n [class.--selected]=\"year.isSelected\"\n [class.--disabled]=\"year.isDisabled\"\n role=\"gridcell\"\n [attr.aria-selected]=\"year.isSelected\"\n [attr.aria-disabled]=\"year.isDisabled\"\n [disabled]=\"year.isDisabled\"\n (click)=\"onYearClick(year)\"\n >\n {{ year.year }}\n </button>\n }\n </div>\n }\n </div>\n}\n\n<!-- Live region for screen readers -->\n<div class=\"fui-calendar__announcer\" aria-live=\"polite\" aria-atomic=\"true\">\n @switch (currentView()) {\n @case ('days') {\n {{ monthYearLabel() }}\n }\n @case ('months') {\n {{ yearLabel() }}\n }\n @case ('years') {\n {{ decadeLabel() }}\n }\n }\n</div>\n","export type DatePickerValue = Date | null;\n\nexport interface DateRange {\n start: Date | null;\n end: Date | null;\n}\n\nexport type DatePickerModelValue = DatePickerValue | DateRange;\n\nexport type DateFilterFn = (date: Date) => boolean;\n\nexport type CalendarView = 'days' | 'months' | 'years';\n\nexport interface CalendarDay {\n date: Date;\n day: number;\n isCurrentMonth: boolean;\n isToday: boolean;\n isSelected: boolean;\n isDisabled: boolean;\n isRangeStart: boolean;\n isRangeEnd: boolean;\n isInRange: boolean;\n isRangePreview: boolean;\n}\n\nexport interface CalendarMonth {\n month: number;\n label: string;\n isCurrentMonth: boolean;\n isSelected: boolean;\n isDisabled: boolean;\n}\n\nexport interface CalendarYear {\n year: number;\n isCurrentYear: boolean;\n isSelected: boolean;\n isDisabled: boolean;\n}\n\nexport const DEFAULT_DATE_FORMAT = 'dd/MM/yyyy';\nexport const RANGE_SEPARATOR = ' \\u2014 ';\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DoCheck,\n effect,\n ElementRef,\n inject,\n NgZone,\n input,\n InputSignal,\n OnDestroy,\n output,\n OutputEmitterRef,\n signal,\n ViewChild,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n FormGroupDirective,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n NgControl,\n NgForm,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\nimport { DOCUMENT } from '@angular/common';\nimport { fromEvent, Subject, Subscription } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { injectNgControl, updateErrorState, syncRequiredState, syncNgControlDisabled } from '@raintonic/formaui/cdk/form-field';\nimport { FUI_FORM_FIELD_CONTROL, FuiFormFieldControl } from '@raintonic/formaui/core';\nimport { DefaultErrorStateMatcher, ErrorStateMatcher } from '@raintonic/formaui/core';\nimport { FuiConnectedPosition, FuiOverlayRef, FuiOverlayService } from '@raintonic/formaui/cdk/overlay';\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\nimport { FuiCalendarComponent } from './calendar/calendar.component';\nimport {\n DateFilterFn,\n DatePickerModelValue,\n DateRange,\n DEFAULT_DATE_FORMAT,\n RANGE_SEPARATOR,\n} from './date-picker.types';\nimport { applyDateMask, formatDate, isAfter, isBefore, normalizeDate, parseDate } from './date-picker.utils';\n\n/**\n * @component FuiDatePickerComponent\n * @selector fui-date-picker\n * @description A date picker form control with inline text input, calendar overlay panel,\n * and optional range selection. Integrates with `fui-form-field` via `FuiFormFieldControl`\n * and supports Reactive Forms (ControlValueAccessor) plus built-in Validator for min/max/filter\n * constraints. Uses the overlay service for proper dropdown positioning.\n *\n * @input placeholder - Placeholder text for the date input (alias: 'placeholder')\n * @input disabled - Whether the picker is disabled (alias: 'disabled')\n * @input readonly - Whether the picker is read-only\n * @input range - Enables date-range mode with start/end inputs (default: false)\n * @input format - Display format string (default: 'DD/MM/YYYY')\n * @input min - Minimum selectable date (Date | null)\n * @input max - Maximum selectable date (Date | null)\n * @input dateFilter - Custom filter function to disable specific dates (DateFilterFn | null)\n * @input startAt - Initial calendar view date when opened (Date | null)\n * @input firstDayOfWeek - First day of the week: 0 = Sunday, 1 = Monday (default: 1)\n * @input rangeSeparator - Separator string between range start/end display (default: RANGE_SEPARATOR)\n * @input errorStateMatcher - Custom error state matcher (ErrorStateMatcher | null)\n *\n * @output valueChange - Emits the new model value on change (Date | DateRange | null)\n * @output dateChange - Emits the new model value on date selection (Date | DateRange | null)\n * @output openedChange - Emits boolean when the calendar panel opens or closes\n *\n * @cssvar --fui-date-picker-font-size - Font size of the input text\n * @cssvar --fui-date-picker-panel-border-radius - Border radius of the calendar panel\n * @cssvar --fui-date-picker-panel-shadow - Box shadow of the calendar panel\n * @cssvar --fui-date-picker-panel-bg - Background color of the calendar panel\n * @cssvar --fui-date-picker-panel-border-color - Border color of the calendar panel\n * @cssvar --fui-date-picker-toggle-size - Size of the calendar toggle icon button\n *\n * @example\n * <fui-form-field>\n * <fui-label>Birth date</fui-label>\n * <fui-date-picker formControlName=\"birthDate\" placeholder=\"DD/MM/YYYY\"></fui-date-picker>\n * </fui-form-field>\n *\n * @example\n * <fui-form-field>\n * <fui-label>Stay period</fui-label>\n * <fui-date-picker [range]=\"true\" formControlName=\"period\"></fui-date-picker>\n * </fui-form-field>\n */\n@Component({\n selector: 'fui-date-picker',\n standalone: true,\n imports: [FuiIconComponent, FuiCalendarComponent],\n templateUrl: './date-picker.component.html',\n styleUrls: ['./date-picker.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'fui-date-picker',\n '[attr.id]': 'id',\n '[class.fui-date-picker--open]': 'panelOpen()',\n '[class.fui-date-picker--disabled]': 'disabled()',\n '[class.fui-date-picker--range]': 'range()',\n '[class.fui-date-picker--focused]': 'focused()',\n '[class.fui-date-picker--error]': 'errorState()',\n '[class.fui-date-picker--readonly]': '_readOnly()',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: FuiDatePickerComponent,\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: FuiDatePickerComponent,\n multi: true,\n },\n {\n provide: FUI_FORM_FIELD_CONTROL,\n useExisting: FuiDatePickerComponent,\n },\n ],\n})\nexport class FuiDatePickerComponent\n implements ControlValueAccessor, Validator, FuiFormFieldControl, DoCheck, OnDestroy\n{\n static nextId = 0;\n readonly controlType = 'fui-date-picker';\n\n // Inputs\n readonly placeholderInput: InputSignal<string> = input('', { alias: 'placeholder' });\n readonly disabledInput: InputSignal<boolean> = input(false, { alias: 'disabled' });\n readonly readonly: InputSignal<boolean> = input(false);\n readonly range: InputSignal<boolean> = input(false);\n readonly format: InputSignal<string> = input(DEFAULT_DATE_FORMAT);\n readonly min: InputSignal<Date | null> = input<Date | null>(null);\n readonly max: InputSignal<Date | null> = input<Date | null>(null);\n readonly dateFilter: InputSignal<DateFilterFn | null> = input<DateFilterFn | null>(null);\n readonly startAt: InputSignal<Date | null> = input<Date | null>(null);\n readonly firstDayOfWeek: InputSignal<number> = input(1);\n readonly rangeSeparator: InputSignal<string> = input(RANGE_SEPARATOR);\n readonly errorStateMatcher: InputSignal<ErrorStateMatcher | null> = input<ErrorStateMatcher | null>(null);\n\n // Outputs\n readonly valueChange: OutputEmitterRef<DatePickerModelValue> = output<DatePickerModelValue>();\n readonly dateChange: OutputEmitterRef<DatePickerModelValue> = output<DatePickerModelValue>();\n readonly openedChange: OutputEmitterRef<boolean> = output<boolean>();\n\n // Internal state\n private readonly _value: WritableSignal<DatePickerModelValue> = signal(null);\n private readonly _focused: WritableSignal<boolean> = signal(false);\n private readonly _disabled: WritableSignal<boolean> = signal(false);\n private readonly _ngControlDisabled: WritableSignal<boolean> = signal(false);\n private readonly _required: WritableSignal<boolean> = signal(false);\n private readonly _errorState: WritableSignal<boolean> = signal(false);\n readonly _readOnly: WritableSignal<boolean> = signal(false);\n readonly panelOpen = signal(false);\n\n // Range hover\n readonly hoveredDate = signal<Date | null>(null);\n\n // FuiFormFieldControl\n readonly stateChanges = new Subject<void>();\n private _uid = `fui-date-picker-${FuiDatePickerComponent.nextId++}`;\n _ariaDescribedby: string | null = null;\n\n // Form references\n private _parentForm = inject(NgForm, { optional: true });\n private _parentFormGroup = inject(FormGroupDirective, { optional: true });\n private _defaultErrorStateMatcher = inject(DefaultErrorStateMatcher);\n private readonly _ngControlRef = injectNgControl();\n get ngControl(): NgControl | null {\n return this._ngControlRef.ngControl;\n }\n\n // Interface signals\n readonly placeholder = computed(() => this.placeholderInput());\n readonly required = this._required;\n readonly value = this._value;\n readonly focused = this._focused;\n readonly disabled = computed(() => this._disabled() || this.disabledInput() || this._ngControlDisabled());\n readonly errorState = this._errorState;\n readonly id = this._uid;\n\n readonly empty = computed(() => {\n const val = this._value();\n if (val === null) return true;\n if (this.range() && this._isDateRange(val)) {\n return val.start === null && val.end === null;\n }\n return false;\n });\n\n // Computed: selected date for single mode calendar input\n readonly selectedDate = computed<Date | null>(() => {\n const val = this._value();\n if (val instanceof Date) return val;\n return null;\n });\n\n readonly rangeStartDate = computed<Date | null>(() => {\n const val = this._value();\n if (this._isDateRange(val)) return val.start;\n return null;\n });\n\n readonly rangeEndDate = computed<Date | null>(() => {\n const val = this._value();\n if (this._isDateRange(val)) return val.end;\n return null;\n });\n\n // ViewChildren\n @ViewChild('triggerEl', { static: false }) triggerEl?: ElementRef<HTMLDivElement>;\n @ViewChild('calendarPanel', { static: false }) calendarPanel?: ElementRef<HTMLDivElement>;\n @ViewChild('startInput', { static: false }) startInputEl?: ElementRef<HTMLInputElement>;\n @ViewChild('endInput', { static: false }) endInputEl?: ElementRef<HTMLInputElement>;\n @ViewChild('calendar', { static: false }) calendarComponent?: FuiCalendarComponent;\n\n // Overlay\n private _overlayRef: FuiOverlayRef | null = null;\n private _overlaySubscriptions = new Subscription();\n private readonly _overlayService = inject(FuiOverlayService);\n private readonly _elementRef = inject(ElementRef);\n private readonly _document = inject(DOCUMENT);\n private readonly _ngZone = inject(NgZone);\n private _outsideClickSub?: Subscription;\n\n // CVA callbacks\n private _onChange: (value: DatePickerModelValue) => void = () => {\n /* noop */\n };\n private _onTouched: () => void = () => {\n /* noop */\n };\n private _onValidatorChange: () => void = () => {\n /* noop */\n };\n\n // Input text tracking\n readonly startInputText = signal('');\n readonly endInputText = signal('');\n\n // Display value for form-field readOnly mode (duck-typed like select/autocomplete)\n readonly displayValue = computed(() => {\n if (this.range()) {\n const start = this.startInputText();\n const end = this.endInputText();\n if (!start && !end) return '';\n return `${start || '—'} ${this.rangeSeparator()} ${end || '—'}`;\n }\n return this.startInputText() || '';\n });\n\n constructor() {\n void Promise.resolve().then(() => {\n if (this._ngControlRef.ngControl) {\n this._ngControlRef.ngControl.valueAccessor = this;\n }\n });\n\n // Effect to emit state changes\n effect(() => {\n this.placeholderInput();\n this.readonly();\n this.disabledInput();\n this.range();\n this.format();\n this.errorStateMatcher();\n this._focused();\n this._disabled();\n this._value();\n this._ngControlDisabled();\n this._required();\n this._errorState();\n\n this.stateChanges.next();\n });\n\n // Re-trigger validation when min/max/dateFilter change\n effect(() => {\n this.min();\n this.max();\n this.dateFilter();\n this._onValidatorChange();\n });\n\n // Sync display text when value changes\n effect(() => {\n const val = this._value();\n const fmt = this.format();\n if (this.range() && this._isDateRange(val)) {\n this.startInputText.set(formatDate(val.start, fmt));\n this.endInputText.set(formatDate(val.end, fmt));\n } else if (val instanceof Date) {\n this.startInputText.set(formatDate(val, fmt));\n } else {\n this.startInputText.set('');\n this.endInputText.set('');\n }\n });\n }\n\n ngDoCheck(): void {\n if (this.ngControl) {\n updateErrorState(\n this.ngControl,\n this._errorState,\n this.errorStateMatcher(),\n this._defaultErrorStateMatcher,\n this._parentForm,\n this._parentFormGroup,\n this.stateChanges,\n );\n syncRequiredState(this.ngControl, this._required, this.stateChanges);\n syncNgControlDisabled(this.ngControl, this._ngControlDisabled, this.stateChanges);\n }\n }\n\n ngOnDestroy(): void {\n this.stateChanges.complete();\n this._outsideClickSub?.unsubscribe();\n this._disposeOverlay();\n }\n\n // --- CVA ---\n\n writeValue(value: DatePickerModelValue | string): void {\n if (typeof value === 'string') {\n const parsed = parseDate(value, this.format());\n this._value.set(parsed);\n } else if (value instanceof Date) {\n this._value.set(normalizeDate(value));\n } else if (value && typeof value === 'object' && ('start' in value || 'end' in value)) {\n const range = value;\n this._value.set({\n start: range.start ? normalizeDate(range.start) : null,\n end: range.end ? normalizeDate(range.end) : null,\n });\n } else {\n this._value.set(null);\n }\n this.stateChanges.next();\n }\n\n registerOnChange(fn: (value: DatePickerModelValue) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabled.set(isDisabled);\n this.stateChanges.next();\n }\n\n // --- Validator ---\n\n validate(_control: AbstractControl): ValidationErrors | null {\n const value = this._value();\n if (value === null) return null;\n\n const minDate = this.min();\n const maxDate = this.max();\n const filter = this.dateFilter();\n\n if (value instanceof Date) {\n return this._validateSingleDate(value, minDate, maxDate, filter);\n }\n\n if (this._isDateRange(value)) {\n const errors: ValidationErrors = {};\n if (value.start) {\n const startErrors = this._validateSingleDate(value.start, minDate, maxDate, filter);\n if (startErrors) Object.assign(errors, startErrors);\n }\n if (value.end) {\n const endErrors = this._validateSingleDate(value.end, minDate, maxDate, filter);\n if (endErrors) Object.assign(errors, endErrors);\n }\n return Object.keys(errors).length > 0 ? errors : null;\n }\n\n return null;\n }\n\n registerOnValidatorChange(fn: () => void): void {\n this._onValidatorChange = fn;\n }\n\n private _validateSingleDate(\n date: Date,\n min: Date | null,\n max: Date | null,\n filter: DateFilterFn | null,\n ): ValidationErrors | null {\n if (min && isBefore(date, min)) {\n return { dateMin: { min, actual: date } };\n }\n if (max && isAfter(date, max)) {\n return { dateMax: { max, actual: date } };\n }\n if (filter && !filter(date)) {\n return { dateFilter: { actual: date } };\n }\n return null;\n }\n\n // --- FuiFormFieldControl ---\n\n onContainerClick(_event: MouseEvent): void {\n if (!this.disabled()) {\n this.startInputEl?.nativeElement.focus();\n if (!this.panelOpen()) {\n this.open();\n }\n }\n }\n\n setDescribedByIds(ids: string[]): void {\n this._ariaDescribedby = ids.length ? ids.join(' ') : null;\n }\n\n setReadOnly(readOnly: boolean): void {\n this._readOnly.set(readOnly);\n }\n\n // --- Panel open/close ---\n\n open(): void {\n if (this.disabled() || this.readonly() || this.panelOpen()) return;\n\n requestAnimationFrame(() => {\n this.panelOpen.set(true);\n this._focused.set(true);\n this.openedChange.emit(true);\n\n setTimeout(() => {\n this._createOverlay();\n this._listenForOutsideClicks();\n this.calendarComponent?.focus();\n });\n });\n }\n\n close(): void {\n if (!this.panelOpen()) return;\n this._outsideClickSub?.unsubscribe();\n\n this.panelOpen.set(false);\n this._focused.set(false);\n this.hoveredDate.set(null);\n this._disposeOverlay();\n this.openedChange.emit(false);\n this._onTouched();\n\n setTimeout(() => {\n this.startInputEl?.nativeElement.focus();\n }, 0);\n }\n\n toggle(): void {\n if (this.panelOpen()) {\n this.close();\n } else {\n this.open();\n }\n }\n\n // --- Trigger click ---\n\n onTriggerClick(): void {\n if (!this.disabled() && !this.readonly()) {\n this.toggle();\n }\n }\n\n onToggleClick(event: MouseEvent): void {\n event.stopPropagation();\n if (!this.disabled() && !this.readonly()) {\n this.toggle();\n }\n }\n\n // --- Input masking (start input) ---\n\n onInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n const { masked, cursor } = applyDateMask(input.value, this.format());\n input.value = masked;\n input.setSelectionRange(cursor, cursor);\n this.startInputText.set(masked);\n }\n\n onBlur(): void {\n const text = this.startInputText();\n if (!text) {\n if (!this.range()) {\n this._setValue(null);\n }\n return;\n }\n const parsed = parseDate(text, this.format());\n if (parsed) {\n if (this.range()) {\n const current = this._value();\n const rangeVal = this._isDateRange(current) ? current : { start: null, end: null };\n this._setValue({ ...rangeVal, start: parsed });\n } else {\n this._setValue(parsed);\n }\n } else {\n // Invalid input — revert to formatted value\n const val = this._value();\n if (this.range() && this._isDateRange(val)) {\n this.startInputText.set(formatDate(val.start, this.format()));\n } else if (val instanceof Date) {\n this.startInputText.set(formatDate(val, this.format()));\n } else {\n this.startInputText.set('');\n }\n }\n if (!this.panelOpen()) {\n this._onTouched();\n }\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.panelOpen()) {\n event.preventDefault();\n this.close();\n } else if ((event.key === 'ArrowDown' || event.key === 'Enter') && !this.panelOpen()) {\n event.preventDefault();\n this.open();\n }\n }\n\n // --- End input (range mode) ---\n\n onEndInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n const { masked, cursor } = applyDateMask(input.value, this.format());\n input.value = masked;\n input.setSelectionRange(cursor, cursor);\n this.endInputText.set(masked);\n }\n\n onEndBlur(): void {\n const text = this.endInputText();\n if (!text) return;\n const parsed = parseDate(text, this.format());\n if (parsed) {\n const current = this._value();\n const rangeVal = this._isDateRange(current) ? current : { start: null, end: null };\n this._setValue({ ...rangeVal, end: parsed });\n } else {\n const val = this._value();\n if (this._isDateRange(val)) {\n this.endInputText.set(formatDate(val.end, this.format()));\n } else {\n this.endInputText.set('');\n }\n }\n if (!this.panelOpen()) {\n this._onTouched();\n }\n }\n\n onEndKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.panelOpen()) {\n event.preventDefault();\n this.close();\n }\n }\n\n onInputFocus(): void {\n this._focused.set(true);\n }\n\n // --- Calendar events ---\n\n onDateSelected(date: Date): void {\n if (this.range()) {\n this._handleRangeSelection(date);\n } else {\n this._setValue(date);\n this.close();\n }\n }\n\n onDateHovered(date: Date | null): void {\n this.hoveredDate.set(date);\n }\n\n // Start listening for outside clicks when panel opens\n private _listenForOutsideClicks(): void {\n this._outsideClickSub?.unsubscribe();\n\n this._ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n this._outsideClickSub = fromEvent<MouseEvent>(this._document, 'click')\n .pipe(\n filter(() => this.panelOpen()),\n filter((event) => {\n const target = event.target as HTMLElement;\n const hostElement = this._elementRef.nativeElement;\n const overlayElement = this._overlayRef?.overlayElement;\n return !hostElement.contains(target) && !overlayElement?.contains(target);\n }),\n )\n .subscribe(() => {\n this._ngZone.run(() => {\n this.close();\n });\n });\n });\n });\n }\n\n // --- Private helpers ---\n\n private _handleRangeSelection(date: Date): void {\n const current = this._value();\n const rangeVal = this._isDateRange(current) ? current : { start: null, end: null };\n\n if (!rangeVal.start || rangeVal.end) {\n // First click or resetting\n this._setValue({ start: date, end: null });\n this.hoveredDate.set(null);\n } else {\n // Second click — auto-swap if needed\n let start = rangeVal.start;\n let end = date;\n if (normalizeDate(end).getTime() < normalizeDate(start).getTime()) {\n [start, end] = [end, start];\n }\n this._setValue({ start, end });\n this.close();\n }\n }\n\n private _setValue(value: DatePickerModelValue): void {\n this._value.set(value);\n this._onChange(value);\n this.valueChange.emit(value);\n this.dateChange.emit(value);\n this.stateChanges.next();\n }\n\n private _createOverlay(): void {\n if (this._overlayRef || !this.calendarPanel || !this.triggerEl) return;\n\n const triggerElement = this.triggerEl.nativeElement;\n const triggerWidth = triggerElement.getBoundingClientRect().width;\n\n const positions: FuiConnectedPosition[] = [\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\n ];\n\n const positionStrategy = this._overlayService\n .position()\n .connectedTo(triggerElement, positions)\n .withPush(true)\n .withViewportMargin(8);\n\n this._overlayRef = this._overlayService.create({\n positionStrategy,\n scrollStrategy: this._overlayService.scrollStrategies.reposition(),\n hasBackdrop: true,\n backdropClass: 'fui-date-picker-backdrop',\n backdropClickBehavior: 'close',\n panelClass: ['fui-date-picker-overlay-panel'],\n minWidth: Math.max(triggerWidth, 280),\n });\n\n // Track overlay subscriptions for proper cleanup\n this._overlaySubscriptions.unsubscribe();\n this._overlaySubscriptions = new Subscription();\n\n this._overlaySubscriptions.add(\n this._overlayRef.backdropClick.subscribe(() => {\n this.close();\n }),\n );\n\n this._overlaySubscriptions.add(\n this._overlayRef.keydownEvents.subscribe((event) => {\n if (event.key === 'Escape') {\n this.close();\n }\n }),\n );\n\n const panelElement = this.calendarPanel.nativeElement;\n this._overlayRef.attach(panelElement);\n }\n\n private _disposeOverlay(): void {\n this._overlaySubscriptions.unsubscribe();\n if (this._overlayRef) {\n this._overlayRef.dispose();\n this._overlayRef = null;\n }\n }\n\n private _isDateRange(val: DatePickerModelValue): val is DateRange {\n return val !== null && !(val instanceof Date) && typeof val === 'object' && 'start' in val;\n }\n\n // Public: get the computed placeholder for the start input\n getStartPlaceholder(): string {\n const p = this.placeholderInput();\n if (p) return p;\n return this.format().toLowerCase();\n }\n\n getEndPlaceholder(): string {\n return this.format().toLowerCase();\n }\n}\n","<!-- Trigger area -->\n<div #triggerEl class=\"fui-date-picker__trigger\" (click)=\"onTriggerClick()\">\n <!-- Start input -->\n <input\n #startInput\n class=\"fui-date-picker__input\"\n [id]=\"id\"\n [value]=\"startInputText()\"\n [placeholder]=\"getStartPlaceholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [attr.aria-describedby]=\"_ariaDescribedby\"\n [attr.aria-required]=\"required()\"\n [attr.aria-invalid]=\"errorState()\"\n [attr.aria-expanded]=\"panelOpen()\"\n aria-haspopup=\"dialog\"\n aria-autocomplete=\"none\"\n role=\"combobox\"\n inputmode=\"numeric\"\n autocomplete=\"off\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\"\n (focus)=\"onInputFocus()\"\n (keydown)=\"onKeydown($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n\n <!-- Range separator + end input -->\n @if (range()) {\n <span class=\"fui-date-picker__range-separator\" aria-hidden=\"true\">{{ rangeSeparator() }}</span>\n <input\n #endInput\n class=\"fui-date-picker__input fui-date-picker__input--end\"\n [value]=\"endInputText()\"\n [placeholder]=\"getEndPlaceholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [attr.aria-label]=\"'End date'\"\n [attr.aria-invalid]=\"errorState()\"\n inputmode=\"numeric\"\n autocomplete=\"off\"\n (input)=\"onEndInput($event)\"\n (blur)=\"onEndBlur()\"\n (focus)=\"onInputFocus()\"\n (keydown)=\"onEndKeydown($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n }\n\n <!-- Calendar toggle button — hidden in readOnly mode -->\n @if (!_readOnly()) {\n <button\n type=\"button\"\n class=\"fui-date-picker__toggle\"\n tabindex=\"-1\"\n [attr.aria-expanded]=\"panelOpen()\"\n [disabled]=\"disabled()\"\n aria-haspopup=\"dialog\"\n aria-label=\"Open calendar\"\n (click)=\"onToggleClick($event)\"\n >\n <fui-icon name=\"calendar-blank\" size=\"sm\" />\n </button>\n }\n</div>\n\n<!-- Calendar panel -->\n@if (panelOpen()) {\n <div #calendarPanel class=\"fui-date-picker__panel\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Calendar\">\n <fui-calendar\n #calendar\n [selected]=\"selectedDate()\"\n [rangeStart]=\"rangeStartDate()\"\n [rangeEnd]=\"rangeEndDate()\"\n [range]=\"range()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [dateFilter]=\"dateFilter()\"\n [startAt]=\"startAt()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n [hoveredDate]=\"hoveredDate()\"\n (dateSelected)=\"onDateSelected($event)\"\n (dateHovered)=\"onDateHovered($event)\"\n />\n </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, signal, afterNextRender, ViewChild, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
class FuiDividerComponent {
|
|
5
|
+
static nextId = 0;
|
|
6
|
+
orientation = input('horizontal', ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
|
|
7
|
+
textAlign = input('center', ...(ngDevMode ? [{ debugName: "textAlign" }] : /* istanbul ignore next */ []));
|
|
8
|
+
inset = input(false, ...(ngDevMode ? [{ debugName: "inset" }] : /* istanbul ignore next */ []));
|
|
9
|
+
hasContent = signal(false, ...(ngDevMode ? [{ debugName: "hasContent" }] : /* istanbul ignore next */ []));
|
|
10
|
+
contentWrapper;
|
|
11
|
+
constructor() {
|
|
12
|
+
afterNextRender(() => {
|
|
13
|
+
if (this.contentWrapper) {
|
|
14
|
+
this.hasContent.set(this.contentWrapper.nativeElement.childNodes.length > 0);
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiDividerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
19
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiDividerComponent, isStandalone: true, selector: "fui-divider", inputs: { orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, textAlign: { classPropertyName: "textAlign", publicName: "textAlign", isSignal: true, isRequired: false, transformFunction: null }, inset: { classPropertyName: "inset", publicName: "inset", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.fui-divider--vertical": "orientation() === \"vertical\"", "class.fui-divider--inset": "inset()", "class.fui-divider--with-text": "hasContent()", "attr.role": "\"separator\"", "attr.aria-orientation": "orientation()" }, classAttribute: "fui-divider" }, viewQueries: [{ propertyName: "contentWrapper", first: true, predicate: ["contentWrapper"], descendants: true }], ngImport: i0, template: "@if (orientation() === 'horizontal' && hasContent()) {\n <div\n class=\"fui-divider__wrapper\"\n [class.fui-divider__wrapper--start]=\"textAlign() === 'start'\"\n [class.fui-divider__wrapper--center]=\"textAlign() === 'center'\"\n [class.fui-divider__wrapper--end]=\"textAlign() === 'end'\"\n >\n <span class=\"fui-divider__line fui-divider__line--before\"></span>\n <span class=\"fui-divider__text\" #contentWrapper>\n <ng-content></ng-content>\n </span>\n <span class=\"fui-divider__line fui-divider__line--after\"></span>\n </div>\n} @else {\n <span class=\"fui-divider__line\"></span>\n}\n", styles: [".fui-divider{display:block}.fui-divider--vertical{display:inline-flex;height:100%;width:auto;align-self:stretch}.fui-divider__line{display:block;border:0;border-top:1px solid var(--fui-border-color)}.fui-divider--vertical .fui-divider__line{border-top:0;border-left:1px solid var(--fui-border-color);height:100%;width:0}.fui-divider__wrapper{display:flex;align-items:center;gap:var(--fui-gap-12, .75rem)}.fui-divider__wrapper--start .fui-divider__line--before{flex:0 0 1.5rem}.fui-divider__wrapper--start .fui-divider__line--after,.fui-divider__wrapper--center .fui-divider__line--before,.fui-divider__wrapper--center .fui-divider__line--after,.fui-divider__wrapper--end .fui-divider__line--before{flex:1}.fui-divider__wrapper--end .fui-divider__line--after{flex:0 0 1.5rem}.fui-divider__line--before,.fui-divider__line--after{border-top:1px solid var(--fui-border-color)}.fui-divider__text{font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-01);color:var(--fui-text-secondary);white-space:nowrap;padding:0}.fui-divider--inset{margin-left:var(--fui-padding-24, 1.5rem);margin-right:var(--fui-padding-24, 1.5rem)}@media(prefers-contrast:high){.fui-divider__line,.fui-divider__line--before,.fui-divider__line--after{border-color:CanvasText}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
20
|
+
}
|
|
21
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiDividerComponent, decorators: [{
|
|
22
|
+
type: Component,
|
|
23
|
+
args: [{ selector: 'fui-divider', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
|
|
24
|
+
class: 'fui-divider',
|
|
25
|
+
'[class.fui-divider--vertical]': 'orientation() === "vertical"',
|
|
26
|
+
'[class.fui-divider--inset]': 'inset()',
|
|
27
|
+
'[class.fui-divider--with-text]': 'hasContent()',
|
|
28
|
+
'[attr.role]': '"separator"',
|
|
29
|
+
'[attr.aria-orientation]': 'orientation()',
|
|
30
|
+
}, template: "@if (orientation() === 'horizontal' && hasContent()) {\n <div\n class=\"fui-divider__wrapper\"\n [class.fui-divider__wrapper--start]=\"textAlign() === 'start'\"\n [class.fui-divider__wrapper--center]=\"textAlign() === 'center'\"\n [class.fui-divider__wrapper--end]=\"textAlign() === 'end'\"\n >\n <span class=\"fui-divider__line fui-divider__line--before\"></span>\n <span class=\"fui-divider__text\" #contentWrapper>\n <ng-content></ng-content>\n </span>\n <span class=\"fui-divider__line fui-divider__line--after\"></span>\n </div>\n} @else {\n <span class=\"fui-divider__line\"></span>\n}\n", styles: [".fui-divider{display:block}.fui-divider--vertical{display:inline-flex;height:100%;width:auto;align-self:stretch}.fui-divider__line{display:block;border:0;border-top:1px solid var(--fui-border-color)}.fui-divider--vertical .fui-divider__line{border-top:0;border-left:1px solid var(--fui-border-color);height:100%;width:0}.fui-divider__wrapper{display:flex;align-items:center;gap:var(--fui-gap-12, .75rem)}.fui-divider__wrapper--start .fui-divider__line--before{flex:0 0 1.5rem}.fui-divider__wrapper--start .fui-divider__line--after,.fui-divider__wrapper--center .fui-divider__line--before,.fui-divider__wrapper--center .fui-divider__line--after,.fui-divider__wrapper--end .fui-divider__line--before{flex:1}.fui-divider__wrapper--end .fui-divider__line--after{flex:0 0 1.5rem}.fui-divider__line--before,.fui-divider__line--after{border-top:1px solid var(--fui-border-color)}.fui-divider__text{font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-01);color:var(--fui-text-secondary);white-space:nowrap;padding:0}.fui-divider--inset{margin-left:var(--fui-padding-24, 1.5rem);margin-right:var(--fui-padding-24, 1.5rem)}@media(prefers-contrast:high){.fui-divider__line,.fui-divider__line--before,.fui-divider__line--after{border-color:CanvasText}}\n"] }]
|
|
31
|
+
}], ctorParameters: () => [], propDecorators: { orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], textAlign: [{ type: i0.Input, args: [{ isSignal: true, alias: "textAlign", required: false }] }], inset: [{ type: i0.Input, args: [{ isSignal: true, alias: "inset", required: false }] }], contentWrapper: [{
|
|
32
|
+
type: ViewChild,
|
|
33
|
+
args: ['contentWrapper', { static: false }]
|
|
34
|
+
}] } });
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Generated bundle index. Do not edit.
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
export { FuiDividerComponent };
|
|
41
|
+
//# sourceMappingURL=raintonic-formaui-components-divider.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raintonic-formaui-components-divider.mjs","sources":["../../../lib/components/divider/divider.component.ts","../../../lib/components/divider/divider.component.html","../../../lib/components/divider/raintonic-formaui-components-divider.ts"],"sourcesContent":["import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n input,\n signal,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FuiDividerOrientation, FuiDividerTextAlign } from './divider.types';\n\n@Component({\n selector: 'fui-divider',\n standalone: true,\n templateUrl: './divider.component.html',\n styleUrls: ['./divider.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'fui-divider',\n '[class.fui-divider--vertical]': 'orientation() === \"vertical\"',\n '[class.fui-divider--inset]': 'inset()',\n '[class.fui-divider--with-text]': 'hasContent()',\n '[attr.role]': '\"separator\"',\n '[attr.aria-orientation]': 'orientation()',\n },\n})\nexport class FuiDividerComponent {\n static nextId = 0;\n\n readonly orientation = input<FuiDividerOrientation>('horizontal');\n readonly textAlign = input<FuiDividerTextAlign>('center');\n readonly inset = input(false);\n\n readonly hasContent = signal(false);\n\n @ViewChild('contentWrapper', { static: false }) contentWrapper?: ElementRef<HTMLElement>;\n\n constructor() {\n afterNextRender(() => {\n if (this.contentWrapper) {\n this.hasContent.set(this.contentWrapper.nativeElement.childNodes.length > 0);\n }\n });\n }\n}\n","@if (orientation() === 'horizontal' && hasContent()) {\n <div\n class=\"fui-divider__wrapper\"\n [class.fui-divider__wrapper--start]=\"textAlign() === 'start'\"\n [class.fui-divider__wrapper--center]=\"textAlign() === 'center'\"\n [class.fui-divider__wrapper--end]=\"textAlign() === 'end'\"\n >\n <span class=\"fui-divider__line fui-divider__line--before\"></span>\n <span class=\"fui-divider__text\" #contentWrapper>\n <ng-content></ng-content>\n </span>\n <span class=\"fui-divider__line fui-divider__line--after\"></span>\n </div>\n} @else {\n <span class=\"fui-divider__line\"></span>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;MA4Ba,mBAAmB,CAAA;AAC9B,IAAA,OAAO,MAAM,GAAG,CAAC;AAER,IAAA,WAAW,GAAG,KAAK,CAAwB,YAAY,kFAAC;AACxD,IAAA,SAAS,GAAG,KAAK,CAAsB,QAAQ,gFAAC;AAChD,IAAA,KAAK,GAAG,KAAK,CAAC,KAAK,4EAAC;AAEpB,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,iFAAC;AAEa,IAAA,cAAc;AAE9D,IAAA,WAAA,GAAA;QACE,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;YAC9E;AACF,QAAA,CAAC,CAAC;IACJ;uGAjBW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,o2BC5BhC,onBAgBA,EAAA,MAAA,EAAA,CAAA,8uCAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FDYa,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAhB/B,SAAS;+BACE,aAAa,EAAA,UAAA,EACX,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B;AACJ,wBAAA,KAAK,EAAE,aAAa;AACpB,wBAAA,+BAA+B,EAAE,8BAA8B;AAC/D,wBAAA,4BAA4B,EAAE,SAAS;AACvC,wBAAA,gCAAgC,EAAE,cAAc;AAChD,wBAAA,aAAa,EAAE,aAAa;AAC5B,wBAAA,yBAAyB,EAAE,eAAe;AAC3C,qBAAA,EAAA,QAAA,EAAA,onBAAA,EAAA,MAAA,EAAA,CAAA,8uCAAA,CAAA,EAAA;;sBAWA,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,gBAAgB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;;;AErChD;;AAEG;;;;"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, input, booleanAttribute, output, signal, viewChild, computed, effect, HostListener, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { DOCUMENT } from '@angular/common';
|
|
4
|
+
import { FuiIconComponent } from '@raintonic/formaui/components/icon';
|
|
5
|
+
|
|
6
|
+
const DRAWER_SIZES = {
|
|
7
|
+
sm: '320px',
|
|
8
|
+
md: '480px',
|
|
9
|
+
lg: '640px',
|
|
10
|
+
full: '100%',
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
class FuiDrawerComponent {
|
|
14
|
+
_document = inject(DOCUMENT);
|
|
15
|
+
// Inputs
|
|
16
|
+
position = input('right', ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
|
|
17
|
+
mode = input('overlay', ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
|
|
18
|
+
size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
19
|
+
opened = input(false, { ...(ngDevMode ? { debugName: "opened" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
20
|
+
hasBackdrop = input(true, { ...(ngDevMode ? { debugName: "hasBackdrop" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
21
|
+
closeOnBackdropClick = input(true, { ...(ngDevMode ? { debugName: "closeOnBackdropClick" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
22
|
+
closeOnEsc = input(true, { ...(ngDevMode ? { debugName: "closeOnEsc" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
23
|
+
title = input('', ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
|
|
24
|
+
showCloseButton = input(true, { ...(ngDevMode ? { debugName: "showCloseButton" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
25
|
+
/** ARIA label for the drawer, used when no visible title is present */
|
|
26
|
+
ariaLabel = input(null, ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
27
|
+
/** ID of an element that labels the drawer */
|
|
28
|
+
ariaLabelledBy = input(null, ...(ngDevMode ? [{ debugName: "ariaLabelledBy" }] : /* istanbul ignore next */ []));
|
|
29
|
+
// Outputs
|
|
30
|
+
openedChange = output();
|
|
31
|
+
closed = output();
|
|
32
|
+
// Internal state
|
|
33
|
+
_opened = signal(false, ...(ngDevMode ? [{ debugName: "_opened" }] : /* istanbul ignore next */ []));
|
|
34
|
+
_animating = signal(false, ...(ngDevMode ? [{ debugName: "_animating" }] : /* istanbul ignore next */ []));
|
|
35
|
+
// Track the last input value to avoid effect re-triggering on programmatic changes
|
|
36
|
+
_lastInputValue = false;
|
|
37
|
+
// Focus management
|
|
38
|
+
_previouslyFocusedElement = null;
|
|
39
|
+
// ViewChild
|
|
40
|
+
drawerPanel = viewChild('drawerPanel', ...(ngDevMode ? [{ debugName: "drawerPanel" }] : /* istanbul ignore next */ []));
|
|
41
|
+
// Computed
|
|
42
|
+
_sizeValue = computed(() => {
|
|
43
|
+
const size = this.size();
|
|
44
|
+
return DRAWER_SIZES[size] ?? size;
|
|
45
|
+
}, ...(ngDevMode ? [{ debugName: "_sizeValue" }] : /* istanbul ignore next */ []));
|
|
46
|
+
_isHorizontal = computed(() => {
|
|
47
|
+
const pos = this.position();
|
|
48
|
+
return pos === 'left' || pos === 'right';
|
|
49
|
+
}, ...(ngDevMode ? [{ debugName: "_isHorizontal" }] : /* istanbul ignore next */ []));
|
|
50
|
+
constructor() {
|
|
51
|
+
// Sync opened input with internal state — only react when the input actually changes
|
|
52
|
+
effect(() => {
|
|
53
|
+
const inputValue = this.opened();
|
|
54
|
+
if (inputValue !== this._lastInputValue) {
|
|
55
|
+
this._lastInputValue = inputValue;
|
|
56
|
+
if (inputValue) {
|
|
57
|
+
this._openInternal();
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
this._closeInternal();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
onKeydown(event) {
|
|
66
|
+
if (!this._opened())
|
|
67
|
+
return;
|
|
68
|
+
if (event.key === 'Escape' && this.closeOnEsc()) {
|
|
69
|
+
this.close();
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// Focus trap cycling
|
|
73
|
+
if (event.key === 'Tab') {
|
|
74
|
+
const focusableElements = this._getAllFocusableElements();
|
|
75
|
+
if (focusableElements.length === 0) {
|
|
76
|
+
event.preventDefault();
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const firstFocusable = focusableElements[0];
|
|
80
|
+
const lastFocusable = focusableElements[focusableElements.length - 1];
|
|
81
|
+
const activeElement = this._document.activeElement;
|
|
82
|
+
if (event.shiftKey) {
|
|
83
|
+
if (activeElement === firstFocusable) {
|
|
84
|
+
event.preventDefault();
|
|
85
|
+
lastFocusable.focus();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
if (activeElement === lastFocusable) {
|
|
90
|
+
event.preventDefault();
|
|
91
|
+
firstFocusable.focus();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
open() {
|
|
97
|
+
if (!this._opened()) {
|
|
98
|
+
this._openInternal();
|
|
99
|
+
this.openedChange.emit(true);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
close() {
|
|
103
|
+
if (this._opened()) {
|
|
104
|
+
this._closeInternal();
|
|
105
|
+
this.openedChange.emit(false);
|
|
106
|
+
this.closed.emit();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
toggle() {
|
|
110
|
+
if (this._opened()) {
|
|
111
|
+
this.close();
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
this.open();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
_openInternal() {
|
|
118
|
+
this._previouslyFocusedElement = document.activeElement;
|
|
119
|
+
this._opened.set(true);
|
|
120
|
+
// Focus the panel after it renders
|
|
121
|
+
setTimeout(() => {
|
|
122
|
+
this._focusFirstTabbable();
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
_closeInternal() {
|
|
126
|
+
this._opened.set(false);
|
|
127
|
+
// Restore focus
|
|
128
|
+
if (this._previouslyFocusedElement) {
|
|
129
|
+
this._previouslyFocusedElement.focus();
|
|
130
|
+
this._previouslyFocusedElement = null;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
_focusFirstTabbable() {
|
|
134
|
+
const panel = this.drawerPanel()?.nativeElement;
|
|
135
|
+
if (!panel)
|
|
136
|
+
return;
|
|
137
|
+
const focusable = this._getAllFocusableElements();
|
|
138
|
+
if (focusable.length > 0) {
|
|
139
|
+
focusable[0].focus();
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
panel.setAttribute('tabindex', '-1');
|
|
143
|
+
panel.focus();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
_getAllFocusableElements() {
|
|
147
|
+
const panel = this.drawerPanel()?.nativeElement;
|
|
148
|
+
if (!panel)
|
|
149
|
+
return [];
|
|
150
|
+
const selectors = [
|
|
151
|
+
'a[href]',
|
|
152
|
+
'button:not([disabled])',
|
|
153
|
+
'textarea:not([disabled])',
|
|
154
|
+
'input:not([disabled])',
|
|
155
|
+
'select:not([disabled])',
|
|
156
|
+
'[tabindex]:not([tabindex="-1"])',
|
|
157
|
+
'[contenteditable="true"]',
|
|
158
|
+
].join(',');
|
|
159
|
+
return Array.from(panel.querySelectorAll(selectors)).filter((el) => el.offsetParent !== null);
|
|
160
|
+
}
|
|
161
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiDrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
162
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiDrawerComponent, isStandalone: true, selector: "fui-drawer", inputs: { position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, opened: { classPropertyName: "opened", publicName: "opened", isSignal: true, isRequired: false, transformFunction: null }, hasBackdrop: { classPropertyName: "hasBackdrop", publicName: "hasBackdrop", isSignal: true, isRequired: false, transformFunction: null }, closeOnBackdropClick: { classPropertyName: "closeOnBackdropClick", publicName: "closeOnBackdropClick", isSignal: true, isRequired: false, transformFunction: null }, closeOnEsc: { classPropertyName: "closeOnEsc", publicName: "closeOnEsc", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, showCloseButton: { classPropertyName: "showCloseButton", publicName: "showCloseButton", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledBy: { classPropertyName: "ariaLabelledBy", publicName: "ariaLabelledBy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openedChange: "openedChange", closed: "closed" }, host: { listeners: { "document:keydown": "onKeydown($event)" }, properties: { "class.fui-drawer--open": "_opened()", "class.fui-drawer--left": "position() === \"left\"", "class.fui-drawer--right": "position() === \"right\"", "class.fui-drawer--top": "position() === \"top\"", "class.fui-drawer--bottom": "position() === \"bottom\"", "class.fui-drawer--overlay": "mode() === \"overlay\"", "class.fui-drawer--push": "mode() === \"push\"", "attr.role": "\"dialog\"", "attr.aria-modal": "_opened() ? \"true\" : null", "attr.aria-label": "ariaLabel() || (!ariaLabelledBy() ? title() : null)", "attr.aria-labelledby": "ariaLabelledBy()" }, classAttribute: "fui-drawer" }, viewQueries: [{ propertyName: "drawerPanel", first: true, predicate: ["drawerPanel"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (_opened() && hasBackdrop()) {\n <div class=\"fui-drawer__backdrop\" (click)=\"closeOnBackdropClick() ? close() : null\" aria-hidden=\"true\"></div>\n}\n\n<div class=\"fui-drawer__panel\" [style.--_drawer-size]=\"_sizeValue()\" #drawerPanel tabindex=\"-1\">\n @if (title() || showCloseButton()) {\n <div class=\"fui-drawer__header\">\n @if (title()) {\n <h2 class=\"fui-drawer__title\">{{ title() }}</h2>\n }\n @if (showCloseButton()) {\n <button type=\"button\" class=\"fui-drawer__close\" (click)=\"close()\" aria-label=\"Close drawer\">\n <fui-icon name=\"x\" size=\"sm\"></fui-icon>\n </button>\n }\n </div>\n }\n\n <div class=\"fui-drawer__content\">\n <ng-content></ng-content>\n </div>\n\n <div class=\"fui-drawer__footer\">\n <ng-content select=\"[drawerFooter]\"></ng-content>\n </div>\n</div>\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-motion-fade-out{transition:opacity var(--fui-duration-fast-01) var(--fui-ease-exit) 0ms}.fui-motion-slide-in-bottom{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition:transform,opacity var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-moderate-01) var(--fui-ease-entrance)}.fui-drawer{--fui-drawer-z-index: var(--fui-z-index-modal, 1050);--fui-drawer-bg: var(--fui-surface-00);--fui-drawer-border-color: var(--fui-border-color);--fui-drawer-shadow: -4px 0 24px var(--fui-black-10);--fui-drawer-backdrop-color: var(--fui-black-30);--fui-drawer-header-padding: var(--fui-spacing-04) var(--fui-spacing-05);--fui-drawer-content-padding: var(--fui-spacing-05);--fui-drawer-footer-padding: var(--fui-spacing-04) var(--fui-spacing-05);position:fixed;inset:0;pointer-events:none;z-index:var(--fui-drawer-z-index);overflow:hidden;visibility:hidden;transition:visibility 0s linear var(--fui-duration-moderate-01)}.fui-drawer--open{pointer-events:auto;visibility:visible;transition-delay:0s}.fui-drawer__backdrop{position:fixed;inset:0;background-color:var(--fui-drawer-backdrop-color);z-index:1;opacity:0;transition:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-drawer--open .fui-drawer__backdrop{opacity:1}.fui-drawer__panel{position:fixed;display:flex;flex-direction:column;background-color:var(--fui-drawer-bg);z-index:2;pointer-events:auto;transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms}.fui-drawer--right .fui-drawer__panel{top:0;right:0;bottom:0;width:var(--_drawer-size, 480px);max-width:100%;border-left:1px solid var(--fui-drawer-border-color);box-shadow:var(--fui-drawer-shadow);transform:translate(100%)}.fui-drawer--right.fui-drawer--open .fui-drawer__panel{transform:translate(0)}.fui-drawer--left .fui-drawer__panel{top:0;left:0;bottom:0;width:var(--_drawer-size, 480px);max-width:100%;border-right:1px solid var(--fui-drawer-border-color);box-shadow:4px 0 24px var(--fui-black-10);transform:translate(-100%)}.fui-drawer--left.fui-drawer--open .fui-drawer__panel{transform:translate(0)}.fui-drawer--top .fui-drawer__panel{top:0;left:0;right:0;height:var(--_drawer-size, 480px);max-height:100%;border-bottom:1px solid var(--fui-drawer-border-color);box-shadow:0 4px 24px var(--fui-black-10);transform:translateY(-100%)}.fui-drawer--top.fui-drawer--open .fui-drawer__panel{transform:translateY(0)}.fui-drawer--bottom .fui-drawer__panel{bottom:0;left:0;right:0;height:var(--_drawer-size, 480px);max-height:100%;border-top:1px solid var(--fui-drawer-border-color);box-shadow:0 -4px 24px var(--fui-black-10);transform:translateY(100%)}.fui-drawer--bottom.fui-drawer--open .fui-drawer__panel{transform:translateY(0)}.fui-drawer__header{display:flex;align-items:center;justify-content:space-between;padding:var(--fui-drawer-header-padding);border-bottom:1px solid var(--fui-drawer-border-color);flex-shrink:0}.fui-drawer__title{font-size:var(--fui-font-size-03);font-weight:var(--fui-font-weight-semibold);color:var(--fui-text-primary);margin:0}.fui-drawer__close{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border:none;background:transparent;border-radius:var(--fui-border-radius-sm);color:var(--fui-text-secondary);cursor:pointer;transition:background-color var(--fui-duration-moderate-01) var(--fui-ease-standard),color var(--fui-duration-moderate-01) var(--fui-ease-standard)}.fui-drawer__close:hover{background-color:var(--fui-surface-02);color:var(--fui-text-primary)}.fui-drawer__close:focus-visible{outline:2px solid var(--fui-primary);outline-offset:2px}.fui-drawer__content{flex:1;overflow-y:auto;padding:var(--fui-drawer-content-padding)}.fui-drawer__footer{display:flex;align-items:center;justify-content:flex-end;gap:var(--fui-spacing-03);padding:var(--fui-drawer-footer-padding);border-top:1px solid var(--fui-drawer-border-color);flex-shrink:0}.fui-drawer__footer:empty{display:none}@media(prefers-reduced-motion:reduce){.fui-drawer__backdrop,.fui-drawer__panel,.fui-drawer__close{transition:none}}\n"], dependencies: [{ kind: "component", type: FuiIconComponent, selector: "fui-icon", inputs: ["name", "size", "weight", "color", "ariaLabel", "spin", "pulse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
163
|
+
}
|
|
164
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiDrawerComponent, decorators: [{
|
|
165
|
+
type: Component,
|
|
166
|
+
args: [{ selector: 'fui-drawer', standalone: true, imports: [FuiIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
|
|
167
|
+
class: 'fui-drawer',
|
|
168
|
+
'[class.fui-drawer--open]': '_opened()',
|
|
169
|
+
'[class.fui-drawer--left]': 'position() === "left"',
|
|
170
|
+
'[class.fui-drawer--right]': 'position() === "right"',
|
|
171
|
+
'[class.fui-drawer--top]': 'position() === "top"',
|
|
172
|
+
'[class.fui-drawer--bottom]': 'position() === "bottom"',
|
|
173
|
+
'[class.fui-drawer--overlay]': 'mode() === "overlay"',
|
|
174
|
+
'[class.fui-drawer--push]': 'mode() === "push"',
|
|
175
|
+
'[attr.role]': '"dialog"',
|
|
176
|
+
'[attr.aria-modal]': '_opened() ? "true" : null',
|
|
177
|
+
'[attr.aria-label]': 'ariaLabel() || (!ariaLabelledBy() ? title() : null)',
|
|
178
|
+
'[attr.aria-labelledby]': 'ariaLabelledBy()',
|
|
179
|
+
}, template: "@if (_opened() && hasBackdrop()) {\n <div class=\"fui-drawer__backdrop\" (click)=\"closeOnBackdropClick() ? close() : null\" aria-hidden=\"true\"></div>\n}\n\n<div class=\"fui-drawer__panel\" [style.--_drawer-size]=\"_sizeValue()\" #drawerPanel tabindex=\"-1\">\n @if (title() || showCloseButton()) {\n <div class=\"fui-drawer__header\">\n @if (title()) {\n <h2 class=\"fui-drawer__title\">{{ title() }}</h2>\n }\n @if (showCloseButton()) {\n <button type=\"button\" class=\"fui-drawer__close\" (click)=\"close()\" aria-label=\"Close drawer\">\n <fui-icon name=\"x\" size=\"sm\"></fui-icon>\n </button>\n }\n </div>\n }\n\n <div class=\"fui-drawer__content\">\n <ng-content></ng-content>\n </div>\n\n <div class=\"fui-drawer__footer\">\n <ng-content select=\"[drawerFooter]\"></ng-content>\n </div>\n</div>\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-motion-fade-out{transition:opacity var(--fui-duration-fast-01) var(--fui-ease-exit) 0ms}.fui-motion-slide-in-bottom{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition:transform,opacity var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-moderate-01) var(--fui-ease-entrance)}.fui-drawer{--fui-drawer-z-index: var(--fui-z-index-modal, 1050);--fui-drawer-bg: var(--fui-surface-00);--fui-drawer-border-color: var(--fui-border-color);--fui-drawer-shadow: -4px 0 24px var(--fui-black-10);--fui-drawer-backdrop-color: var(--fui-black-30);--fui-drawer-header-padding: var(--fui-spacing-04) var(--fui-spacing-05);--fui-drawer-content-padding: var(--fui-spacing-05);--fui-drawer-footer-padding: var(--fui-spacing-04) var(--fui-spacing-05);position:fixed;inset:0;pointer-events:none;z-index:var(--fui-drawer-z-index);overflow:hidden;visibility:hidden;transition:visibility 0s linear var(--fui-duration-moderate-01)}.fui-drawer--open{pointer-events:auto;visibility:visible;transition-delay:0s}.fui-drawer__backdrop{position:fixed;inset:0;background-color:var(--fui-drawer-backdrop-color);z-index:1;opacity:0;transition:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-drawer--open .fui-drawer__backdrop{opacity:1}.fui-drawer__panel{position:fixed;display:flex;flex-direction:column;background-color:var(--fui-drawer-bg);z-index:2;pointer-events:auto;transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms}.fui-drawer--right .fui-drawer__panel{top:0;right:0;bottom:0;width:var(--_drawer-size, 480px);max-width:100%;border-left:1px solid var(--fui-drawer-border-color);box-shadow:var(--fui-drawer-shadow);transform:translate(100%)}.fui-drawer--right.fui-drawer--open .fui-drawer__panel{transform:translate(0)}.fui-drawer--left .fui-drawer__panel{top:0;left:0;bottom:0;width:var(--_drawer-size, 480px);max-width:100%;border-right:1px solid var(--fui-drawer-border-color);box-shadow:4px 0 24px var(--fui-black-10);transform:translate(-100%)}.fui-drawer--left.fui-drawer--open .fui-drawer__panel{transform:translate(0)}.fui-drawer--top .fui-drawer__panel{top:0;left:0;right:0;height:var(--_drawer-size, 480px);max-height:100%;border-bottom:1px solid var(--fui-drawer-border-color);box-shadow:0 4px 24px var(--fui-black-10);transform:translateY(-100%)}.fui-drawer--top.fui-drawer--open .fui-drawer__panel{transform:translateY(0)}.fui-drawer--bottom .fui-drawer__panel{bottom:0;left:0;right:0;height:var(--_drawer-size, 480px);max-height:100%;border-top:1px solid var(--fui-drawer-border-color);box-shadow:0 -4px 24px var(--fui-black-10);transform:translateY(100%)}.fui-drawer--bottom.fui-drawer--open .fui-drawer__panel{transform:translateY(0)}.fui-drawer__header{display:flex;align-items:center;justify-content:space-between;padding:var(--fui-drawer-header-padding);border-bottom:1px solid var(--fui-drawer-border-color);flex-shrink:0}.fui-drawer__title{font-size:var(--fui-font-size-03);font-weight:var(--fui-font-weight-semibold);color:var(--fui-text-primary);margin:0}.fui-drawer__close{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border:none;background:transparent;border-radius:var(--fui-border-radius-sm);color:var(--fui-text-secondary);cursor:pointer;transition:background-color var(--fui-duration-moderate-01) var(--fui-ease-standard),color var(--fui-duration-moderate-01) var(--fui-ease-standard)}.fui-drawer__close:hover{background-color:var(--fui-surface-02);color:var(--fui-text-primary)}.fui-drawer__close:focus-visible{outline:2px solid var(--fui-primary);outline-offset:2px}.fui-drawer__content{flex:1;overflow-y:auto;padding:var(--fui-drawer-content-padding)}.fui-drawer__footer{display:flex;align-items:center;justify-content:flex-end;gap:var(--fui-spacing-03);padding:var(--fui-drawer-footer-padding);border-top:1px solid var(--fui-drawer-border-color);flex-shrink:0}.fui-drawer__footer:empty{display:none}@media(prefers-reduced-motion:reduce){.fui-drawer__backdrop,.fui-drawer__panel,.fui-drawer__close{transition:none}}\n"] }]
|
|
180
|
+
}], ctorParameters: () => [], propDecorators: { position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], opened: [{ type: i0.Input, args: [{ isSignal: true, alias: "opened", required: false }] }], hasBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasBackdrop", required: false }] }], closeOnBackdropClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnBackdropClick", required: false }] }], closeOnEsc: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnEsc", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], showCloseButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCloseButton", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], ariaLabelledBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabelledBy", required: false }] }], openedChange: [{ type: i0.Output, args: ["openedChange"] }], closed: [{ type: i0.Output, args: ["closed"] }], drawerPanel: [{ type: i0.ViewChild, args: ['drawerPanel', { isSignal: true }] }], onKeydown: [{
|
|
181
|
+
type: HostListener,
|
|
182
|
+
args: ['document:keydown', ['$event']]
|
|
183
|
+
}] } });
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Generated bundle index. Do not edit.
|
|
187
|
+
*/
|
|
188
|
+
|
|
189
|
+
export { DRAWER_SIZES, FuiDrawerComponent };
|
|
190
|
+
//# sourceMappingURL=raintonic-formaui-components-drawer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raintonic-formaui-components-drawer.mjs","sources":["../../../lib/components/drawer/drawer.types.ts","../../../lib/components/drawer/drawer.component.ts","../../../lib/components/drawer/drawer.component.html","../../../lib/components/drawer/raintonic-formaui-components-drawer.ts"],"sourcesContent":["export type DrawerPosition = 'left' | 'right' | 'top' | 'bottom';\nexport type DrawerMode = 'overlay' | 'push';\nexport type DrawerSize = 'sm' | 'md' | 'lg' | 'full';\n\nexport const DRAWER_SIZES: Record<DrawerSize, string> = {\n sm: '320px',\n md: '480px',\n lg: '640px',\n full: '100%',\n};\n","import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n input,\n output,\n signal,\n computed,\n effect,\n booleanAttribute,\n HostListener,\n ElementRef,\n inject,\n viewChild,\n Signal,\n WritableSignal,\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\nimport { DrawerPosition, DrawerMode, DrawerSize, DRAWER_SIZES } from './drawer.types';\n\n@Component({\n selector: 'fui-drawer',\n standalone: true,\n imports: [FuiIconComponent],\n templateUrl: './drawer.component.html',\n styleUrls: ['./drawer.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'fui-drawer',\n '[class.fui-drawer--open]': '_opened()',\n '[class.fui-drawer--left]': 'position() === \"left\"',\n '[class.fui-drawer--right]': 'position() === \"right\"',\n '[class.fui-drawer--top]': 'position() === \"top\"',\n '[class.fui-drawer--bottom]': 'position() === \"bottom\"',\n '[class.fui-drawer--overlay]': 'mode() === \"overlay\"',\n '[class.fui-drawer--push]': 'mode() === \"push\"',\n '[attr.role]': '\"dialog\"',\n '[attr.aria-modal]': '_opened() ? \"true\" : null',\n '[attr.aria-label]': 'ariaLabel() || (!ariaLabelledBy() ? title() : null)',\n '[attr.aria-labelledby]': 'ariaLabelledBy()',\n },\n})\nexport class FuiDrawerComponent {\n private readonly _document = inject(DOCUMENT);\n\n // Inputs\n readonly position = input<DrawerPosition>('right');\n readonly mode = input<DrawerMode>('overlay');\n readonly size = input('md');\n readonly opened = input<boolean, unknown>(false, { transform: booleanAttribute });\n readonly hasBackdrop = input<boolean, unknown>(true, { transform: booleanAttribute });\n readonly closeOnBackdropClick = input<boolean, unknown>(true, { transform: booleanAttribute });\n readonly closeOnEsc = input<boolean, unknown>(true, { transform: booleanAttribute });\n readonly title = input('');\n readonly showCloseButton = input<boolean, unknown>(true, { transform: booleanAttribute });\n\n /** ARIA label for the drawer, used when no visible title is present */\n readonly ariaLabel = input<string | null>(null);\n\n /** ID of an element that labels the drawer */\n readonly ariaLabelledBy = input<string | null>(null);\n\n // Outputs\n readonly openedChange = output<boolean>();\n readonly closed = output();\n\n // Internal state\n readonly _opened: WritableSignal<boolean> = signal(false);\n readonly _animating: WritableSignal<boolean> = signal(false);\n\n // Track the last input value to avoid effect re-triggering on programmatic changes\n private _lastInputValue = false;\n\n // Focus management\n private _previouslyFocusedElement: HTMLElement | null = null;\n\n // ViewChild\n readonly drawerPanel: Signal<ElementRef<HTMLElement> | undefined> = viewChild<ElementRef<HTMLElement>>('drawerPanel');\n\n // Computed\n readonly _sizeValue: Signal<string> = computed(() => {\n const size = this.size();\n return DRAWER_SIZES[size as DrawerSize] ?? size;\n });\n\n readonly _isHorizontal: Signal<boolean> = computed(() => {\n const pos = this.position();\n return pos === 'left' || pos === 'right';\n });\n\n constructor() {\n // Sync opened input with internal state — only react when the input actually changes\n effect(() => {\n const inputValue = this.opened();\n if (inputValue !== this._lastInputValue) {\n this._lastInputValue = inputValue;\n if (inputValue) {\n this._openInternal();\n } else {\n this._closeInternal();\n }\n }\n });\n }\n\n @HostListener('document:keydown', ['$event'])\n onKeydown(event: KeyboardEvent): void {\n if (!this._opened()) return;\n\n if (event.key === 'Escape' && this.closeOnEsc()) {\n this.close();\n return;\n }\n\n // Focus trap cycling\n if (event.key === 'Tab') {\n const focusableElements = this._getAllFocusableElements();\n if (focusableElements.length === 0) {\n event.preventDefault();\n return;\n }\n\n const firstFocusable = focusableElements[0];\n const lastFocusable = focusableElements[focusableElements.length - 1];\n const activeElement = this._document.activeElement;\n\n if (event.shiftKey) {\n if (activeElement === firstFocusable) {\n event.preventDefault();\n lastFocusable.focus();\n }\n } else {\n if (activeElement === lastFocusable) {\n event.preventDefault();\n firstFocusable.focus();\n }\n }\n }\n }\n\n open(): void {\n if (!this._opened()) {\n this._openInternal();\n this.openedChange.emit(true);\n }\n }\n\n close(): void {\n if (this._opened()) {\n this._closeInternal();\n this.openedChange.emit(false);\n this.closed.emit();\n }\n }\n\n toggle(): void {\n if (this._opened()) {\n this.close();\n } else {\n this.open();\n }\n }\n\n private _openInternal(): void {\n this._previouslyFocusedElement = document.activeElement as HTMLElement;\n this._opened.set(true);\n\n // Focus the panel after it renders\n setTimeout(() => {\n this._focusFirstTabbable();\n });\n }\n\n private _closeInternal(): void {\n this._opened.set(false);\n\n // Restore focus\n if (this._previouslyFocusedElement) {\n this._previouslyFocusedElement.focus();\n this._previouslyFocusedElement = null;\n }\n }\n\n private _focusFirstTabbable(): void {\n const panel = this.drawerPanel()?.nativeElement;\n if (!panel) return;\n\n const focusable = this._getAllFocusableElements();\n\n if (focusable.length > 0) {\n focusable[0].focus();\n } else {\n panel.setAttribute('tabindex', '-1');\n panel.focus();\n }\n }\n\n private _getAllFocusableElements(): HTMLElement[] {\n const panel = this.drawerPanel()?.nativeElement;\n if (!panel) return [];\n\n const selectors = [\n 'a[href]',\n 'button:not([disabled])',\n 'textarea:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n ].join(',');\n\n return Array.from(panel.querySelectorAll<HTMLElement>(selectors)).filter((el) => el.offsetParent !== null);\n }\n}\n","@if (_opened() && hasBackdrop()) {\n <div class=\"fui-drawer__backdrop\" (click)=\"closeOnBackdropClick() ? close() : null\" aria-hidden=\"true\"></div>\n}\n\n<div class=\"fui-drawer__panel\" [style.--_drawer-size]=\"_sizeValue()\" #drawerPanel tabindex=\"-1\">\n @if (title() || showCloseButton()) {\n <div class=\"fui-drawer__header\">\n @if (title()) {\n <h2 class=\"fui-drawer__title\">{{ title() }}</h2>\n }\n @if (showCloseButton()) {\n <button type=\"button\" class=\"fui-drawer__close\" (click)=\"close()\" aria-label=\"Close drawer\">\n <fui-icon name=\"x\" size=\"sm\"></fui-icon>\n </button>\n }\n </div>\n }\n\n <div class=\"fui-drawer__content\">\n <ng-content></ng-content>\n </div>\n\n <div class=\"fui-drawer__footer\">\n <ng-content select=\"[drawerFooter]\"></ng-content>\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|