ng-primitives 0.123.1 → 0.125.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.
Files changed (76) hide show
  1. package/date-time-date-fns/README.md +3 -0
  2. package/fesm2022/ng-primitives-avatar.mjs +4 -2
  3. package/fesm2022/ng-primitives-avatar.mjs.map +1 -1
  4. package/fesm2022/ng-primitives-checkbox.mjs +4 -2
  5. package/fesm2022/ng-primitives-checkbox.mjs.map +1 -1
  6. package/fesm2022/ng-primitives-date-picker.mjs +42 -44
  7. package/fesm2022/ng-primitives-date-picker.mjs.map +1 -1
  8. package/fesm2022/ng-primitives-date-time-date-fns.mjs +95 -0
  9. package/fesm2022/ng-primitives-date-time-date-fns.mjs.map +1 -0
  10. package/fesm2022/ng-primitives-date-time-luxon.mjs +21 -3
  11. package/fesm2022/ng-primitives-date-time-luxon.mjs.map +1 -1
  12. package/fesm2022/ng-primitives-date-time.mjs +18 -3
  13. package/fesm2022/ng-primitives-date-time.mjs.map +1 -1
  14. package/fesm2022/ng-primitives-dialog.mjs +11 -4
  15. package/fesm2022/ng-primitives-dialog.mjs.map +1 -1
  16. package/fesm2022/ng-primitives-form-field.mjs +3 -0
  17. package/fesm2022/ng-primitives-form-field.mjs.map +1 -1
  18. package/fesm2022/ng-primitives-input-otp.mjs +15 -7
  19. package/fesm2022/ng-primitives-input-otp.mjs.map +1 -1
  20. package/fesm2022/ng-primitives-listbox.mjs +5 -4
  21. package/fesm2022/ng-primitives-listbox.mjs.map +1 -1
  22. package/fesm2022/ng-primitives-menu.mjs +8 -0
  23. package/fesm2022/ng-primitives-menu.mjs.map +1 -1
  24. package/fesm2022/ng-primitives-meter.mjs +20 -5
  25. package/fesm2022/ng-primitives-meter.mjs.map +1 -1
  26. package/fesm2022/ng-primitives-number-field.mjs +10 -0
  27. package/fesm2022/ng-primitives-number-field.mjs.map +1 -1
  28. package/fesm2022/ng-primitives-pagination.mjs +41 -21
  29. package/fesm2022/ng-primitives-pagination.mjs.map +1 -1
  30. package/fesm2022/ng-primitives-popover.mjs +4 -0
  31. package/fesm2022/ng-primitives-popover.mjs.map +1 -1
  32. package/fesm2022/ng-primitives-progress.mjs +36 -11
  33. package/fesm2022/ng-primitives-progress.mjs.map +1 -1
  34. package/fesm2022/ng-primitives-radio.mjs +135 -129
  35. package/fesm2022/ng-primitives-radio.mjs.map +1 -1
  36. package/fesm2022/ng-primitives-roving-focus.mjs +13 -2
  37. package/fesm2022/ng-primitives-roving-focus.mjs.map +1 -1
  38. package/fesm2022/ng-primitives-search.mjs +2 -1
  39. package/fesm2022/ng-primitives-search.mjs.map +1 -1
  40. package/fesm2022/ng-primitives-slider.mjs +38 -18
  41. package/fesm2022/ng-primitives-slider.mjs.map +1 -1
  42. package/fesm2022/ng-primitives-switch.mjs +18 -8
  43. package/fesm2022/ng-primitives-switch.mjs.map +1 -1
  44. package/fesm2022/ng-primitives-tabs.mjs +22 -6
  45. package/fesm2022/ng-primitives-tabs.mjs.map +1 -1
  46. package/fesm2022/ng-primitives-textarea.mjs +10 -8
  47. package/fesm2022/ng-primitives-textarea.mjs.map +1 -1
  48. package/fesm2022/ng-primitives-toast.mjs +3 -0
  49. package/fesm2022/ng-primitives-toast.mjs.map +1 -1
  50. package/fesm2022/ng-primitives-toggle-group.mjs +40 -15
  51. package/fesm2022/ng-primitives-toggle-group.mjs.map +1 -1
  52. package/package.json +8 -1
  53. package/schematics/ng-generate/templates/checkbox/checkbox.__fileSuffix@dasherize__.ts.template +2 -1
  54. package/schematics/ng-generate/templates/combobox/combobox.__fileSuffix@dasherize__.ts.template +3 -2
  55. package/schematics/ng-generate/templates/date-picker/date-picker.__fileSuffix@dasherize__.ts.template +2 -1
  56. package/schematics/ng-generate/templates/listbox/listbox.__fileSuffix@dasherize__.ts.template +9 -4
  57. package/schematics/ng-generate/templates/pagination/pagination.__fileSuffix@dasherize__.ts.template +7 -1
  58. package/schematics/ng-generate/templates/radio/radio-group.__fileSuffix@dasherize__.ts.template +16 -4
  59. package/schematics/ng-generate/templates/range-slider/range-slider.__fileSuffix@dasherize__.ts.template +4 -3
  60. package/schematics/ng-generate/templates/slider/slider.__fileSuffix@dasherize__.ts.template +2 -1
  61. package/schematics/ng-generate/templates/switch/switch.__fileSuffix@dasherize__.ts.template +2 -1
  62. package/types/ng-primitives-checkbox.d.ts +5 -1
  63. package/types/ng-primitives-date-picker.d.ts +7 -9
  64. package/types/ng-primitives-date-time-date-fns.d.ts +30 -0
  65. package/types/ng-primitives-date-time.d.ts +15 -3
  66. package/types/ng-primitives-dialog.d.ts +4 -0
  67. package/types/ng-primitives-input-otp.d.ts +5 -5
  68. package/types/ng-primitives-meter.d.ts +9 -2
  69. package/types/ng-primitives-pagination.d.ts +34 -8
  70. package/types/ng-primitives-progress.d.ts +4 -2
  71. package/types/ng-primitives-radio.d.ts +147 -52
  72. package/types/ng-primitives-roving-focus.d.ts +7 -0
  73. package/types/ng-primitives-slider.d.ts +5 -4
  74. package/types/ng-primitives-switch.d.ts +14 -4
  75. package/types/ng-primitives-tabs.d.ts +6 -1
  76. package/types/ng-primitives-toggle-group.d.ts +55 -42
