@ship-ui/core 0.22.16 → 0.22.17

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.
Files changed (66) hide show
  1. package/assets/mcp/components.json +181 -39
  2. package/bin/src/subset.ts +6 -6
  3. package/bin/src/utilities.ts +14 -14
  4. package/fesm2022/ship-ui-core-ship-a11y-keybindings.mjs +4 -87
  5. package/fesm2022/ship-ui-core-ship-a11y-keybindings.mjs.map +1 -1
  6. package/fesm2022/ship-ui-core-ship-accordion.mjs +4 -3
  7. package/fesm2022/ship-ui-core-ship-accordion.mjs.map +1 -1
  8. package/fesm2022/ship-ui-core-ship-alert.mjs +1 -4
  9. package/fesm2022/ship-ui-core-ship-alert.mjs.map +1 -1
  10. package/fesm2022/ship-ui-core-ship-blueprint.mjs +8 -10
  11. package/fesm2022/ship-ui-core-ship-blueprint.mjs.map +1 -1
  12. package/fesm2022/ship-ui-core-ship-checkbox.mjs +3 -2
  13. package/fesm2022/ship-ui-core-ship-checkbox.mjs.map +1 -1
  14. package/fesm2022/ship-ui-core-ship-color-picker.mjs +66 -62
  15. package/fesm2022/ship-ui-core-ship-color-picker.mjs.map +1 -1
  16. package/fesm2022/ship-ui-core-ship-datepicker.mjs +8 -12
  17. package/fesm2022/ship-ui-core-ship-datepicker.mjs.map +1 -1
  18. package/fesm2022/ship-ui-core-ship-editor.mjs +0 -42
  19. package/fesm2022/ship-ui-core-ship-editor.mjs.map +1 -1
  20. package/fesm2022/ship-ui-core-ship-form-field.mjs +0 -1
  21. package/fesm2022/ship-ui-core-ship-form-field.mjs.map +1 -1
  22. package/fesm2022/ship-ui-core-ship-kbd.mjs +0 -6
  23. package/fesm2022/ship-ui-core-ship-kbd.mjs.map +1 -1
  24. package/fesm2022/ship-ui-core-ship-list-item-swipe.mjs +241 -0
  25. package/fesm2022/ship-ui-core-ship-list-item-swipe.mjs.map +1 -0
  26. package/fesm2022/ship-ui-core-ship-menu.mjs +7 -10
  27. package/fesm2022/ship-ui-core-ship-menu.mjs.map +1 -1
  28. package/fesm2022/ship-ui-core-ship-popover.mjs +1 -20
  29. package/fesm2022/ship-ui-core-ship-popover.mjs.map +1 -1
  30. package/fesm2022/ship-ui-core-ship-radio.mjs +3 -2
  31. package/fesm2022/ship-ui-core-ship-radio.mjs.map +1 -1
  32. package/fesm2022/ship-ui-core-ship-range-slider.mjs +7 -9
  33. package/fesm2022/ship-ui-core-ship-range-slider.mjs.map +1 -1
  34. package/fesm2022/ship-ui-core-ship-select.mjs.map +1 -1
  35. package/fesm2022/ship-ui-core-ship-sidenav.mjs +2 -2
  36. package/fesm2022/ship-ui-core-ship-sidenav.mjs.map +1 -1
  37. package/fesm2022/ship-ui-core-ship-sortable.mjs +262 -68
  38. package/fesm2022/ship-ui-core-ship-sortable.mjs.map +1 -1
  39. package/fesm2022/ship-ui-core-ship-spotlight.mjs +0 -11
  40. package/fesm2022/ship-ui-core-ship-spotlight.mjs.map +1 -1
  41. package/fesm2022/ship-ui-core-ship-stepper.mjs +1 -1
  42. package/fesm2022/ship-ui-core-ship-stepper.mjs.map +1 -1
  43. package/fesm2022/ship-ui-core-ship-table.mjs +4 -5
  44. package/fesm2022/ship-ui-core-ship-table.mjs.map +1 -1
  45. package/fesm2022/ship-ui-core-ship-toggle.mjs +3 -2
  46. package/fesm2022/ship-ui-core-ship-toggle.mjs.map +1 -1
  47. package/fesm2022/ship-ui-core-ship-tree.mjs +1 -9
  48. package/fesm2022/ship-ui-core-ship-tree.mjs.map +1 -1
  49. package/fesm2022/ship-ui-core.mjs +37 -53
  50. package/fesm2022/ship-ui-core.mjs.map +1 -1
  51. package/package.json +5 -1
  52. package/types/ship-ui-core-ship-a11y-keybindings.d.ts +0 -55
  53. package/types/ship-ui-core-ship-accordion.d.ts +7 -7
  54. package/types/ship-ui-core-ship-blueprint.d.ts +1 -1
  55. package/types/ship-ui-core-ship-checkbox.d.ts +2 -3
  56. package/types/ship-ui-core-ship-color-picker.d.ts +1 -25
  57. package/types/ship-ui-core-ship-datepicker.d.ts +0 -3
  58. package/types/ship-ui-core-ship-editor.d.ts +10 -10
  59. package/types/ship-ui-core-ship-list-item-swipe.d.ts +25 -0
  60. package/types/ship-ui-core-ship-menu.d.ts +1 -2
  61. package/types/ship-ui-core-ship-radio.d.ts +2 -3
  62. package/types/ship-ui-core-ship-range-slider.d.ts +6 -6
  63. package/types/ship-ui-core-ship-sortable.d.ts +31 -9
  64. package/types/ship-ui-core-ship-toggle.d.ts +2 -3
  65. package/types/ship-ui-core-ship-tree.d.ts +20 -25
  66. package/types/ship-ui-core.d.ts +17 -24