@@ -1 +1 @@
1
- {"version":3,"file":"ng-primitives-date-time-luxon.mjs","sources":["../../../../packages/ng-primitives/date-time-luxon/src/luxon-date-adapter/luxon-date-adapter.ts","../../../../packages/ng-primitives/date-time-luxon/src/ng-primitives-date-time-luxon.ts"],"sourcesContent":["import { DateTime } from 'luxon';\nimport { NgpDateAdapter, NgpDateUnits, NgpDuration } from 'ng-primitives/date-time';\n\nexport class NgpLuxonDateAdapter implements NgpDateAdapter<DateTime> {\n now() {\n return DateTime.now();\n }\n\n set(date: DateTime, values: NgpDateUnits) {\n return date.set(values);\n }\n\n add(date: DateTime, duration: NgpDuration) {\n return date.plus(duration);\n }\n\n subtract(date: DateTime, duration: NgpDuration) {\n return date.minus(duration);\n }\n\n compare(a: DateTime, b: DateTime): number {\n if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n } else {\n return 0;\n }\n }\n\n isEqual(a: DateTime, b: DateTime): boolean {\n return a.equals(b);\n }\n\n isBefore(a: DateTime, b: DateTime): boolean {\n return a < b;\n }\n\n isAfter(a: DateTime, b: DateTime): boolean {\n return a > b;\n }\n\n isSameDay(a: DateTime, b: DateTime): boolean {\n return a.hasSame(b, 'day') && a.hasSame(b, 'month') && a.hasSame(b, 'year');\n }\n\n isSameMonth(a: DateTime, b: DateTime): boolean {\n return a.hasSame(b, 'month') && a.hasSame(b, 'year');\n }\n\n isSameYear(a: DateTime, b: DateTime): boolean {\n return a.hasSame(b, 'year');\n }\n\n getYear(date: DateTime): number {\n return date.year;\n }\n\n getMonth(date: DateTime): number {\n return date.month;\n }\n\n getDate(date: DateTime): number {\n return date.day;\n }\n\n getDay(date: DateTime): number {\n return date.weekday;\n }\n\n getHours(date: DateTime): number {\n return date.hour;\n }\n\n getMinutes(date: DateTime): number {\n return date.minute;\n }\n\n getSeconds(date: DateTime): number {\n return date.second;\n }\n\n getMilliseconds(date: DateTime): number {\n return date.millisecond;\n }\n\n startOfMonth(date: DateTime) {\n return date.startOf('month');\n }\n\n endOfMonth(date: DateTime) {\n return date.endOf('month');\n }\n\n startOfDay(date: DateTime) {\n return date.startOf('day');\n }\n\n endOfDay(date: DateTime) {\n return date.endOf('day');\n }\n\n create(values: NgpDateUnits) {\n return DateTime.fromObject(values);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ng-primitives-date-time-luxon.mjs","sources":["../../../../packages/ng-primitives/date-time-luxon/src/luxon-date-adapter/luxon-date-adapter.ts","../../../../packages/ng-primitives/date-time-luxon/src/ng-primitives-date-time-luxon.ts"],"sourcesContent":["import { DateTime } from 'luxon';\nimport { NgpDateAdapter, NgpDateUnits, NgpDuration } from 'ng-primitives/date-time';\n\nexport class NgpLuxonDateAdapter implements NgpDateAdapter<DateTime> {\n now() {\n return DateTime.now();\n }\n\n set(date: DateTime, values: NgpDateUnits) {\n // The adapter uses a 0-11 month (matching the native adapter), but Luxon is 1-12.\n const { month, ...rest } = values;\n return date.set(month !== undefined ? { ...rest, month: month + 1 } : rest);\n }\n\n add(date: DateTime, duration: NgpDuration) {\n return date.plus(duration);\n }\n\n subtract(date: DateTime, duration: NgpDuration) {\n return date.minus(duration);\n }\n\n compare(a: DateTime, b: DateTime): number {\n if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n } else {\n return 0;\n }\n }\n\n isEqual(a: DateTime, b: DateTime): boolean {\n return a.equals(b);\n }\n\n isBefore(a: DateTime, b: DateTime): boolean {\n return a < b;\n }\n\n isAfter(a: DateTime, b: DateTime): boolean {\n return a > b;\n }\n\n isSameDay(a: DateTime, b: DateTime): boolean {\n return a.hasSame(b, 'day') && a.hasSame(b, 'month') && a.hasSame(b, 'year');\n }\n\n isSameMonth(a: DateTime, b: DateTime): boolean {\n return a.hasSame(b, 'month') && a.hasSame(b, 'year');\n }\n\n isSameYear(a: DateTime, b: DateTime): boolean {\n return a.hasSame(b, 'year');\n }\n\n getYear(date: DateTime): number {\n return date.year;\n }\n\n getMonth(date: DateTime): number {\n // Luxon is 1-12; the adapter contract uses a 0-11 month (matching the native adapter).\n return date.month - 1;\n }\n\n getDate(date: DateTime): number {\n return date.day;\n }\n\n getDay(date: DateTime): number {\n return date.weekday;\n }\n\n getHours(date: DateTime): number {\n return date.hour;\n }\n\n getMinutes(date: DateTime): number {\n return date.minute;\n }\n\n getSeconds(date: DateTime): number {\n return date.second;\n }\n\n getMilliseconds(date: DateTime): number {\n return date.millisecond;\n }\n\n startOfMonth(date: DateTime) {\n return date.startOf('month');\n }\n\n endOfMonth(date: DateTime) {\n return date.endOf('month');\n }\n\n startOfDay(date: DateTime) {\n return date.startOf('day');\n }\n\n endOfDay(date: DateTime) {\n return date.endOf('day');\n }\n\n create(values: NgpDateUnits) {\n // Match the native adapter: unspecified units default to the current date/time\n // (month uses a truthy check, so 0 falls back to now like `new Date(...)`).\n const now = DateTime.now();\n const month = values.month || now.month;\n const day = values.day ?? now.day;\n\n // Build from a valid anchor and apply the units as durations so out-of-range\n // values roll over like the native Date constructor (e.g. month 13 -> next\n // January, day 0 -> last day of the previous month).\n return DateTime.fromObject({ year: values.year ?? now.year, month: 1, day: 1 }).plus({\n months: month - 1,\n days: day - 1,\n hours: values.hour ?? now.hour,\n minutes: values.minute ?? now.minute,\n seconds: values.second ?? now.second,\n milliseconds: values.millisecond ?? now.millisecond,\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -24,13 +24,28 @@ class NgpNativeDateAdapter {
24
24
  * Add a duration to the date time object.
25
25
  */
26
26
  add(date, duration) {
27
- return new Date(date.getFullYear() + (duration.years ?? 0), date.getMonth() + (duration.months ?? 0), date.getDate() + (duration.days ?? 0), date.getHours() + (duration.hours ?? 0), date.getMinutes() + (duration.minutes ?? 0), date.getSeconds() + (duration.seconds ?? 0), date.getMilliseconds() + (duration.milliseconds ?? 0));
27
+ return this.shift(date, duration, 1);
28
28
  }
29
29
  /**
30
30
  * Subtract a duration from the date time object
31
31
  */
32
32
  subtract(date, duration) {
33
- return new Date(date.getFullYear() - (duration.years ?? 0), date.getMonth() - (duration.months ?? 0), date.getDate() - (duration.days ?? 0), date.getHours() - (duration.hours ?? 0), date.getMinutes() - (duration.minutes ?? 0), date.getSeconds() - (duration.seconds ?? 0), date.getMilliseconds() - (duration.milliseconds ?? 0));
33
+ return this.shift(date, duration, -1);
34
+ }
35
+ /**
36
+ * Apply a duration in `sign` direction. Year/month are applied first with the
37
+ * day clamped to the target month's length (so 31 Jan + 1 month is 28 Feb, not
38
+ * 3 Mar), matching the Luxon and date-fns adapters; day/time deltas follow.
39
+ */
40
+ shift(date, duration, sign) {
41
+ const year = date.getFullYear() + sign * (duration.years ?? 0);
42
+ const month = date.getMonth() + sign * (duration.months ?? 0);
43
+ const daysInMonth = new Date(year, month + 1, 0).getDate();
44
+ const day = Math.min(date.getDate(), daysInMonth);
45
+ const result = new Date(year, month, day, date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());
46
+ result.setDate(result.getDate() + sign * (duration.days ?? 0));
47
+ result.setHours(result.getHours() + sign * (duration.hours ?? 0), result.getMinutes() + sign * (duration.minutes ?? 0), result.getSeconds() + sign * (duration.seconds ?? 0), result.getMilliseconds() + sign * (duration.milliseconds ?? 0));
48
+ return result;
34
49
  }
35
50
  /**
36
51
  * Compare two date time objects
@@ -140,7 +155,7 @@ class NgpNativeDateAdapter {
140
155
  * Get the last day of the month.
141
156
  */
142
157
  endOfMonth(date) {
143
- return new Date(date.getFullYear(), date.getMonth() + 1, 0);
158
+ return new Date(date.getFullYear(), date.getMonth() + 1, 0, 23, 59, 59, 999);
144
159
  }
145
160
  /**
146
161
  * Get the start of the day.
@@ -1 +1 @@
1
- {"version":3,"file":"ng-primitives-date-time.mjs","sources":["../../../../packages/ng-primitives/date-time/src/native-date-adapter/native-date-adapter.ts","../../../../packages/ng-primitives/date-time/src/date-adapter/date-adapter-token.ts","../../../../packages/ng-primitives/date-time/src/ng-primitives-date-time.ts"],"sourcesContent":["import { NgpDateAdapter, NgpDateUnits, NgpDuration } from '../date-adapter/date-adapter';\n\nexport class NgpNativeDateAdapter implements NgpDateAdapter<Date> {\n /**\n * Create a new date time object.\n */\n create({ day, hour, minute, month, second, year, millisecond }: NgpDateUnits): Date {\n const now = new Date();\n\n return new Date(\n year ?? now.getFullYear(),\n month ? month - 1 : now.getMonth(),\n day ?? now.getDate(),\n hour ?? now.getHours(),\n minute ?? now.getMinutes(),\n second ?? now.getSeconds(),\n millisecond ?? now.getMilliseconds(),\n );\n }\n\n /**\n * Create a new date with the current date and time.\n */\n now(): Date {\n return new Date();\n }\n\n /**\n * Set the year of the date time object based on a duration.\n */\n set(date: Date, values: NgpDateUnits): Date {\n return new Date(\n values.year ?? date.getFullYear(),\n values.month ?? date.getMonth(),\n values.day ?? date.getDate(),\n values.hour ?? date.getHours(),\n values.minute ?? date.getMinutes(),\n values.second ?? date.getSeconds(),\n values.millisecond ?? date.getMilliseconds(),\n );\n }\n\n /**\n * Add a duration to the date time object.\n */\n add(date: Date, duration: NgpDuration): Date {\n return new Date(\n date.getFullYear() + (duration.years ?? 0),\n date.getMonth() + (duration.months ?? 0),\n date.getDate() + (duration.days ?? 0),\n date.getHours() + (duration.hours ?? 0),\n date.getMinutes() + (duration.minutes ?? 0),\n date.getSeconds() + (duration.seconds ?? 0),\n date.getMilliseconds() + (duration.milliseconds ?? 0),\n );\n }\n\n /**\n * Subtract a duration from the date time object\n */\n subtract(date: Date, duration: NgpDuration): Date {\n return new Date(\n date.getFullYear() - (duration.years ?? 0),\n date.getMonth() - (duration.months ?? 0),\n date.getDate() - (duration.days ?? 0),\n date.getHours() - (duration.hours ?? 0),\n date.getMinutes() - (duration.minutes ?? 0),\n date.getSeconds() - (duration.seconds ?? 0),\n date.getMilliseconds() - (duration.milliseconds ?? 0),\n );\n }\n\n /**\n * Compare two date time objects\n */\n compare(a: Date, b: Date): number {\n const diff = a.getTime() - b.getTime();\n return diff === 0 ? 0 : diff > 0 ? 1 : -1;\n }\n\n /**\n * Determine if two date time objects are equal.\n */\n isEqual(a: Date, b: Date): boolean {\n return a.getTime() === b.getTime();\n }\n\n /**\n * Determine if a date time object is before another.\n */\n isBefore(a: Date, b: Date): boolean {\n return a.getTime() < b.getTime();\n }\n\n /**\n * Determine if a date time object is after another.\n */\n isAfter(a: Date, b: Date): boolean {\n return a.getTime() > b.getTime();\n }\n\n /**\n * Determine if two date objects are on the same day.\n */\n isSameDay(a: Date, b: Date): boolean {\n return this.isSameYear(a, b) && this.isSameMonth(a, b) && a.getDate() === b.getDate();\n }\n\n /**\n * Determine if two date objects are on the same month.\n */\n isSameMonth(a: Date, b: Date): boolean {\n return this.isSameYear(a, b) && a.getMonth() === b.getMonth();\n }\n\n /**\n * Determine if two date objects are on the same year.\n */\n isSameYear(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear();\n }\n\n /**\n * Get the year.\n */\n getYear(date: Date): number {\n return date.getFullYear();\n }\n\n /**\n * Get the month.\n */\n getMonth(date: Date): number {\n return date.getMonth();\n }\n\n /**\n * Get the day of the week as a number (1-7).\n * - `1` = Monday\n * - `2` = Tuesday\n * - `3` = Wednesday\n * - `4` = Thursday\n * - `5` = Friday\n * - `6` = Saturday\n * - `7` = Sunday\n */\n getDay(date: Date): number {\n return date.getDay() === 0 ? 7 : date.getDay();\n }\n\n /**\n * Get the date.\n */\n getDate(date: Date): number {\n return date.getDate();\n }\n\n /**\n * Get the hours.\n */\n getHours(date: Date): number {\n return date.getHours();\n }\n\n /**\n * Get the minutes.\n */\n getMinutes(date: Date): number {\n return date.getMinutes();\n }\n\n /**\n * Get the seconds.\n */\n getSeconds(date: Date): number {\n return date.getSeconds();\n }\n\n /**\n * Get the milliseconds.\n */\n getMilliseconds(date: Date): number {\n return date.getMilliseconds();\n }\n\n /**\n * Get the first day of the month.\n */\n startOfMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), 1);\n }\n\n /**\n * Get the last day of the month.\n */\n endOfMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0);\n }\n\n /**\n * Get the start of the day.\n */\n startOfDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n }\n\n /**\n * Get the end of the day.\n */\n endOfDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59, 999);\n }\n}\n","import { ClassProvider, InjectionToken, Type, inject } from '@angular/core';\nimport { NgpNativeDateAdapter } from '../native-date-adapter/native-date-adapter';\nimport type { NgpDateAdapter } from './date-adapter';\n\nexport const NgpDateAdapterToken = new InjectionToken<NgpDateAdapter<unknown>>(\n 'NgpDateAdapterToken',\n);\n\n/**\n * Inject the DateAdapter instance\n */\nexport function injectDateAdapter<T>(): NgpDateAdapter<T> {\n return (\n (inject(NgpDateAdapterToken, { optional: true }) as NgpDateAdapter<T>) ||\n new NgpNativeDateAdapter()\n );\n}\n\n/**\n * Provide the DateAdapter instance\n */\nexport function provideDateAdapter<T>(adapter: Type<NgpDateAdapter<T>>): ClassProvider {\n return { provide: NgpDateAdapterToken, useClass: adapter };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ng-primitives-date-time.mjs","sources":["../../../../packages/ng-primitives/date-time/src/native-date-adapter/native-date-adapter.ts","../../../../packages/ng-primitives/date-time/src/date-adapter/date-adapter-token.ts","../../../../packages/ng-primitives/date-time/src/ng-primitives-date-time.ts"],"sourcesContent":["import { NgpDateAdapter, NgpDateUnits, NgpDuration } from '../date-adapter/date-adapter';\n\nexport class NgpNativeDateAdapter implements NgpDateAdapter<Date> {\n /**\n * Create a new date time object.\n */\n create({ day, hour, minute, month, second, year, millisecond }: NgpDateUnits): Date {\n const now = new Date();\n\n return new Date(\n year ?? now.getFullYear(),\n month ? month - 1 : now.getMonth(),\n day ?? now.getDate(),\n hour ?? now.getHours(),\n minute ?? now.getMinutes(),\n second ?? now.getSeconds(),\n millisecond ?? now.getMilliseconds(),\n );\n }\n\n /**\n * Create a new date with the current date and time.\n */\n now(): Date {\n return new Date();\n }\n\n /**\n * Set the year of the date time object based on a duration.\n */\n set(date: Date, values: NgpDateUnits): Date {\n return new Date(\n values.year ?? date.getFullYear(),\n values.month ?? date.getMonth(),\n values.day ?? date.getDate(),\n values.hour ?? date.getHours(),\n values.minute ?? date.getMinutes(),\n values.second ?? date.getSeconds(),\n values.millisecond ?? date.getMilliseconds(),\n );\n }\n\n /**\n * Add a duration to the date time object.\n */\n add(date: Date, duration: NgpDuration): Date {\n return this.shift(date, duration, 1);\n }\n\n /**\n * Subtract a duration from the date time object\n */\n subtract(date: Date, duration: NgpDuration): Date {\n return this.shift(date, duration, -1);\n }\n\n /**\n * Apply a duration in `sign` direction. Year/month are applied first with the\n * day clamped to the target month's length (so 31 Jan + 1 month is 28 Feb, not\n * 3 Mar), matching the Luxon and date-fns adapters; day/time deltas follow.\n */\n private shift(date: Date, duration: NgpDuration, sign: 1 | -1): Date {\n const year = date.getFullYear() + sign * (duration.years ?? 0);\n const month = date.getMonth() + sign * (duration.months ?? 0);\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const day = Math.min(date.getDate(), daysInMonth);\n\n const result = new Date(\n year,\n month,\n day,\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n date.getMilliseconds(),\n );\n\n result.setDate(result.getDate() + sign * (duration.days ?? 0));\n result.setHours(\n result.getHours() + sign * (duration.hours ?? 0),\n result.getMinutes() + sign * (duration.minutes ?? 0),\n result.getSeconds() + sign * (duration.seconds ?? 0),\n result.getMilliseconds() + sign * (duration.milliseconds ?? 0),\n );\n return result;\n }\n\n /**\n * Compare two date time objects\n */\n compare(a: Date, b: Date): number {\n const diff = a.getTime() - b.getTime();\n return diff === 0 ? 0 : diff > 0 ? 1 : -1;\n }\n\n /**\n * Determine if two date time objects are equal.\n */\n isEqual(a: Date, b: Date): boolean {\n return a.getTime() === b.getTime();\n }\n\n /**\n * Determine if a date time object is before another.\n */\n isBefore(a: Date, b: Date): boolean {\n return a.getTime() < b.getTime();\n }\n\n /**\n * Determine if a date time object is after another.\n */\n isAfter(a: Date, b: Date): boolean {\n return a.getTime() > b.getTime();\n }\n\n /**\n * Determine if two date objects are on the same day.\n */\n isSameDay(a: Date, b: Date): boolean {\n return this.isSameYear(a, b) && this.isSameMonth(a, b) && a.getDate() === b.getDate();\n }\n\n /**\n * Determine if two date objects are on the same month.\n */\n isSameMonth(a: Date, b: Date): boolean {\n return this.isSameYear(a, b) && a.getMonth() === b.getMonth();\n }\n\n /**\n * Determine if two date objects are on the same year.\n */\n isSameYear(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear();\n }\n\n /**\n * Get the year.\n */\n getYear(date: Date): number {\n return date.getFullYear();\n }\n\n /**\n * Get the month.\n */\n getMonth(date: Date): number {\n return date.getMonth();\n }\n\n /**\n * Get the day of the week as a number (1-7).\n * - `1` = Monday\n * - `2` = Tuesday\n * - `3` = Wednesday\n * - `4` = Thursday\n * - `5` = Friday\n * - `6` = Saturday\n * - `7` = Sunday\n */\n getDay(date: Date): number {\n return date.getDay() === 0 ? 7 : date.getDay();\n }\n\n /**\n * Get the date.\n */\n getDate(date: Date): number {\n return date.getDate();\n }\n\n /**\n * Get the hours.\n */\n getHours(date: Date): number {\n return date.getHours();\n }\n\n /**\n * Get the minutes.\n */\n getMinutes(date: Date): number {\n return date.getMinutes();\n }\n\n /**\n * Get the seconds.\n */\n getSeconds(date: Date): number {\n return date.getSeconds();\n }\n\n /**\n * Get the milliseconds.\n */\n getMilliseconds(date: Date): number {\n return date.getMilliseconds();\n }\n\n /**\n * Get the first day of the month.\n */\n startOfMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), 1);\n }\n\n /**\n * Get the last day of the month.\n */\n endOfMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0, 23, 59, 59, 999);\n }\n\n /**\n * Get the start of the day.\n */\n startOfDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n }\n\n /**\n * Get the end of the day.\n */\n endOfDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59, 999);\n }\n}\n","import { ClassProvider, InjectionToken, Type, inject } from '@angular/core';\nimport { NgpNativeDateAdapter } from '../native-date-adapter/native-date-adapter';\nimport type { NgpDateAdapter } from './date-adapter';\n\nexport const NgpDateAdapterToken = new InjectionToken<NgpDateAdapter<unknown>>(\n 'NgpDateAdapterToken',\n);\n\n/**\n * Inject the DateAdapter instance\n */\nexport function injectDateAdapter<T>(): NgpDateAdapter<T> {\n return (\n (inject(NgpDateAdapterToken, { optional: true }) as NgpDateAdapter<T>) ||\n new NgpNativeDateAdapter()\n );\n}\n\n/**\n * Provide the DateAdapter instance\n */\nexport function provideDateAdapter<T>(adapter: Type<NgpDateAdapter<T>>): ClassProvider {\n return { provide: NgpDateAdapterToken, useClass: adapter };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, input, Directive, booleanAttribute, ApplicationRef, Injector, ViewContainerRef, isDevMode, Injectable, output, HostListener, signal } from '@angular/core';
2
+ import { InjectionToken, inject, input, Directive, booleanAttribute, ApplicationRef, Injector, ViewContainerRef, isDevMode, Injectable, output, HostListener, signal, computed } from '@angular/core';
3
3
  import { uniqueId, onChange } from 'ng-primitives/utils';
4
4
  import { createStateToken, createStateProvider, createStateInjector, createState } from 'ng-primitives/state';
5
5
  import * as i1 from 'ng-primitives/internal';
@@ -511,6 +511,9 @@ class NgpDialogManager {
511
511
  const userInjector = config.injector || config.viewContainerRef?.injector;
512
512
  const providers = [
513
513
  { provide: NgpDialogRef, useValue: dialogRef },
514
+ // expose the merged per-dialog config so NgpDialog honours role/modal/closeOn*
515
+ // passed to open(), not just the global config
516
+ { provide: NgpDialogConfigToken, useValue: config },
514
517
  { provide: NgpExitAnimationManager, useClass: NgpExitAnimationManager },
515
518
  ];
516
519
  // Fall back to the service's own injector (root injector) to ensure
@@ -672,6 +675,10 @@ class NgpDialog {
672
675
  this.labelledBy = signal([], ...(ngDevMode ? [{ debugName: "labelledBy" }] : /* istanbul ignore next */ []));
673
676
  /** The describedby ids */
674
677
  this.describedBy = signal([], ...(ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []));
678
+ /** The aria-labelledby value, omitted when there are no ids to reference. */
679
+ this.ariaLabelledBy = computed(() => this.labelledBy().length ? this.labelledBy().join(' ') : null, ...(ngDevMode ? [{ debugName: "ariaLabelledBy" }] : /* istanbul ignore next */ []));
680
+ /** The aria-describedby value, omitted when there are no ids to reference. */
681
+ this.ariaDescribedBy = computed(() => this.describedBy().length ? this.describedBy().join(' ') : null, ...(ngDevMode ? [{ debugName: "ariaDescribedBy" }] : /* istanbul ignore next */ []));
675
682
  /** The dialog state */
676
683
  this.state = dialogState(this);
677
684
  }
@@ -703,7 +710,7 @@ class NgpDialog {
703
710
  this.describedBy.update(ids => ids.filter(i => i !== id));
704
711
  }
705
712
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpDialog, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
706
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: NgpDialog, isStandalone: true, selector: "[ngpDialog]", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, role: { classPropertyName: "role", publicName: "ngpDialogRole", isSignal: true, isRequired: false, transformFunction: null }, modal: { classPropertyName: "modal", publicName: "ngpDialogModal", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "-1" }, listeners: { "click": "onClick($event)" }, properties: { "id": "state.id()", "attr.role": "state.role()", "attr.aria-modal": "state.modal()", "attr.aria-labelledby": "labelledBy().join(\" \")", "attr.aria-describedby": "describedBy().join(\" \")" } }, providers: [provideDialogState()], exportAs: ["ngpDialog"], hostDirectives: [{ directive: i1$1.NgpFocusTrap }, { directive: i1.NgpExitAnimation }], ngImport: i0 }); }
713
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: NgpDialog, isStandalone: true, selector: "[ngpDialog]", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, role: { classPropertyName: "role", publicName: "ngpDialogRole", isSignal: true, isRequired: false, transformFunction: null }, modal: { classPropertyName: "modal", publicName: "ngpDialogModal", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "-1" }, listeners: { "click": "onClick($event)" }, properties: { "id": "state.id()", "attr.role": "state.role()", "attr.aria-modal": "state.modal()", "attr.aria-labelledby": "ariaLabelledBy()", "attr.aria-describedby": "ariaDescribedBy()" } }, providers: [provideDialogState()], exportAs: ["ngpDialog"], hostDirectives: [{ directive: i1$1.NgpFocusTrap }, { directive: i1.NgpExitAnimation }], ngImport: i0 }); }
707
714
  }
708
715
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgpDialog, decorators: [{
709
716
  type: Directive,
@@ -717,8 +724,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
717
724
  '[id]': 'state.id()',
718
725
  '[attr.role]': 'state.role()',
719
726
  '[attr.aria-modal]': 'state.modal()',
720
- '[attr.aria-labelledby]': 'labelledBy().join(" ")',
721
- '[attr.aria-describedby]': 'describedBy().join(" ")',
727
+ '[attr.aria-labelledby]': 'ariaLabelledBy()',
728
+ '[attr.aria-describedby]': 'ariaDescribedBy()',
722
729
  },
723
730
  }]