@@ -1 +1 @@
1
- {"version":3,"file":"ship-ui-core-ship-datepicker.mjs","sources":["../../../projects/ship-ui/ship-datepicker/ship-datepicker.ts","../../../projects/ship-ui/ship-datepicker/ship-datepicker-input.ts","../../../projects/ship-ui/ship-datepicker/ship-daterange-input.ts","../../../projects/ship-ui/ship-datepicker/ship-ui-core-ship-datepicker.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, effect, ElementRef, input, model, output, signal, viewChild, inject, ViewEncapsulation } from '@angular/core';\nimport { ShipIcon } from '@ship-ui/core/ship-icon';\nimport { classMutationSignal } from '@ship-ui/core';\nimport { HostListener } from '@angular/core';\nimport { ShipA11yKeybindingsService } from '@ship-ui/core/ship-a11y-keybindings';\n\n@Component({\n selector: 'sh-datepicker',\n styleUrl: './ship-datepicker.scss',\n encapsulation: ViewEncapsulation.None,\n imports: [ShipIcon],\n template: `\n <header>\n <button tabindex=\"-1\" (click)=\"previousMonth()\" [attr.aria-keyshortcuts]=\"prevMonthShortcut()\"><sh-icon>caret-left</sh-icon></button>\n <div class=\"title\">\n {{ getMonthName(currentDate()!) }}\n @if (monthsToShow() > 1) {\n - {{ getMonthName(getLastVisibleMonth()) }}\n }\n {{ getFullYear(currentDate()!) }}\n </div>\n <button tabindex=\"-1\" (click)=\"nextMonth()\" [attr.aria-keyshortcuts]=\"nextMonthShortcut()\"><sh-icon>caret-right</sh-icon></button>\n </header>\n\n <section class=\"months-container\">\n @for (monthOffset of monthOffsets(); track monthOffset) {\n <div class=\"month\">\n <nav class=\"weekdays\">\n @for (day of weekdays(); track $index) {\n <div>{{ day }}</div>\n }\n </nav>\n\n <div class=\"days\" #daysRef>\n @for (calDate of getMonthDates(monthOffset); track $index) {\n <button\n type=\"button\"\n #elementRef\n [class.out-of-scope]=\"!isCurrentMonth(calDate, monthOffset)\"\n [class]=\"isDateSelected(calDate)\"\n [attr.aria-label]=\"getAriaLabel(calDate)\"\n [attr.tabindex]=\"getTabIndex(calDate)\"\n [attr.aria-selected]=\"isDateSelectedBool(calDate)\"\n (keydown)=\"onKeydown($event, calDate)\"\n (click)=\"setDate(calDate, elementRef)\">\n {{ calDate.getDate() }}\n </button>\n }\n\n @if (!asRange()) {\n <article class=\"days\">\n <div class=\"sel-el\" [style]=\"selectedDateStylePosition()\"></div>\n </article>\n }\n </div>\n </div>\n }\n </section>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.as-range]': 'asRange()',\n '[class]': '\"columns-\" + monthsToShow()',\n '[class.disabled]': 'disabled()',\n },\n})\nexport class ShipDatepicker {\n #INIT_DATE = new Date(new Date().setHours(0, 0, 0, 0));\n\n date = model<Date | null>(null);\n endDate = model<Date | null>(null);\n asRange = input<boolean>(false);\n activeRangeSelection = input<'start' | 'end' | null>(null);\n monthsToShow = input<number>(1);\n disabled = input<boolean>(false);\n tabbedOut = output<void>();\n\n startOfWeek = input<number>(1);\n weekdayLabels = input<string[]>(['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']);\n\n daysRef = viewChild<ElementRef<HTMLDivElement>>('daysRef');\n currentDate = signal<Date>(this.date() ?? this.#INIT_DATE);\n\n #keybindings = inject(ShipA11yKeybindingsService);\n\n prevMonthShortcut = computed(() => {\n const action = 'datepicker.prev-month';\n const shortcut = this.#keybindings.getShortcut(action);\n return shortcut ? (this.#keybindings.getDisplayShortcut(action) || shortcut) : null;\n });\n\n nextMonthShortcut = computed(() => {\n const action = 'datepicker.next-month';\n const shortcut = this.#keybindings.getShortcut(action);\n return shortcut ? (this.#keybindings.getDisplayShortcut(action) || shortcut) : null;\n });\n\n monthOffsets = computed(() => {\n return Array.from({ length: this.monthsToShow() }, (_, i) => i);\n });\n\n selectedDateStylePosition = signal<{ transform: string; opacity: string } | null>(null);\n\n weekdays = computed(() => {\n const startOfWeek = this.startOfWeek();\n const weekdayLabels = this.weekdayLabels();\n\n return weekdayLabels.slice(startOfWeek).concat(weekdayLabels.slice(0, startOfWeek));\n });\n\n currentClasses = classMutationSignal();\n someEffect = effect(() => {\n const _ = this.currentClasses();\n\n this.#findSelectedAndCalc();\n });\n\n getLastVisibleMonth(): Date {\n const lastMonthOffset = this.monthsToShow() - 1;\n return this.getOffsetDate(lastMonthOffset);\n }\n\n getOffsetDate(monthOffset: number): Date {\n const date = new Date(this.currentDate());\n date.setMonth(date.getMonth() + monthOffset);\n return date;\n }\n\n getMonthDates(monthOffset: number): Date[] {\n const offsetDate = this.getOffsetDate(monthOffset);\n return this.#generateMonthDates(offsetDate, this.startOfWeek());\n }\n\n #newDateEffect = effect(() => {\n if (this.monthsToShow() > 1) return;\n\n this.#setDateAsCurrent();\n });\n\n ngOnInit() {\n if (this.monthsToShow() === 1) return;\n\n this.#setDateAsCurrent();\n }\n\n #setDateAsCurrent() {\n const newDate = this.date();\n if (newDate && !isNaN(newDate.getTime())) {\n this.currentDate.set(newDate);\n }\n this.#findSelectedAndCalc();\n }\n\n #findSelectedAndCalc() {\n setTimeout(() => {\n const selectedElement = this.daysRef()?.nativeElement.querySelector('.sel');\n\n if (!selectedElement) {\n return this.selectedDateStylePosition.update((x) => (x ? { ...x, opacity: '0' } : null));\n }\n\n this.setSelectedDateStylePosition(selectedElement as HTMLElement);\n });\n }\n\n #generateMonthDates(date: Date, startOfWeek: number): Date[] {\n const year = date.getFullYear();\n const month = date.getMonth();\n const firstDay = new Date(year, month, 1).getDay();\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const dates: Date[] = [];\n\n let offset = firstDay - startOfWeek;\n if (offset < 0) {\n offset += 7;\n }\n\n const lastDayOfPrevMonth = new Date(year, month, 0).getDate();\n\n for (let i = offset - 1; i >= 0; i--) {\n dates.push(new Date(year, month - 1, lastDayOfPrevMonth - i, 0, 0, 0, 0));\n }\n\n for (let i = 1; i <= daysInMonth; i++) {\n dates.push(new Date(year, month, i, 0, 0, 0, 0));\n }\n\n let nextMonthDay = 1;\n while (dates.length % 7 !== 0) {\n dates.push(new Date(year, month + 1, nextMonthDay++, 0, 0, 0, 0));\n }\n\n return dates;\n }\n\n nextMonth() {\n this.currentDate.update((currentDate) => {\n const newDate = new Date(currentDate);\n newDate.setMonth(currentDate.getMonth() + 1);\n return newDate;\n });\n\n this.#findSelectedAndCalc();\n }\n\n previousMonth() {\n this.currentDate.update((currentDate) => {\n const newDate = new Date(currentDate);\n newDate.setMonth(currentDate.getMonth() - 1);\n return newDate;\n });\n\n this.#findSelectedAndCalc();\n }\n\n setDate(newDate: Date, selectedElement: HTMLElement) {\n this.focusedDate.set(newDate);\n\n const createDateWithExistingTime = (newDate: Date, existingDate: any | null) => {\n let hours = 0, minutes = 0, seconds = 0, milliseconds = 0;\n \n if (existingDate) {\n if (typeof existingDate === 'string' || typeof existingDate === 'number') {\n existingDate = new Date(existingDate);\n }\n if (existingDate instanceof Date && !isNaN(existingDate.getTime())) {\n hours = existingDate.getHours();\n minutes = existingDate.getMinutes();\n seconds = existingDate.getSeconds();\n milliseconds = existingDate.getMilliseconds();\n }\n }\n\n return new Date(\n newDate.getFullYear(),\n newDate.getMonth(),\n newDate.getDate(),\n hours,\n minutes,\n seconds,\n milliseconds\n );\n };\n\n if (!this.asRange()) {\n this.date.set(createDateWithExistingTime(newDate, this.date()));\n this.endDate.set(null);\n } else {\n const startDate = this.date();\n const endDate = this.endDate();\n const selectionMode = this.activeRangeSelection();\n\n if (selectionMode === 'start') {\n const utcDate = createDateWithExistingTime(newDate, startDate);\n this.date.set(utcDate);\n if (endDate && utcDate > endDate) {\n this.endDate.set(null);\n }\n } else if (selectionMode === 'end') {\n if (!startDate || newDate < startDate) {\n const newStart = createDateWithExistingTime(newDate, startDate);\n this.date.set(newStart);\n this.endDate.set(null);\n } else {\n const utcDate = createDateWithExistingTime(newDate, endDate);\n this.endDate.set(utcDate);\n }\n } else {\n if (!startDate) {\n const utcDate = createDateWithExistingTime(newDate, startDate);\n this.date.set(utcDate);\n } else if (!endDate) {\n if (newDate < startDate) {\n const newStart = createDateWithExistingTime(newDate, startDate);\n this.date.set(newStart);\n this.endDate.set(null);\n } else {\n const utcDate = createDateWithExistingTime(newDate, endDate);\n this.endDate.set(utcDate);\n }\n } else {\n const utcDate = createDateWithExistingTime(newDate, startDate);\n this.date.set(utcDate);\n this.endDate.set(null);\n }\n }\n }\n\n if (this.asRange()) return;\n\n this.setSelectedDateStylePosition(selectedElement);\n }\n\n isDateSelected(date: Date): string | null {\n let startDate: any = this.date();\n let endDate: any = this.endDate();\n\n if (typeof startDate === 'string' || typeof startDate === 'number') startDate = new Date(startDate);\n if (typeof endDate === 'string' || typeof endDate === 'number') endDate = new Date(endDate);\n\n if (!startDate || !(startDate instanceof Date) || isNaN(startDate.getTime())) return null;\n\n const startOfDay = (date: Date) => {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0, 0);\n };\n\n const endOfDay = (date: Date) => {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59, 999);\n };\n\n const currentDate = startOfDay(date);\n const rangeStart = startOfDay(startDate);\n const rangeEnd = endDate ? endOfDay(endDate) : null;\n\n let classes = [];\n\n if (this.asRange()) {\n if (rangeEnd === null) {\n if (currentDate.getTime() === rangeStart.getTime()) {\n classes.push('sel first last');\n }\n } else {\n if (currentDate.getTime() === rangeStart.getTime()) {\n classes.push('first');\n }\n\n if (currentDate.getTime() === startOfDay(rangeEnd).getTime()) {\n classes.push('last');\n }\n\n if (currentDate >= rangeStart && currentDate <= rangeEnd) {\n classes.push('sel');\n\n const dayOfWeek = currentDate.getDay();\n const startOfWeek = this.startOfWeek();\n\n if (dayOfWeek === startOfWeek) {\n classes.push('week-start');\n }\n\n const endOfWeek = (startOfWeek + 6) % 7;\n if (dayOfWeek === endOfWeek) {\n classes.push('week-end');\n }\n }\n\n const nextDate = new Date(currentDate);\n nextDate.setDate(currentDate.getDate() + 1);\n const prevDate = new Date(currentDate);\n prevDate.setDate(currentDate.getDate() - 1);\n\n const isFirstOfMonth = currentDate.getDate() === 1;\n const isLastOfMonth = nextDate.getMonth() !== currentDate.getMonth();\n\n if (isFirstOfMonth) {\n classes.push('month-start');\n }\n\n if (isLastOfMonth) {\n classes.push('month-end');\n }\n }\n } else {\n if (currentDate.getTime() === rangeStart.getTime()) {\n classes.push('sel');\n }\n }\n\n return classes.join(' ') || null;\n }\n\n setSelectedDateStylePosition(selectedElement: HTMLElement) {\n this.selectedDateStylePosition.set({\n transform: `translate(${selectedElement.offsetLeft}px, ${selectedElement.offsetTop}px)`,\n opacity: '1',\n });\n }\n\n getMonthName(date: Date): string {\n return date.toLocaleString('default', { month: 'long' });\n }\n\n getFullYear(date: Date): number {\n return date.getFullYear();\n }\n\n // Rest of the component methods remain the same, but update isCurrentMonth:\n isCurrentMonth(date: Date, monthOffset: number): boolean {\n const offsetDate = this.getOffsetDate(monthOffset);\n return date.getMonth() === offsetDate.getMonth();\n }\n\n focusedDate = signal<Date | null>(null);\n #selfRef = inject(ElementRef);\n\n isSameDay(d1: Date | null | undefined, d2: Date | null | undefined): boolean {\n if (!d1 || !d2) return false;\n return d1.getFullYear() === d2.getFullYear() &&\n d1.getMonth() === d2.getMonth() &&\n d1.getDate() === d2.getDate();\n }\n\n getAriaLabel(date: Date): string {\n return date.toLocaleDateString(undefined, { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });\n }\n\n getTabIndex(date: Date): number {\n const focused = this.focusedDate();\n const selected = this.date();\n const today = new Date();\n\n if (focused) {\n return this.isSameDay(date, focused) ? 0 : -1;\n }\n if (selected) {\n return this.isSameDay(date, selected) ? 0 : -1;\n }\n return this.isSameDay(date, today) ? 0 : -1;\n }\n\n isDateSelectedBool(date: Date): boolean {\n const classes = this.isDateSelected(date);\n return classes ? classes.includes('sel') : false;\n }\n\n onKeydown(event: KeyboardEvent, date: Date) {\n let newDate = new Date(date);\n let handled = false;\n\n if (this.#keybindings.matches(event, 'datepicker.prev-month')) {\n newDate.setMonth(date.getMonth() - 1);\n handled = true;\n } else if (this.#keybindings.matches(event, 'datepicker.next-month')) {\n newDate.setMonth(date.getMonth() + 1);\n handled = true;\n } else if (this.#keybindings.matches(event, 'datepicker.prev-year')) {\n newDate.setFullYear(date.getFullYear() - 1);\n handled = true;\n } else if (this.#keybindings.matches(event, 'datepicker.next-year')) {\n newDate.setFullYear(date.getFullYear() + 1);\n handled = true;\n } else if (this.#keybindings.matches(event, 'datepicker.month-start')) {\n newDate = new Date(date.getFullYear(), date.getMonth(), 1, 0, 0, 0, 0);\n handled = true;\n } else if (this.#keybindings.matches(event, 'datepicker.month-end')) {\n newDate = new Date(date.getFullYear(), date.getMonth() + 1, 0, 0, 0, 0, 0);\n handled = true;\n } else if (this.#keybindings.matches(event, 'datepicker.day-next')) {\n newDate.setDate(date.getDate() + 1);\n handled = true;\n } else if (this.#keybindings.matches(event, 'datepicker.day-prev')) {\n newDate.setDate(date.getDate() - 1);\n handled = true;\n } else if (this.#keybindings.matches(event, 'datepicker.week-next')) {\n newDate.setDate(date.getDate() + 7);\n handled = true;\n } else if (this.#keybindings.matches(event, 'datepicker.week-prev')) {\n newDate.setDate(date.getDate() - 7);\n handled = true;\n }\n\n if (handled) {\n event.preventDefault();\n this.ensureDateVisible(newDate);\n this.focusedDate.set(newDate);\n \n setTimeout(() => {\n const buttons = this.#selfRef.nativeElement.querySelectorAll('button');\n if (buttons) {\n const targetAria = this.getAriaLabel(newDate);\n let bestMatch: HTMLButtonElement | null = null;\n for (let i = 0; i < buttons.length; i++) {\n if (buttons[i].getAttribute('aria-label') === targetAria) {\n bestMatch = buttons[i];\n if (!buttons[i].classList.contains('out-of-scope')) {\n break;\n }\n }\n }\n if (bestMatch) {\n bestMatch.focus();\n }\n }\n });\n }\n }\n\n ensureDateVisible(date: Date) {\n const start = this.currentDate();\n const end = this.getLastVisibleMonth();\n \n if (date < new Date(start.getFullYear(), start.getMonth(), 1)) {\n this.currentDate.set(new Date(date.getFullYear(), date.getMonth(), 1));\n this.#findSelectedAndCalc();\n } else if (date > new Date(end.getFullYear(), end.getMonth() + 1, 0)) {\n const newStart = new Date(date);\n newStart.setMonth(newStart.getMonth() - this.monthsToShow() + 1);\n newStart.setDate(1);\n this.currentDate.set(newStart);\n this.#findSelectedAndCalc();\n }\n }\n\n focusActiveDate() {\n setTimeout(() => {\n const activeBtn = this.#selfRef.nativeElement.querySelector('button[tabindex=\"0\"]') as HTMLButtonElement;\n if (activeBtn) activeBtn.focus();\n }, 50);\n }\n\n @HostListener('focusout', ['$event'])\n onFocusOut(event: FocusEvent) {\n setTimeout(() => {\n const activeElement = document.activeElement as HTMLElement | null;\n if (\n activeElement &&\n activeElement !== document.body &&\n !this.#selfRef.nativeElement.contains(activeElement)\n ) {\n this.tabbedOut.emit();\n }\n });\n }\n}\n","import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ElementRef, HostListener, computed, contentChild, effect, inject, input, model, output, signal, viewChild, ViewEncapsulation } from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport { ShipFormFieldPopover } from '@ship-ui/core/ship-form-field';\nimport { ShipIcon } from '@ship-ui/core/ship-icon';\nimport { classMutationSignal } from '@ship-ui/core';\nimport { contentProjectionSignal } from '@ship-ui/core';\nimport { ShipDatepicker } from './ship-datepicker';\n\n@Component({\n selector: 'sh-datepicker-input',\n styleUrl: './ship-datepicker.scss',\n encapsulation: ViewEncapsulation.None,\n imports: [ShipDatepicker, ShipFormFieldPopover, ShipIcon],\n providers: [DatePipe],\n template: `\n <sh-form-field-popover (closed)=\"close()\" [(isOpen)]=\"isOpen\">\n <ng-content select=\"label\" ngProjectAs=\"label\" />\n\n <ng-content select=\"[prefix]\" ngProjectAs=\"[prefix]\" />\n <ng-content select=\"[textPrefix]\" ngProjectAs=\"[textPrefix]\" />\n\n <div id=\"input-wrap\" class=\"input\" ngProjectAs=\"input\">\n @if (this.masking()) {\n <div class=\"masked-value\">\n {{ _maskedDate() }}\n </div>\n }\n <ng-content select=\"input\" />\n </div>\n\n <ng-content select=\"[textSuffix]\" ngProjectAs=\"[textSuffix]\" />\n <ng-content select=\"[suffix]\" ngProjectAs=\"[suffix]\" />\n <sh-icon class=\"default-indicator\" suffix>calendar</sh-icon>\n\n <div popoverContent>\n @if (this.isOpen()) {\n <sh-datepicker [date]=\"internalDate()\" (dateChange)=\"onDateChange($event)\" (tabbedOut)=\"isOpen.set(false)\" [class]=\"currentClass()\" />\n }\n </div>\n </sh-form-field-popover>\n\n <ng-template #defaultIndicator></ng-template>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ShipDatepickerInput {\n // #INIT_DATE = this.#getUTCDate(new Date());\n\n #selfRef = inject(ElementRef);\n ngControl = contentChild(NgControl);\n #datePipe = inject(DatePipe);\n #inputRef = signal<HTMLInputElement | null>(null);\n\n masking = input('mediumDate');\n closed = output<Date | null>();\n\n _maskedDate = computed(() => {\n const date = this.internalDate();\n const mask = this.masking();\n\n if (!mask) return date;\n if (!date) return null;\n\n return this.#datePipe.transform(date, mask);\n });\n\n internalDate = signal<Date | null>(null);\n isOpen = model<boolean>(false);\n currentClass = classMutationSignal();\n #inputObserver = contentProjectionSignal<HTMLInputElement>('#input-wrap input');\n datepicker = viewChild(ShipDatepicker);\n\n #isOpenEffect = effect(() => {\n if (this.isOpen()) {\n setTimeout(() => {\n this.datepicker()?.focusActiveDate();\n }, 50);\n }\n });\n\n @HostListener('focusout', ['$event'])\n onFocusOut(event: FocusEvent) {\n setTimeout(() => {\n const activeElement = document.activeElement as HTMLElement | null;\n if (\n activeElement &&\n activeElement !== document.body &&\n !this.#selfRef.nativeElement.contains(activeElement)\n ) {\n this.isOpen.set(false);\n }\n });\n }\n\n onDateChange(date: Date | null) {\n this.internalDate.set(date);\n\n const control = this.ngControl()?.control;\n\n if (control) {\n control.setValue(date);\n } else {\n const input = this.#inputRef();\n if (input) {\n input.value = date ? date.toString() : '';\n input.dispatchEvent(new Event('input'));\n }\n }\n }\n\n close() {\n this.closed.emit(this.internalDate());\n }\n\n #inputRefEffect = effect(() => {\n const inputs = this.#inputObserver();\n\n if (!inputs.length) return;\n\n const input = inputs[0];\n\n if (!input) return;\n\n this.#createCustomInputEventListener(input);\n\n input.addEventListener('inputValueChanged', (event: any) => {\n const val = event.detail.value;\n if (!val) {\n this.internalDate.set(null);\n return;\n }\n \n let newD = new Date(val);\n \n if (isNaN(newD.getTime())) {\n // If it's a time-only string like \"14:30\" or \"14:30:00\"\n if (typeof val === 'string' && /^(\\d{2}):(\\d{2})/.test(val)) {\n const match = val.match(/^(\\d{2}):(\\d{2})(?::(\\d{2}))?/);\n if (match) {\n const current = this.internalDate() || new Date();\n newD = new Date(current);\n newD.setHours(parseInt(match[1], 10), parseInt(match[2], 10), match[3] ? parseInt(match[3], 10) : 0, 0);\n }\n }\n }\n \n if (!isNaN(newD.getTime())) {\n this.internalDate.set(newD);\n }\n });\n\n input.addEventListener('focus', () => {\n this.isOpen.set(true);\n // Removed input.blur() so users can actually type or use Shift+Tab to navigate backward\n });\n\n this.#inputRef.set(input);\n input.autocomplete = 'off';\n\n if (typeof input.value === 'string') {\n this.internalDate.set(input.value ? new Date(input.value) : null);\n }\n });\n\n #createCustomInputEventListener(input: HTMLInputElement) {\n Object.defineProperty(input, 'value', {\n configurable: true,\n get() {\n const descriptor = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value');\n return descriptor!.get!.call(this);\n },\n set(newVal) {\n const descriptor = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value');\n descriptor!.set!.call(this, newVal);\n\n const inputEvent = new CustomEvent('inputValueChanged', {\n bubbles: true,\n cancelable: true,\n detail: {\n value: newVal,\n },\n });\n\n this.dispatchEvent(inputEvent);\n\n return newVal;\n },\n });\n\n return input;\n }\n}\n","import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, contentChildren, effect, ElementRef, HostListener, inject, input, model, output, signal, viewChild, ViewEncapsulation } from '@angular/core';\nimport { contentProjectionSignal } from '@ship-ui/core';\nimport { ShipFormFieldPopover } from '@ship-ui/core/ship-form-field';\nimport { ShipIcon } from '@ship-ui/core/ship-icon';\nimport { ShipDatepicker } from './ship-datepicker';\n\n@Component({\n selector: 'sh-daterange-input',\n styleUrl: './ship-datepicker.scss',\n encapsulation: ViewEncapsulation.None,\n imports: [ShipDatepicker, ShipFormFieldPopover, ShipIcon],\n providers: [DatePipe],\n template: `\n <sh-form-field-popover [class]=\"'columns-' + monthsToShow()\" (closed)=\"close()\" [(isOpen)]=\"isOpen\">\n <ng-content select=\"label\" ngProjectAs=\"label\" />\n\n <ng-content select=\"[prefix]\" ngProjectAs=\"[prefix]\" />\n <ng-content select=\"[textPrefix]\" ngProjectAs=\"[textPrefix]\" />\n\n <div class=\"input\" ngProjectAs=\"input\" #inputWrap [class.active-start]=\"isOpen() && activeInput() === 'start'\" [class.active-end]=\"isOpen() && activeInput() === 'end'\">\n @if (this.masking()) {\n <div class=\"masked-value\" [class.active-start]=\"isOpen() && activeInput() === 'start'\" [class.active-end]=\"isOpen() && activeInput() === 'end'\">\n <span class=\"start-val\">{{ _maskedStartDate() ?? 'N/A' }}</span>\n <span class=\"separator\">-</span>\n <span class=\"end-val\">{{ _maskedEndDate() ?? 'N/A' }}</span>\n </div>\n }\n <ng-content select=\"input\" />\n </div>\n\n <ng-content select=\"[textSuffix]\" ngProjectAs=\"[textSuffix]\" />\n <ng-content select=\"[suffix]\" ngProjectAs=\"[suffix]\" />\n <sh-icon class=\"default-indicator\" suffix>calendar</sh-icon>\n\n <div popoverContent>\n @if (this.isOpen()) {\n <sh-datepicker\n [date]=\"startDate()\"\n [endDate]=\"endDate()\"\n [activeRangeSelection]=\"activeInput()\"\n [class]=\"classes\"\n (dateChange)=\"onStartDateChange($event)\"\n (endDateChange)=\"onEndDateChange($event)\"\n (tabbedOut)=\"isOpen.set(false)\"\n [monthsToShow]=\"monthsToShow()\"\n [asRange]=\"true\" />\n }\n </div>\n </sh-form-field-popover>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ShipDaterangeInput {\n #selfRef = inject(ElementRef);\n\n #inputObserver = contentProjectionSignal('input', {\n childList: true,\n subtree: true,\n });\n\n #datePipe = inject(DatePipe);\n monthsToShow = input<number>(1);\n masking = input('mediumDate');\n closed = output<{ start: Date | null; end: Date | null }>();\n\n startDate = signal<Date | null>(null);\n endDate = signal<Date | null>(null);\n activeInput = signal<'start' | 'end'>('start');\n isOpen = model<boolean>(false);\n datepicker = viewChild(ShipDatepicker);\n\n #isOpenEffect = effect(() => {\n if (this.isOpen()) {\n setTimeout(() => {\n this.datepicker()?.focusActiveDate();\n }, 50);\n }\n });\n\n get classes() {\n return `${this.#selfRef.nativeElement.classList.value}`;\n }\n\n _maskedStartDate = computed(() => {\n const date = this.startDate();\n const mask = this.masking();\n if (!mask || !date) return null;\n return this.#datePipe.transform(date, mask);\n });\n\n _maskedEndDate = computed(() => {\n const date = this.endDate();\n const mask = this.masking();\n if (!mask || !date) return null;\n return this.#datePipe.transform(date, mask);\n });\n\n constructor() {\n effect(() => {\n const inputs = this.#inputObserver() as HTMLInputElement[];\n if (inputs.length === 0) return;\n\n if (inputs[0]) this.setupInput(inputs[0], true);\n if (inputs[1]) this.setupInput(inputs[1], false);\n });\n }\n\n private setupInput(element: HTMLInputElement, isStart: boolean) {\n if ((element as any)._hasCustomFocusEvent) return;\n (element as any)._hasCustomFocusEvent = true;\n\n element.autocomplete = 'off';\n \n // Set tabindex -1 on the second input to prevent users from having to Shift+Tab \n // multiple times to exit the component when masking is enabled.\n if (!isStart) {\n element.tabIndex = -1;\n }\n\n element.addEventListener('focus', () => {\n this.activeInput.set(isStart ? 'start' : 'end');\n if ((element as any)._ignoreNextFocus) {\n (element as any)._ignoreNextFocus = false;\n return;\n }\n this.isOpen.set(true);\n });\n\n // Handle initial value\n if (element.value) {\n try {\n const date = new Date(element.value);\n if (!isNaN(date.getTime())) {\n if (isStart) {\n this.startDate.set(date);\n } else {\n this.endDate.set(date);\n }\n }\n } catch (e) {\n console.warn('Invalid date value:', element.value);\n }\n }\n }\n\n @HostListener('focusout', ['$event'])\n onFocusOut(event: FocusEvent) {\n setTimeout(() => {\n const activeElement = document.activeElement as HTMLElement | null;\n if (\n activeElement &&\n activeElement !== document.body &&\n !this.#selfRef.nativeElement.contains(activeElement)\n ) {\n this.isOpen.set(false);\n }\n });\n }\n\n onStartDateChange(date: Date | null) {\n this.startDate.set(date);\n const inputs = this.#inputObserver() as HTMLInputElement[];\n if (inputs[0]) this.updateInputValue([inputs[0]], date);\n \n // Automatically switch to end date selection\n this.activeInput.set('end');\n }\n\n onEndDateChange(date: Date | null) {\n this.endDate.set(date);\n const inputs = this.#inputObserver() as HTMLInputElement[];\n if (inputs[1]) this.updateInputValue([inputs[1]], date);\n\n if (this.startDate() && date) {\n this.isOpen.set(false);\n \n const inputs = this.#inputObserver() as HTMLInputElement[];\n if (inputs[0] && document.activeElement !== inputs[0]) {\n (inputs[0] as any)._ignoreNextFocus = true;\n inputs[0].focus();\n }\n }\n }\n\n private updateInputValue(inputs: HTMLInputElement[], date: Date | null) {\n inputs.forEach((input) => {\n if (this.masking()) {\n input.value = this.#datePipe.transform(date, this.masking()) ?? '';\n } else {\n input.value = date ? date.toUTCString() : '';\n }\n this.dispatchInputEvent(input);\n });\n }\n\n private dispatchInputEvent(input: HTMLInputElement) {\n input.dispatchEvent(new Event('input', { bubbles: true }));\n input.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n close() {\n this.closed.emit({\n start: this.startDate(),\n end: this.endDate(),\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ship-ui-core-ship-datepicker.mjs","sources":["../../../projects/ship-ui/ship-datepicker/ship-datepicker.ts","../../../projects/ship-ui/ship-datepicker/ship-datepicker-input.ts","../../../projects/ship-ui/ship-datepicker/ship-daterange-input.ts","../../../projects/ship-ui/ship-datepicker/ship-ui-core-ship-datepicker.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, effect, ElementRef, input, model, output, signal, viewChild, inject, ViewEncapsulation } from '@angular/core';\nimport { ShipIcon } from '@ship-ui/core/ship-icon';\nimport { classMutationSignal } from '@ship-ui/core';\nimport { HostListener } from '@angular/core';\nimport { ShipA11yKeybindingsService } from '@ship-ui/core/ship-a11y-keybindings';\n\n@Component({\n selector: 'sh-datepicker',\n styleUrl: './ship-datepicker.scss',\n encapsulation: ViewEncapsulation.None,\n imports: [ShipIcon],\n template: `\n <header>\n <button tabindex=\"-1\" (click)=\"previousMonth()\" [attr.aria-keyshortcuts]=\"prevMonthShortcut()\"><sh-icon>caret-left</sh-icon></button>\n <div class=\"title\">\n {{ getMonthName(currentDate()!) }}\n @if (monthsToShow() > 1) {\n - {{ getMonthName(getLastVisibleMonth()) }}\n }\n {{ getFullYear(currentDate()!) }}\n </div>\n <button tabindex=\"-1\" (click)=\"nextMonth()\" [attr.aria-keyshortcuts]=\"nextMonthShortcut()\"><sh-icon>caret-right</sh-icon></button>\n </header>\n\n <section class=\"months-container\">\n @for (monthOffset of monthOffsets(); track monthOffset) {\n <div class=\"month\">\n <nav class=\"weekdays\">\n @for (day of weekdays(); track $index) {\n <div>{{ day }}</div>\n }\n </nav>\n\n <div class=\"days\" #daysRef>\n @for (calDate of getMonthDates(monthOffset); track $index) {\n <button\n type=\"button\"\n #elementRef\n [class.out-of-scope]=\"!isCurrentMonth(calDate, monthOffset)\"\n [class]=\"isDateSelected(calDate)\"\n [attr.aria-label]=\"getAriaLabel(calDate)\"\n [attr.tabindex]=\"getTabIndex(calDate)\"\n [attr.aria-selected]=\"isDateSelectedBool(calDate)\"\n (keydown)=\"onKeydown($event, calDate)\"\n (click)=\"setDate(calDate, elementRef)\">\n {{ calDate.getDate() }}\n </button>\n }\n\n @if (!asRange()) {\n <article class=\"days\">\n <div class=\"sel-el\" [style]=\"selectedDateStylePosition()\"></div>\n </article>\n }\n </div>\n </div>\n }\n </section>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.as-range]': 'asRange()',\n '[class]': '\"columns-\" + monthsToShow()',\n '[class.disabled]': 'disabled()',\n },\n})\nexport class ShipDatepicker {\n #INIT_DATE = new Date(new Date().setHours(0, 0, 0, 0));\n\n date = model<Date | null>(null);\n endDate = model<Date | null>(null);\n asRange = input<boolean>(false);\n activeRangeSelection = input<'start' | 'end' | null>(null);\n monthsToShow = input<number>(1);\n disabled = input<boolean>(false);\n tabbedOut = output<void>();\n\n startOfWeek = input<number>(1);\n weekdayLabels = input<string[]>(['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']);\n\n daysRef = viewChild<ElementRef<HTMLDivElement>>('daysRef');\n currentDate = signal<Date>(this.date() ?? this.#INIT_DATE);\n\n #keybindings = inject(ShipA11yKeybindingsService);\n\n prevMonthShortcut = computed(() => {\n const action = 'datepicker.prev-month';\n const shortcut = this.#keybindings.getShortcut(action);\n return shortcut ? (this.#keybindings.getDisplayShortcut(action) || shortcut) : null;\n });\n\n nextMonthShortcut = computed(() => {\n const action = 'datepicker.next-month';\n const shortcut = this.#keybindings.getShortcut(action);\n return shortcut ? (this.#keybindings.getDisplayShortcut(action) || shortcut) : null;\n });\n\n monthOffsets = computed(() => {\n return Array.from({ length: this.monthsToShow() }, (_, i) => i);\n });\n\n selectedDateStylePosition = signal<{ transform: string; opacity: string } | null>(null);\n\n weekdays = computed(() => {\n const startOfWeek = this.startOfWeek();\n const weekdayLabels = this.weekdayLabels();\n\n return weekdayLabels.slice(startOfWeek).concat(weekdayLabels.slice(0, startOfWeek));\n });\n\n currentClasses = classMutationSignal();\n someEffect = effect(() => {\n const _ = this.currentClasses();\n\n this.#findSelectedAndCalc();\n });\n\n getLastVisibleMonth(): Date {\n const lastMonthOffset = this.monthsToShow() - 1;\n return this.getOffsetDate(lastMonthOffset);\n }\n\n getOffsetDate(monthOffset: number): Date {\n const date = new Date(this.currentDate());\n date.setMonth(date.getMonth() + monthOffset);\n return date;\n }\n\n getMonthDates(monthOffset: number): Date[] {\n const offsetDate = this.getOffsetDate(monthOffset);\n return this.#generateMonthDates(offsetDate, this.startOfWeek());\n }\n\n #newDateEffect = effect(() => {\n if (this.monthsToShow() > 1) return;\n\n this.#setDateAsCurrent();\n });\n\n ngOnInit() {\n if (this.monthsToShow() === 1) return;\n\n this.#setDateAsCurrent();\n }\n\n #setDateAsCurrent() {\n const newDate = this.date();\n if (newDate && !isNaN(newDate.getTime())) {\n this.currentDate.set(newDate);\n }\n this.#findSelectedAndCalc();\n }\n\n #findSelectedAndCalc() {\n setTimeout(() => {\n const selectedElement = this.daysRef()?.nativeElement.querySelector('.sel');\n\n if (!selectedElement) {\n return this.selectedDateStylePosition.update((x) => (x ? { ...x, opacity: '0' } : null));\n }\n\n this.setSelectedDateStylePosition(selectedElement as HTMLElement);\n });\n }\n\n #generateMonthDates(date: Date, startOfWeek: number): Date[] {\n const year = date.getFullYear();\n const month = date.getMonth();\n const firstDay = new Date(year, month, 1).getDay();\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const dates: Date[] = [];\n\n let offset = firstDay - startOfWeek;\n if (offset < 0) {\n offset += 7;\n }\n\n const lastDayOfPrevMonth = new Date(year, month, 0).getDate();\n\n for (let i = offset - 1; i >= 0; i--) {\n dates.push(new Date(year, month - 1, lastDayOfPrevMonth - i, 0, 0, 0, 0));\n }\n\n for (let i = 1; i <= daysInMonth; i++) {\n dates.push(new Date(year, month, i, 0, 0, 0, 0));\n }\n\n let nextMonthDay = 1;\n while (dates.length % 7 !== 0) {\n dates.push(new Date(year, month + 1, nextMonthDay++, 0, 0, 0, 0));\n }\n\n return dates;\n }\n\n nextMonth() {\n this.currentDate.update((currentDate) => {\n const newDate = new Date(currentDate);\n newDate.setMonth(currentDate.getMonth() + 1);\n return newDate;\n });\n\n this.#findSelectedAndCalc();\n }\n\n previousMonth() {\n this.currentDate.update((currentDate) => {\n const newDate = new Date(currentDate);\n newDate.setMonth(currentDate.getMonth() - 1);\n return newDate;\n });\n\n this.#findSelectedAndCalc();\n }\n\n setDate(newDate: Date, selectedElement: HTMLElement) {\n this.focusedDate.set(newDate);\n\n const createDateWithExistingTime = (newDate: Date, existingDate: any | null) => {\n let hours = 0, minutes = 0, seconds = 0, milliseconds = 0;\n \n if (existingDate) {\n if (typeof existingDate === 'string' || typeof existingDate === 'number') {\n existingDate = new Date(existingDate);\n }\n if (existingDate instanceof Date && !isNaN(existingDate.getTime())) {\n hours = existingDate.getHours();\n minutes = existingDate.getMinutes();\n seconds = existingDate.getSeconds();\n milliseconds = existingDate.getMilliseconds();\n }\n }\n\n return new Date(\n newDate.getFullYear(),\n newDate.getMonth(),\n newDate.getDate(),\n hours,\n minutes,\n seconds,\n milliseconds\n );\n };\n\n if (!this.asRange()) {\n this.date.set(createDateWithExistingTime(newDate, this.date()));\n this.endDate.set(null);\n } else {\n const startDate = this.date();\n const endDate = this.endDate();\n const selectionMode = this.activeRangeSelection();\n\n if (selectionMode === 'start') {\n const utcDate = createDateWithExistingTime(newDate, startDate);\n this.date.set(utcDate);\n if (endDate && utcDate > endDate) {\n this.endDate.set(null);\n }\n } else if (selectionMode === 'end') {\n if (!startDate || newDate < startDate) {\n const newStart = createDateWithExistingTime(newDate, startDate);\n this.date.set(newStart);\n this.endDate.set(null);\n } else {\n const utcDate = createDateWithExistingTime(newDate, endDate);\n this.endDate.set(utcDate);\n }\n } else {\n if (!startDate) {\n const utcDate = createDateWithExistingTime(newDate, startDate);\n this.date.set(utcDate);\n } else if (!endDate) {\n if (newDate < startDate) {\n const newStart = createDateWithExistingTime(newDate, startDate);\n this.date.set(newStart);\n this.endDate.set(null);\n } else {\n const utcDate = createDateWithExistingTime(newDate, endDate);\n this.endDate.set(utcDate);\n }\n } else {\n const utcDate = createDateWithExistingTime(newDate, startDate);\n this.date.set(utcDate);\n this.endDate.set(null);\n }\n }\n }\n\n if (this.asRange()) return;\n\n this.setSelectedDateStylePosition(selectedElement);\n }\n\n isDateSelected(date: Date): string | null {\n let startDate: any = this.date();\n let endDate: any = this.endDate();\n\n if (typeof startDate === 'string' || typeof startDate === 'number') startDate = new Date(startDate);\n if (typeof endDate === 'string' || typeof endDate === 'number') endDate = new Date(endDate);\n\n if (!startDate || !(startDate instanceof Date) || isNaN(startDate.getTime())) return null;\n\n const startOfDay = (date: Date) => {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0, 0);\n };\n\n const endOfDay = (date: Date) => {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59, 999);\n };\n\n const currentDate = startOfDay(date);\n const rangeStart = startOfDay(startDate);\n const rangeEnd = endDate ? endOfDay(endDate) : null;\n\n let classes = [];\n\n if (this.asRange()) {\n if (rangeEnd === null) {\n if (currentDate.getTime() === rangeStart.getTime()) {\n classes.push('sel first last');\n }\n } else {\n if (currentDate.getTime() === rangeStart.getTime()) {\n classes.push('first');\n }\n\n if (currentDate.getTime() === startOfDay(rangeEnd).getTime()) {\n classes.push('last');\n }\n\n if (currentDate >= rangeStart && currentDate <= rangeEnd) {\n classes.push('sel');\n\n const dayOfWeek = currentDate.getDay();\n const startOfWeek = this.startOfWeek();\n\n if (dayOfWeek === startOfWeek) {\n classes.push('week-start');\n }\n\n const endOfWeek = (startOfWeek + 6) % 7;\n if (dayOfWeek === endOfWeek) {\n classes.push('week-end');\n }\n }\n\n const nextDate = new Date(currentDate);\n nextDate.setDate(currentDate.getDate() + 1);\n const prevDate = new Date(currentDate);\n prevDate.setDate(currentDate.getDate() - 1);\n\n const isFirstOfMonth = currentDate.getDate() === 1;\n const isLastOfMonth = nextDate.getMonth() !== currentDate.getMonth();\n\n if (isFirstOfMonth) {\n classes.push('month-start');\n }\n\n if (isLastOfMonth) {\n classes.push('month-end');\n }\n }\n } else {\n if (currentDate.getTime() === rangeStart.getTime()) {\n classes.push('sel');\n }\n }\n\n return classes.join(' ') || null;\n }\n\n setSelectedDateStylePosition(selectedElement: HTMLElement) {\n this.selectedDateStylePosition.set({\n transform: `translate(${selectedElement.offsetLeft}px, ${selectedElement.offsetTop}px)`,\n opacity: '1',\n });\n }\n\n getMonthName(date: Date): string {\n return date.toLocaleString('default', { month: 'long' });\n }\n\n getFullYear(date: Date): number {\n return date.getFullYear();\n }\n\n // Rest of the component methods remain the same, but update isCurrentMonth:\n isCurrentMonth(date: Date, monthOffset: number): boolean {\n const offsetDate = this.getOffsetDate(monthOffset);\n return date.getMonth() === offsetDate.getMonth();\n }\n\n focusedDate = signal<Date | null>(null);\n #selfRef = inject(ElementRef);\n\n isSameDay(d1: Date | null | undefined, d2: Date | null | undefined): boolean {\n if (!d1 || !d2) return false;\n return d1.getFullYear() === d2.getFullYear() &&\n d1.getMonth() === d2.getMonth() &&\n d1.getDate() === d2.getDate();\n }\n\n getAriaLabel(date: Date): string {\n return date.toLocaleDateString(undefined, { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });\n }\n\n getTabIndex(date: Date): number {\n const focused = this.focusedDate();\n const selected = this.date();\n const today = new Date();\n\n if (focused) {\n return this.isSameDay(date, focused) ? 0 : -1;\n }\n if (selected) {\n return this.isSameDay(date, selected) ? 0 : -1;\n }\n return this.isSameDay(date, today) ? 0 : -1;\n }\n\n isDateSelectedBool(date: Date): boolean {\n const classes = this.isDateSelected(date);\n return classes ? classes.includes('sel') : false;\n }\n\n onKeydown(event: KeyboardEvent, date: Date) {\n let newDate = new Date(date);\n let handled = false;\n\n if (this.#keybindings.matches(event, 'datepicker.prev-month')) {\n newDate.setMonth(date.getMonth() - 1);\n handled = true;\n } else if (this.#keybindings.matches(event, 'datepicker.next-month')) {\n newDate.setMonth(date.getMonth() + 1);\n handled = true;\n } else if (this.#keybindings.matches(event, 'datepicker.prev-year')) {\n newDate.setFullYear(date.getFullYear() - 1);\n handled = true;\n } else if (this.#keybindings.matches(event, 'datepicker.next-year')) {\n newDate.setFullYear(date.getFullYear() + 1);\n handled = true;\n } else if (this.#keybindings.matches(event, 'datepicker.month-start')) {\n newDate = new Date(date.getFullYear(), date.getMonth(), 1, 0, 0, 0, 0);\n handled = true;\n } else if (this.#keybindings.matches(event, 'datepicker.month-end')) {\n newDate = new Date(date.getFullYear(), date.getMonth() + 1, 0, 0, 0, 0, 0);\n handled = true;\n } else if (this.#keybindings.matches(event, 'datepicker.day-next')) {\n newDate.setDate(date.getDate() + 1);\n handled = true;\n } else if (this.#keybindings.matches(event, 'datepicker.day-prev')) {\n newDate.setDate(date.getDate() - 1);\n handled = true;\n } else if (this.#keybindings.matches(event, 'datepicker.week-next')) {\n newDate.setDate(date.getDate() + 7);\n handled = true;\n } else if (this.#keybindings.matches(event, 'datepicker.week-prev')) {\n newDate.setDate(date.getDate() - 7);\n handled = true;\n }\n\n if (handled) {\n event.preventDefault();\n this.ensureDateVisible(newDate);\n this.focusedDate.set(newDate);\n \n setTimeout(() => {\n const buttons = this.#selfRef.nativeElement.querySelectorAll('button');\n if (buttons) {\n const targetAria = this.getAriaLabel(newDate);\n let bestMatch: HTMLButtonElement | null = null;\n for (let i = 0; i < buttons.length; i++) {\n if (buttons[i].getAttribute('aria-label') === targetAria) {\n bestMatch = buttons[i];\n if (!buttons[i].classList.contains('out-of-scope')) {\n break;\n }\n }\n }\n if (bestMatch) {\n bestMatch.focus();\n }\n }\n });\n }\n }\n\n ensureDateVisible(date: Date) {\n const start = this.currentDate();\n const end = this.getLastVisibleMonth();\n \n if (date < new Date(start.getFullYear(), start.getMonth(), 1)) {\n this.currentDate.set(new Date(date.getFullYear(), date.getMonth(), 1));\n this.#findSelectedAndCalc();\n } else if (date > new Date(end.getFullYear(), end.getMonth() + 1, 0)) {\n const newStart = new Date(date);\n newStart.setMonth(newStart.getMonth() - this.monthsToShow() + 1);\n newStart.setDate(1);\n this.currentDate.set(newStart);\n this.#findSelectedAndCalc();\n }\n }\n\n focusActiveDate() {\n setTimeout(() => {\n const activeBtn = this.#selfRef.nativeElement.querySelector('button[tabindex=\"0\"]') as HTMLButtonElement;\n if (activeBtn) activeBtn.focus();\n }, 50);\n }\n\n @HostListener('focusout', ['$event'])\n onFocusOut(event: FocusEvent) {\n setTimeout(() => {\n const activeElement = document.activeElement as HTMLElement | null;\n if (\n activeElement &&\n activeElement !== document.body &&\n !this.#selfRef.nativeElement.contains(activeElement)\n ) {\n this.tabbedOut.emit();\n }\n });\n }\n}\n","import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ElementRef, HostListener, computed, contentChild, effect, inject, input, model, output, signal, viewChild, ViewEncapsulation } from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport { ShipFormFieldPopover } from '@ship-ui/core/ship-form-field';\nimport { ShipIcon } from '@ship-ui/core/ship-icon';\nimport { classMutationSignal } from '@ship-ui/core';\nimport { contentProjectionSignal } from '@ship-ui/core';\nimport { ShipDatepicker } from './ship-datepicker';\n\n@Component({\n selector: 'sh-datepicker-input',\n styleUrl: './ship-datepicker.scss',\n encapsulation: ViewEncapsulation.None,\n imports: [ShipDatepicker, ShipFormFieldPopover, ShipIcon],\n providers: [DatePipe],\n template: `\n <sh-form-field-popover (closed)=\"close()\" [(isOpen)]=\"isOpen\">\n <ng-content select=\"label\" ngProjectAs=\"label\" />\n\n <ng-content select=\"[prefix]\" ngProjectAs=\"[prefix]\" />\n <ng-content select=\"[textPrefix]\" ngProjectAs=\"[textPrefix]\" />\n\n <div id=\"input-wrap\" class=\"input\" ngProjectAs=\"input\">\n @if (this.masking()) {\n <div class=\"masked-value\">\n {{ _maskedDate() }}\n </div>\n }\n <ng-content select=\"input\" />\n </div>\n\n <ng-content select=\"[textSuffix]\" ngProjectAs=\"[textSuffix]\" />\n <ng-content select=\"[suffix]\" ngProjectAs=\"[suffix]\" />\n <sh-icon class=\"default-indicator\" suffix>calendar</sh-icon>\n\n <div popoverContent>\n @if (this.isOpen()) {\n <sh-datepicker [date]=\"internalDate()\" (dateChange)=\"onDateChange($event)\" (tabbedOut)=\"isOpen.set(false)\" [class]=\"currentClass()\" />\n }\n </div>\n </sh-form-field-popover>\n\n <ng-template #defaultIndicator></ng-template>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ShipDatepickerInput {\n \n\n #selfRef = inject(ElementRef);\n ngControl = contentChild(NgControl);\n #datePipe = inject(DatePipe);\n #inputRef = signal<HTMLInputElement | null>(null);\n\n masking = input('mediumDate');\n closed = output<Date | null>();\n\n _maskedDate = computed(() => {\n const date = this.internalDate();\n const mask = this.masking();\n\n if (!mask) return date;\n if (!date) return null;\n\n return this.#datePipe.transform(date, mask);\n });\n\n internalDate = signal<Date | null>(null);\n isOpen = model<boolean>(false);\n currentClass = classMutationSignal();\n #inputObserver = contentProjectionSignal<HTMLInputElement>('#input-wrap input');\n datepicker = viewChild(ShipDatepicker);\n\n #isOpenEffect = effect(() => {\n if (this.isOpen()) {\n setTimeout(() => {\n this.datepicker()?.focusActiveDate();\n }, 50);\n }\n });\n\n @HostListener('focusout', ['$event'])\n onFocusOut(event: FocusEvent) {\n setTimeout(() => {\n const activeElement = document.activeElement as HTMLElement | null;\n if (\n activeElement &&\n activeElement !== document.body &&\n !this.#selfRef.nativeElement.contains(activeElement)\n ) {\n this.isOpen.set(false);\n }\n });\n }\n\n onDateChange(date: Date | null) {\n this.internalDate.set(date);\n\n const control = this.ngControl()?.control;\n\n if (control) {\n control.setValue(date);\n } else {\n const input = this.#inputRef();\n if (input) {\n input.value = date ? date.toString() : '';\n input.dispatchEvent(new Event('input'));\n }\n }\n }\n\n close() {\n this.closed.emit(this.internalDate());\n }\n\n #inputRefEffect = effect(() => {\n const inputs = this.#inputObserver();\n\n if (!inputs.length) return;\n\n const input = inputs[0];\n\n if (!input) return;\n\n this.#createCustomInputEventListener(input);\n\n input.addEventListener('inputValueChanged', (event: any) => {\n const val = event.detail.value;\n if (!val) {\n this.internalDate.set(null);\n return;\n }\n \n let newD = new Date(val);\n \n if (isNaN(newD.getTime())) {\n \n if (typeof val === 'string' && /^(\\d{2}):(\\d{2})/.test(val)) {\n const match = val.match(/^(\\d{2}):(\\d{2})(?::(\\d{2}))?/);\n if (match) {\n const current = this.internalDate() || new Date();\n newD = new Date(current);\n newD.setHours(parseInt(match[1], 10), parseInt(match[2], 10), match[3] ? parseInt(match[3], 10) : 0, 0);\n }\n }\n }\n \n if (!isNaN(newD.getTime())) {\n this.internalDate.set(newD);\n }\n });\n\n input.addEventListener('focus', () => {\n this.isOpen.set(true);\n \n });\n\n this.#inputRef.set(input);\n input.autocomplete = 'off';\n\n if (typeof input.value === 'string') {\n this.internalDate.set(input.value ? new Date(input.value) : null);\n }\n });\n\n #createCustomInputEventListener(input: HTMLInputElement) {\n Object.defineProperty(input, 'value', {\n configurable: true,\n get() {\n const descriptor = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value');\n return descriptor!.get!.call(this);\n },\n set(newVal) {\n const descriptor = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value');\n descriptor!.set!.call(this, newVal);\n\n const inputEvent = new CustomEvent('inputValueChanged', {\n bubbles: true,\n cancelable: true,\n detail: {\n value: newVal,\n },\n });\n\n this.dispatchEvent(inputEvent);\n\n return newVal;\n },\n });\n\n return input;\n }\n}\n","import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, contentChildren, effect, ElementRef, HostListener, inject, input, model, output, signal, viewChild, ViewEncapsulation } from '@angular/core';\nimport { contentProjectionSignal } from '@ship-ui/core';\nimport { ShipFormFieldPopover } from '@ship-ui/core/ship-form-field';\nimport { ShipIcon } from '@ship-ui/core/ship-icon';\nimport { ShipDatepicker } from './ship-datepicker';\n\n@Component({\n selector: 'sh-daterange-input',\n styleUrl: './ship-datepicker.scss',\n encapsulation: ViewEncapsulation.None,\n imports: [ShipDatepicker, ShipFormFieldPopover, ShipIcon],\n providers: [DatePipe],\n template: `\n <sh-form-field-popover [class]=\"'columns-' + monthsToShow()\" (closed)=\"close()\" [(isOpen)]=\"isOpen\">\n <ng-content select=\"label\" ngProjectAs=\"label\" />\n\n <ng-content select=\"[prefix]\" ngProjectAs=\"[prefix]\" />\n <ng-content select=\"[textPrefix]\" ngProjectAs=\"[textPrefix]\" />\n\n <div class=\"input\" ngProjectAs=\"input\" #inputWrap [class.active-start]=\"isOpen() && activeInput() === 'start'\" [class.active-end]=\"isOpen() && activeInput() === 'end'\">\n @if (this.masking()) {\n <div class=\"masked-value\" [class.active-start]=\"isOpen() && activeInput() === 'start'\" [class.active-end]=\"isOpen() && activeInput() === 'end'\">\n <span class=\"start-val\">{{ _maskedStartDate() ?? 'N/A' }}</span>\n <span class=\"separator\">-</span>\n <span class=\"end-val\">{{ _maskedEndDate() ?? 'N/A' }}</span>\n </div>\n }\n <ng-content select=\"input\" />\n </div>\n\n <ng-content select=\"[textSuffix]\" ngProjectAs=\"[textSuffix]\" />\n <ng-content select=\"[suffix]\" ngProjectAs=\"[suffix]\" />\n <sh-icon class=\"default-indicator\" suffix>calendar</sh-icon>\n\n <div popoverContent>\n @if (this.isOpen()) {\n <sh-datepicker\n [date]=\"startDate()\"\n [endDate]=\"endDate()\"\n [activeRangeSelection]=\"activeInput()\"\n [class]=\"classes\"\n (dateChange)=\"onStartDateChange($event)\"\n (endDateChange)=\"onEndDateChange($event)\"\n (tabbedOut)=\"isOpen.set(false)\"\n [monthsToShow]=\"monthsToShow()\"\n [asRange]=\"true\" />\n }\n </div>\n </sh-form-field-popover>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ShipDaterangeInput {\n #selfRef = inject(ElementRef);\n\n #inputObserver = contentProjectionSignal('input', {\n childList: true,\n subtree: true,\n });\n\n #datePipe = inject(DatePipe);\n monthsToShow = input<number>(1);\n masking = input('mediumDate');\n closed = output<{ start: Date | null; end: Date | null }>();\n\n startDate = signal<Date | null>(null);\n endDate = signal<Date | null>(null);\n activeInput = signal<'start' | 'end'>('start');\n isOpen = model<boolean>(false);\n datepicker = viewChild(ShipDatepicker);\n\n #isOpenEffect = effect(() => {\n if (this.isOpen()) {\n setTimeout(() => {\n this.datepicker()?.focusActiveDate();\n }, 50);\n }\n });\n\n get classes() {\n return `${this.#selfRef.nativeElement.classList.value}`;\n }\n\n _maskedStartDate = computed(() => {\n const date = this.startDate();\n const mask = this.masking();\n if (!mask || !date) return null;\n return this.#datePipe.transform(date, mask);\n });\n\n _maskedEndDate = computed(() => {\n const date = this.endDate();\n const mask = this.masking();\n if (!mask || !date) return null;\n return this.#datePipe.transform(date, mask);\n });\n\n constructor() {\n effect(() => {\n const inputs = this.#inputObserver() as HTMLInputElement[];\n if (inputs.length === 0) return;\n\n if (inputs[0]) this.#setupInput(inputs[0], true);\n if (inputs[1]) this.#setupInput(inputs[1], false);\n });\n }\n\n #setupInput(element: HTMLInputElement, isStart: boolean) {\n if ((element as any)._hasCustomFocusEvent) return;\n (element as any)._hasCustomFocusEvent = true;\n\n element.autocomplete = 'off';\n \n // Set tabindex -1 on the second input to prevent users from having to Shift+Tab \n // multiple times to exit the component when masking is enabled.\n if (!isStart) {\n element.tabIndex = -1;\n }\n\n element.addEventListener('focus', () => {\n this.activeInput.set(isStart ? 'start' : 'end');\n if ((element as any)._ignoreNextFocus) {\n (element as any)._ignoreNextFocus = false;\n return;\n }\n this.isOpen.set(true);\n });\n\n // Handle initial value\n if (element.value) {\n try {\n const date = new Date(element.value);\n if (!isNaN(date.getTime())) {\n if (isStart) {\n this.startDate.set(date);\n } else {\n this.endDate.set(date);\n }\n }\n } catch (e) {\n console.warn('Invalid date value:', element.value);\n }\n }\n }\n\n @HostListener('focusout', ['$event'])\n onFocusOut(event: FocusEvent) {\n setTimeout(() => {\n const activeElement = document.activeElement as HTMLElement | null;\n if (\n activeElement &&\n activeElement !== document.body &&\n !this.#selfRef.nativeElement.contains(activeElement)\n ) {\n this.isOpen.set(false);\n }\n });\n }\n\n onStartDateChange(date: Date | null) {\n this.startDate.set(date);\n const inputs = this.#inputObserver() as HTMLInputElement[];\n if (inputs[0]) this.#updateInputValue([inputs[0]], date);\n \n // Automatically switch to end date selection\n this.activeInput.set('end');\n }\n\n onEndDateChange(date: Date | null) {\n this.endDate.set(date);\n const inputs = this.#inputObserver() as HTMLInputElement[];\n if (inputs[1]) this.#updateInputValue([inputs[1]], date);\n\n if (this.startDate() && date) {\n this.isOpen.set(false);\n \n const inputs = this.#inputObserver() as HTMLInputElement[];\n if (inputs[0] && document.activeElement !== inputs[0]) {\n (inputs[0] as any)._ignoreNextFocus = true;\n inputs[0].focus();\n }\n }\n }\n\n #updateInputValue(inputs: HTMLInputElement[], date: Date | null) {\n inputs.forEach((input) => {\n if (this.masking()) {\n input.value = this.#datePipe.transform(date, this.masking()) ?? '';\n } else {\n input.value = date ? date.toUTCString() : '';\n }\n this.#dispatchInputEvent(input);\n });\n }\n\n #dispatchInputEvent(input: HTMLInputElement) {\n input.dispatchEvent(new Event('input', { bubbles: true }));\n input.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n close() {\n this.closed.emit({\n start: this.startDate(),\n end: this.endDate(),\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -7,7 +7,6 @@ import { ShipIcon } from '@ship-ui/core/ship-icon';
7
7
  import { ShipMenu } from '@ship-ui/core/ship-menu';
8
8
  import { ShipA11yKeybindingsService } from '@ship-ui/core/ship-a11y-keybindings';
9
9
 
10
- // Value Accessor Provider
11
10
  const SHIP_EDITOR_VALUE_ACCESSOR = {
12
11
  provide: NG_VALUE_ACCESSOR,
13
12
  useExisting: forwardRef(() => ShipEditor),
@@ -29,11 +28,8 @@ class ShipEditor {
29
28
  #maxHistorySize;
30
29
  #isInternalDOMUpdate;
31
30
  #typingTimeout;
32
- // Image layout overlay signals
33
31
  #selectedImage;
34
- // Selection backup for inserting links/images when modal is open
35
32
  #savedRange;
36
- // Track outer changes
37
33
  #isWriting;
38
34
  #lastFormat;
39
35
  constructor() {
@@ -42,7 +38,6 @@ class ShipEditor {
42
38
  this.#isBrowser = isPlatformBrowser(this.#platformId);
43
39
  this.#elementRef = inject(ElementRef);
44
40
  this.#keybindings = inject(ShipA11yKeybindingsService);
45
- // Elements
46
41
  this.editorRef = viewChild('editorRef', /* @ts-ignore */
47
42
  ...(ngDevMode ? [{ debugName: "editorRef" }] : /* istanbul ignore next */ []));
48
43
  this.codeEditorRef = viewChild('codeEditorRef', /* @ts-ignore */
@@ -53,7 +48,6 @@ class ShipEditor {
53
48
  ...(ngDevMode ? [{ debugName: "imageInput" }] : /* istanbul ignore next */ []));
54
49
  this.linkInput = viewChild('linkInput', /* @ts-ignore */
55
50
  ...(ngDevMode ? [{ debugName: "linkInput" }] : /* istanbul ignore next */ []));
56
- // Configuration inputs & model signals
57
51
  this.value = model('', /* @ts-ignore */
58
52
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
59
53
  this.format = input('html', /* @ts-ignore */
@@ -70,7 +64,6 @@ class ShipEditor {
70
64
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
71
65
  this.customCommands = input([], /* @ts-ignore */
72
66
  ...(ngDevMode ? [{ debugName: "customCommands" }] : /* istanbul ignore next */ []));
73
- // Slash commands state signals
74
67
  this.showSlashMenu = signal(false, /* @ts-ignore */
75
68
  ...(ngDevMode ? [{ debugName: "showSlashMenu" }] : /* istanbul ignore next */ []));
76
69
  this.slashSearchQuery = signal('', /* @ts-ignore */
@@ -183,7 +176,6 @@ class ShipEditor {
183
176
  cmd.id.toLowerCase().includes(query));
184
177
  }, /* @ts-ignore */
185
178
  ...(ngDevMode ? [{ debugName: "filteredCommands" }] : /* istanbul ignore next */ []));
186
- // Toolbar group configuration inputs
187
179
  this.showFormats = input(true, /* @ts-ignore */
188
180
  ...(ngDevMode ? [{ debugName: "showFormats" }] : /* istanbul ignore next */ []));
189
181
  this.showBlocks = input(true, /* @ts-ignore */
@@ -196,13 +188,11 @@ class ShipEditor {
196
188
  ...(ngDevMode ? [{ debugName: "showInsertions" }] : /* istanbul ignore next */ []));
197
189
  this.showHistory = input(true, /* @ts-ignore */
198
190
  ...(ngDevMode ? [{ debugName: "showHistory" }] : /* istanbul ignore next */ []));
199
- // File upload output hook & configuration
200
191
  this.customUpload = input(false, /* @ts-ignore */
201
192
  ...(ngDevMode ? [{ debugName: "customUpload" }] : /* istanbul ignore next */ []));
202
193
  this.imageUploadEnabled = input(true, /* @ts-ignore */
203
194
  ...(ngDevMode ? [{ debugName: "imageUploadEnabled" }] : /* istanbul ignore next */ []));
204
195
  this.imageUpload = output();
205
- // Image layout overlay signals
206
196
  this.#selectedImage = signal(null, /* @ts-ignore */
207
197
  ...(ngDevMode ? [{ debugName: "#selectedImage" }] : /* istanbul ignore next */ []));
208
198
  this.imgToolbarTop = signal(0, /* @ts-ignore */
@@ -213,7 +203,6 @@ class ShipEditor {
213
203
  ...(ngDevMode ? [{ debugName: "imgMode" }] : /* istanbul ignore next */ []));
214
204
  this.imgSize = signal('auto', /* @ts-ignore */
215
205
  ...(ngDevMode ? [{ debugName: "imgSize" }] : /* istanbul ignore next */ []));
216
- // Local state signals
217
206
  this.viewMode = signal('design', /* @ts-ignore */
218
207
  ...(ngDevMode ? [{ debugName: "viewMode" }] : /* istanbul ignore next */ []));
219
208
  this.isFocused = signal(false, /* @ts-ignore */
@@ -226,7 +215,6 @@ class ShipEditor {
226
215
  ...(ngDevMode ? [{ debugName: "rawCodeValue" }] : /* istanbul ignore next */ []));
227
216
  this.showBlockMenu = signal(false, /* @ts-ignore */
228
217
  ...(ngDevMode ? [{ debugName: "showBlockMenu" }] : /* istanbul ignore next */ []));
229
- // Toolbar active states
230
218
  this.isBold = signal(false, /* @ts-ignore */
231
219
  ...(ngDevMode ? [{ debugName: "isBold" }] : /* istanbul ignore next */ []));
232
220
  this.isItalic = signal(false, /* @ts-ignore */
@@ -243,28 +231,22 @@ class ShipEditor {
243
231
  ...(ngDevMode ? [{ debugName: "canUndo" }] : /* istanbul ignore next */ []));
244
232
  this.canRedo = signal(false, /* @ts-ignore */
245
233
  ...(ngDevMode ? [{ debugName: "canRedo" }] : /* istanbul ignore next */ []));
246
- // Selection backup for inserting links/images when modal is open
247
234
  this.#savedRange = null;
248
- // Text metrics signals
249
235
  this.charCount = signal(0, /* @ts-ignore */
250
236
  ...(ngDevMode ? [{ debugName: "charCount" }] : /* istanbul ignore next */ []));
251
237
  this.wordCount = signal(0, /* @ts-ignore */
252
238
  ...(ngDevMode ? [{ debugName: "wordCount" }] : /* istanbul ignore next */ []));
253
- // Form accessors callbacks
254
239
  this.onChange = () => { };
255
240
  this.onTouched = () => { };
256
- // Host CSS classes resolver
257
241
  this.hostClasses = shipComponentClasses('editor', {
258
242
  color: this.color,
259
243
  variant: this.variant,
260
244
  readonly: this.readonly,
261
245
  });
262
- // Track outer changes
263
246
  this.#isWriting = false;
264
247
  this.#lastFormat = null;
265
248
  // --- IMAGE FILE HANDLING & LAYOUT OVERLAYS ---
266
249
  this.selectedImage = this.#selectedImage.asReadonly();
267
- // Auto-focus link dialog input when opened
268
250
  effect(() => {
269
251
  if (this.showLinkModal()) {
270
252
  const linkInput = this.linkInput();
@@ -273,7 +255,6 @@ class ShipEditor {
273
255
  }
274
256
  }
275
257
  });
276
- // Auto-focus image dialog elements when opened based on configuration
277
258
  effect(() => {
278
259
  if (this.showImageModal()) {
279
260
  const uploadBtn = this.uploadBtn();
@@ -290,12 +271,9 @@ class ShipEditor {
290
271
  }
291
272
  }
292
273
  });
293
- // Keep DOM inside editor in sync with value model changes reactively (when written from parent)
294
274
  effect(() => {
295
275
  const val = this.value();
296
276
  const editor = this.editorRef()?.nativeElement;
297
- // If the DOM element itself has changed (re-created during HMR), we must reset
298
- // lastValueWrittenFromDOM to force content initialization onto the new element.
299
277
  if (editor && editor !== this.#lastEditorElement) {
300
278
  this.#lastEditorElement = editor;
301
279
  this.#lastValueWrittenFromDOM = undefined;
@@ -304,14 +282,12 @@ class ShipEditor {
304
282
  return;
305
283
  this.#syncModelToDOM(val);
306
284
  });
307
- // React to format changes by converting the model value to the new format reactively
308
285
  effect(() => {
309
286
  const fmt = this.format();
310
287
  const prev = this.#lastFormat;
311
288
  this.#lastFormat = fmt;
312
289
  if (prev !== null && prev !== fmt) {
313
290
  const val = this.value();
314
- // 1. Convert current value in prev format to HTML
315
291
  let html = '';
316
292
  if (prev === 'html' && typeof val === 'string') {
317
293
  html = val;
@@ -322,7 +298,6 @@ class ShipEditor {
322
298
  else if (prev === 'json' && Array.isArray(val)) {
323
299
  html = this.#jsonToHTML(val);
324
300
  }
325
- // 2. Convert HTML to the new format
326
301
  let newValue = '';
327
302
  if (fmt === 'html') {
328
303
  newValue = html;
@@ -333,7 +308,6 @@ class ShipEditor {
333
308
  else if (fmt === 'json') {
334
309
  newValue = this.#htmlToJSON(html);
335
310
  }
336
- // 3. Update the model and DOM
337
311
  this.#isWriting = true;
338
312
  this.value.set(newValue);
339
313
  this.#lastValueWrittenFromDOM = newValue;
@@ -359,7 +333,6 @@ class ShipEditor {
359
333
  this.#isWriting = false;
360
334
  }
361
335
  });
362
- // Recalculate metrics whenever raw content updates
363
336
  effect(() => {
364
337
  const val = this.value();
365
338
  const fmt = this.format();
@@ -384,7 +357,6 @@ class ShipEditor {
384
357
  this.charCount.set(text.length);
385
358
  this.wordCount.set(text === '' ? 0 : text.split(/\s+/).filter((w) => w.length > 0).length);
386
359
  });
387
- // Reinitialize toolbar tabindexes when visibility inputs change
388
360
  effect(() => {
389
361
  this.showFormats();
390
362
  this.showBlocks();
@@ -398,7 +370,6 @@ class ShipEditor {
398
370
  });
399
371
  }
400
372
  ngOnInit() {
401
- // Empty hook
402
373
  }
403
374
  ngAfterViewInit() {
404
375
  this.#syncModelToDOM(this.value());
@@ -409,7 +380,6 @@ class ShipEditor {
409
380
  clearTimeout(this.#typingTimeout);
410
381
  }
411
382
  }
412
- // --- CONTROL VALUE ACCESSOR ---
413
383
  writeValue(obj) {
414
384
  this.#isWriting = true;
415
385
  this.value.set(obj);
@@ -423,9 +393,7 @@ class ShipEditor {
423
393
  this.onTouched = fn;
424
394
  }
425
395
  setDisabledState(isDisabled) {
426
- // In Angular forms, this matches readonly
427
396
  }
428
- // --- MODEL TO DOM SYNCING ---
429
397
  #syncModelToDOM(val) {
430
398
  let html = '';
431
399
  if (val === null || val === undefined || val === '') {
@@ -446,7 +414,6 @@ class ShipEditor {
446
414
  html = '<p><br></p>';
447
415
  }
448
416
  const isNewValue = val !== this.#lastValueWrittenFromDOM;
449
- // Set code editor value
450
417
  if (this.format() === 'markdown' && typeof val === 'string') {
451
418
  this.rawCodeValue.set(val);
452
419
  }
@@ -456,11 +423,9 @@ class ShipEditor {
456
423
  else {
457
424
  this.rawCodeValue.set(html);
458
425
  }
459
- // Update WYSIWYG editor surface if in design mode
460
426
  const editor = this.editorRef()?.nativeElement;
461
427
  if (editor) {
462
428
  this.#lastValueWrittenFromDOM = val;
463
- // Avoid resetting selection if html content is equivalent
464
429
  const normalizedHTML = html === '<p><br></p>' ? '' : html;
465
430
  const currentNormalized = editor.innerHTML === '<p><br></p>' ? '' : editor.innerHTML;
466
431
  if (normalizedHTML !== currentNormalized) {
@@ -477,13 +442,11 @@ class ShipEditor {
477
442
  }
478
443
  this.#updateHistoryStates();
479
444
  }
480
- // --- DOM TO MODEL SYNCING ---
481
445
  #updateValueFromDOM() {
482
446
  const editor = this.editorRef()?.nativeElement;
483
447
  if (!editor)
484
448
  return;
485
449
  let html = editor.innerHTML;
486
- // Normalize empty editor contents to empty string or basic paragraph
487
450
  if (html === '' || html === '<br>' || html === '<p><br></p>') {
488
451
  html = '';
489
452
  }
@@ -510,11 +473,9 @@ class ShipEditor {
510
473
  }
511
474
  this.#isWriting = false;
512
475
  }
513
- // --- COMPONENT HANDLERS ---
514
476
  onDOMInput() {
515
477
  this.#ensureImagesFocusable();
516
478
  this.#updateValueFromDOM();
517
- // Debounce history save on typing (500ms) or save immediately on word/sentence boundaries
518
479
  const selection = window.getSelection();
519
480
  let saveImmediately = false;
520
481
  if (selection && selection.rangeCount > 0) {
@@ -568,13 +529,11 @@ class ShipEditor {
568
529
  this.onChange(parsed);
569
530
  }
570
531
  catch (e) {
571
- // invalid JSON, do not update model, let user fix it
572
532
  }
573
533
  }
574
534
  this.#isWriting = false;
575
535
  this.onTouched();
576
536
  }
577
- // --- SELECTION STATE & COMMANDS ---
578
537
  formatText(command, value = '') {
579
538
  if (this.readonly())
580
539
  return;
@@ -764,7 +723,6 @@ class ShipEditor {
764
723
  selection.addRange(newRange);
765
724
  }
766
725
  catch (e) {
767
- // Fallback
768
726
  }
769
727
  }
770
728
  this.#updateValueFromDOM();