724
731
  }], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], role: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpDialogRole", required: false }] }], modal: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpDialogModal", required: false }] }], onClick: [{
@@ -1 +1 @@
1
- {"version":3,"file":"ng-primitives-dialog.mjs","sources":["../../../../packages/ng-primitives/dialog/src/config/dialog-config.ts","../../../../packages/ng-primitives/dialog/src/dialog/dialog-state.ts","../../../../packages/ng-primitives/dialog/src/dialog-description/dialog-description.ts","../../../../packages/ng-primitives/dialog/src/dialog/dialog-ref.ts","../../../../packages/ng-primitives/dialog/src/dialog-overlay/dialog-overlay.ts","../../../../packages/ng-primitives/dialog/src/dialog-title/dialog-title.ts","../../../../packages/ng-primitives/dialog/src/dialog/dialog.service.ts","../../../../packages/ng-primitives/dialog/src/dialog-trigger/dialog-trigger.ts","../../../../packages/ng-primitives/dialog/src/dialog/dialog.ts","../../../../packages/ng-primitives/dialog/src/ng-primitives-dialog.ts"],"sourcesContent":["import { InjectionToken, Injector, Provider, ViewContainerRef, inject } from '@angular/core';\nimport { NgpDismissGuard, ScrollStrategy } from 'ng-primitives/portal';\n\n/** Valid ARIA roles for a dialog. */\nexport type NgpDialogRole = 'dialog' | 'alertdialog';\n\nexport interface NgpDialogConfig<T = any> {\n /** The view container to attach the dialog to. */\n viewContainerRef?: ViewContainerRef;\n\n /** The injector to use for the dialog. Defaults to the view container's injector.*/\n injector?: Injector;\n\n /** ID for the dialog. If omitted, a unique one will be generated. */\n id?: string;\n\n /** The role of the dialog. */\n role?: NgpDialogRole;\n\n /** Whether this is a modal dialog. Used to set the `aria-modal` attribute. */\n modal?: boolean;\n\n /**\n * Whether the dialog should close when the user navigates. This includes both browser history\n * navigation (back/forward) and programmatic route changes (e.g. router.navigate()).\n */\n closeOnNavigation?: boolean;\n\n /** Whether the dialog should close when the user presses the escape key, or a guard function. */\n closeOnEscape?: NgpDismissGuard<KeyboardEvent>;\n\n /**\n * Whether the dialog should close when clicking outside (on the overlay), or a guard function.\n */\n closeOnOutsideClick?: NgpDismissGuard<Element>;\n\n /**\n * Whether the dialog should close when the user clicks the overlay.\n * @deprecated Use `closeOnOutsideClick` instead.\n */\n closeOnClick?: boolean;\n\n /** Scroll strategy to be used for the dialog. */\n scrollStrategy?: ScrollStrategy;\n\n data?: T;\n}\n\nexport const defaultDialogConfig: NgpDialogConfig = {\n role: 'dialog',\n modal: true,\n closeOnNavigation: true,\n closeOnEscape: true,\n closeOnClick: true,\n};\n\nexport const NgpDialogConfigToken = new InjectionToken<NgpDialogConfig>('NgpDialogConfigToken');\n\n/**\n * Provide the default Dialog configuration\n * @param config The Dialog configuration\n * @returns The provider\n */\nexport function provideDialogConfig(config: Partial<NgpDialogConfig>): Provider[] {\n return [\n {\n provide: NgpDialogConfigToken,\n useValue: { ...defaultDialogConfig, ...config },\n },\n ];\n}\n\n/**\n * Inject the Dialog configuration\n * @returns The global Dialog configuration\n */\nexport function injectDialogConfig(): NgpDialogConfig {\n return inject(NgpDialogConfigToken, { optional: true }) ?? defaultDialogConfig;\n}\n","import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpDialog } from './dialog';\n\n/**\n * The state token for the Dialog primitive.\n */\nexport const NgpDialogStateToken = createStateToken<NgpDialog<any, any>>('Dialog');\n\n/**\n * Provides the Dialog state.\n */\nexport const provideDialogState = createStateProvider(NgpDialogStateToken);\n\n/**\n * Injects the Dialog state.\n */\nexport const injectDialogState = createStateInjector<NgpDialog>(NgpDialogStateToken);\n\n/**\n * The Dialog state registration function.\n */\nexport const dialogState = createState(NgpDialogStateToken);\n","import { Directive, input, OnDestroy } from '@angular/core';\nimport { onChange, uniqueId } from 'ng-primitives/utils';\nimport { injectDialogState } from '../dialog/dialog-state';\n\n@Directive({\n selector: '[ngpDialogDescription]',\n exportAs: 'ngpDialogDescription',\n host: {\n '[id]': 'id()',\n },\n})\nexport class NgpDialogDescription implements OnDestroy {\n /** Access the dialog */\n private readonly dialog = injectDialogState();\n\n /** The id of the descriptions. */\n readonly id = input<string>(uniqueId('ngp-dialog-description'));\n\n constructor() {\n onChange(this.id, (id, prevId) => {\n if (prevId) {\n this.dialog().removeDescribedBy(prevId);\n }\n\n if (id) {\n this.dialog().setDescribedBy(id);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.dialog().removeDescribedBy(this.id());\n }\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { inject, InjectOptions, Injector } from '@angular/core';\nimport { NgpExitAnimationManager } from 'ng-primitives/internal';\nimport { NgpDismissGuard, NgpOverlayRef } from 'ng-primitives/portal';\nimport { defer, EMPTY, fromEvent, Observable, Subject } from 'rxjs';\nimport { filter, map, takeUntil } from 'rxjs/operators';\nimport { NgpDialogConfig } from '../config/dialog-config';\n\n/** Minimal portal interface needed by the dialog ref. */\nexport interface NgpDialogPortalRef {\n getElements(): HTMLElement[];\n detach(immediate?: boolean): Promise<void>;\n}\n\n/**\n * Reference to a dialog opened via the Dialog service.\n */\nexport class NgpDialogRef<T = unknown, R = unknown> implements NgpOverlayRef {\n /** Whether the user is allowed to close the dialog. */\n disableClose: boolean | undefined;\n\n /** Whether the escape key is allowed to close the dialog, or a guard function. */\n closeOnEscape: NgpDismissGuard<KeyboardEvent> | undefined;\n\n /** Whether clicking outside (on the overlay) is allowed to close the dialog, or a guard function. */\n closeOnOutsideClick: NgpDismissGuard<Element> | undefined;\n\n /** Emits when the dialog has been closed. */\n readonly closed = new Subject<{ focusOrigin?: FocusOrigin; result?: R }>();\n\n /** @internal */\n readonly afterClosed$ = new Subject<{ focusOrigin?: FocusOrigin; result?: R }>();\n\n /**\n * Observable that emits the dialog result after exit animations have completed.\n */\n readonly afterClosed: Observable<R | undefined> = this.afterClosed$.pipe(\n map(event => event.result),\n );\n\n /** Data passed from the dialog opener. */\n readonly data: T;\n\n /** Unique ID for the dialog. */\n readonly id: string;\n\n /** @internal Store the injector */\n injector: Injector | undefined;\n\n /** Whether the dialog is closing. */\n private closing = false;\n\n /** @internal Portal reference for element access and detach. */\n portal: NgpDialogPortalRef | null = null;\n\n /** Emits on keyboard events within the dialog. */\n readonly keydownEvents: Observable<KeyboardEvent>;\n\n /**\n * Emits pointer events (click, auxclick, contextmenu) that happen outside of the dialog.\n * Fed by the NgpOverlayRegistry with CDK-compatible stacking awareness.\n * @internal\n */\n readonly outsidePointerEvents$ = new Subject<MouseEvent>();\n\n /** Emits on pointer events that happen outside of the dialog. */\n readonly outsidePointerEvents: Observable<MouseEvent> = this.outsidePointerEvents$.asObservable();\n\n constructor(\n readonly config: NgpDialogConfig<T>,\n private readonly document: Document,\n ) {\n this.data = config.data as T;\n this.id = config.id!; // By the time the dialog is created we are guaranteed to have an ID.\n this.closeOnEscape = config.closeOnEscape ?? true;\n this.closeOnOutsideClick = config.closeOnOutsideClick;\n\n // Use defer() so the observable is created on subscribe — by then the portal will be set.\n this.keydownEvents = defer(() => {\n const elements = this.getElements();\n if (!elements.length) return EMPTY;\n return fromEvent<KeyboardEvent>(this.document, 'keydown').pipe(\n filter(event => elements.some(el => el.contains(event.target as Node))),\n takeUntil(this.closed),\n );\n });\n }\n\n /**\n * Updates the position of the dialog. No-op since dialogs are CSS-centered.\n */\n updatePosition(): this {\n return this;\n }\n\n /**\n * NgpOverlayRef implementation — called by the registry for escape-key dismiss.\n */\n hide(options?: { immediate?: boolean; origin?: FocusOrigin }): void {\n if (this.disableClose) {\n return;\n }\n this.close(undefined, options?.origin);\n }\n\n /**\n * NgpOverlayRef implementation — called by the registry for descendant cascade.\n * Skips exit animations and tears down immediately.\n */\n async hideImmediate(): Promise<void> {\n if (this.closing) {\n return;\n }\n\n this.closing = true;\n\n this.closed.next({});\n this.closed.complete();\n\n // Detach the portal immediately — no exit animation\n if (this.portal) {\n await this.portal.detach(true);\n this.portal = null;\n }\n\n this.afterClosed$.next({});\n this.afterClosed$.complete();\n }\n\n /**\n * Close the dialog.\n * @param result Optional result to return to the dialog opener.\n * @param focusOrigin The origin of the focus event that triggered the close.\n */\n async close(result?: R, focusOrigin?: FocusOrigin): Promise<void> {\n // If the dialog is already closed, do nothing.\n if (this.closing) {\n return;\n }\n\n this.closing = true;\n\n // Emit immediately so consumers can react before exit animations run.\n this.closed.next({ focusOrigin, result });\n this.closed.complete();\n\n const exitAnimationManager = this.injector?.get(NgpExitAnimationManager, undefined, {\n optional: true,\n });\n if (exitAnimationManager) {\n await exitAnimationManager.exit();\n }\n\n // Detach the portal (immediate since exit animation already ran)\n if (this.portal) {\n await this.portal.detach(true);\n this.portal = null;\n }\n\n this.afterClosed$.next({ focusOrigin, result });\n this.afterClosed$.complete();\n }\n\n /**\n * @deprecated Access dialog methods directly instead (keydownEvents, outsidePointerEvents,\n * updatePosition, close). This shim will be removed in the next major version.\n */\n get overlayRef(): {\n keydownEvents: () => Observable<KeyboardEvent>;\n outsidePointerEvents: () => Observable<MouseEvent>;\n updatePosition: () => NgpDialogRef<T, R>;\n dispose: () => Promise<void>;\n detachments: () => Observable<{ focusOrigin?: FocusOrigin; result?: R }>;\n overlayElement: HTMLElement | undefined;\n } {\n return {\n keydownEvents: () => this.keydownEvents,\n outsidePointerEvents: () => this.outsidePointerEvents,\n updatePosition: () => this.updatePosition(),\n dispose: () => this.close(),\n detachments: () => this.closed.asObservable(),\n overlayElement: this.getElements()[0] as HTMLElement | undefined,\n };\n }\n\n /**\n * Get the portal elements.\n * @internal\n */\n getElements(): HTMLElement[] {\n return this.portal?.getElements() ?? [];\n }\n}\n\nexport function injectDialogRef<T = unknown, R = unknown>(\n options?: InjectOptions & { optional?: false },\n): NgpDialogRef<T, R>;\nexport function injectDialogRef<T = unknown, R = unknown>(\n options: InjectOptions & { optional: true },\n): NgpDialogRef<T, R> | null;\nexport function injectDialogRef<T = unknown, R = unknown>(\n options?: InjectOptions,\n): NgpDialogRef<T, R> | null {\n return inject<NgpDialogRef<T, R>>(NgpDialogRef, options ?? {});\n}\n","import { booleanAttribute, Directive, input } from '@angular/core';\nimport { NgpExitAnimation } from 'ng-primitives/internal';\nimport { NgpDismissGuard } from 'ng-primitives/portal';\nimport { injectDialogRef } from '../dialog/dialog-ref';\n\n@Directive({\n selector: '[ngpDialogOverlay]',\n exportAs: 'ngpDialogOverlay',\n hostDirectives: [NgpExitAnimation],\n host: {\n '(pointerdown)': 'onPointerDown($event)',\n '(click)': 'onClick($event)',\n '(pointercancel)': 'resetPointerOrigin()',\n },\n})\nexport class NgpDialogOverlay {\n private readonly dialogRef = injectDialogRef();\n private startedPointerDownOnOverlay = false;\n\n /**\n * Whether the dialog should close on backdrop click.\n * @default `true`\n */\n readonly closeOnClick = input(this.dialogRef.config.closeOnClick, {\n alias: 'ngpDialogOverlayCloseOnClick',\n transform: booleanAttribute,\n });\n\n protected onPointerDown(event: Event): void {\n this.startedPointerDownOnOverlay = event.target === event.currentTarget;\n }\n\n protected onClick(event: Event): void {\n const isOverlayClick = this.startedPointerDownOnOverlay && event.target === event.currentTarget;\n\n this.resetPointerOrigin();\n\n if (!isOverlayClick || this.dialogRef.disableClose) {\n return;\n }\n\n const guard: NgpDismissGuard<Element> =\n this.dialogRef.closeOnOutsideClick ?? this.closeOnClick() ?? true;\n this.evaluateGuard(guard, event.target as Element);\n }\n\n private evaluateGuard(guard: NgpDismissGuard<Element>, target: Element): void {\n if (guard === true) {\n this.dialogRef.close(undefined, 'mouse');\n return;\n }\n\n if (guard === false) {\n return;\n }\n\n // Function guard — evaluate sync or async\n let result: boolean | Promise<boolean>;\n try {\n result = guard(target);\n } catch (error) {\n console.error('NgpDialogOverlay: dismiss guard threw', error);\n return;\n }\n\n if (typeof result === 'boolean') {\n if (result) {\n this.dialogRef.close(undefined, 'mouse');\n }\n } else {\n result\n .then(shouldClose => {\n if (shouldClose) {\n this.dialogRef.close(undefined, 'mouse');\n }\n })\n .catch(error => {\n console.error('NgpDialogOverlay: dismiss guard rejected', error);\n });\n }\n }\n\n protected resetPointerOrigin(): void {\n this.startedPointerDownOnOverlay = false;\n }\n}\n","import { Directive, input, OnDestroy } from '@angular/core';\nimport { onChange, uniqueId } from 'ng-primitives/utils';\nimport { injectDialogState } from '../dialog/dialog-state';\n\n@Directive({\n selector: '[ngpDialogTitle]',\n exportAs: 'ngpDialogTitle',\n host: {\n '[id]': 'id()',\n },\n})\nexport class NgpDialogTitle implements OnDestroy {\n /** Access the dialog. */\n private readonly dialog = injectDialogState();\n\n /** The id of the title. */\n readonly id = input<string>(uniqueId('ngp-dialog-title'));\n\n constructor() {\n onChange(this.id, (id, prevId) => {\n if (prevId) {\n this.dialog().removeLabelledBy(prevId);\n }\n\n if (id) {\n this.dialog().setLabelledBy(id);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.dialog().removeLabelledBy(this.id());\n }\n}\n","import { FocusMonitor } from '@angular/cdk/a11y';\nimport { ViewportRuler } from '@angular/cdk/scrolling';\nimport { DOCUMENT } from '@angular/common';\nimport {\n ApplicationRef,\n Injectable,\n Injector,\n OnDestroy,\n StaticProvider,\n TemplateRef,\n Type,\n ViewContainerRef,\n inject,\n isDevMode,\n} from '@angular/core';\nimport { NavigationStart, Router } from '@angular/router';\nimport { NgpExitAnimationManager } from 'ng-primitives/internal';\nimport {\n BlockScrollStrategy,\n NgpOverlayRegistry,\n ScrollStrategy,\n createPortal,\n} from 'ng-primitives/portal';\nimport { uniqueId } from 'ng-primitives/utils';\nimport { Observable, Subject, Subscription, defer } from 'rxjs';\nimport { startWith } from 'rxjs/operators';\nimport { NgpDialogConfig, injectDialogConfig } from '../config/dialog-config';\nimport { NgpDialogRef } from './dialog-ref';\n\n/**\n * Originally based on Angular CDK Dialog service.\n * Re-implemented to use ng-primitives/portal instead of @angular/cdk/overlay.\n */\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NgpDialogManager implements OnDestroy {\n private readonly applicationRef = inject(ApplicationRef);\n private readonly injector = inject(Injector);\n private readonly document = inject<Document>(DOCUMENT);\n private readonly focusMonitor = inject(FocusMonitor);\n private readonly viewportRuler = inject(ViewportRuler);\n private readonly registry = inject(NgpOverlayRegistry);\n private readonly defaultOptions = injectDialogConfig();\n private readonly parentDialogManager = inject(NgpDialogManager, {\n optional: true,\n skipSelf: true,\n });\n private readonly router = inject(Router, { optional: true });\n\n private openDialogsAtThisLevel: NgpDialogRef[] = [];\n private readonly afterAllClosedAtThisLevel = new Subject<void>();\n private readonly afterOpenedAtThisLevel = new Subject<NgpDialogRef>();\n private ariaHiddenElements = new Map<Element, string | null>();\n private routerSubscription: Subscription | undefined;\n\n /** Scroll blocking strategy — shared across all dialogs. */\n private scrollStrategy: ScrollStrategy | null = null;\n\n /** Keeps track of the currently-open dialogs. */\n get openDialogs(): readonly NgpDialogRef[] {\n return this.parentDialogManager\n ? this.parentDialogManager.openDialogs\n : this.openDialogsAtThisLevel;\n }\n\n /** Stream that emits when a dialog has been opened. */\n get afterOpened(): Subject<NgpDialogRef> {\n return this.parentDialogManager\n ? this.parentDialogManager.afterOpened\n : this.afterOpenedAtThisLevel;\n }\n\n /**\n * Stream that emits when all open dialog have finished closing.\n * Will emit on subscribe if there are no open dialogs to begin with.\n */\n readonly afterAllClosed: Observable<void> = defer(() =>\n this.openDialogs.length\n ? this.getAfterAllClosed()\n : this.getAfterAllClosed().pipe(startWith(undefined)),\n );\n\n /**\n * Opens a modal dialog containing the given template or component.\n */\n open(\n templateRefOrComponentType: TemplateRef<NgpDialogContext> | Type<unknown>,\n config?: NgpDialogConfig,\n ): NgpDialogRef;\n\n /**\n * Opens a modal dialog containing the given template or component with typed data.\n */\n open<T, R = unknown>(\n templateRefOrComponentType: TemplateRef<NgpDialogContext<T, R>> | Type<unknown>,\n config: NgpDialogConfig<T> & { data: T },\n ): NgpDialogRef<T, R>;\n\n /**\n * Opens a modal dialog with typed result but no data (explicit void for data type).\n */\n open<T extends void, R>(\n templateRefOrComponentType: TemplateRef<NgpDialogContext<T, R>> | Type<unknown>,\n config?: NgpDialogConfig,\n ): NgpDialogRef<T, R>;\n\n open(\n templateRefOrComponentType: TemplateRef<any> | Type<unknown>,\n config?: NgpDialogConfig<any>,\n ): NgpDialogRef<any, any> {\n // store the current active element so we can focus it after the dialog is closed\n const activeElement = this.document.activeElement;\n\n // this is not ideal, but there is a case where a dialog trigger is within an overlay (e.g. menu),\n // which may be removed before the dialog is closed. This is not desired, so we need to access a view container ref\n // that is not within the overlay. To solve this we use the view container ref of the root component.\n // Could this have any unintended side effects? For example, the dialog would not be closed during route changes?\n const viewContainerRef =\n this.applicationRef.components[0]?.injector.get(ViewContainerRef) ??\n config?.viewContainerRef ??\n config?.injector?.get(ViewContainerRef);\n\n const defaults = this.defaultOptions;\n config = { ...defaults, viewContainerRef, ...config };\n config.id = config.id ?? uniqueId('ngp-dialog');\n\n if (config.id && this.getDialogById(config.id) && isDevMode()) {\n throw Error(`Dialog with id \"${config.id}\" exists already. The dialog id must be unique.`);\n }\n\n const dialogRef = new NgpDialogRef(config, this.document);\n const injector = this.createInjector(config, dialogRef);\n\n // store the injector in the dialog ref - this is so we can access the exit animation manager\n dialogRef.injector = injector;\n\n const context: NgpDialogContext = {\n $implicit: dialogRef,\n close: dialogRef.close.bind(dialogRef),\n };\n\n // Create the portal using our portal system\n const portal = createPortal(\n templateRefOrComponentType,\n config.viewContainerRef!,\n injector,\n context,\n );\n\n // Attach the portal to document.body\n portal.attach(this.document.body);\n\n // Store the portal reference on the dialog ref for element access and cleanup\n dialogRef.portal = portal;\n\n // If this is the first dialog that we're opening, hide all the non-overlay content\n // and enable scroll blocking.\n if (!this.openDialogs.length) {\n this.hideNonDialogContentFromAssistiveTechnology(portal.getElements());\n this.enableScrollBlocking(config);\n }\n\n // Auto-detect parent overlay: if the trigger element lives inside an existing overlay\n // (e.g. a dialog opened from a popover), register as its child so that clicks inside\n // the dialog don't dismiss the parent overlay.\n // Only inherit parentId from other dialogs — non-dialog overlays (menus, popovers)\n // may close after triggering the dialog open, which would cascade-close the dialog.\n let parentId =\n activeElement instanceof HTMLElement\n ? this.registry.findContainingOverlay(activeElement)\n : null;\n\n if (parentId !== null && !this.openDialogs.some(d => d.id === parentId)) {\n parentId = null;\n }\n\n // Register with the overlay registry for centralized escape-key routing.\n // outsidePress is false because the NgpDialogOverlay directive handles its own backdrop clicks.\n this.registry.register({\n id: dialogRef.id,\n parentId,\n overlay: dialogRef,\n getElements: () => dialogRef.getElements(),\n triggerElement: (activeElement as HTMLElement) ?? this.document.body,\n dismissPolicy: {\n outsidePress: false,\n escapeKey: config.closeOnEscape ?? true,\n },\n outsidePointerEvents$: dialogRef.outsidePointerEvents$,\n });\n\n (this.openDialogs as NgpDialogRef[]).push(dialogRef as NgpDialogRef<any, any>);\n this.afterOpened.next(dialogRef as NgpDialogRef<any, any>);\n this.subscribeToRouterEvents();\n\n dialogRef.closed.subscribe(() => {\n // Deregister from the overlay registry immediately so stacking order is updated.\n this.registry.deregister(dialogRef.id);\n this.removeOpenDialog(dialogRef as NgpDialogRef<any, any>, true);\n });\n\n dialogRef.afterClosed$.subscribe(({ focusOrigin }) => {\n // Focus the trigger element after exit animations complete.\n if (activeElement instanceof HTMLElement && this.document.body.contains(activeElement)) {\n // Its not great that we are relying on an internal API here, but we need to in order to\n // try and best determine the focus origin when it is programmatically closed by the user.\n this.focusMonitor.focusVia(\n activeElement,\n focusOrigin ?? (this.focusMonitor as any)._lastFocusOrigin,\n );\n }\n });\n\n return dialogRef;\n }\n\n /**\n * Closes all of the currently-open dialogs.\n */\n closeAll(): void {\n reverseForEach(this.openDialogs, dialog => dialog.close());\n }\n\n /**\n * Finds an open dialog by its id.\n * @param id ID to use when looking up the dialog.\n */\n getDialogById(id: string): NgpDialogRef | undefined {\n return this.openDialogs.find(dialog => dialog.id === id);\n }\n\n /**\n * Subscribe to router navigation events so that dialogs with `closeOnNavigation`\n * are closed when the user navigates. This handles both browser popstate events\n * and programmatic route changes (e.g. router.navigate()).\n */\n private subscribeToRouterEvents(): void {\n if (this.routerSubscription || !this.router) {\n return;\n }\n\n this.routerSubscription = this.router.events.subscribe(event => {\n if (event instanceof NavigationStart && this.openDialogs.length) {\n // Close dialogs that have closeOnNavigation enabled (iterate in reverse as closing modifies the array)\n let i = this.openDialogs.length;\n while (i--) {\n const dialog = this.openDialogs[i];\n if (dialog.config.closeOnNavigation !== false) {\n dialog.close();\n }\n }\n }\n });\n }\n\n ngOnDestroy(): void {\n // Make one pass over all the dialogs that need to be untracked, but should not be closed. We\n // want to stop tracking the open dialog even if it hasn't been closed, because the tracking\n // determines when `aria-hidden` is removed from elements outside the dialog.\n reverseForEach(this.openDialogsAtThisLevel, dialog => {\n // Check for `false` specifically since we want `undefined` to be interpreted as `true`.\n this.removeOpenDialog(dialog, false);\n });\n\n // Make a second pass and close the remaining dialogs. We do this second pass in order to\n // correctly dispatch the `afterAllClosed` event in case we have a mixed array of dialogs\n // that should be closed and dialogs that should not.\n reverseForEach(this.openDialogsAtThisLevel, dialog => dialog.close());\n\n this.afterAllClosedAtThisLevel.complete();\n this.afterOpenedAtThisLevel.complete();\n this.openDialogsAtThisLevel = [];\n this.routerSubscription?.unsubscribe();\n }\n\n /**\n * Creates a custom injector to be used inside the dialog. This allows a component loaded inside\n * of a dialog to close itself and, optionally, to return a value.\n */\n private createInjector<T, R>(\n config: NgpDialogConfig<T>,\n dialogRef: NgpDialogRef<T, R>,\n ): Injector {\n const userInjector = config.injector || config.viewContainerRef?.injector;\n const providers: StaticProvider[] = [\n { provide: NgpDialogRef, useValue: dialogRef },\n { provide: NgpExitAnimationManager, useClass: NgpExitAnimationManager },\n ];\n\n // Fall back to the service's own injector (root injector) to ensure\n // ApplicationRef and other platform providers are available.\n return Injector.create({ parent: userInjector || this.injector, providers });\n }\n\n /**\n * Removes a dialog from the array of open dialogs.\n */\n private removeOpenDialog(dialogRef: NgpDialogRef, emitEvent: boolean) {\n const index = this.openDialogs.indexOf(dialogRef);\n\n if (index > -1) {\n (this.openDialogs as NgpDialogRef[]).splice(index, 1);\n\n // If all the dialogs were closed, remove/restore the `aria-hidden`\n // to a the siblings and emit to the `afterAllClosed` stream.\n if (!this.openDialogs.length) {\n this.ariaHiddenElements.forEach((previousValue, element) => {\n if (previousValue) {\n element.setAttribute('aria-hidden', previousValue);\n } else {\n element.removeAttribute('aria-hidden');\n }\n });\n\n this.ariaHiddenElements.clear();\n this.disableScrollBlocking();\n\n if (emitEvent) {\n this.getAfterAllClosed().next();\n }\n }\n }\n }\n\n /**\n * Enable scroll blocking when the first dialog opens.\n */\n private enableScrollBlocking(config?: NgpDialogConfig): void {\n if (!this.scrollStrategy) {\n this.scrollStrategy =\n config?.scrollStrategy ?? new BlockScrollStrategy(this.viewportRuler, this.document);\n }\n this.scrollStrategy.enable();\n }\n\n /**\n * Disable scroll blocking when the last dialog closes.\n */\n private disableScrollBlocking(): void {\n this.scrollStrategy?.disable();\n this.scrollStrategy = null;\n }\n\n /**\n * Hides all of the content that isn't a dialog portal from assistive technology.\n */\n private hideNonDialogContentFromAssistiveTechnology(portalElements: HTMLElement[]) {\n const body = this.document.body;\n const bodyChildren = body.children;\n\n for (let i = bodyChildren.length - 1; i > -1; i--) {\n const sibling = bodyChildren[i];\n\n if (\n !portalElements.includes(sibling as HTMLElement) &&\n sibling.nodeName !== 'SCRIPT' &&\n sibling.nodeName !== 'STYLE' &&\n !sibling.hasAttribute('aria-live')\n ) {\n this.ariaHiddenElements.set(sibling, sibling.getAttribute('aria-hidden'));\n sibling.setAttribute('aria-hidden', 'true');\n }\n }\n }\n\n private getAfterAllClosed(): Subject<void> {\n const parent = this.parentDialogManager;\n return parent ? parent.getAfterAllClosed() : this.afterAllClosedAtThisLevel;\n }\n}\n\n/**\n * Executes a callback against all elements in an array while iterating in reverse.\n * Useful if the array is being modified as it is being iterated.\n */\nfunction reverseForEach<T>(items: T[] | readonly T[], callback: (current: T) => void) {\n let i = items.length;\n\n while (i--) {\n callback(items[i]);\n }\n}\n\nexport interface NgpDialogContext<T = unknown, R = unknown> {\n $implicit: NgpDialogRef<T, R>;\n close: (result?: R) => void;\n}\n\nexport function injectDialogManager(): NgpDialogManager {\n return inject(NgpDialogManager);\n}\n","import { Directive, HostListener, inject, input, output, TemplateRef } from '@angular/core';\nimport { dismissGuardAttribute, NgpDismissGuard, NgpDismissGuardInput } from 'ng-primitives/portal';\nimport { injectDialogConfig } from '../config/dialog-config';\nimport { NgpDialogRef } from '../dialog/dialog-ref';\nimport { NgpDialogContext, NgpDialogManager } from '../dialog/dialog.service';\n\n@Directive({\n selector: '[ngpDialogTrigger]',\n exportAs: 'ngpDialogTrigger',\n})\nexport class NgpDialogTrigger<T = unknown> {\n /** Access the global configuration */\n private readonly config = injectDialogConfig();\n\n /** Access the dialog manager. */\n private readonly dialogManager = inject(NgpDialogManager);\n\n /** The template to launch. */\n readonly template = input.required<TemplateRef<NgpDialogContext>>({\n alias: 'ngpDialogTrigger',\n });\n\n /** Emits whenever the dialog is closed with the given result. */\n readonly closed = output<T>({ alias: 'ngpDialogTriggerClosed' });\n\n /**\n * Whether the dialog should close on escape, or a guard function.\n * @default `true`\n */\n readonly closeOnEscape = input<\n NgpDismissGuard<KeyboardEvent>,\n NgpDismissGuardInput<KeyboardEvent>\n >(this.config.closeOnEscape ?? true, {\n alias: 'ngpDialogTriggerCloseOnEscape',\n transform: dismissGuardAttribute,\n });\n\n /**\n * Whether the dialog should close on outside click, or a guard function.\n * @default `true`\n */\n readonly closeOnOutsideClick = input<NgpDismissGuard<Element>, NgpDismissGuardInput<Element>>(\n this.config.closeOnOutsideClick ?? true,\n {\n alias: 'ngpDialogTriggerCloseOnOutsideClick',\n transform: dismissGuardAttribute,\n },\n );\n\n /**\n * Store the dialog ref.\n * @internal\n */\n private dialogRef: NgpDialogRef | null = null;\n\n @HostListener('click')\n protected launch(): void {\n this.dialogRef = this.dialogManager.open(this.template(), {\n closeOnEscape: this.closeOnEscape(),\n closeOnOutsideClick: this.closeOnOutsideClick(),\n });\n this.dialogRef.closed.subscribe(({ result }) => {\n this.closed.emit(result as T);\n return (this.dialogRef = null);\n });\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, HostListener, input, OnDestroy, signal } from '@angular/core';\nimport { NgpFocusTrap } from 'ng-primitives/focus-trap';\nimport { NgpExitAnimation } from 'ng-primitives/internal';\nimport { uniqueId } from 'ng-primitives/utils';\nimport { injectDialogConfig } from '../config/dialog-config';\nimport { injectDialogRef } from './dialog-ref';\nimport { dialogState, provideDialogState } from './dialog-state';\n\n@Directive({\n selector: '[ngpDialog]',\n exportAs: 'ngpDialog',\n providers: [provideDialogState()],\n hostDirectives: [NgpFocusTrap, NgpExitAnimation],\n host: {\n tabindex: '-1',\n '[id]': 'state.id()',\n '[attr.role]': 'state.role()',\n '[attr.aria-modal]': 'state.modal()',\n '[attr.aria-labelledby]': 'labelledBy().join(\" \")',\n '[attr.aria-describedby]': 'describedBy().join(\" \")',\n },\n})\nexport class NgpDialog<T = unknown, R = unknown> implements OnDestroy {\n private readonly config = injectDialogConfig();\n\n /** Access the dialog ref */\n private readonly dialogRef = injectDialogRef<T, R>();\n\n /** The id of the dialog */\n readonly id = input<string>(uniqueId('ngp-dialog'));\n\n /** The dialog role. */\n readonly role = input(this.config.role, {\n alias: 'ngpDialogRole',\n });\n\n /** Whether the dialog is a modal. */\n readonly modal = input<boolean, BooleanInput>(this.config.modal ?? false, {\n alias: 'ngpDialogModal',\n transform: booleanAttribute,\n });\n\n /** The labelledby ids */\n protected readonly labelledBy = signal<string[]>([]);\n\n /** The describedby ids */\n protected readonly describedBy = signal<string[]>([]);\n\n /** The dialog state */\n protected readonly state = dialogState<NgpDialog<T, R>>(this);\n\n ngOnDestroy(): void {\n this.close();\n }\n\n /** Close the dialog. */\n close(result?: R): void {\n this.dialogRef.close(result);\n }\n\n /** Stop click events from propagating to the overlay */\n @HostListener('click', ['$event'])\n protected onClick(event: Event): void {\n event.stopPropagation();\n }\n\n /** @internal register a labelledby id */\n setLabelledBy(id: string): void {\n this.labelledBy.update(ids => [...ids, id]);\n }\n\n /** @internal register a describedby id */\n setDescribedBy(id: string): void {\n this.describedBy.update(ids => [...ids, id]);\n }\n\n /** @internal remove a labelledby id */\n removeLabelledBy(id: string): void {\n this.labelledBy.update(ids => ids.filter(i => i !== id));\n }\n\n /** @internal remove a describedby id */\n removeDescribedBy(id: string): void {\n this.describedBy.update(ids => ids.filter(i => i !== id));\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}
1
+ {"version":3,"file":"ng-primitives-dialog.mjs","sources":["../../../../packages/ng-primitives/dialog/src/config/dialog-config.ts","../../../../packages/ng-primitives/dialog/src/dialog/dialog-state.ts","../../../../packages/ng-primitives/dialog/src/dialog-description/dialog-description.ts","../../../../packages/ng-primitives/dialog/src/dialog/dialog-ref.ts","../../../../packages/ng-primitives/dialog/src/dialog-overlay/dialog-overlay.ts","../../../../packages/ng-primitives/dialog/src/dialog-title/dialog-title.ts","../../../../packages/ng-primitives/dialog/src/dialog/dialog.service.ts","../../../../packages/ng-primitives/dialog/src/dialog-trigger/dialog-trigger.ts","../../../../packages/ng-primitives/dialog/src/dialog/dialog.ts","../../../../packages/ng-primitives/dialog/src/ng-primitives-dialog.ts"],"sourcesContent":["import { InjectionToken, Injector, Provider, ViewContainerRef, inject } from '@angular/core';\nimport { NgpDismissGuard, ScrollStrategy } from 'ng-primitives/portal';\n\n/** Valid ARIA roles for a dialog. */\nexport type NgpDialogRole = 'dialog' | 'alertdialog';\n\nexport interface NgpDialogConfig<T = any> {\n /** The view container to attach the dialog to. */\n viewContainerRef?: ViewContainerRef;\n\n /** The injector to use for the dialog. Defaults to the view container's injector.*/\n injector?: Injector;\n\n /** ID for the dialog. If omitted, a unique one will be generated. */\n id?: string;\n\n /** The role of the dialog. */\n role?: NgpDialogRole;\n\n /** Whether this is a modal dialog. Used to set the `aria-modal` attribute. */\n modal?: boolean;\n\n /**\n * Whether the dialog should close when the user navigates. This includes both browser history\n * navigation (back/forward) and programmatic route changes (e.g. router.navigate()).\n */\n closeOnNavigation?: boolean;\n\n /** Whether the dialog should close when the user presses the escape key, or a guard function. */\n closeOnEscape?: NgpDismissGuard<KeyboardEvent>;\n\n /**\n * Whether the dialog should close when clicking outside (on the overlay), or a guard function.\n */\n closeOnOutsideClick?: NgpDismissGuard<Element>;\n\n /**\n * Whether the dialog should close when the user clicks the overlay.\n * @deprecated Use `closeOnOutsideClick` instead.\n */\n closeOnClick?: boolean;\n\n /** Scroll strategy to be used for the dialog. */\n scrollStrategy?: ScrollStrategy;\n\n data?: T;\n}\n\nexport const defaultDialogConfig: NgpDialogConfig = {\n role: 'dialog',\n modal: true,\n closeOnNavigation: true,\n closeOnEscape: true,\n closeOnClick: true,\n};\n\nexport const NgpDialogConfigToken = new InjectionToken<NgpDialogConfig>('NgpDialogConfigToken');\n\n/**\n * Provide the default Dialog configuration\n * @param config The Dialog configuration\n * @returns The provider\n */\nexport function provideDialogConfig(config: Partial<NgpDialogConfig>): Provider[] {\n return [\n {\n provide: NgpDialogConfigToken,\n useValue: { ...defaultDialogConfig, ...config },\n },\n ];\n}\n\n/**\n * Inject the Dialog configuration\n * @returns The global Dialog configuration\n */\nexport function injectDialogConfig(): NgpDialogConfig {\n return inject(NgpDialogConfigToken, { optional: true }) ?? defaultDialogConfig;\n}\n","import {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpDialog } from './dialog';\n\n/**\n * The state token for the Dialog primitive.\n */\nexport const NgpDialogStateToken = createStateToken<NgpDialog<any, any>>('Dialog');\n\n/**\n * Provides the Dialog state.\n */\nexport const provideDialogState = createStateProvider(NgpDialogStateToken);\n\n/**\n * Injects the Dialog state.\n */\nexport const injectDialogState = createStateInjector<NgpDialog>(NgpDialogStateToken);\n\n/**\n * The Dialog state registration function.\n */\nexport const dialogState = createState(NgpDialogStateToken);\n","import { Directive, input, OnDestroy } from '@angular/core';\nimport { onChange, uniqueId } from 'ng-primitives/utils';\nimport { injectDialogState } from '../dialog/dialog-state';\n\n@Directive({\n selector: '[ngpDialogDescription]',\n exportAs: 'ngpDialogDescription',\n host: {\n '[id]': 'id()',\n },\n})\nexport class NgpDialogDescription implements OnDestroy {\n /** Access the dialog */\n private readonly dialog = injectDialogState();\n\n /** The id of the descriptions. */\n readonly id = input<string>(uniqueId('ngp-dialog-description'));\n\n constructor() {\n onChange(this.id, (id, prevId) => {\n if (prevId) {\n this.dialog().removeDescribedBy(prevId);\n }\n\n if (id) {\n this.dialog().setDescribedBy(id);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.dialog().removeDescribedBy(this.id());\n }\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { inject, InjectOptions, Injector } from '@angular/core';\nimport { NgpExitAnimationManager } from 'ng-primitives/internal';\nimport { NgpDismissGuard, NgpOverlayRef } from 'ng-primitives/portal';\nimport { defer, EMPTY, fromEvent, Observable, Subject } from 'rxjs';\nimport { filter, map, takeUntil } from 'rxjs/operators';\nimport { NgpDialogConfig } from '../config/dialog-config';\n\n/** Minimal portal interface needed by the dialog ref. */\nexport interface NgpDialogPortalRef {\n getElements(): HTMLElement[];\n detach(immediate?: boolean): Promise<void>;\n}\n\n/**\n * Reference to a dialog opened via the Dialog service.\n */\nexport class NgpDialogRef<T = unknown, R = unknown> implements NgpOverlayRef {\n /** Whether the user is allowed to close the dialog. */\n disableClose: boolean | undefined;\n\n /** Whether the escape key is allowed to close the dialog, or a guard function. */\n closeOnEscape: NgpDismissGuard<KeyboardEvent> | undefined;\n\n /** Whether clicking outside (on the overlay) is allowed to close the dialog, or a guard function. */\n closeOnOutsideClick: NgpDismissGuard<Element> | undefined;\n\n /** Emits when the dialog has been closed. */\n readonly closed = new Subject<{ focusOrigin?: FocusOrigin; result?: R }>();\n\n /** @internal */\n readonly afterClosed$ = new Subject<{ focusOrigin?: FocusOrigin; result?: R }>();\n\n /**\n * Observable that emits the dialog result after exit animations have completed.\n */\n readonly afterClosed: Observable<R | undefined> = this.afterClosed$.pipe(\n map(event => event.result),\n );\n\n /** Data passed from the dialog opener. */\n readonly data: T;\n\n /** Unique ID for the dialog. */\n readonly id: string;\n\n /** @internal Store the injector */\n injector: Injector | undefined;\n\n /** Whether the dialog is closing. */\n private closing = false;\n\n /** @internal Portal reference for element access and detach. */\n portal: NgpDialogPortalRef | null = null;\n\n /** Emits on keyboard events within the dialog. */\n readonly keydownEvents: Observable<KeyboardEvent>;\n\n /**\n * Emits pointer events (click, auxclick, contextmenu) that happen outside of the dialog.\n * Fed by the NgpOverlayRegistry with CDK-compatible stacking awareness.\n * @internal\n */\n readonly outsidePointerEvents$ = new Subject<MouseEvent>();\n\n /** Emits on pointer events that happen outside of the dialog. */\n readonly outsidePointerEvents: Observable<MouseEvent> = this.outsidePointerEvents$.asObservable();\n\n constructor(\n readonly config: NgpDialogConfig<T>,\n private readonly document: Document,\n ) {\n this.data = config.data as T;\n this.id = config.id!; // By the time the dialog is created we are guaranteed to have an ID.\n this.closeOnEscape = config.closeOnEscape ?? true;\n this.closeOnOutsideClick = config.closeOnOutsideClick;\n\n // Use defer() so the observable is created on subscribe — by then the portal will be set.\n this.keydownEvents = defer(() => {\n const elements = this.getElements();\n if (!elements.length) return EMPTY;\n return fromEvent<KeyboardEvent>(this.document, 'keydown').pipe(\n filter(event => elements.some(el => el.contains(event.target as Node))),\n takeUntil(this.closed),\n );\n });\n }\n\n /**\n * Updates the position of the dialog. No-op since dialogs are CSS-centered.\n */\n updatePosition(): this {\n return this;\n }\n\n /**\n * NgpOverlayRef implementation — called by the registry for escape-key dismiss.\n */\n hide(options?: { immediate?: boolean; origin?: FocusOrigin }): void {\n if (this.disableClose) {\n return;\n }\n this.close(undefined, options?.origin);\n }\n\n /**\n * NgpOverlayRef implementation — called by the registry for descendant cascade.\n * Skips exit animations and tears down immediately.\n */\n async hideImmediate(): Promise<void> {\n if (this.closing) {\n return;\n }\n\n this.closing = true;\n\n this.closed.next({});\n this.closed.complete();\n\n // Detach the portal immediately — no exit animation\n if (this.portal) {\n await this.portal.detach(true);\n this.portal = null;\n }\n\n this.afterClosed$.next({});\n this.afterClosed$.complete();\n }\n\n /**\n * Close the dialog.\n * @param result Optional result to return to the dialog opener.\n * @param focusOrigin The origin of the focus event that triggered the close.\n */\n async close(result?: R, focusOrigin?: FocusOrigin): Promise<void> {\n // If the dialog is already closed, do nothing.\n if (this.closing) {\n return;\n }\n\n this.closing = true;\n\n // Emit immediately so consumers can react before exit animations run.\n this.closed.next({ focusOrigin, result });\n this.closed.complete();\n\n const exitAnimationManager = this.injector?.get(NgpExitAnimationManager, undefined, {\n optional: true,\n });\n if (exitAnimationManager) {\n await exitAnimationManager.exit();\n }\n\n // Detach the portal (immediate since exit animation already ran)\n if (this.portal) {\n await this.portal.detach(true);\n this.portal = null;\n }\n\n this.afterClosed$.next({ focusOrigin, result });\n this.afterClosed$.complete();\n }\n\n /**\n * @deprecated Access dialog methods directly instead (keydownEvents, outsidePointerEvents,\n * updatePosition, close). This shim will be removed in the next major version.\n */\n get overlayRef(): {\n keydownEvents: () => Observable<KeyboardEvent>;\n outsidePointerEvents: () => Observable<MouseEvent>;\n updatePosition: () => NgpDialogRef<T, R>;\n dispose: () => Promise<void>;\n detachments: () => Observable<{ focusOrigin?: FocusOrigin; result?: R }>;\n overlayElement: HTMLElement | undefined;\n } {\n return {\n keydownEvents: () => this.keydownEvents,\n outsidePointerEvents: () => this.outsidePointerEvents,\n updatePosition: () => this.updatePosition(),\n dispose: () => this.close(),\n detachments: () => this.closed.asObservable(),\n overlayElement: this.getElements()[0] as HTMLElement | undefined,\n };\n }\n\n /**\n * Get the portal elements.\n * @internal\n */\n getElements(): HTMLElement[] {\n return this.portal?.getElements() ?? [];\n }\n}\n\nexport function injectDialogRef<T = unknown, R = unknown>(\n options?: InjectOptions & { optional?: false },\n): NgpDialogRef<T, R>;\nexport function injectDialogRef<T = unknown, R = unknown>(\n options: InjectOptions & { optional: true },\n): NgpDialogRef<T, R> | null;\nexport function injectDialogRef<T = unknown, R = unknown>(\n options?: InjectOptions,\n): NgpDialogRef<T, R> | null {\n return inject<NgpDialogRef<T, R>>(NgpDialogRef, options ?? {});\n}\n","import { booleanAttribute, Directive, input } from '@angular/core';\nimport { NgpExitAnimation } from 'ng-primitives/internal';\nimport { NgpDismissGuard } from 'ng-primitives/portal';\nimport { injectDialogRef } from '../dialog/dialog-ref';\n\n@Directive({\n selector: '[ngpDialogOverlay]',\n exportAs: 'ngpDialogOverlay',\n hostDirectives: [NgpExitAnimation],\n host: {\n '(pointerdown)': 'onPointerDown($event)',\n '(click)': 'onClick($event)',\n '(pointercancel)': 'resetPointerOrigin()',\n },\n})\nexport class NgpDialogOverlay {\n private readonly dialogRef = injectDialogRef();\n private startedPointerDownOnOverlay = false;\n\n /**\n * Whether the dialog should close on backdrop click.\n * @default `true`\n */\n readonly closeOnClick = input(this.dialogRef.config.closeOnClick, {\n alias: 'ngpDialogOverlayCloseOnClick',\n transform: booleanAttribute,\n });\n\n protected onPointerDown(event: Event): void {\n this.startedPointerDownOnOverlay = event.target === event.currentTarget;\n }\n\n protected onClick(event: Event): void {\n const isOverlayClick = this.startedPointerDownOnOverlay && event.target === event.currentTarget;\n\n this.resetPointerOrigin();\n\n if (!isOverlayClick || this.dialogRef.disableClose) {\n return;\n }\n\n const guard: NgpDismissGuard<Element> =\n this.dialogRef.closeOnOutsideClick ?? this.closeOnClick() ?? true;\n this.evaluateGuard(guard, event.target as Element);\n }\n\n private evaluateGuard(guard: NgpDismissGuard<Element>, target: Element): void {\n if (guard === true) {\n this.dialogRef.close(undefined, 'mouse');\n return;\n }\n\n if (guard === false) {\n return;\n }\n\n // Function guard — evaluate sync or async\n let result: boolean | Promise<boolean>;\n try {\n result = guard(target);\n } catch (error) {\n console.error('NgpDialogOverlay: dismiss guard threw', error);\n return;\n }\n\n if (typeof result === 'boolean') {\n if (result) {\n this.dialogRef.close(undefined, 'mouse');\n }\n } else {\n result\n .then(shouldClose => {\n if (shouldClose) {\n this.dialogRef.close(undefined, 'mouse');\n }\n })\n .catch(error => {\n console.error('NgpDialogOverlay: dismiss guard rejected', error);\n });\n }\n }\n\n protected resetPointerOrigin(): void {\n this.startedPointerDownOnOverlay = false;\n }\n}\n","import { Directive, input, OnDestroy } from '@angular/core';\nimport { onChange, uniqueId } from 'ng-primitives/utils';\nimport { injectDialogState } from '../dialog/dialog-state';\n\n@Directive({\n selector: '[ngpDialogTitle]',\n exportAs: 'ngpDialogTitle',\n host: {\n '[id]': 'id()',\n },\n})\nexport class NgpDialogTitle implements OnDestroy {\n /** Access the dialog. */\n private readonly dialog = injectDialogState();\n\n /** The id of the title. */\n readonly id = input<string>(uniqueId('ngp-dialog-title'));\n\n constructor() {\n onChange(this.id, (id, prevId) => {\n if (prevId) {\n this.dialog().removeLabelledBy(prevId);\n }\n\n if (id) {\n this.dialog().setLabelledBy(id);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.dialog().removeLabelledBy(this.id());\n }\n}\n","import { FocusMonitor } from '@angular/cdk/a11y';\nimport { ViewportRuler } from '@angular/cdk/scrolling';\nimport { DOCUMENT } from '@angular/common';\nimport {\n ApplicationRef,\n Injectable,\n Injector,\n OnDestroy,\n StaticProvider,\n TemplateRef,\n Type,\n ViewContainerRef,\n inject,\n isDevMode,\n} from '@angular/core';\nimport { NavigationStart, Router } from '@angular/router';\nimport { NgpExitAnimationManager } from 'ng-primitives/internal';\nimport {\n BlockScrollStrategy,\n NgpOverlayRegistry,\n ScrollStrategy,\n createPortal,\n} from 'ng-primitives/portal';\nimport { uniqueId } from 'ng-primitives/utils';\nimport { Observable, Subject, Subscription, defer } from 'rxjs';\nimport { startWith } from 'rxjs/operators';\nimport { NgpDialogConfig, NgpDialogConfigToken, injectDialogConfig } from '../config/dialog-config';\nimport { NgpDialogRef } from './dialog-ref';\n\n/**\n * Originally based on Angular CDK Dialog service.\n * Re-implemented to use ng-primitives/portal instead of @angular/cdk/overlay.\n */\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NgpDialogManager implements OnDestroy {\n private readonly applicationRef = inject(ApplicationRef);\n private readonly injector = inject(Injector);\n private readonly document = inject<Document>(DOCUMENT);\n private readonly focusMonitor = inject(FocusMonitor);\n private readonly viewportRuler = inject(ViewportRuler);\n private readonly registry = inject(NgpOverlayRegistry);\n private readonly defaultOptions = injectDialogConfig();\n private readonly parentDialogManager = inject(NgpDialogManager, {\n optional: true,\n skipSelf: true,\n });\n private readonly router = inject(Router, { optional: true });\n\n private openDialogsAtThisLevel: NgpDialogRef[] = [];\n private readonly afterAllClosedAtThisLevel = new Subject<void>();\n private readonly afterOpenedAtThisLevel = new Subject<NgpDialogRef>();\n private ariaHiddenElements = new Map<Element, string | null>();\n private routerSubscription: Subscription | undefined;\n\n /** Scroll blocking strategy — shared across all dialogs. */\n private scrollStrategy: ScrollStrategy | null = null;\n\n /** Keeps track of the currently-open dialogs. */\n get openDialogs(): readonly NgpDialogRef[] {\n return this.parentDialogManager\n ? this.parentDialogManager.openDialogs\n : this.openDialogsAtThisLevel;\n }\n\n /** Stream that emits when a dialog has been opened. */\n get afterOpened(): Subject<NgpDialogRef> {\n return this.parentDialogManager\n ? this.parentDialogManager.afterOpened\n : this.afterOpenedAtThisLevel;\n }\n\n /**\n * Stream that emits when all open dialog have finished closing.\n * Will emit on subscribe if there are no open dialogs to begin with.\n */\n readonly afterAllClosed: Observable<void> = defer(() =>\n this.openDialogs.length\n ? this.getAfterAllClosed()\n : this.getAfterAllClosed().pipe(startWith(undefined)),\n );\n\n /**\n * Opens a modal dialog containing the given template or component.\n */\n open(\n templateRefOrComponentType: TemplateRef<NgpDialogContext> | Type<unknown>,\n config?: NgpDialogConfig,\n ): NgpDialogRef;\n\n /**\n * Opens a modal dialog containing the given template or component with typed data.\n */\n open<T, R = unknown>(\n templateRefOrComponentType: TemplateRef<NgpDialogContext<T, R>> | Type<unknown>,\n config: NgpDialogConfig<T> & { data: T },\n ): NgpDialogRef<T, R>;\n\n /**\n * Opens a modal dialog with typed result but no data (explicit void for data type).\n */\n open<T extends void, R>(\n templateRefOrComponentType: TemplateRef<NgpDialogContext<T, R>> | Type<unknown>,\n config?: NgpDialogConfig,\n ): NgpDialogRef<T, R>;\n\n open(\n templateRefOrComponentType: TemplateRef<any> | Type<unknown>,\n config?: NgpDialogConfig<any>,\n ): NgpDialogRef<any, any> {\n // store the current active element so we can focus it after the dialog is closed\n const activeElement = this.document.activeElement;\n\n // this is not ideal, but there is a case where a dialog trigger is within an overlay (e.g. menu),\n // which may be removed before the dialog is closed. This is not desired, so we need to access a view container ref\n // that is not within the overlay. To solve this we use the view container ref of the root component.\n // Could this have any unintended side effects? For example, the dialog would not be closed during route changes?\n const viewContainerRef =\n this.applicationRef.components[0]?.injector.get(ViewContainerRef) ??\n config?.viewContainerRef ??\n config?.injector?.get(ViewContainerRef);\n\n const defaults = this.defaultOptions;\n config = { ...defaults, viewContainerRef, ...config };\n config.id = config.id ?? uniqueId('ngp-dialog');\n\n if (config.id && this.getDialogById(config.id) && isDevMode()) {\n throw Error(`Dialog with id \"${config.id}\" exists already. The dialog id must be unique.`);\n }\n\n const dialogRef = new NgpDialogRef(config, this.document);\n const injector = this.createInjector(config, dialogRef);\n\n // store the injector in the dialog ref - this is so we can access the exit animation manager\n dialogRef.injector = injector;\n\n const context: NgpDialogContext = {\n $implicit: dialogRef,\n close: dialogRef.close.bind(dialogRef),\n };\n\n // Create the portal using our portal system\n const portal = createPortal(\n templateRefOrComponentType,\n config.viewContainerRef!,\n injector,\n context,\n );\n\n // Attach the portal to document.body\n portal.attach(this.document.body);\n\n // Store the portal reference on the dialog ref for element access and cleanup\n dialogRef.portal = portal;\n\n // If this is the first dialog that we're opening, hide all the non-overlay content\n // and enable scroll blocking.\n if (!this.openDialogs.length) {\n this.hideNonDialogContentFromAssistiveTechnology(portal.getElements());\n this.enableScrollBlocking(config);\n }\n\n // Auto-detect parent overlay: if the trigger element lives inside an existing overlay\n // (e.g. a dialog opened from a popover), register as its child so that clicks inside\n // the dialog don't dismiss the parent overlay.\n // Only inherit parentId from other dialogs — non-dialog overlays (menus, popovers)\n // may close after triggering the dialog open, which would cascade-close the dialog.\n let parentId =\n activeElement instanceof HTMLElement\n ? this.registry.findContainingOverlay(activeElement)\n : null;\n\n if (parentId !== null && !this.openDialogs.some(d => d.id === parentId)) {\n parentId = null;\n }\n\n // Register with the overlay registry for centralized escape-key routing.\n // outsidePress is false because the NgpDialogOverlay directive handles its own backdrop clicks.\n this.registry.register({\n id: dialogRef.id,\n parentId,\n overlay: dialogRef,\n getElements: () => dialogRef.getElements(),\n triggerElement: (activeElement as HTMLElement) ?? this.document.body,\n dismissPolicy: {\n outsidePress: false,\n escapeKey: config.closeOnEscape ?? true,\n },\n outsidePointerEvents$: dialogRef.outsidePointerEvents$,\n });\n\n (this.openDialogs as NgpDialogRef[]).push(dialogRef as NgpDialogRef<any, any>);\n this.afterOpened.next(dialogRef as NgpDialogRef<any, any>);\n this.subscribeToRouterEvents();\n\n dialogRef.closed.subscribe(() => {\n // Deregister from the overlay registry immediately so stacking order is updated.\n this.registry.deregister(dialogRef.id);\n this.removeOpenDialog(dialogRef as NgpDialogRef<any, any>, true);\n });\n\n dialogRef.afterClosed$.subscribe(({ focusOrigin }) => {\n // Focus the trigger element after exit animations complete.\n if (activeElement instanceof HTMLElement && this.document.body.contains(activeElement)) {\n // Its not great that we are relying on an internal API here, but we need to in order to\n // try and best determine the focus origin when it is programmatically closed by the user.\n this.focusMonitor.focusVia(\n activeElement,\n focusOrigin ?? (this.focusMonitor as any)._lastFocusOrigin,\n );\n }\n });\n\n return dialogRef;\n }\n\n /**\n * Closes all of the currently-open dialogs.\n */\n closeAll(): void {\n reverseForEach(this.openDialogs, dialog => dialog.close());\n }\n\n /**\n * Finds an open dialog by its id.\n * @param id ID to use when looking up the dialog.\n */\n getDialogById(id: string): NgpDialogRef | undefined {\n return this.openDialogs.find(dialog => dialog.id === id);\n }\n\n /**\n * Subscribe to router navigation events so that dialogs with `closeOnNavigation`\n * are closed when the user navigates. This handles both browser popstate events\n * and programmatic route changes (e.g. router.navigate()).\n */\n private subscribeToRouterEvents(): void {\n if (this.routerSubscription || !this.router) {\n return;\n }\n\n this.routerSubscription = this.router.events.subscribe(event => {\n if (event instanceof NavigationStart && this.openDialogs.length) {\n // Close dialogs that have closeOnNavigation enabled (iterate in reverse as closing modifies the array)\n let i = this.openDialogs.length;\n while (i--) {\n const dialog = this.openDialogs[i];\n if (dialog.config.closeOnNavigation !== false) {\n dialog.close();\n }\n }\n }\n });\n }\n\n ngOnDestroy(): void {\n // Make one pass over all the dialogs that need to be untracked, but should not be closed. We\n // want to stop tracking the open dialog even if it hasn't been closed, because the tracking\n // determines when `aria-hidden` is removed from elements outside the dialog.\n reverseForEach(this.openDialogsAtThisLevel, dialog => {\n // Check for `false` specifically since we want `undefined` to be interpreted as `true`.\n this.removeOpenDialog(dialog, false);\n });\n\n // Make a second pass and close the remaining dialogs. We do this second pass in order to\n // correctly dispatch the `afterAllClosed` event in case we have a mixed array of dialogs\n // that should be closed and dialogs that should not.\n reverseForEach(this.openDialogsAtThisLevel, dialog => dialog.close());\n\n this.afterAllClosedAtThisLevel.complete();\n this.afterOpenedAtThisLevel.complete();\n this.openDialogsAtThisLevel = [];\n this.routerSubscription?.unsubscribe();\n }\n\n /**\n * Creates a custom injector to be used inside the dialog. This allows a component loaded inside\n * of a dialog to close itself and, optionally, to return a value.\n */\n private createInjector<T, R>(\n config: NgpDialogConfig<T>,\n dialogRef: NgpDialogRef<T, R>,\n ): Injector {\n const userInjector = config.injector || config.viewContainerRef?.injector;\n const providers: StaticProvider[] = [\n { provide: NgpDialogRef, useValue: dialogRef },\n // expose the merged per-dialog config so NgpDialog honours role/modal/closeOn*\n // passed to open(), not just the global config\n { provide: NgpDialogConfigToken, useValue: config },\n { provide: NgpExitAnimationManager, useClass: NgpExitAnimationManager },\n ];\n\n // Fall back to the service's own injector (root injector) to ensure\n // ApplicationRef and other platform providers are available.\n return Injector.create({ parent: userInjector || this.injector, providers });\n }\n\n /**\n * Removes a dialog from the array of open dialogs.\n */\n private removeOpenDialog(dialogRef: NgpDialogRef, emitEvent: boolean) {\n const index = this.openDialogs.indexOf(dialogRef);\n\n if (index > -1) {\n (this.openDialogs as NgpDialogRef[]).splice(index, 1);\n\n // If all the dialogs were closed, remove/restore the `aria-hidden`\n // to a the siblings and emit to the `afterAllClosed` stream.\n if (!this.openDialogs.length) {\n this.ariaHiddenElements.forEach((previousValue, element) => {\n if (previousValue) {\n element.setAttribute('aria-hidden', previousValue);\n } else {\n element.removeAttribute('aria-hidden');\n }\n });\n\n this.ariaHiddenElements.clear();\n this.disableScrollBlocking();\n\n if (emitEvent) {\n this.getAfterAllClosed().next();\n }\n }\n }\n }\n\n /**\n * Enable scroll blocking when the first dialog opens.\n */\n private enableScrollBlocking(config?: NgpDialogConfig): void {\n if (!this.scrollStrategy) {\n this.scrollStrategy =\n config?.scrollStrategy ?? new BlockScrollStrategy(this.viewportRuler, this.document);\n }\n this.scrollStrategy.enable();\n }\n\n /**\n * Disable scroll blocking when the last dialog closes.\n */\n private disableScrollBlocking(): void {\n this.scrollStrategy?.disable();\n this.scrollStrategy = null;\n }\n\n /**\n * Hides all of the content that isn't a dialog portal from assistive technology.\n */\n private hideNonDialogContentFromAssistiveTechnology(portalElements: HTMLElement[]) {\n const body = this.document.body;\n const bodyChildren = body.children;\n\n for (let i = bodyChildren.length - 1; i > -1; i--) {\n const sibling = bodyChildren[i];\n\n if (\n !portalElements.includes(sibling as HTMLElement) &&\n sibling.nodeName !== 'SCRIPT' &&\n sibling.nodeName !== 'STYLE' &&\n !sibling.hasAttribute('aria-live')\n ) {\n this.ariaHiddenElements.set(sibling, sibling.getAttribute('aria-hidden'));\n sibling.setAttribute('aria-hidden', 'true');\n }\n }\n }\n\n private getAfterAllClosed(): Subject<void> {\n const parent = this.parentDialogManager;\n return parent ? parent.getAfterAllClosed() : this.afterAllClosedAtThisLevel;\n }\n}\n\n/**\n * Executes a callback against all elements in an array while iterating in reverse.\n * Useful if the array is being modified as it is being iterated.\n */\nfunction reverseForEach<T>(items: T[] | readonly T[], callback: (current: T) => void) {\n let i = items.length;\n\n while (i--) {\n callback(items[i]);\n }\n}\n\nexport interface NgpDialogContext<T = unknown, R = unknown> {\n $implicit: NgpDialogRef<T, R>;\n close: (result?: R) => void;\n}\n\nexport function injectDialogManager(): NgpDialogManager {\n return inject(NgpDialogManager);\n}\n","import { Directive, HostListener, inject, input, output, TemplateRef } from '@angular/core';\nimport { dismissGuardAttribute, NgpDismissGuard, NgpDismissGuardInput } from 'ng-primitives/portal';\nimport { injectDialogConfig } from '../config/dialog-config';\nimport { NgpDialogRef } from '../dialog/dialog-ref';\nimport { NgpDialogContext, NgpDialogManager } from '../dialog/dialog.service';\n\n@Directive({\n selector: '[ngpDialogTrigger]',\n exportAs: 'ngpDialogTrigger',\n})\nexport class NgpDialogTrigger<T = unknown> {\n /** Access the global configuration */\n private readonly config = injectDialogConfig();\n\n /** Access the dialog manager. */\n private readonly dialogManager = inject(NgpDialogManager);\n\n /** The template to launch. */\n readonly template = input.required<TemplateRef<NgpDialogContext>>({\n alias: 'ngpDialogTrigger',\n });\n\n /** Emits whenever the dialog is closed with the given result. */\n readonly closed = output<T>({ alias: 'ngpDialogTriggerClosed' });\n\n /**\n * Whether the dialog should close on escape, or a guard function.\n * @default `true`\n */\n readonly closeOnEscape = input<\n NgpDismissGuard<KeyboardEvent>,\n NgpDismissGuardInput<KeyboardEvent>\n >(this.config.closeOnEscape ?? true, {\n alias: 'ngpDialogTriggerCloseOnEscape',\n transform: dismissGuardAttribute,\n });\n\n /**\n * Whether the dialog should close on outside click, or a guard function.\n * @default `true`\n */\n readonly closeOnOutsideClick = input<NgpDismissGuard<Element>, NgpDismissGuardInput<Element>>(\n this.config.closeOnOutsideClick ?? true,\n {\n alias: 'ngpDialogTriggerCloseOnOutsideClick',\n transform: dismissGuardAttribute,\n },\n );\n\n /**\n * Store the dialog ref.\n * @internal\n */\n private dialogRef: NgpDialogRef | null = null;\n\n @HostListener('click')\n protected launch(): void {\n this.dialogRef = this.dialogManager.open(this.template(), {\n closeOnEscape: this.closeOnEscape(),\n closeOnOutsideClick: this.closeOnOutsideClick(),\n });\n this.dialogRef.closed.subscribe(({ result }) => {\n this.closed.emit(result as T);\n return (this.dialogRef = null);\n });\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n Directive,\n HostListener,\n input,\n OnDestroy,\n signal,\n} from '@angular/core';\nimport { NgpFocusTrap } from 'ng-primitives/focus-trap';\nimport { NgpExitAnimation } from 'ng-primitives/internal';\nimport { uniqueId } from 'ng-primitives/utils';\nimport { injectDialogConfig } from '../config/dialog-config';\nimport { injectDialogRef } from './dialog-ref';\nimport { dialogState, provideDialogState } from './dialog-state';\n\n@Directive({\n selector: '[ngpDialog]',\n exportAs: 'ngpDialog',\n providers: [provideDialogState()],\n hostDirectives: [NgpFocusTrap, NgpExitAnimation],\n host: {\n tabindex: '-1',\n '[id]': 'state.id()',\n '[attr.role]': 'state.role()',\n '[attr.aria-modal]': 'state.modal()',\n '[attr.aria-labelledby]': 'ariaLabelledBy()',\n '[attr.aria-describedby]': 'ariaDescribedBy()',\n },\n})\nexport class NgpDialog<T = unknown, R = unknown> implements OnDestroy {\n private readonly config = injectDialogConfig();\n\n /** Access the dialog ref */\n private readonly dialogRef = injectDialogRef<T, R>();\n\n /** The id of the dialog */\n readonly id = input<string>(uniqueId('ngp-dialog'));\n\n /** The dialog role. */\n readonly role = input(this.config.role, {\n alias: 'ngpDialogRole',\n });\n\n /** Whether the dialog is a modal. */\n readonly modal = input<boolean, BooleanInput>(this.config.modal ?? false, {\n alias: 'ngpDialogModal',\n transform: booleanAttribute,\n });\n\n /** The labelledby ids */\n protected readonly labelledBy = signal<string[]>([]);\n\n /** The describedby ids */\n protected readonly describedBy = signal<string[]>([]);\n\n /** The aria-labelledby value, omitted when there are no ids to reference. */\n protected readonly ariaLabelledBy = computed(() =>\n this.labelledBy().length ? this.labelledBy().join(' ') : null,\n );\n\n /** The aria-describedby value, omitted when there are no ids to reference. */\n protected readonly ariaDescribedBy = computed(() =>\n this.describedBy().length ? this.describedBy().join(' ') : null,\n );\n\n /** The dialog state */\n protected readonly state = dialogState<NgpDialog<T, R>>(this);\n\n ngOnDestroy(): void {\n this.close();\n }\n\n /** Close the dialog. */\n close(result?: R): void {\n this.dialogRef.close(result);\n }\n\n /** Stop click events from propagating to the overlay */\n @HostListener('click', ['$event'])\n protected onClick(event: Event): void {\n event.stopPropagation();\n }\n\n /** @internal register a labelledby id */\n setLabelledBy(id: string): void {\n this.labelledBy.update(ids => [...ids, id]);\n }\n\n /** @internal register a describedby id */\n setDescribedBy(id: string): void {\n this.describedBy.update(ids => [...ids, id]);\n }\n\n /** @internal remove a labelledby id */\n removeLabelledBy(id: string): void {\n this.labelledBy.update(ids => ids.filter(i => i !== id));\n }\n\n /** @internal remove a describedby id */\n removeDescribedBy(id: string): void {\n this.describedBy.update(ids => ids.filter(i => i !== id));\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}
@@ -296,6 +296,9 @@ function ngpFormControl({ id, disabled = signal(false), }) {
296
296
  attrBinding(elementRef, 'id', id);
297
297
  attrBinding(elementRef, 'aria-labelledby', ariaLabelledBy);
298
298
  attrBinding(elementRef, 'aria-describedby', ariaDescribedBy);
299
+ // Expose the validity to assistive technology. `aria-invalid="true"` is only
300
+ // present while the control is invalid; a valid or untracked control omits it.
301
+ attrBinding(elementRef, 'aria-invalid', () => (status().invalid ? 'true' : null));
299
302
  dataBinding(elementRef, 'data-invalid', () => status().invalid);
300
303
  dataBinding(elementRef, 'data-valid', () => status().valid);
301
304
  dataBinding(elementRef, 'data-touched', () => status().touched);