@mesgflow/ui-kit 0.9.0 → 0.11.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 (34) hide show
  1. package/fesm2022/mesgflow-ui-kit-badge.mjs +20 -6
  2. package/fesm2022/mesgflow-ui-kit-badge.mjs.map +1 -1
  3. package/fesm2022/mesgflow-ui-kit-brand.mjs +6 -0
  4. package/fesm2022/mesgflow-ui-kit-brand.mjs.map +1 -1
  5. package/fesm2022/mesgflow-ui-kit-core.mjs +23 -3
  6. package/fesm2022/mesgflow-ui-kit-core.mjs.map +1 -1
  7. package/fesm2022/mesgflow-ui-kit-dialog.mjs +26 -5
  8. package/fesm2022/mesgflow-ui-kit-dialog.mjs.map +1 -1
  9. package/fesm2022/mesgflow-ui-kit-drawer.mjs +20 -5
  10. package/fesm2022/mesgflow-ui-kit-drawer.mjs.map +1 -1
  11. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs +1 -1
  12. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs.map +1 -1
  13. package/fesm2022/mesgflow-ui-kit-input.mjs +101 -95
  14. package/fesm2022/mesgflow-ui-kit-input.mjs.map +1 -1
  15. package/fesm2022/mesgflow-ui-kit-menu.mjs +216 -18
  16. package/fesm2022/mesgflow-ui-kit-menu.mjs.map +1 -1
  17. package/fesm2022/mesgflow-ui-kit-popover.mjs +43 -13
  18. package/fesm2022/mesgflow-ui-kit-popover.mjs.map +1 -1
  19. package/fesm2022/mesgflow-ui-kit-sidebar.mjs +51 -11
  20. package/fesm2022/mesgflow-ui-kit-sidebar.mjs.map +1 -1
  21. package/fesm2022/mesgflow-ui-kit-split-button.mjs +1 -1
  22. package/fesm2022/mesgflow-ui-kit-split-button.mjs.map +1 -1
  23. package/fesm2022/mesgflow-ui-kit-table.mjs +48 -42
  24. package/fesm2022/mesgflow-ui-kit-table.mjs.map +1 -1
  25. package/package.json +1 -1
  26. package/tokens.json +1 -1
  27. package/types/mesgflow-ui-kit-badge.d.ts +9 -3
  28. package/types/mesgflow-ui-kit-dialog.d.ts +18 -2
  29. package/types/mesgflow-ui-kit-drawer.d.ts +3 -1
  30. package/types/mesgflow-ui-kit-input.d.ts +6 -6
  31. package/types/mesgflow-ui-kit-menu.d.ts +78 -15
  32. package/types/mesgflow-ui-kit-popover.d.ts +32 -7
  33. package/types/mesgflow-ui-kit-sidebar.d.ts +35 -2
  34. package/types/mesgflow-ui-kit-table.d.ts +7 -7
@@ -143,6 +143,9 @@ class DialogSurface {
143
143
  ...(ngDevMode ? [{ debugName: "draggable" }] : /* istanbul ignore next */ []));
144
144
  resizable = signal(false, /* @ts-ignore */
145
145
  ...(ngDevMode ? [{ debugName: "resizable" }] : /* istanbul ignore next */ []));
146
+ /** `DialogOptions.disableClose` — `true` iken header'daki X çizilmez (bkz. `Dialog.closeVisible`). */
147
+ disableClose = signal(false, /* @ts-ignore */
148
+ ...(ngDevMode ? [{ debugName: "disableClose" }] : /* istanbul ignore next */ []));
146
149
  maximized = signal(false, /* @ts-ignore */
147
150
  ...(ngDevMode ? [{ debugName: "maximized" }] : /* istanbul ignore next */ []));
148
151
  /** Kullanıcı kenardan boyutlandırdıysa dolu; maximize/sheet'te yok sayılır. */
@@ -438,6 +441,21 @@ class Dialog {
438
441
  * `false`: yalnızca `close` yayınlanır — kapanışı tamamen tüketici yönetir.
439
442
  */
440
443
  autoClose = input(true, { ...(ngDevMode ? { debugName: "autoClose" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
444
+ /**
445
+ * Kapat (X) düğmesinin erişilebilir adı — verilmezse `MfLabels.dialog.close`
446
+ * ("Close dialog" / "Pencereyi kapat"). İçerikte aynı adlı bir birincil eylem
447
+ * varsa (ör. "İki adımlı doğrulamayı kapat" diyaloğunun "Kapat"ı) iki düğme
448
+ * ekran okuyucuda ayrışsın diye.
449
+ */
450
+ closeLabel = input(/* @ts-ignore */
451
+ ...(ngDevMode ? [undefined, { debugName: "closeLabel" }] : /* istanbul ignore next */ []));
452
+ /**
453
+ * X düğmesi çizilsin mi. Verilmezse `DialogOptions.disableClose`'un tersi —
454
+ * Escape/backdrop'la kapanmayan bir dialog'da X de yoktur (kullanıcı bir
455
+ * eylem seçmek zorunda).
456
+ */
457
+ showClose = input(undefined, /* @ts-ignore */
458
+ ...(ngDevMode ? [{ debugName: "showClose" }] : /* istanbul ignore next */ []));
441
459
  // `close` adı native DOM `close` olayıyla çakışıyor (@angular-eslint/no-output-native);
442
460
  // mevcut public API — yeniden adlandırma kırıcı, ileri bir sürümde ele alınacak.
443
461
  // eslint-disable-next-line @angular-eslint/no-output-native
@@ -471,6 +489,8 @@ class Dialog {
471
489
  resizeHandleVisible = computed(() => this.surface.resizable() && this.stateVariant() === 'normal', /* @ts-ignore */
472
490
  ...(ngDevMode ? [{ debugName: "resizeHandleVisible" }] : /* istanbul ignore next */ []));
473
491
  /** Drawer zaten tam yükseklik — büyütme düğmesinin anlamı yok, `surface.maximizable()` `true` olsa bile gizlenir. */
492
+ closeVisible = computed(() => this.showClose() ?? !this.surface.disableClose(), /* @ts-ignore */
493
+ ...(ngDevMode ? [{ debugName: "closeVisible" }] : /* istanbul ignore next */ []));
474
494
  maximizeVisible = computed(() => this.surface.maximizable() && this.stateVariant() !== 'drawer', /* @ts-ignore */
475
495
  ...(ngDevMode ? [{ debugName: "maximizeVisible" }] : /* istanbul ignore next */ []));
476
496
  hostClasses = computed(() => {
@@ -565,12 +585,12 @@ class Dialog {
565
585
  this.elementRef.nativeElement.querySelector('form')?.requestSubmit();
566
586
  }
567
587
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: Dialog, deps: [], target: i0.ɵɵFactoryTarget.Component });
568
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: Dialog, isStandalone: true, selector: "mf-dialog", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, fillBody: { classPropertyName: "fillBody", publicName: "fillBody", isSignal: true, isRequired: false, transformFunction: null }, autoClose: { classPropertyName: "autoClose", publicName: "autoClose", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { close: "close" }, host: { listeners: { "keydown.control.enter": "requestSubmit()", "keydown.meta.enter": "requestSubmit()" }, properties: { "class": "hostClasses()", "style.width.px": "customWidth()", "style.height.px": "customHeight()", "style.--mf-dir": "stateVariant() === 'drawer' ? 1 : null" } }, providers: [
588
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: Dialog, isStandalone: true, selector: "mf-dialog", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, fillBody: { classPropertyName: "fillBody", publicName: "fillBody", isSignal: true, isRequired: false, transformFunction: null }, autoClose: { classPropertyName: "autoClose", publicName: "autoClose", isSignal: true, isRequired: false, transformFunction: null }, closeLabel: { classPropertyName: "closeLabel", publicName: "closeLabel", isSignal: true, isRequired: false, transformFunction: null }, showClose: { classPropertyName: "showClose", publicName: "showClose", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { close: "close" }, host: { listeners: { "keydown.control.enter": "requestSubmit()", "keydown.meta.enter": "requestSubmit()" }, properties: { "class": "hostClasses()", "style.width.px": "customWidth()", "style.height.px": "customHeight()", "style.--mf-dir": "stateVariant() === 'drawer' ? 1 : null" } }, providers: [
569
589
  {
570
590
  provide: DialogSurface,
571
591
  useFactory: () => inject(DialogSurface, { optional: true, skipSelf: true }) ?? new DialogSurface(),
572
592
  },
573
- ], viewQueries: [{ propertyName: "scrollBody", first: true, predicate: ["scrollBody"], descendants: true, isSignal: true }], exportAs: ["mfDialog"], hostDirectives: [{ directive: i1.CdkDrag }], ngImport: i0, template: "<div\r\n class=\"flex shrink-0 items-start justify-between gap-3 px-6 pt-5 pb-4\"\r\n [class.border-b]=\"headerBorder()\"\r\n [class.border-border]=\"headerBorder()\"\r\n>\r\n <ng-content select=\"[dialog-header]\">\r\n @if (icon()) {\r\n <span\r\n class=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-md bg-surface-alt text-fg-muted\"\r\n >\r\n <span mfIcon [size]=\"20\">{{ icon() }}</span>\r\n </span>\r\n }\r\n <div\r\n cdkDragHandle\r\n class=\"min-w-0 flex-1 pt-0.5\"\r\n [class.cursor-grab]=\"dragEnabled()\"\r\n [class.active:cursor-grabbing]=\"dragEnabled()\"\r\n >\r\n @if (title()) {\r\n <h2 [id]=\"titleId\" class=\"truncate font-display text-title text-fg\">{{ title() }}</h2>\r\n }\r\n @if (subtitle()) {\r\n <p class=\"mt-0.5 truncate text-sm text-fg-muted\">{{ subtitle() }}</p>\r\n }\r\n </div>\r\n </ng-content>\r\n\r\n <div class=\"flex shrink-0 items-center gap-1\">\r\n @if (maximizeVisible()) {\r\n <button\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"neutral\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"surface.maximized() ? labels().fullscreenExit : labels().fullscreenEnter\"\r\n (click)=\"surface.toggleMaximize()\"\r\n >\r\n <span mfIcon [size]=\"18\">{{ surface.maximized() ? 'fullscreen_exit' : 'fullscreen' }}</span>\r\n </button>\r\n }\r\n <button\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"neutral\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"labels().close\"\r\n (click)=\"onDismiss()\"\r\n >\r\n <span mfIcon [size]=\"20\">close</span>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<div\r\n #scrollBody\r\n class=\"flex-1 min-h-0 px-6\"\r\n [class.py-4]=\"framed()\"\r\n [class.overflow-y-auto]=\"!fillBody()\"\r\n [class.flex]=\"fillBody()\"\r\n [class.flex-col]=\"fillBody()\"\r\n [class.overflow-hidden]=\"fillBody()\"\r\n (scroll)=\"updateScrollShadow()\"\r\n>\r\n <ng-content />\r\n</div>\r\n\r\n<div\r\n class=\"shrink-0 px-6 py-4 [&:not(:has(*))]:hidden\"\r\n [class.border-t]=\"footerBorder()\"\r\n [class.border-border]=\"footerBorder()\"\r\n>\r\n <ng-content select=\"[dialog-footer]\" />\r\n</div>\r\n\r\n@if (resizeHandleVisible()) {\r\n <button\r\n mfDialogResizeHandle\r\n type=\"button\"\r\n [ariaLabel]=\"labels().resize\"\r\n class=\"absolute right-1 bottom-1 flex h-4 w-4 cursor-se-resize items-center justify-center rounded-xs text-fg-subtle hover:text-fg-muted focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\"\r\n >\r\n <span mfIcon [size]=\"14\">south_east</span>\r\n </button>\r\n}\r\n", dependencies: [{ kind: "component", type: Button, selector: "button[mfButton], a[mfButton]", inputs: ["tone", "appearance", "size", "shape", "type", "loading", "iconStart", "iconEnd"], exportAs: ["mfButton"] }, { kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "directive", type: DialogResizeHandle, selector: "[mfDialogResizeHandle]", inputs: ["ariaLabel"] }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }] });
593
+ ], viewQueries: [{ propertyName: "scrollBody", first: true, predicate: ["scrollBody"], descendants: true, isSignal: true }], exportAs: ["mfDialog"], hostDirectives: [{ directive: i1.CdkDrag }], ngImport: i0, template: "<div\r\n class=\"flex shrink-0 items-start justify-between gap-3 px-6 pt-5 pb-4\"\r\n [class.border-b]=\"headerBorder()\"\r\n [class.border-border]=\"headerBorder()\"\r\n>\r\n <ng-content select=\"[dialog-header]\">\r\n @if (icon()) {\r\n <span\r\n class=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-md bg-surface-alt text-fg-muted\"\r\n >\r\n <span mfIcon [size]=\"20\">{{ icon() }}</span>\r\n </span>\r\n }\r\n <div\r\n cdkDragHandle\r\n class=\"min-w-0 flex-1 pt-0.5\"\r\n [class.cursor-grab]=\"dragEnabled()\"\r\n [class.active:cursor-grabbing]=\"dragEnabled()\"\r\n >\r\n @if (title()) {\r\n <h2 [id]=\"titleId\" class=\"truncate font-display text-title text-fg\">{{ title() }}</h2>\r\n }\r\n @if (subtitle()) {\r\n <p class=\"mt-0.5 truncate text-sm text-fg-muted\">{{ subtitle() }}</p>\r\n }\r\n </div>\r\n </ng-content>\r\n\r\n <div class=\"flex shrink-0 items-center gap-1\">\r\n @if (maximizeVisible()) {\r\n <button\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"neutral\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"surface.maximized() ? labels().fullscreenExit : labels().fullscreenEnter\"\r\n (click)=\"surface.toggleMaximize()\"\r\n >\r\n <span mfIcon [size]=\"18\">{{ surface.maximized() ? 'fullscreen_exit' : 'fullscreen' }}</span>\r\n </button>\r\n }\r\n @if (closeVisible()) {\r\n <button\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"neutral\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"closeLabel() || labels().close\"\r\n (click)=\"onDismiss()\"\r\n >\r\n <span mfIcon [size]=\"20\">close</span>\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n\r\n<div\r\n #scrollBody\r\n class=\"flex-1 min-h-0 px-6\"\r\n [class.py-4]=\"framed()\"\r\n [class.overflow-y-auto]=\"!fillBody()\"\r\n [class.flex]=\"fillBody()\"\r\n [class.flex-col]=\"fillBody()\"\r\n [class.overflow-hidden]=\"fillBody()\"\r\n (scroll)=\"updateScrollShadow()\"\r\n>\r\n <ng-content />\r\n</div>\r\n\r\n<div\r\n class=\"shrink-0 px-6 py-4 [&:not(:has(*))]:hidden\"\r\n [class.border-t]=\"footerBorder()\"\r\n [class.border-border]=\"footerBorder()\"\r\n>\r\n <ng-content select=\"[dialog-footer]\" />\r\n</div>\r\n\r\n@if (resizeHandleVisible()) {\r\n <button\r\n mfDialogResizeHandle\r\n type=\"button\"\r\n [ariaLabel]=\"labels().resize\"\r\n class=\"absolute right-1 bottom-1 flex h-4 w-4 cursor-se-resize items-center justify-center rounded-xs text-fg-subtle hover:text-fg-muted focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\"\r\n >\r\n <span mfIcon [size]=\"14\">south_east</span>\r\n </button>\r\n}\r\n", dependencies: [{ kind: "component", type: Button, selector: "button[mfButton], a[mfButton]", inputs: ["tone", "appearance", "size", "shape", "type", "loading", "iconStart", "iconEnd"], exportAs: ["mfButton"] }, { kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "directive", type: DialogResizeHandle, selector: "[mfDialogResizeHandle]", inputs: ["ariaLabel"] }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }] });
574
594
  }
575
595
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: Dialog, decorators: [{
576
596
  type: Component,
@@ -588,8 +608,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImpor
588
608
  '[style.--mf-dir]': "stateVariant() === 'drawer' ? 1 : null",
589
609
  '(keydown.control.enter)': 'requestSubmit()',
590
610
  '(keydown.meta.enter)': 'requestSubmit()',
591
- }, template: "<div\r\n class=\"flex shrink-0 items-start justify-between gap-3 px-6 pt-5 pb-4\"\r\n [class.border-b]=\"headerBorder()\"\r\n [class.border-border]=\"headerBorder()\"\r\n>\r\n <ng-content select=\"[dialog-header]\">\r\n @if (icon()) {\r\n <span\r\n class=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-md bg-surface-alt text-fg-muted\"\r\n >\r\n <span mfIcon [size]=\"20\">{{ icon() }}</span>\r\n </span>\r\n }\r\n <div\r\n cdkDragHandle\r\n class=\"min-w-0 flex-1 pt-0.5\"\r\n [class.cursor-grab]=\"dragEnabled()\"\r\n [class.active:cursor-grabbing]=\"dragEnabled()\"\r\n >\r\n @if (title()) {\r\n <h2 [id]=\"titleId\" class=\"truncate font-display text-title text-fg\">{{ title() }}</h2>\r\n }\r\n @if (subtitle()) {\r\n <p class=\"mt-0.5 truncate text-sm text-fg-muted\">{{ subtitle() }}</p>\r\n }\r\n </div>\r\n </ng-content>\r\n\r\n <div class=\"flex shrink-0 items-center gap-1\">\r\n @if (maximizeVisible()) {\r\n <button\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"neutral\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"surface.maximized() ? labels().fullscreenExit : labels().fullscreenEnter\"\r\n (click)=\"surface.toggleMaximize()\"\r\n >\r\n <span mfIcon [size]=\"18\">{{ surface.maximized() ? 'fullscreen_exit' : 'fullscreen' }}</span>\r\n </button>\r\n }\r\n <button\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"neutral\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"labels().close\"\r\n (click)=\"onDismiss()\"\r\n >\r\n <span mfIcon [size]=\"20\">close</span>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<div\r\n #scrollBody\r\n class=\"flex-1 min-h-0 px-6\"\r\n [class.py-4]=\"framed()\"\r\n [class.overflow-y-auto]=\"!fillBody()\"\r\n [class.flex]=\"fillBody()\"\r\n [class.flex-col]=\"fillBody()\"\r\n [class.overflow-hidden]=\"fillBody()\"\r\n (scroll)=\"updateScrollShadow()\"\r\n>\r\n <ng-content />\r\n</div>\r\n\r\n<div\r\n class=\"shrink-0 px-6 py-4 [&:not(:has(*))]:hidden\"\r\n [class.border-t]=\"footerBorder()\"\r\n [class.border-border]=\"footerBorder()\"\r\n>\r\n <ng-content select=\"[dialog-footer]\" />\r\n</div>\r\n\r\n@if (resizeHandleVisible()) {\r\n <button\r\n mfDialogResizeHandle\r\n type=\"button\"\r\n [ariaLabel]=\"labels().resize\"\r\n class=\"absolute right-1 bottom-1 flex h-4 w-4 cursor-se-resize items-center justify-center rounded-xs text-fg-subtle hover:text-fg-muted focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\"\r\n >\r\n <span mfIcon [size]=\"14\">south_east</span>\r\n </button>\r\n}\r\n" }]
592
- }], ctorParameters: () => [], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], fillBody: [{ type: i0.Input, args: [{ isSignal: true, alias: "fillBody", required: false }] }], autoClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoClose", required: false }] }], close: [{ type: i0.Output, args: ["close"] }], scrollBody: [{ type: i0.ViewChild, args: ['scrollBody', { isSignal: true }] }] } });
611
+ }, template: "<div\r\n class=\"flex shrink-0 items-start justify-between gap-3 px-6 pt-5 pb-4\"\r\n [class.border-b]=\"headerBorder()\"\r\n [class.border-border]=\"headerBorder()\"\r\n>\r\n <ng-content select=\"[dialog-header]\">\r\n @if (icon()) {\r\n <span\r\n class=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-md bg-surface-alt text-fg-muted\"\r\n >\r\n <span mfIcon [size]=\"20\">{{ icon() }}</span>\r\n </span>\r\n }\r\n <div\r\n cdkDragHandle\r\n class=\"min-w-0 flex-1 pt-0.5\"\r\n [class.cursor-grab]=\"dragEnabled()\"\r\n [class.active:cursor-grabbing]=\"dragEnabled()\"\r\n >\r\n @if (title()) {\r\n <h2 [id]=\"titleId\" class=\"truncate font-display text-title text-fg\">{{ title() }}</h2>\r\n }\r\n @if (subtitle()) {\r\n <p class=\"mt-0.5 truncate text-sm text-fg-muted\">{{ subtitle() }}</p>\r\n }\r\n </div>\r\n </ng-content>\r\n\r\n <div class=\"flex shrink-0 items-center gap-1\">\r\n @if (maximizeVisible()) {\r\n <button\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"neutral\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"surface.maximized() ? labels().fullscreenExit : labels().fullscreenEnter\"\r\n (click)=\"surface.toggleMaximize()\"\r\n >\r\n <span mfIcon [size]=\"18\">{{ surface.maximized() ? 'fullscreen_exit' : 'fullscreen' }}</span>\r\n </button>\r\n }\r\n @if (closeVisible()) {\r\n <button\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"neutral\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"closeLabel() || labels().close\"\r\n (click)=\"onDismiss()\"\r\n >\r\n <span mfIcon [size]=\"20\">close</span>\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n\r\n<div\r\n #scrollBody\r\n class=\"flex-1 min-h-0 px-6\"\r\n [class.py-4]=\"framed()\"\r\n [class.overflow-y-auto]=\"!fillBody()\"\r\n [class.flex]=\"fillBody()\"\r\n [class.flex-col]=\"fillBody()\"\r\n [class.overflow-hidden]=\"fillBody()\"\r\n (scroll)=\"updateScrollShadow()\"\r\n>\r\n <ng-content />\r\n</div>\r\n\r\n<div\r\n class=\"shrink-0 px-6 py-4 [&:not(:has(*))]:hidden\"\r\n [class.border-t]=\"footerBorder()\"\r\n [class.border-border]=\"footerBorder()\"\r\n>\r\n <ng-content select=\"[dialog-footer]\" />\r\n</div>\r\n\r\n@if (resizeHandleVisible()) {\r\n <button\r\n mfDialogResizeHandle\r\n type=\"button\"\r\n [ariaLabel]=\"labels().resize\"\r\n class=\"absolute right-1 bottom-1 flex h-4 w-4 cursor-se-resize items-center justify-center rounded-xs text-fg-subtle hover:text-fg-muted focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\"\r\n >\r\n <span mfIcon [size]=\"14\">south_east</span>\r\n </button>\r\n}\r\n" }]
612
+ }], ctorParameters: () => [], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], fillBody: [{ type: i0.Input, args: [{ isSignal: true, alias: "fillBody", required: false }] }], autoClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoClose", required: false }] }], closeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeLabel", required: false }] }], showClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClose", required: false }] }], close: [{ type: i0.Output, args: ["close"] }], scrollBody: [{ type: i0.ViewChild, args: ['scrollBody', { isSignal: true }] }] } });
593
613
 
594
614
  const TONE_ICON = {
595
615
  danger: 'warning',
@@ -662,7 +682,7 @@ class ConfirmDialog {
662
682
  }
663
683
  }
664
684
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: ConfirmDialog, deps: [], target: i0.ɵɵFactoryTarget.Component });
665
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: ConfirmDialog, isStandalone: true, selector: "mf-confirm-dialog", host: { classAttribute: "contents" }, ngImport: i0, template: "<mf-dialog size=\"sm\" (close)=\"onCancel()\">\r\n <div dialog-header class=\"flex items-start gap-3\">\r\n <span\r\n class=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-md\"\r\n [class]=\"toneBadgeClass()\"\r\n >\r\n <span mfIcon [size]=\"22\">{{ toneIcon() }}</span>\r\n </span>\r\n <div class=\"min-w-0 flex-1 pt-1.5\">\r\n <h2 class=\"truncate font-display text-title text-fg\">{{ data.title }}</h2>\r\n </div>\r\n </div>\r\n\r\n <p class=\"text-sm text-fg-muted\">{{ data.content }}</p>\r\n\r\n @if (actionError()) {\r\n <p class=\"mt-3 text-sm text-danger\">{{ actionError() }}</p>\r\n }\r\n\r\n <div dialog-footer class=\"flex justify-end gap-2\">\r\n @if (!data.alert) {\r\n <button\r\n mfButton\r\n appearance=\"outlined\"\r\n tone=\"neutral\"\r\n type=\"button\"\r\n [disabled]=\"submitting()\"\r\n (click)=\"onCancel()\"\r\n >\r\n {{ data.cancelLabel ?? labels().confirmCancel }}\r\n </button>\r\n }\r\n <button\r\n mfButton\r\n [tone]=\"confirmTone()\"\r\n appearance=\"filled\"\r\n type=\"button\"\r\n [disabled]=\"submitting()\"\r\n [loading]=\"submitting()\"\r\n (click)=\"onConfirm()\"\r\n >\r\n {{ data.confirmLabel ?? (data.alert ? labels().confirmOk : labels().confirmConfirm) }}\r\n </button>\r\n </div>\r\n</mf-dialog>\r\n", dependencies: [{ kind: "component", type: Dialog, selector: "mf-dialog", inputs: ["title", "subtitle", "icon", "size", "fillBody", "autoClose"], outputs: ["close"], exportAs: ["mfDialog"] }, { kind: "component", type: Button, selector: "button[mfButton], a[mfButton]", inputs: ["tone", "appearance", "size", "shape", "type", "loading", "iconStart", "iconEnd"], exportAs: ["mfButton"] }, { kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }] });
685
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: ConfirmDialog, isStandalone: true, selector: "mf-confirm-dialog", host: { classAttribute: "contents" }, ngImport: i0, template: "<mf-dialog size=\"sm\" (close)=\"onCancel()\">\r\n <div dialog-header class=\"flex items-start gap-3\">\r\n <span\r\n class=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-md\"\r\n [class]=\"toneBadgeClass()\"\r\n >\r\n <span mfIcon [size]=\"22\">{{ toneIcon() }}</span>\r\n </span>\r\n <div class=\"min-w-0 flex-1 pt-1.5\">\r\n <h2 class=\"truncate font-display text-title text-fg\">{{ data.title }}</h2>\r\n </div>\r\n </div>\r\n\r\n <p class=\"text-sm text-fg-muted\">{{ data.content }}</p>\r\n\r\n @if (actionError()) {\r\n <p class=\"mt-3 text-sm text-danger\">{{ actionError() }}</p>\r\n }\r\n\r\n <div dialog-footer class=\"flex justify-end gap-2\">\r\n @if (!data.alert) {\r\n <button\r\n mfButton\r\n appearance=\"outlined\"\r\n tone=\"neutral\"\r\n type=\"button\"\r\n [disabled]=\"submitting()\"\r\n (click)=\"onCancel()\"\r\n >\r\n {{ data.cancelLabel ?? labels().confirmCancel }}\r\n </button>\r\n }\r\n <button\r\n mfButton\r\n [tone]=\"confirmTone()\"\r\n appearance=\"filled\"\r\n type=\"button\"\r\n [disabled]=\"submitting()\"\r\n [loading]=\"submitting()\"\r\n (click)=\"onConfirm()\"\r\n >\r\n {{ data.confirmLabel ?? (data.alert ? labels().confirmOk : labels().confirmConfirm) }}\r\n </button>\r\n </div>\r\n</mf-dialog>\r\n", dependencies: [{ kind: "component", type: Dialog, selector: "mf-dialog", inputs: ["title", "subtitle", "icon", "size", "fillBody", "autoClose", "closeLabel", "showClose"], outputs: ["close"], exportAs: ["mfDialog"] }, { kind: "component", type: Button, selector: "button[mfButton], a[mfButton]", inputs: ["tone", "appearance", "size", "shape", "type", "loading", "iconStart", "iconEnd"], exportAs: ["mfButton"] }, { kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }] });
666
686
  }
667
687
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: ConfirmDialog, decorators: [{
668
688
  type: Component,
@@ -754,6 +774,7 @@ class DialogService {
754
774
  surface.maximizable.set(options?.maximizable ?? false);
755
775
  surface.draggable.set(options?.draggable ?? false);
756
776
  surface.resizable.set(options?.resizable ?? false);
777
+ surface.disableClose.set(options?.disableClose ?? false);
757
778
  const position = createGlobalPositionStrategy(this.injector);
758
779
  const place = () => {
759
780
  if (side === 'right')
@@ -1 +1 @@
1
- {"version":3,"file":"mesgflow-ui-kit-dialog.mjs","sources":["../../../projects/ui-kit/dialog/dialog-ref.ts","../../../projects/ui-kit/dialog/dialog.surface.ts","../../../projects/ui-kit/dialog/dialog-resize-handle.ts","../../../projects/ui-kit/dialog/dialog.variants.ts","../../../projects/ui-kit/dialog/dialog.ts","../../../projects/ui-kit/dialog/dialog.html","../../../projects/ui-kit/dialog/confirm-dialog.ts","../../../projects/ui-kit/dialog/confirm-dialog.html","../../../projects/ui-kit/dialog/dialog.service.ts","../../../projects/ui-kit/dialog/index.ts","../../../projects/ui-kit/dialog/mesgflow-ui-kit-dialog.ts"],"sourcesContent":["import { DIALOG_DATA, type DialogRef } from '@angular/cdk/dialog';\r\nimport type { OverlayRef } from '@angular/cdk/overlay';\r\nimport { computed, inject, signal, type ComponentRef, type Signal } from '@angular/core';\r\nimport type { Observable } from 'rxjs';\r\nimport type { DialogSize } from './dialog.model';\r\nimport type { DialogSurface } from './dialog.surface';\r\n\r\n/** `open` → (`close()` çağrıldı, çıkış animasyonu oynuyor) `closing` → (dispose edildi) `closed`. */\r\nexport type DialogState = 'open' | 'closing' | 'closed';\r\n\r\n/**\r\n * `DialogService.open()`/`openDrawer()`'ın döndürdüğü, kite ait dialog referansı.\r\n *\r\n * CDK `DialogRef`'in günlük kullanılan yüzeyini (`close`, `closed`,\r\n * `componentInstance`, `disableClose`, `backdropClick`, `keydownEvents` …)\r\n * birebir DELEGE eder — yani eski `ref.closed.subscribe(...)` kodu aynen derlenir.\r\n * Üstüne kitin kendi dünyasını ekler:\r\n *\r\n * - `afterClosed()` — `await` edilebilir sonuç (çıkış animasyonu BİTTİKTEN sonra çözülür).\r\n * - `state` — `'open' | 'closing' | 'closed'` signal'i (şablonda/`computed`'ta okunur).\r\n * - `surface` — boyut/maximize/kirli-form durumuna tipli erişim (`setSize`, `toggleMaximize`,\r\n * `registerDirty`, `markClean` kısayolları).\r\n * - `cdk` — ham CDK referansı (kaçış kapısı; ör. `updatePosition()`).\r\n *\r\n * `close()` İDEMPOTENT'tir: çıkış animasyonu sürerken ya da kirli-form onayı\r\n * açıkken gelen ek çağrılar yok sayılır (bkz. `dialog.service.ts` `closePredicate`).\r\n *\r\n * İçerik component'i içinde `injectDialogRef<Sonuç>()` ile alınır.\r\n */\r\nexport class MfDialogRef<R = unknown, C = unknown> {\r\n readonly closed: Observable<R | undefined>;\r\n readonly backdropClick: Observable<MouseEvent>;\r\n readonly keydownEvents: Observable<KeyboardEvent>;\r\n readonly outsidePointerEvents: Observable<MouseEvent>;\r\n readonly overlayRef: OverlayRef;\r\n readonly id: string;\r\n\r\n private readonly isClosed = signal(false);\r\n private readonly result: Promise<R | undefined>;\r\n\r\n /** Dialog'un yaşam döngüsü — `closing` çıkış animasyonu boyunca. */\r\n readonly state: Signal<DialogState>;\r\n\r\n constructor(\r\n readonly cdk: DialogRef<R, C>,\r\n readonly surface: DialogSurface,\r\n ) {\r\n this.closed = cdk.closed;\r\n this.backdropClick = cdk.backdropClick;\r\n this.keydownEvents = cdk.keydownEvents;\r\n this.outsidePointerEvents = cdk.outsidePointerEvents;\r\n this.overlayRef = cdk.overlayRef;\r\n this.id = cdk.id;\r\n this.state = computed<DialogState>(() =>\r\n this.isClosed() ? 'closed' : surface.closing() ? 'closing' : 'open',\r\n );\r\n this.result = new Promise((resolve) =>\r\n cdk.closed.subscribe((value) => {\r\n this.isClosed.set(true);\r\n resolve(value);\r\n }),\r\n );\r\n }\r\n\r\n /** Açılan component örneği (şablonla açıldıysa ve kapandıktan sonra `null`). */\r\n get componentInstance(): C | null {\r\n return this.cdk.componentInstance;\r\n }\r\n\r\n get componentRef(): ComponentRef<C> | null {\r\n return this.cdk.componentRef;\r\n }\r\n\r\n /** `true` iken ESC/backdrop kapatmaz; programatik `close()` yine çalışır. */\r\n get disableClose(): boolean | undefined {\r\n return this.cdk.disableClose;\r\n }\r\n set disableClose(value: boolean | undefined) {\r\n this.cdk.disableClose = value;\r\n }\r\n\r\n /** Dialog'u (çıkış animasyonu + kirli-form koruması üzerinden) kapatır. İdempotent. */\r\n close(result?: R): void {\r\n if (this.isClosed()) return;\r\n this.cdk.close(result);\r\n }\r\n\r\n /** Kapanış tamamlandığında (animasyon dahil) sonuçla çözülür; ESC/backdrop'ta `undefined`. */\r\n afterClosed(): Promise<R | undefined> {\r\n return this.result;\r\n }\r\n\r\n /** Açıkken genişlik basamağını değiştirir (`sm`…`xl`, `full`). */\r\n setSize(size: DialogSize): void {\r\n this.surface.size.set(size);\r\n }\r\n\r\n toggleMaximize(): void {\r\n this.surface.toggleMaximize();\r\n }\r\n\r\n /** Kirli-form sorusunu kaydeder — ESC/backdrop/X kapanışında `true` dönerse onay sorulur. */\r\n registerDirty(check: () => boolean): void {\r\n this.surface.registerDirty(check);\r\n }\r\n\r\n /** Başarılı kayıttan hemen önce — sonraki `close()` kirli-form onayı sormaz. */\r\n markClean(): void {\r\n this.surface.markClean();\r\n }\r\n}\r\n\r\n/**\r\n * `DIALOG_DATA`'nın kite ait adı — AYNI token nesnesi, CDK'dan ayrıca import\r\n * etmeye gerek kalmasın diye. `inject(MF_DIALOG_DATA)` ≡ `injectDialogData()`.\r\n */\r\nexport const MF_DIALOG_DATA = DIALOG_DATA;\r\n\r\n/** İçerik component'inde `DialogService.open(..., { data })` ile geçilen veriyi okur. */\r\nexport function injectDialogData<D>(): D {\r\n return inject<D>(DIALOG_DATA);\r\n}\r\n\r\n/** İçerik component'inde kendi dialog referansını alır — `ref.close(sonuç)`. */\r\nexport function injectDialogRef<R = unknown, C = unknown>(): MfDialogRef<R, C> {\r\n return inject<MfDialogRef<R, C>>(MfDialogRef);\r\n}\r\n","import { signal } from '@angular/core';\r\nimport type { DialogPlacement, DialogSize, DrawerSide } from './dialog.model';\r\n\r\nexport interface DialogCustomSize {\r\n width: number;\r\n height: number;\r\n}\r\n\r\n/**\r\n * Dialog başına TEK instance — `DialogService.open()` her açılışta yeni bir\r\n * tane üretip `options`'tan doldurur, CDK `DialogConfig.providers` ile o\r\n * dialog'un (içerik component'inin) injector'ına verir. `Dialog` (dialog.ts)\r\n * kendi `@Component.providers`'ında `skipSelf` ile bunu arar — bulamazsa\r\n * (ör. overlay olmadan tek başına render edilen statik bir önizleme/demo)\r\n * kendi yerel instance'ını üretir, hiçbir şey patlamaz.\r\n *\r\n * Boyut/maximize/drag/resize/sheet durumunun TAMAMI burada yaşıyor — `Dialog`\r\n * kendi `@Input()`'larıyla DEĞİL, bu sınıfı okuyarak render ediyor. Böylece\r\n * `DialogService.open(SomeForm, { size:'lg', maximizable:true })` gibi bir\r\n * çağrı, `SomeForm`'un template'inde 1+ seviye iç içe olan `<mf-dialog>`'a\r\n * DI üzerinden ulaşabiliyor (`@Input()` ile mümkün olmazdı — DialogService\r\n * `Dialog`'u değil, `SomeForm`'u örnekliyor).\r\n */\r\nexport class DialogSurface {\r\n readonly size = signal<DialogSize>('md');\r\n readonly placement = signal<DialogPlacement>('center');\r\n /** Çekmecenin fiziksel kenarı (`center`'da `null`) — `DialogService` yön bilgisiyle çözer. */\r\n readonly side = signal<DrawerSide | null>(null);\r\n readonly maximizable = signal(false);\r\n readonly draggable = signal(false);\r\n readonly resizable = signal(false);\r\n readonly maximized = signal(false);\r\n /** Kullanıcı kenardan boyutlandırdıysa dolu; maximize/sheet'te yok sayılır. */\r\n readonly customSize = signal<DialogCustomSize | null>(null);\r\n /** < 640px — `DialogService` `BreakpointObserver` ile besler. */\r\n readonly sheet = signal(false);\r\n /** Kapanış animasyonu oynarken `true` — bkz. `DialogService.open()` `closePredicate`. */\r\n readonly closing = signal(false);\r\n\r\n toggleMaximize(): void {\r\n this.maximized.update((value) => !value);\r\n this.customSize.set(null);\r\n }\r\n\r\n private dirtyCheck: (() => boolean) | null = null;\r\n /** Başarılı kayıt/programatik kapanışta `true` yapılır — bir sonraki kapanışta kirli-form uyarısı SORULMAZ. */\r\n readonly bypassDirtyGuard = signal(false);\r\n\r\n /** İçerik component'i (tüketicinin kendi form component'i) kendi \"kirli mi\" sorusunu buraya kaydeder — `DialogSurface` formun kendi şemasını bilmez. */\r\n registerDirty(check: () => boolean): void {\r\n this.dirtyCheck = check;\r\n }\r\n\r\n /** `DialogService.open()`'ın `closePredicate`'i ESC/backdrop/X kapanışında bunu okur. */\r\n isDirty(): boolean {\r\n return !this.bypassDirtyGuard() && !!this.dirtyCheck?.();\r\n }\r\n\r\n /** Başarılı kayıttan hemen önce çağrılır — programatik `dialogRef.close()` kirli-form uyarısı sormasın diye. */\r\n markClean(): void {\r\n this.bypassDirtyGuard.set(true);\r\n }\r\n}\r\n","import { Directive, ElementRef, computed, inject, input } from '@angular/core';\r\nimport { DialogSurface } from './dialog.surface';\r\n\r\nconst MIN_WIDTH = 320;\r\nconst MIN_HEIGHT = 240;\r\nconst VIEWPORT_MARGIN = 32;\r\nconst ARROW_STEP = 16;\r\nconst ARROW_STEP_LARGE = 64;\r\n\r\n/**\r\n * `<button mfDialogResizeHandle [ariaLabel]=\"...\">` — `Dialog`'un (dialog.ts)\r\n * sağ-alt köşesinde, `DialogSurface.customSize`'ı besleyen serbest boyutlandırma\r\n * tutamacı. Fare/dokunma İLE klavye (ok tuşları) İKİSİ de destekleniyor —\r\n * projects/ui-kit/README.md \"a11y checklist\" bölümü \"sadece fareyle çalışan bir\r\n * tutamaç\"ı kabul etmiyor.\r\n */\r\n@Directive({\r\n selector: '[mfDialogResizeHandle]',\r\n host: {\r\n role: 'slider',\r\n tabindex: '0',\r\n '[attr.aria-label]': 'ariaLabel()',\r\n '[attr.aria-valuenow]': 'ariaValueNow()',\r\n '(pointerdown)': 'onPointerDown($event)',\r\n '(pointermove)': 'onPointerMove($event)',\r\n '(pointerup)': 'onPointerUp($event)',\r\n '(pointercancel)': 'onPointerUp($event)',\r\n '(keydown)': 'onKeydown($event)',\r\n },\r\n})\r\nexport class DialogResizeHandle {\r\n private readonly surface = inject(DialogSurface);\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n readonly ariaLabel = input.required<string>();\r\n\r\n /** `role=\"slider\"` `aria-valuenow` zorunlu kılıyor (axe: `aria-required-attr`) — genişliği raporlar, özel boyut yoksa panelin ölçülen genişliğine, o da yoksa `MIN_WIDTH`'e düşer. */\r\n protected readonly ariaValueNow = computed(\r\n () => this.surface.customSize()?.width ?? this.panelRect()?.width ?? MIN_WIDTH,\r\n );\r\n\r\n private pointerId: number | null = null;\r\n private startX = 0;\r\n private startY = 0;\r\n private startWidth = 0;\r\n private startHeight = 0;\r\n\r\n protected onPointerDown(event: PointerEvent): void {\r\n if (event.button !== 0) return;\r\n const rect = this.panelRect();\r\n if (!rect) return;\r\n\r\n this.pointerId = event.pointerId;\r\n this.startX = event.clientX;\r\n this.startY = event.clientY;\r\n this.startWidth = this.surface.customSize()?.width ?? rect.width;\r\n this.startHeight = this.surface.customSize()?.height ?? rect.height;\r\n this.host.nativeElement.setPointerCapture(event.pointerId);\r\n event.preventDefault();\r\n }\r\n\r\n protected onPointerMove(event: PointerEvent): void {\r\n if (this.pointerId !== event.pointerId) return;\r\n this.applySize(\r\n this.startWidth + (event.clientX - this.startX),\r\n this.startHeight + (event.clientY - this.startY),\r\n );\r\n }\r\n\r\n protected onPointerUp(event: PointerEvent): void {\r\n if (this.pointerId !== event.pointerId) return;\r\n this.pointerId = null;\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent): void {\r\n const rect = this.panelRect();\r\n const current = this.surface.customSize() ?? {\r\n width: rect?.width ?? MIN_WIDTH,\r\n height: rect?.height ?? MIN_HEIGHT,\r\n };\r\n const step = event.shiftKey ? ARROW_STEP_LARGE : ARROW_STEP;\r\n\r\n switch (event.key) {\r\n case 'ArrowRight':\r\n this.applySize(current.width + step, current.height);\r\n break;\r\n case 'ArrowLeft':\r\n this.applySize(current.width - step, current.height);\r\n break;\r\n case 'ArrowDown':\r\n this.applySize(current.width, current.height + step);\r\n break;\r\n case 'ArrowUp':\r\n this.applySize(current.width, current.height - step);\r\n break;\r\n case 'Home':\r\n this.surface.customSize.set(null);\r\n break;\r\n default:\r\n return;\r\n }\r\n event.preventDefault();\r\n }\r\n\r\n private panelRect(): DOMRect | null {\r\n return (\r\n this.host.nativeElement.closest<HTMLElement>('.cdk-overlay-pane')?.getBoundingClientRect() ??\r\n null\r\n );\r\n }\r\n\r\n private applySize(width: number, height: number): void {\r\n const maxWidth = window.innerWidth - VIEWPORT_MARGIN;\r\n const maxHeight = window.innerHeight - VIEWPORT_MARGIN;\r\n this.surface.customSize.set({\r\n width: Math.min(Math.max(width, MIN_WIDTH), maxWidth),\r\n height: Math.min(Math.max(height, MIN_HEIGHT), maxHeight),\r\n });\r\n }\r\n}\r\n","import { cva, type VariantProps } from 'class-variance-authority';\r\nimport { glassSurface } from '@mesgflow/ui-kit/core';\r\n\r\n/**\r\n * Boyut ölçeği CSS `min()` ile viewport'a göre kendini sınırlıyor —\r\n * `max-w-[560px]` gibi ayrı bir \"hiçbir zaman viewport'tan taşma\" class'ıyla\r\n * `cn()`/tailwind-merge üzerinden birleştirilemezdi (ikisi aynı utility\r\n * grubu — `max-width` — sonuncusu kazanır, ikisi birden UYGULANMAZ). Tek\r\n * arbitrary value'da `min(N, 100vw-2rem)` ile ikisi birden garanti ediliyor.\r\n *\r\n * `state` (normal/maximized/sheet/drawer) boyut eksenine dik, tek-seçim bir eksen —\r\n * `Dialog` (dialog.ts) `DialogSurface`'ten okuyup hesaplıyor, tüketici\r\n * tarafından doğrudan set edilmiyor. `drawer` boyut ölçeğini (sm/md/lg/xl)\r\n * `normal` ile PAYLAŞIR ama genişliği AYNI şekilde uygulamaz — aşağıdaki\r\n * `compoundVariants`'a bak.\r\n *\r\n * **`drawer` neden `width` de alıyor, `max-width` yetmiyor mu**: sağa yaslı\r\n * `GlobalPositionStrategy` (`dialog.service.ts`) overlay wrapper'a\r\n * `align-items:flex-start` veriyor — bu, cross-axis stretch'i KAPATIYOR, yani\r\n * `.cdk-overlay-pane` içeriğine göre daralıyor (shrink-to-fit). Böyle bir\r\n * (genişliği belirsiz/auto) kapsayıcı içinde `mf-dialog`'un tabandaki\r\n * `w-full`'u (`width:100%`) CSS Sizing L3'e göre `width:auto`'ya döner —\r\n * yani panel `max-w-[min(N,...)]` TAVANINA hiç ulaşmadan, içeriğin doğal\r\n * genişliğinde kalır. `normal` (ortada yüzen) dialog için bu doğru davranış\r\n * (kısa bir onay kutusu tavana kadar zorla GENİŞLEMEMELİ), ama drawer için\r\n * YANLIŞ — üç CRUD formu içerik uzunluğuna göre üç farklı genişlikte açılırdı\r\n * (gerçek, gözlemlenen bir regresyon). Çözüm: `calc(100vw-2rem)` viewport'a\r\n * göre DEFINITE bir uzunluk — parent'ın genişliği belirsiz olsa bile bu\r\n * paradoksu atlıyor. `width` + `max-width` aynı ifadeyi taşıdığı için\r\n * `max-width` drawer'da fiilen artık gereksiz ama zararsız kalıyor.\r\n *\r\n * **`maximized` neden kendi `max-w-none`'ını taşıyor**: `size` (sm/md/lg/xl)\r\n * her zaman uygulanır, `state` ondan BAĞIMSIZ bir eksendir — `maximized` kendi\r\n * `max-w-none`'ını taşımazsa, `size`'ın `max-w-[min(N,...)]`'i (aynı `max-width`\r\n * grubu, ama `size` `state`'ten ÖNCE değerlendirildiği için `state` sonuncusu\r\n * kazanmadıkça) tek başına kalır ve `w-screen`'i geçersiz kılar — gerçek,\r\n * gözlemlenen bir regresyon: `maximizable:true, size:'lg'` bir dialog\r\n * büyütüldüğünde yükseklik `h-[100dvh]`'e ulaşırken genişlik hâlâ `lg`'nin\r\n * 720px tavanına sıkışıp kalıyordu (\"kenarlar kısa, sadece boyu uzuyor\").\r\n */\r\n/**\r\n * Panel yüzeyi `glassSurface` (bkz. `@mesgflow/ui-kit/core` — mikro\r\n * glassmorphism, 2026-09 Deep Emerald geçişi): arkadaki içerik `backdrop-blur`\r\n * destekleyen tarayıcılarda hafifçe görünür kalır, backdrop\r\n * (`.mf-dialog-backdrop`, motion.css) ayrıca karartıyor. `maximized` durumu\r\n * TAM VIEWPORT'u kapladığı için (arkasında blur'lanacak sayfa içeriği yok,\r\n * sadece backdrop) camı KAPATIP düz `bg-surface`'e döner — hem maliyetsiz hem\r\n * anlamsız bir blur'dan kaçınır.\r\n */\r\nexport const dialogVariants = cva(\r\n `relative flex w-full flex-col overflow-hidden border shadow-3 ${glassSurface}`,\r\n {\r\n variants: {\r\n size: {\r\n sm: 'max-w-[min(440px,calc(100vw-2rem))]',\r\n md: 'max-w-[min(560px,calc(100vw-2rem))]',\r\n lg: 'max-w-[min(720px,calc(100vw-2rem))]',\r\n xl: 'max-w-[min(960px,calc(100vw-2rem))]',\r\n full: 'max-w-none',\r\n },\r\n state: {\r\n normal: 'rounded-xl max-h-[85vh]',\r\n maximized:\r\n 'h-[100dvh] max-h-none w-screen max-w-none rounded-none supports-[backdrop-filter]:bg-surface supports-[backdrop-filter]:backdrop-blur-none',\r\n sheet: 'w-screen rounded-t-xl rounded-b-none max-h-[92dvh]',\r\n drawer: 'max-h-none',\r\n },\r\n /** Çekmecenin fiziksel kenarı — yalnızca `state: 'drawer'` ile anlamlı. */\r\n side: {\r\n none: '',\r\n right: '',\r\n left: '',\r\n top: '',\r\n bottom: '',\r\n },\r\n },\r\n compoundVariants: [\r\n // Yan çekmeceler: tam yükseklik, boyut ölçeği GENİŞLİK olarak.\r\n { state: 'drawer', side: ['left', 'right'], class: 'h-[100dvh]' },\r\n { state: 'drawer', side: 'right', class: 'rounded-l-xl rounded-r-none' },\r\n { state: 'drawer', side: 'left', class: 'rounded-r-xl rounded-l-none' },\r\n {\r\n state: 'drawer',\r\n side: ['left', 'right'],\r\n size: 'sm',\r\n class: 'w-[min(440px,calc(100vw-2rem))]',\r\n },\r\n {\r\n state: 'drawer',\r\n side: ['left', 'right'],\r\n size: 'md',\r\n class: 'w-[min(560px,calc(100vw-2rem))]',\r\n },\r\n {\r\n state: 'drawer',\r\n side: ['left', 'right'],\r\n size: 'lg',\r\n class: 'w-[min(720px,calc(100vw-2rem))]',\r\n },\r\n {\r\n state: 'drawer',\r\n side: ['left', 'right'],\r\n size: 'xl',\r\n class: 'w-[min(960px,calc(100vw-2rem))]',\r\n },\r\n // Üst/alt paneller: tam genişlik, içerik yüksekliğinde (en çok %85).\r\n { state: 'drawer', side: ['top', 'bottom'], class: 'w-screen max-w-none max-h-[85dvh]' },\r\n { state: 'drawer', side: 'top', class: 'rounded-b-xl rounded-t-none' },\r\n { state: 'drawer', side: 'bottom', class: 'rounded-t-xl rounded-b-none' },\r\n ],\r\n defaultVariants: { size: 'md', state: 'normal', side: 'none' },\r\n },\r\n);\r\n\r\nexport type DialogVariants = VariantProps<typeof dialogVariants>;\r\n","import { DialogRef } from '@angular/cdk/dialog';\r\nimport { CdkDrag, CdkDragHandle } from '@angular/cdk/drag-drop';\r\nimport {\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n afterNextRender,\r\n booleanAttribute,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { cn, MF_DIALOG_LABELS, nextId } from '@mesgflow/ui-kit/core';\r\nimport { Button } from '@mesgflow/ui-kit/button';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { MfDialogRef } from './dialog-ref';\r\nimport { DialogResizeHandle } from './dialog-resize-handle';\r\nimport type { DialogSize } from './dialog.model';\r\nimport { DialogSurface } from './dialog.surface';\r\nimport { dialogVariants } from './dialog.variants';\r\n\r\nconst DRAG_MIN_VISIBLE = 48;\r\n\r\n/**\r\n * `<mf-dialog [title]=\"...\" [subtitle]=\"...\" [icon]=\"'group'\" (close)=\"onCancel()\">`\r\n * — `DialogService.open()`'ın açtığı her içerik component'i (tüketicinin kendi\r\n * form component'i, ör. `ConfirmDialog`) kendi kök elemanı olarak bunu kullanır. CDK Dialog'un\r\n * kendisi (bkz. dialog.service.ts) hiçbir görsel çerçeve DAYATMIYOR (backdrop hariç) —\r\n * panel görünümü (yuvarlak köşe/gölge/header/footer/kapatma düğmesi) TAMAMEN burada,\r\n * tek yerde yaşıyor.\r\n *\r\n * Boyut/placement/maximize/drag/resize/sheet durumu kendi `@Input()`'ları DEĞİL,\r\n * `DialogSurface` (DI ile enjekte edilir) — bkz. o dosyanın doc yorumu. `title`/\r\n * `subtitle`/`icon`/`fillBody` ise İÇERİĞE ait olduğu için normal input —\r\n * `[dialog-header]` slot'u tamamen özel bir başlık gerektiren durumlar için (bkz.\r\n * ConfirmDialog) kaçış kapısı olarak kalıyor.\r\n *\r\n * `stateVariant()` sırası (sheet → maximized → drawer → normal) bilinçli: mobil\r\n * sheet her zaman kazanır, ardından drag/resize/mobil-sheet'in yalnızca `normal`'da\r\n * açık olması (bkz. `dragEnabled`/`resizeHandleVisible`) drawer'da bu ikisinin\r\n * otomatik kapalı kalmasını BEDAVA sağlıyor — ayrı bir kontrol gerekmiyor.\r\n */\r\n@Component({\r\n selector: 'mf-dialog',\r\n exportAs: 'mfDialog',\r\n imports: [Button, Icon, DialogResizeHandle, CdkDragHandle],\r\n hostDirectives: [CdkDrag],\r\n providers: [\r\n {\r\n provide: DialogSurface,\r\n useFactory: () =>\r\n inject(DialogSurface, { optional: true, skipSelf: true }) ?? new DialogSurface(),\r\n },\r\n ],\r\n host: {\r\n '[class]': 'hostClasses()',\r\n '[style.width.px]': 'customWidth()',\r\n '[style.height.px]': 'customHeight()',\r\n // Çekmece kenarları FİZİKSEL çözülür (`DialogService` RTL'i zaten hesaba kattı) —\r\n // motion.css'in `--mf-dir` çevirmesi burada çift çevirme yapmasın.\r\n '[style.--mf-dir]': \"stateVariant() === 'drawer' ? 1 : null\",\r\n '(keydown.control.enter)': 'requestSubmit()',\r\n '(keydown.meta.enter)': 'requestSubmit()',\r\n },\r\n templateUrl: './dialog.html',\r\n})\r\nexport class Dialog {\r\n readonly title = input('');\r\n readonly subtitle = input('');\r\n readonly icon = input('');\r\n /** Sadece `DialogSurface` DI ile enjekte edilmediğinde (ör. statik bir önizleme/demo) etkili — gerçek dialog'larda `DialogService.open({ size })` kullanılır. */\r\n readonly size = input<DialogSize | undefined>(undefined);\r\n /**\r\n * `true` ise gövde kendi kaydırmasını KAPATIR (`overflow:hidden`) ve kalan\r\n * yüksekliği içeriğe `flex-1` ile devreder — içeriğin KENDİ tek scroll alanını\r\n * kurması beklenir (ör. uzun bir liste içeren bir form). \"Tek kaydırma bölgesi\"\r\n * kuralının uygulama noktası: dialog gövdesi + içerik aynı anda kaymaz.\r\n */\r\n readonly fillBody = input(false);\r\n /**\r\n * `true` (varsayılan): kapat (X) düğmesi `close` olayını yayınladıktan SONRA\r\n * dialog'u kendisi de kapatır (`MfDialogRef.close()` — idempotent, tüketicinin\r\n * `(close)` handler'ında sonuçla yaptığı kapanış önce davranır ve kazanır).\r\n * `false`: yalnızca `close` yayınlanır — kapanışı tamamen tüketici yönetir.\r\n */\r\n readonly autoClose = input(true, { transform: booleanAttribute });\r\n // `close` adı native DOM `close` olayıyla çakışıyor (@angular-eslint/no-output-native);\r\n // mevcut public API — yeniden adlandırma kırıcı, ileri bir sürümde ele alınacak.\r\n // eslint-disable-next-line @angular-eslint/no-output-native\r\n readonly close = output<void>();\r\n\r\n protected readonly surface = inject(DialogSurface);\r\n protected readonly labels = inject(MF_DIALOG_LABELS);\r\n /** Görünür başlığın id'si — CDK konteynerinin `aria-labelledby`'ı buna bağlanır. */\r\n protected readonly titleId = nextId('mf-dialog-title');\r\n\r\n private readonly mfRef = inject(MfDialogRef, { optional: true });\r\n private readonly cdkRef = inject(DialogRef, { optional: true });\r\n\r\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly cdkDrag = inject(CdkDrag, { self: true });\r\n private readonly scrollBody = viewChild<ElementRef<HTMLElement>>('scrollBody');\r\n\r\n protected readonly scrolledFromTop = signal(false);\r\n protected readonly hasMoreBelow = signal(false);\r\n\r\n protected readonly stateVariant = computed<'normal' | 'maximized' | 'sheet' | 'drawer'>(() => {\r\n if (this.surface.sheet()) return 'sheet';\r\n if (this.surface.maximized() || this.size() === 'full') return 'maximized';\r\n if (this.surface.side()) return 'drawer';\r\n return 'normal';\r\n });\r\n\r\n protected readonly dragEnabled = computed(\r\n () => this.surface.draggable() && this.stateVariant() === 'normal',\r\n );\r\n protected readonly resizeHandleVisible = computed(\r\n () => this.surface.resizable() && this.stateVariant() === 'normal',\r\n );\r\n /** Drawer zaten tam yükseklik — büyütme düğmesinin anlamı yok, `surface.maximizable()` `true` olsa bile gizlenir. */\r\n protected readonly maximizeVisible = computed(\r\n () => this.surface.maximizable() && this.stateVariant() !== 'drawer',\r\n );\r\n\r\n protected readonly hostClasses = computed(() => {\r\n const closing = this.surface.closing();\r\n const state = this.stateVariant();\r\n const side = state === 'drawer' ? (this.surface.side() ?? 'right') : null;\r\n // Kenar başına FİZİKSEL kayma (host `--mf-dir: 1` sabitler — bkz. host bağlaması).\r\n const animateBase =\r\n state === 'sheet' || side === 'bottom'\r\n ? 'sheet'\r\n : side === 'right'\r\n ? 'drawer'\r\n : side === 'left'\r\n ? 'drawer-start'\r\n : side === 'top'\r\n ? 'drawer-top'\r\n : 'dialog';\r\n return cn(\r\n dialogVariants({ size: this.size() ?? this.surface.size(), state, side: side ?? 'none' }),\r\n state === 'normal' && this.surface.customSize() ? 'max-w-none max-h-none' : '',\r\n `animate-${animateBase}-${closing ? 'out' : 'in'}`,\r\n );\r\n });\r\n\r\n protected readonly customWidth = computed(() =>\r\n this.stateVariant() === 'normal' ? this.surface.customSize()?.width : undefined,\r\n );\r\n protected readonly customHeight = computed(() =>\r\n this.stateVariant() === 'normal' ? this.surface.customSize()?.height : undefined,\r\n );\r\n\r\n /** Kenara/tam ekrana yaslı yüzeyler (drawer, mobil sheet, maximized): bölgeler KALICI\r\n * çizgiyle ayrılır — header/content/footer iskeleti her zaman aynı görünür. Ortada\r\n * yüzen klasik dialog (`normal`, ör. ConfirmDialog) bugünkü kaydırma-gölgesi davranışını\r\n * korur — kısa bir onay kutusu gereksiz çizgi kazanmaz. */\r\n protected readonly framed = computed(() => this.stateVariant() !== 'normal');\r\n\r\n protected readonly headerBorder = computed(() => this.framed() || this.scrolledFromTop());\r\n protected readonly footerBorder = computed(() => this.framed() || this.hasMoreBelow());\r\n\r\n constructor() {\r\n this.cdkDrag.rootElementSelector = '.cdk-overlay-pane';\r\n this.cdkDrag.constrainPosition = (point, _dragRef, dimensions) => ({\r\n x: Math.min(\r\n Math.max(point.x, DRAG_MIN_VISIBLE - dimensions.width),\r\n window.innerWidth - DRAG_MIN_VISIBLE,\r\n ),\r\n y: Math.min(Math.max(point.y, 0), window.innerHeight - DRAG_MIN_VISIBLE),\r\n });\r\n\r\n effect(() => {\r\n this.cdkDrag.disabled = !this.dragEnabled();\r\n });\r\n\r\n effect(() => {\r\n if (this.surface.maximized() || this.surface.sheet()) {\r\n this.cdkDrag.reset();\r\n this.surface.customSize.set(null);\r\n }\r\n });\r\n\r\n // Erişilebilir ad: `ariaLabel` verilmemiş bir dialog'da CDK konteyneri görünür\r\n // başlığa `aria-labelledby` ile bağlanır (MatDialogTitle'ın kullandığı AYNI kanca).\r\n // Başlık sonradan boşalırsa/değişirse effect cleanup'ı kaydı geri alır.\r\n effect((onCleanup) => {\r\n // `DialogRef.containerInstance` tipi bu (CdkDialogContainer'a ait) metotları taşımıyor.\r\n const container = this.cdkRef?.containerInstance as unknown as\r\n | { _addAriaLabelledBy?(id: string): void; _removeAriaLabelledBy?(id: string): void }\r\n | null\r\n | undefined;\r\n if (!this.title() || !container?._addAriaLabelledBy) return;\r\n container._addAriaLabelledBy(this.titleId);\r\n onCleanup(() => container._removeAriaLabelledBy?.(this.titleId));\r\n });\r\n\r\n const destroyRef = inject(DestroyRef);\r\n afterNextRender(() => {\r\n this.updateScrollShadow();\r\n const el = this.scrollBody()?.nativeElement;\r\n if (!el || typeof ResizeObserver === 'undefined') return;\r\n const observer = new ResizeObserver(() => this.updateScrollShadow());\r\n observer.observe(el);\r\n destroyRef.onDestroy(() => observer.disconnect());\r\n });\r\n }\r\n\r\n /** Kapat (X): önce `close` olayı (tüketici sonuçla kapatabilsin), sonra — `autoClose` ise — ref'in kendisi. */\r\n protected onDismiss(): void {\r\n this.close.emit();\r\n if (this.autoClose()) (this.mfRef ?? this.cdkRef)?.close();\r\n }\r\n\r\n protected updateScrollShadow(): void {\r\n const el = this.scrollBody()?.nativeElement;\r\n if (!el) return;\r\n this.scrolledFromTop.set(el.scrollTop > 1);\r\n this.hasMoreBelow.set(el.scrollHeight - el.clientHeight - el.scrollTop > 1);\r\n }\r\n\r\n /**\r\n * Ctrl/Cmd+Enter — tek yerde çözülür, her form bedava kazanır. Kaydet düğmesi\r\n * footer slot'unda `<form>`'un DIŞINDA yaşıyor (`form=\"role-form\"` attribute\r\n * ilişkilendirmesiyle çalışıyor) — bu yüzden düğmeye tıklamayı taklit etmek\r\n * yerine doğrudan `<form>` üzerinde `requestSubmit()` çağrılıyor; bu da native\r\n * kısıt doğrulamasını çalıştırıp mevcut `(submit)` bağlamasını tetikler.\r\n */\r\n protected requestSubmit(): void {\r\n this.elementRef.nativeElement.querySelector('form')?.requestSubmit();\r\n }\r\n}\r\n","<div\r\n class=\"flex shrink-0 items-start justify-between gap-3 px-6 pt-5 pb-4\"\r\n [class.border-b]=\"headerBorder()\"\r\n [class.border-border]=\"headerBorder()\"\r\n>\r\n <ng-content select=\"[dialog-header]\">\r\n @if (icon()) {\r\n <span\r\n class=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-md bg-surface-alt text-fg-muted\"\r\n >\r\n <span mfIcon [size]=\"20\">{{ icon() }}</span>\r\n </span>\r\n }\r\n <div\r\n cdkDragHandle\r\n class=\"min-w-0 flex-1 pt-0.5\"\r\n [class.cursor-grab]=\"dragEnabled()\"\r\n [class.active:cursor-grabbing]=\"dragEnabled()\"\r\n >\r\n @if (title()) {\r\n <h2 [id]=\"titleId\" class=\"truncate font-display text-title text-fg\">{{ title() }}</h2>\r\n }\r\n @if (subtitle()) {\r\n <p class=\"mt-0.5 truncate text-sm text-fg-muted\">{{ subtitle() }}</p>\r\n }\r\n </div>\r\n </ng-content>\r\n\r\n <div class=\"flex shrink-0 items-center gap-1\">\r\n @if (maximizeVisible()) {\r\n <button\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"neutral\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"surface.maximized() ? labels().fullscreenExit : labels().fullscreenEnter\"\r\n (click)=\"surface.toggleMaximize()\"\r\n >\r\n <span mfIcon [size]=\"18\">{{ surface.maximized() ? 'fullscreen_exit' : 'fullscreen' }}</span>\r\n </button>\r\n }\r\n <button\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"neutral\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"labels().close\"\r\n (click)=\"onDismiss()\"\r\n >\r\n <span mfIcon [size]=\"20\">close</span>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<div\r\n #scrollBody\r\n class=\"flex-1 min-h-0 px-6\"\r\n [class.py-4]=\"framed()\"\r\n [class.overflow-y-auto]=\"!fillBody()\"\r\n [class.flex]=\"fillBody()\"\r\n [class.flex-col]=\"fillBody()\"\r\n [class.overflow-hidden]=\"fillBody()\"\r\n (scroll)=\"updateScrollShadow()\"\r\n>\r\n <ng-content />\r\n</div>\r\n\r\n<div\r\n class=\"shrink-0 px-6 py-4 [&:not(:has(*))]:hidden\"\r\n [class.border-t]=\"footerBorder()\"\r\n [class.border-border]=\"footerBorder()\"\r\n>\r\n <ng-content select=\"[dialog-footer]\" />\r\n</div>\r\n\r\n@if (resizeHandleVisible()) {\r\n <button\r\n mfDialogResizeHandle\r\n type=\"button\"\r\n [ariaLabel]=\"labels().resize\"\r\n class=\"absolute right-1 bottom-1 flex h-4 w-4 cursor-se-resize items-center justify-center rounded-xs text-fg-subtle hover:text-fg-muted focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\"\r\n >\r\n <span mfIcon [size]=\"14\">south_east</span>\r\n </button>\r\n}\r\n","import { Component, computed, inject, signal } from '@angular/core';\r\nimport { Button } from '@mesgflow/ui-kit/button';\r\nimport type { ButtonTone } from '@mesgflow/ui-kit/button';\r\nimport { MF_DIALOG_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Dialog } from './dialog';\r\nimport { injectDialogData, injectDialogRef } from './dialog-ref';\r\nimport type { ConfirmDialogData, ConfirmTone } from './dialog.model';\r\n\r\nconst TONE_ICON: Record<ConfirmTone, string> = {\r\n danger: 'warning',\r\n warning: 'warning',\r\n info: 'info',\r\n success: 'check_circle',\r\n neutral: 'help',\r\n};\r\n\r\n/** Rozet renkleri Badge'in `badge.variants.ts`'teki tonal işaret rol token'ını (`bg-X-tint text-X-tint-fg`) birebir izliyor. */\r\nconst TONE_BADGE_CLASS: Record<ConfirmTone, string> = {\r\n danger: 'bg-danger-tint text-danger-tint-fg',\r\n warning: 'bg-warning-tint text-warning-tint-fg',\r\n info: 'bg-info-tint text-info-tint-fg',\r\n success: 'bg-success-tint text-success-tint-fg',\r\n neutral: 'bg-surface-alt text-fg-muted',\r\n};\r\n\r\n/**\r\n * Onay diyaloğunun içerik component'i — `DialogService.confirm()`/`confirmDelete()`/\r\n * `alert()` (bkz. dialog.service.ts) bunu açıp `DialogRef<boolean>`'ı `Promise`'e\r\n * çeviriyor. `Dialog`'un (dialog.ts) `[dialog-header]` kaçış kapısını kullanıyor —\r\n * ton'a göre renkli ikon rozeti, generic `Dialog`'un kendi `[icon]` input'unun\r\n * desteklemediği bir şey (o sadece nötr bir rozet çizer), bu yüzden kendi başlığını\r\n * kendi çiziyor.\r\n */\r\n@Component({\r\n selector: 'mf-confirm-dialog',\r\n imports: [Dialog, Button, Icon],\r\n host: { class: 'contents' },\r\n templateUrl: './confirm-dialog.html',\r\n})\r\nexport class ConfirmDialog {\r\n protected readonly data = injectDialogData<ConfirmDialogData>();\r\n private readonly dialogRef = injectDialogRef<boolean, ConfirmDialog>();\r\n protected readonly labels = inject(MF_DIALOG_LABELS);\r\n\r\n protected readonly tone = computed<ConfirmTone>(() => this.data.tone ?? 'neutral');\r\n protected readonly toneIcon = computed(() => TONE_ICON[this.tone()]);\r\n protected readonly toneBadgeClass = computed(() => TONE_BADGE_CLASS[this.tone()]);\r\n\r\n /** Her ton `filled` — warning da diğer tonlarla aynı `bg-X-fill` rol deseninde dolu blok kullanıyor (bkz. button.variants.ts), eski `outlined` istisnası kaldırıldı. */\r\n protected readonly confirmTone = computed<ButtonTone>(() => {\r\n const tone = this.tone();\r\n if (tone === 'danger') return 'danger';\r\n if (tone === 'warning') return 'warning';\r\n return 'primary';\r\n });\r\n\r\n protected readonly submitting = signal(false);\r\n protected readonly actionError = signal<string | null>(null);\r\n\r\n protected onCancel(): void {\r\n this.dialogRef.close(false);\r\n }\r\n\r\n protected async onConfirm(): Promise<void> {\r\n if (!this.data.action) {\r\n this.dialogRef.close(true);\r\n return;\r\n }\r\n\r\n this.submitting.set(true);\r\n this.actionError.set(null);\r\n this.dialogRef.disableClose = true;\r\n try {\r\n await this.data.action();\r\n this.dialogRef.close(true);\r\n } catch {\r\n this.actionError.set(this.labels().errorGeneric);\r\n } finally {\r\n this.submitting.set(false);\r\n this.dialogRef.disableClose = false;\r\n }\r\n }\r\n}\r\n","<mf-dialog size=\"sm\" (close)=\"onCancel()\">\r\n <div dialog-header class=\"flex items-start gap-3\">\r\n <span\r\n class=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-md\"\r\n [class]=\"toneBadgeClass()\"\r\n >\r\n <span mfIcon [size]=\"22\">{{ toneIcon() }}</span>\r\n </span>\r\n <div class=\"min-w-0 flex-1 pt-1.5\">\r\n <h2 class=\"truncate font-display text-title text-fg\">{{ data.title }}</h2>\r\n </div>\r\n </div>\r\n\r\n <p class=\"text-sm text-fg-muted\">{{ data.content }}</p>\r\n\r\n @if (actionError()) {\r\n <p class=\"mt-3 text-sm text-danger\">{{ actionError() }}</p>\r\n }\r\n\r\n <div dialog-footer class=\"flex justify-end gap-2\">\r\n @if (!data.alert) {\r\n <button\r\n mfButton\r\n appearance=\"outlined\"\r\n tone=\"neutral\"\r\n type=\"button\"\r\n [disabled]=\"submitting()\"\r\n (click)=\"onCancel()\"\r\n >\r\n {{ data.cancelLabel ?? labels().confirmCancel }}\r\n </button>\r\n }\r\n <button\r\n mfButton\r\n [tone]=\"confirmTone()\"\r\n appearance=\"filled\"\r\n type=\"button\"\r\n [disabled]=\"submitting()\"\r\n [loading]=\"submitting()\"\r\n (click)=\"onConfirm()\"\r\n >\r\n {{ data.confirmLabel ?? (data.alert ? labels().confirmOk : labels().confirmConfirm) }}\r\n </button>\r\n </div>\r\n</mf-dialog>\r\n","import { Dialog as CdkDialog, type DialogRef } from '@angular/cdk/dialog';\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { BreakpointObserver } from '@angular/cdk/layout';\r\nimport { createGlobalPositionStrategy } from '@angular/cdk/overlay';\r\nimport type { ComponentType } from '@angular/cdk/portal';\r\nimport { Injectable, Injector, inject, type TemplateRef } from '@angular/core';\r\nimport { MF_DIALOG_LABELS, exitDurationMs } from '@mesgflow/ui-kit/core';\r\nimport { ConfirmDialog } from './confirm-dialog';\r\nimport { MfDialogRef } from './dialog-ref';\r\nimport type { ConfirmDialogData, DialogOptions, DialogPlacement, DrawerSide } from './dialog.model';\r\nimport { DialogSurface } from './dialog.surface';\r\n\r\nconst SHEET_QUERY = '(max-width: 639.98px)';\r\n\r\n/** Mantıksal yerleşimi fiziksel kenara çevirir (`start`/`end` RTL'de yer değiştirir). */\r\nfunction sideOf(placement: DialogPlacement, rtl: boolean): DrawerSide | null {\r\n switch (placement) {\r\n case 'center':\r\n return null;\r\n case 'start':\r\n return rtl ? 'right' : 'left';\r\n case 'end':\r\n return rtl ? 'left' : 'right';\r\n default:\r\n return placement;\r\n }\r\n}\r\n\r\nfunction normalizeClass(value: string | string[] | undefined): string[] {\r\n if (!value) return [];\r\n return Array.isArray(value) ? value : [value];\r\n}\r\n\r\n/**\r\n * Dialog açmanın tek, merkezi noktası — `@angular/cdk/dialog`'un `Dialog`\r\n * servisi ÜZERİNE ince bir katman (focus-trap/ESC/backdrop-click/geri-scroll-\r\n * engelleme davranışının TAMAMI CDK'dan geliyor, burada TEKRAR YAZILMADI — bkz.\r\n * projects/ui-kit/README.md \"a11y checklist\" bölümündeki \"elle yazmak son çare\" ilkesi).\r\n *\r\n * `open()` kite ait `MfDialogRef` döndürür (CDK `DialogRef` yüzeyini delege eder +\r\n * `afterClosed()`/`state`/`surface`). İçerik component'i `injectDialogRef()`/\r\n * `injectDialogData()` (bkz. dialog-ref.ts) kullanır — CDK'nın kendi `DialogRef`/\r\n * `DIALOG_DATA` token'larını inject etmek de çalışmaya devam eder. Boyut/placement/maximize/drag/resize/sheet durumu\r\n * `DialogSurface` (bkz. o dosya) üzerinden, `providers` ile o dialog'un injector'ına\r\n * verilir — `Dialog` (dialog.ts) bunu DI'dan okuyarak render eder.\r\n *\r\n * **Tek kural**: kayıt oluştur/düzenle → `openDrawer()` (sağdan, `placement:'right'`);\r\n * onayla/bilgilendir/sil → `confirm()`/`confirmDelete()`/`alert()` (merkezi, `size:'sm'`).\r\n * Drawer ayrı bir primitif DEĞİL — `placement` sadece konum stratejisini ve\r\n * `Dialog.stateVariant()`'ı değiştiren bir eksen, geri kalan her şey (CDK Dialog,\r\n * closePredicate, kirli-form koruması, mobil sheet, kaydırma gölgesi) ortak.\r\n *\r\n * Kapanış animasyonu: CDK'nın `DialogRef.close()`'u `overlayRef.dispose()`'u SENKRON\r\n * çağırıyor, bir \"kapanıyor\" olayı/kancası yok. `closePredicate` bunun için bilinçli\r\n * bir kaçamak — `false` döndürmek kapanmayı iptal ediyor: ilk çağrıda `surface.closing`'i\r\n * `true` yapıp gerçek kapanmayı `exitDurationMs()` kadar geciktiriyoruz (panel bu sürede `Dialog`'un\r\n * kendi reaktif `animate-dialog-out`/`animate-sheet-out`/`animate-drawer-out` class'ıyla\r\n * görsel olarak kapanır), ikinci çağrıda (zaten `closing()===true`) gerçek `dispose()`'a\r\n * izin veriyoruz. ESC/backdrop/programatik `dialogRef.close(...)` HEPSİ bu predicate'ten\r\n * geçtiği için davranış tekdüze. Animasyon sürerken gelen EK `close()` çağrıları\r\n * yok sayılır (`disposeArmed` yalnızca zamanlayıcı tarafından kurulur) — X düğmesi +\r\n * tüketicinin `(close)` handler'ı aynı anda kapatsa bile animasyon kesilmez. `prefers-reduced-motion` gecikmeyi tamamen atlıyor —\r\n * AMA kirli-form kontrolünden SONRA: koruma reduced-motion kullanıcılarında da çalışmalı.\r\n *\r\n * **Kirli form koruması**: `surface.isDirty()` `true` dönerse kapanış iptal edilip\r\n * `confirmDiscard()` (kendi içindeki `ConfirmDialog`, ayrı/temiz bir `DialogSurface`\r\n * ile) açılır; kullanıcı onaylarsa `surface.markClean()` + gerçek `close()`. İçerik\r\n * component'i `constructor()`'da `surface.registerDirty(() => ...)` ile kendi\r\n * \"değişti mi\" sorusunu kaydeder.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class DialogService {\r\n private readonly cdkDialog = inject(CdkDialog);\r\n private readonly injector = inject(Injector);\r\n private readonly breakpointObserver = inject(BreakpointObserver);\r\n private readonly labels = inject(MF_DIALOG_LABELS);\r\n private readonly dir = inject(Directionality, { optional: true });\r\n\r\n /** `ref` başına `DialogSurface` — tüketicinin kendi URL senkronizasyon mantığı, kirli-form durumunu PROAKTİF sormak için kullanabilir (kendi `closePredicate`'inin async akışıyla yarışmamak için). */\r\n // `DialogRef<D, C>`'nin `config.providers` callback'i kendi generic'lerine yapısal\r\n // olarak döngüsel referans veriyor (bkz. @angular/cdk/dialog) — `unknown` kullanmak\r\n // `ref`'i somut `DialogRef<R, C>` tipiyle çağıran DIŞARIDAKİ tüketicileri (public API)\r\n // derleme zamanında kırar. Registry nesne KİMLİĞİNE göre çalışıyor, tür parametreleri\r\n // ilgisiz; `any` burada BİLEREK.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private readonly surfaces = new WeakMap<DialogRef<any, any>, DialogSurface>();\r\n\r\n /**\r\n * Bir component'i ya da bir `TemplateRef'i açar (şablon yolu `<mf-drawer>` gibi\r\n * bildirimsel sarmalayıcılar içindir — şablonun injector'ı da `DialogSurface'i görür).\r\n */\r\n open<R = void, D = undefined, C = unknown>(\r\n component: ComponentType<C> | TemplateRef<C>,\r\n options?: DialogOptions<D>,\r\n ): MfDialogRef<R, C> {\r\n const surface = new DialogSurface();\r\n const placement = options?.placement ?? 'center';\r\n surface.size.set(options?.size ?? 'md');\r\n surface.placement.set(placement);\r\n const side = sideOf(placement, this.dir?.value === 'rtl');\r\n surface.side.set(side);\r\n const sheetOnMobile = (options?.sheetOnMobile ?? true) && side !== 'top' && side !== 'bottom';\r\n surface.maximizable.set(options?.maximizable ?? false);\r\n surface.draggable.set(options?.draggable ?? false);\r\n surface.resizable.set(options?.resizable ?? false);\r\n\r\n const position = createGlobalPositionStrategy(this.injector);\r\n const place = () => {\r\n if (side === 'right') position.right('0').top('0');\r\n else if (side === 'left') position.left('0').top('0');\r\n else if (side === 'top') position.top('0').left('0');\r\n else if (side === 'bottom') position.bottom('0').left('0');\r\n else position.centerHorizontally().centerVertically();\r\n };\r\n place();\r\n // Çıkış süresi CSS token'ından (`--mf-duration-exit`); reduced-motion'da 0.\r\n const exitMs = exitDurationMs();\r\n // Gerçek dispose'a SADECE çıkış zamanlayıcısı izin verir — bkz. sınıf yorumu.\r\n let disposeArmed = false;\r\n // Kirli-form onayı açıkken ikinci bir onay yığılmasın.\r\n let discardPending = false;\r\n let mfRef: MfDialogRef<R, C> | undefined;\r\n\r\n // CDK iki aşırı yükü (component / şablon) çalışma zamanında ayırt eder.\r\n const ref = this.cdkDialog.open<R, D, C>(component as ComponentType<C>, {\r\n data: options?.data,\r\n panelClass: normalizeClass(options?.panelClass),\r\n backdropClass: 'mf-dialog-backdrop',\r\n positionStrategy: position,\r\n autoFocus: 'first-tabbable',\r\n restoreFocus: true,\r\n disableClose: options?.disableClose ?? false,\r\n // CDK'nın kendi tarayıcı geri/ileri tuşu dinleyicisi (varsayılan `true`) —\r\n // tüketici derin-bağlantı/URL senkronizasyonunu KENDİ route effect'i\r\n // üzerinden yönetiyorsa (kirli-form kontrolü + confirmDiscard + URL\r\n // senkronu dahil), CDK'nın PARALEL ve koordinasyonsuz kendi `close()`\r\n // çağrısı (kendi closePredicate'inden geçerek KENDİ confirmDiscard'ını\r\n // açar) tüketicininkiyle AYNI ANDA iki ayrı \"Kaydedilmemiş değişiklikler\"\r\n // onayı açılmasına yol açabilir — gerçek bir kullanıcı senaryosunda\r\n // tekrarlanan, doğrulanmış bir çakışma.\r\n closeOnNavigation: false,\r\n // `aria-modal` — arka plan zaten `aria-hidden`, ama ekran okuyucuların sanal imleci\r\n // için modal olduğunu açıkça söylemek WAI-ARIA dialog deseninin gereği.\r\n ariaModal: true,\r\n // Verilmezse CDK konteyneri `<mf-dialog>`'un görünür başlığına `aria-labelledby` ile\r\n // bağlanır (bkz. dialog.ts — `_addAriaLabelledBy`).\r\n ariaLabel: options?.ariaLabel,\r\n providers: (cdkRef) => {\r\n mfRef = new MfDialogRef<R, C>(cdkRef as DialogRef<R, C>, surface);\r\n return [\r\n { provide: DialogSurface, useValue: surface },\r\n { provide: MfDialogRef, useValue: mfRef },\r\n ];\r\n },\r\n closePredicate: (result) => {\r\n // Çıkış animasyonu bitti — zamanlayıcının kendi çağrısı, gerçek dispose'a izin ver.\r\n if (disposeArmed) return true;\r\n // Animasyon ya da kirli-form onayı sürerken gelen ek çağrılar yok sayılır.\r\n if (surface.closing() || discardPending) return false;\r\n\r\n // Kirli form koruması reduced-motion kısa devresinden ÖNCE kontrol edilir — aksi halde\r\n // \"animasyonu azalt\" açık kullanıcılarda bu koruma hiç çalışmazdı.\r\n if (surface.isDirty()) {\r\n discardPending = true;\r\n void this.confirmDiscard().then((discard) => {\r\n discardPending = false;\r\n if (!discard) return;\r\n surface.markClean();\r\n ref.close(result as R | undefined);\r\n });\r\n return false;\r\n }\r\n\r\n if (exitMs === 0) return true;\r\n surface.closing.set(true);\r\n ref.overlayRef.backdropElement?.classList.add('is-closing');\r\n setTimeout(() => {\r\n disposeArmed = true;\r\n ref.close(result as R | undefined);\r\n }, exitMs);\r\n return false;\r\n },\r\n });\r\n\r\n this.surfaces.set(ref, surface);\r\n\r\n const breakpointSub = this.breakpointObserver.observe(SHEET_QUERY).subscribe(({ matches }) => {\r\n const sheet = matches && sheetOnMobile;\r\n surface.sheet.set(sheet);\r\n if (sheet) position.centerHorizontally().bottom('0');\r\n else place();\r\n position.apply();\r\n });\r\n ref.closed.subscribe(() => breakpointSub.unsubscribe());\r\n\r\n // `providers` fabrikası CDK `open()` içinde SENKRON çağrılır — burada her zaman dolu.\r\n return mfRef ?? new MfDialogRef<R, C>(ref, surface);\r\n }\r\n\r\n /**\r\n * Kayıt oluştur/düzenle formlarının TEK açılış noktası — sağdan drawer.\r\n * `maximizable` bilerek zorla kapatılıyor: drawer zaten tam yükseklik, büyütme\r\n * düğmesinin anlamı yok (bkz. `Dialog.maximizeVisible`).\r\n *\r\n * Varsayılan genişlik `md` (560px) — CRUD formları `size` GEÇMEZ, hepsi aynı\r\n * genişlikte açılmalı. İstisna: iki sütunlu bir form (sol dikey ray + sağ\r\n * panel gibi) `md` içine sığmazsa `xl` (960px) geçilebilir.\r\n */\r\n openDrawer<R = void, D = undefined, C = unknown>(\r\n component: ComponentType<C>,\r\n options?: Omit<DialogOptions<D>, 'placement'> & {\r\n placement?: Exclude<DialogPlacement, 'center'>;\r\n },\r\n ): MfDialogRef<R, C> {\r\n return this.open<R, D, C>(component, {\r\n ...options,\r\n placement: options?.placement ?? 'right',\r\n maximizable: false,\r\n });\r\n }\r\n\r\n /** `Promise<boolean>` döner — `if (await dialog.confirm(...))` çağıran taraf için `.subscribe()` zincirinden daha sade. */\r\n confirm(data: ConfirmDialogData): Promise<boolean> {\r\n const ref = this.open<boolean, ConfirmDialogData, ConfirmDialog>(ConfirmDialog, {\r\n data,\r\n size: 'sm',\r\n // `data.title` her zaman görünür bir başlık taşıyor — CDK'nın dialog konteynerine\r\n // erişilebilir ad olarak veriliyor (axe: `aria-dialog-name`); çağıran taraf\r\n // `ConfirmDialogData`'da ayrı bir `ariaLabel` alanı sağlayamıyor zaten.\r\n ariaLabel: data.title,\r\n });\r\n return ref.afterClosed().then((result) => !!result);\r\n }\r\n\r\n /**\r\n * Kirli-form kapanış korumasının kendi onay diyaloğu — `confirmDiscard`'ın açtığı\r\n * `ConfirmDialog`'un `DialogSurface`'i her zaman temiz (yeni instance), bu yüzden\r\n * özyineleme sorunsuz. `closePredicate` içinden (ESC/backdrop/X) VE tüketicinin\r\n * kendi route senkronizasyonundan (URL değişip panel PROAKTİF kapatılmadan\r\n * önce) iki ayrı yoldan çağrılabildiği için `public`.\r\n *\r\n * `tone: 'warning'` — onay butonu artık DOLU warning (bkz.\r\n * `button.variants.ts`/`confirm-dialog.ts`, eski `outlined` istisnası\r\n * kaldırıldı).\r\n */\r\n confirmDiscard(): Promise<boolean> {\r\n const t = this.labels().discard;\r\n return this.confirm({\r\n title: t.title,\r\n content: t.content,\r\n tone: 'warning',\r\n confirmLabel: t.confirm,\r\n cancelLabel: t.cancel,\r\n });\r\n }\r\n\r\n /**\r\n * Tüketici bir ref'i kapatmadan ÖNCE kirli mi diye sormak istiyorsa — kendi `closePredicate`'inin\r\n * async akışıyla yarışmamak için `DialogSurface`'e doğrudan erişim. `MfDialogRef` için\r\n * `ref.surface` tercih edilir; ham CDK ref'i (ör. içerikte inject edilen) de kabul edilir.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n getSurface(ref: DialogRef<any, any> | MfDialogRef<any, any>): DialogSurface | undefined {\r\n return ref instanceof MfDialogRef ? ref.surface : this.surfaces.get(ref);\r\n }\r\n\r\n /** `confirm()`'in silme kısayolu — `tone:'danger'` + varsayılan \"Sil\" etiketi. */\r\n confirmDelete(data: Omit<ConfirmDialogData, 'tone'>): Promise<boolean> {\r\n const confirmLabel = data.confirmLabel ?? this.labels().confirmDelete;\r\n return this.confirm({ ...data, tone: 'danger', confirmLabel });\r\n }\r\n\r\n /** Tek butonlu bilgilendirme modu — sonuç önemsiz olduğu için `Promise<void>` döner. */\r\n alert(data: Omit<ConfirmDialogData, 'alert'>): Promise<void> {\r\n const ref = this.open<boolean, ConfirmDialogData, ConfirmDialog>(ConfirmDialog, {\r\n data: { ...data, alert: true },\r\n size: 'sm',\r\n ariaLabel: data.title,\r\n });\r\n return ref.afterClosed().then(() => undefined);\r\n }\r\n}\r\n","// `MF_DIALOG_LABELS`/`MfDialogLabels` artık `@mesgflow/ui-kit/core`'da yaşıyor\r\n// (bkz. `core/i18n/tokens.ts` — MF_LABELS'ın bir seçicisi) — buradan AYRICA\r\n// re-export etmek `ng build ui-kit`'de TS2308 (ambiguous export) veriyor, çünkü\r\n// birincil barrel zaten hem `./core`'u hem `./dialog`'u `export *` ediyor.\r\n// Tüketici `import { MF_DIALOG_LABELS } from '@mesgflow/ui-kit'` (birincil barrel)\r\n// veya `'@mesgflow/ui-kit/core'` kullanır.\r\nexport * from './confirm-dialog';\r\nexport * from './dialog';\r\nexport * from './dialog-ref';\r\nexport * from './dialog-resize-handle';\r\nexport * from './dialog.model';\r\nexport * from './dialog.service';\r\nexport * from './dialog.surface';\r\nexport * from './dialog.variants';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["CdkDialog"],"mappings":"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"}
1
+ {"version":3,"file":"mesgflow-ui-kit-dialog.mjs","sources":["../../../projects/ui-kit/dialog/dialog-ref.ts","../../../projects/ui-kit/dialog/dialog.surface.ts","../../../projects/ui-kit/dialog/dialog-resize-handle.ts","../../../projects/ui-kit/dialog/dialog.variants.ts","../../../projects/ui-kit/dialog/dialog.ts","../../../projects/ui-kit/dialog/dialog.html","../../../projects/ui-kit/dialog/confirm-dialog.ts","../../../projects/ui-kit/dialog/confirm-dialog.html","../../../projects/ui-kit/dialog/dialog.service.ts","../../../projects/ui-kit/dialog/index.ts","../../../projects/ui-kit/dialog/mesgflow-ui-kit-dialog.ts"],"sourcesContent":["import { DIALOG_DATA, type DialogRef } from '@angular/cdk/dialog';\r\nimport type { OverlayRef } from '@angular/cdk/overlay';\r\nimport { computed, inject, signal, type ComponentRef, type Signal } from '@angular/core';\r\nimport type { Observable } from 'rxjs';\r\nimport type { DialogSize } from './dialog.model';\r\nimport type { DialogSurface } from './dialog.surface';\r\n\r\n/** `open` → (`close()` çağrıldı, çıkış animasyonu oynuyor) `closing` → (dispose edildi) `closed`. */\r\nexport type DialogState = 'open' | 'closing' | 'closed';\r\n\r\n/**\r\n * `DialogService.open()`/`openDrawer()`'ın döndürdüğü, kite ait dialog referansı.\r\n *\r\n * CDK `DialogRef`'in günlük kullanılan yüzeyini (`close`, `closed`,\r\n * `componentInstance`, `disableClose`, `backdropClick`, `keydownEvents` …)\r\n * birebir DELEGE eder — yani eski `ref.closed.subscribe(...)` kodu aynen derlenir.\r\n * Üstüne kitin kendi dünyasını ekler:\r\n *\r\n * - `afterClosed()` — `await` edilebilir sonuç (çıkış animasyonu BİTTİKTEN sonra çözülür).\r\n * - `state` — `'open' | 'closing' | 'closed'` signal'i (şablonda/`computed`'ta okunur).\r\n * - `surface` — boyut/maximize/kirli-form durumuna tipli erişim (`setSize`, `toggleMaximize`,\r\n * `registerDirty`, `markClean` kısayolları).\r\n * - `cdk` — ham CDK referansı (kaçış kapısı; ör. `updatePosition()`).\r\n *\r\n * `close()` İDEMPOTENT'tir: çıkış animasyonu sürerken ya da kirli-form onayı\r\n * açıkken gelen ek çağrılar yok sayılır (bkz. `dialog.service.ts` `closePredicate`).\r\n *\r\n * İçerik component'i içinde `injectDialogRef<Sonuç>()` ile alınır.\r\n */\r\nexport class MfDialogRef<R = unknown, C = unknown> {\r\n readonly closed: Observable<R | undefined>;\r\n readonly backdropClick: Observable<MouseEvent>;\r\n readonly keydownEvents: Observable<KeyboardEvent>;\r\n readonly outsidePointerEvents: Observable<MouseEvent>;\r\n readonly overlayRef: OverlayRef;\r\n readonly id: string;\r\n\r\n private readonly isClosed = signal(false);\r\n private readonly result: Promise<R | undefined>;\r\n\r\n /** Dialog'un yaşam döngüsü — `closing` çıkış animasyonu boyunca. */\r\n readonly state: Signal<DialogState>;\r\n\r\n constructor(\r\n readonly cdk: DialogRef<R, C>,\r\n readonly surface: DialogSurface,\r\n ) {\r\n this.closed = cdk.closed;\r\n this.backdropClick = cdk.backdropClick;\r\n this.keydownEvents = cdk.keydownEvents;\r\n this.outsidePointerEvents = cdk.outsidePointerEvents;\r\n this.overlayRef = cdk.overlayRef;\r\n this.id = cdk.id;\r\n this.state = computed<DialogState>(() =>\r\n this.isClosed() ? 'closed' : surface.closing() ? 'closing' : 'open',\r\n );\r\n this.result = new Promise((resolve) =>\r\n cdk.closed.subscribe((value) => {\r\n this.isClosed.set(true);\r\n resolve(value);\r\n }),\r\n );\r\n }\r\n\r\n /** Açılan component örneği (şablonla açıldıysa ve kapandıktan sonra `null`). */\r\n get componentInstance(): C | null {\r\n return this.cdk.componentInstance;\r\n }\r\n\r\n get componentRef(): ComponentRef<C> | null {\r\n return this.cdk.componentRef;\r\n }\r\n\r\n /** `true` iken ESC/backdrop kapatmaz; programatik `close()` yine çalışır. */\r\n get disableClose(): boolean | undefined {\r\n return this.cdk.disableClose;\r\n }\r\n set disableClose(value: boolean | undefined) {\r\n this.cdk.disableClose = value;\r\n }\r\n\r\n /** Dialog'u (çıkış animasyonu + kirli-form koruması üzerinden) kapatır. İdempotent. */\r\n close(result?: R): void {\r\n if (this.isClosed()) return;\r\n this.cdk.close(result);\r\n }\r\n\r\n /** Kapanış tamamlandığında (animasyon dahil) sonuçla çözülür; ESC/backdrop'ta `undefined`. */\r\n afterClosed(): Promise<R | undefined> {\r\n return this.result;\r\n }\r\n\r\n /** Açıkken genişlik basamağını değiştirir (`sm`…`xl`, `full`). */\r\n setSize(size: DialogSize): void {\r\n this.surface.size.set(size);\r\n }\r\n\r\n toggleMaximize(): void {\r\n this.surface.toggleMaximize();\r\n }\r\n\r\n /** Kirli-form sorusunu kaydeder — ESC/backdrop/X kapanışında `true` dönerse onay sorulur. */\r\n registerDirty(check: () => boolean): void {\r\n this.surface.registerDirty(check);\r\n }\r\n\r\n /** Başarılı kayıttan hemen önce — sonraki `close()` kirli-form onayı sormaz. */\r\n markClean(): void {\r\n this.surface.markClean();\r\n }\r\n}\r\n\r\n/**\r\n * `DIALOG_DATA`'nın kite ait adı — AYNI token nesnesi, CDK'dan ayrıca import\r\n * etmeye gerek kalmasın diye. `inject(MF_DIALOG_DATA)` ≡ `injectDialogData()`.\r\n */\r\nexport const MF_DIALOG_DATA = DIALOG_DATA;\r\n\r\n/** İçerik component'inde `DialogService.open(..., { data })` ile geçilen veriyi okur. */\r\nexport function injectDialogData<D>(): D {\r\n return inject<D>(DIALOG_DATA);\r\n}\r\n\r\n/** İçerik component'inde kendi dialog referansını alır — `ref.close(sonuç)`. */\r\nexport function injectDialogRef<R = unknown, C = unknown>(): MfDialogRef<R, C> {\r\n return inject<MfDialogRef<R, C>>(MfDialogRef);\r\n}\r\n","import { signal } from '@angular/core';\r\nimport type { DialogPlacement, DialogSize, DrawerSide } from './dialog.model';\r\n\r\nexport interface DialogCustomSize {\r\n width: number;\r\n height: number;\r\n}\r\n\r\n/**\r\n * Dialog başına TEK instance — `DialogService.open()` her açılışta yeni bir\r\n * tane üretip `options`'tan doldurur, CDK `DialogConfig.providers` ile o\r\n * dialog'un (içerik component'inin) injector'ına verir. `Dialog` (dialog.ts)\r\n * kendi `@Component.providers`'ında `skipSelf` ile bunu arar — bulamazsa\r\n * (ör. overlay olmadan tek başına render edilen statik bir önizleme/demo)\r\n * kendi yerel instance'ını üretir, hiçbir şey patlamaz.\r\n *\r\n * Boyut/maximize/drag/resize/sheet durumunun TAMAMI burada yaşıyor — `Dialog`\r\n * kendi `@Input()`'larıyla DEĞİL, bu sınıfı okuyarak render ediyor. Böylece\r\n * `DialogService.open(SomeForm, { size:'lg', maximizable:true })` gibi bir\r\n * çağrı, `SomeForm`'un template'inde 1+ seviye iç içe olan `<mf-dialog>`'a\r\n * DI üzerinden ulaşabiliyor (`@Input()` ile mümkün olmazdı — DialogService\r\n * `Dialog`'u değil, `SomeForm`'u örnekliyor).\r\n */\r\nexport class DialogSurface {\r\n readonly size = signal<DialogSize>('md');\r\n readonly placement = signal<DialogPlacement>('center');\r\n /** Çekmecenin fiziksel kenarı (`center`'da `null`) — `DialogService` yön bilgisiyle çözer. */\r\n readonly side = signal<DrawerSide | null>(null);\r\n readonly maximizable = signal(false);\r\n readonly draggable = signal(false);\r\n readonly resizable = signal(false);\r\n /** `DialogOptions.disableClose` — `true` iken header'daki X çizilmez (bkz. `Dialog.closeVisible`). */\r\n readonly disableClose = signal(false);\r\n readonly maximized = signal(false);\r\n /** Kullanıcı kenardan boyutlandırdıysa dolu; maximize/sheet'te yok sayılır. */\r\n readonly customSize = signal<DialogCustomSize | null>(null);\r\n /** < 640px — `DialogService` `BreakpointObserver` ile besler. */\r\n readonly sheet = signal(false);\r\n /** Kapanış animasyonu oynarken `true` — bkz. `DialogService.open()` `closePredicate`. */\r\n readonly closing = signal(false);\r\n\r\n toggleMaximize(): void {\r\n this.maximized.update((value) => !value);\r\n this.customSize.set(null);\r\n }\r\n\r\n private dirtyCheck: (() => boolean) | null = null;\r\n /** Başarılı kayıt/programatik kapanışta `true` yapılır — bir sonraki kapanışta kirli-form uyarısı SORULMAZ. */\r\n readonly bypassDirtyGuard = signal(false);\r\n\r\n /** İçerik component'i (tüketicinin kendi form component'i) kendi \"kirli mi\" sorusunu buraya kaydeder — `DialogSurface` formun kendi şemasını bilmez. */\r\n registerDirty(check: () => boolean): void {\r\n this.dirtyCheck = check;\r\n }\r\n\r\n /** `DialogService.open()`'ın `closePredicate`'i ESC/backdrop/X kapanışında bunu okur. */\r\n isDirty(): boolean {\r\n return !this.bypassDirtyGuard() && !!this.dirtyCheck?.();\r\n }\r\n\r\n /** Başarılı kayıttan hemen önce çağrılır — programatik `dialogRef.close()` kirli-form uyarısı sormasın diye. */\r\n markClean(): void {\r\n this.bypassDirtyGuard.set(true);\r\n }\r\n}\r\n","import { Directive, ElementRef, computed, inject, input } from '@angular/core';\r\nimport { DialogSurface } from './dialog.surface';\r\n\r\nconst MIN_WIDTH = 320;\r\nconst MIN_HEIGHT = 240;\r\nconst VIEWPORT_MARGIN = 32;\r\nconst ARROW_STEP = 16;\r\nconst ARROW_STEP_LARGE = 64;\r\n\r\n/**\r\n * `<button mfDialogResizeHandle [ariaLabel]=\"...\">` — `Dialog`'un (dialog.ts)\r\n * sağ-alt köşesinde, `DialogSurface.customSize`'ı besleyen serbest boyutlandırma\r\n * tutamacı. Fare/dokunma İLE klavye (ok tuşları) İKİSİ de destekleniyor —\r\n * projects/ui-kit/README.md \"a11y checklist\" bölümü \"sadece fareyle çalışan bir\r\n * tutamaç\"ı kabul etmiyor.\r\n */\r\n@Directive({\r\n selector: '[mfDialogResizeHandle]',\r\n host: {\r\n role: 'slider',\r\n tabindex: '0',\r\n '[attr.aria-label]': 'ariaLabel()',\r\n '[attr.aria-valuenow]': 'ariaValueNow()',\r\n '(pointerdown)': 'onPointerDown($event)',\r\n '(pointermove)': 'onPointerMove($event)',\r\n '(pointerup)': 'onPointerUp($event)',\r\n '(pointercancel)': 'onPointerUp($event)',\r\n '(keydown)': 'onKeydown($event)',\r\n },\r\n})\r\nexport class DialogResizeHandle {\r\n private readonly surface = inject(DialogSurface);\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n readonly ariaLabel = input.required<string>();\r\n\r\n /** `role=\"slider\"` `aria-valuenow` zorunlu kılıyor (axe: `aria-required-attr`) — genişliği raporlar, özel boyut yoksa panelin ölçülen genişliğine, o da yoksa `MIN_WIDTH`'e düşer. */\r\n protected readonly ariaValueNow = computed(\r\n () => this.surface.customSize()?.width ?? this.panelRect()?.width ?? MIN_WIDTH,\r\n );\r\n\r\n private pointerId: number | null = null;\r\n private startX = 0;\r\n private startY = 0;\r\n private startWidth = 0;\r\n private startHeight = 0;\r\n\r\n protected onPointerDown(event: PointerEvent): void {\r\n if (event.button !== 0) return;\r\n const rect = this.panelRect();\r\n if (!rect) return;\r\n\r\n this.pointerId = event.pointerId;\r\n this.startX = event.clientX;\r\n this.startY = event.clientY;\r\n this.startWidth = this.surface.customSize()?.width ?? rect.width;\r\n this.startHeight = this.surface.customSize()?.height ?? rect.height;\r\n this.host.nativeElement.setPointerCapture(event.pointerId);\r\n event.preventDefault();\r\n }\r\n\r\n protected onPointerMove(event: PointerEvent): void {\r\n if (this.pointerId !== event.pointerId) return;\r\n this.applySize(\r\n this.startWidth + (event.clientX - this.startX),\r\n this.startHeight + (event.clientY - this.startY),\r\n );\r\n }\r\n\r\n protected onPointerUp(event: PointerEvent): void {\r\n if (this.pointerId !== event.pointerId) return;\r\n this.pointerId = null;\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent): void {\r\n const rect = this.panelRect();\r\n const current = this.surface.customSize() ?? {\r\n width: rect?.width ?? MIN_WIDTH,\r\n height: rect?.height ?? MIN_HEIGHT,\r\n };\r\n const step = event.shiftKey ? ARROW_STEP_LARGE : ARROW_STEP;\r\n\r\n switch (event.key) {\r\n case 'ArrowRight':\r\n this.applySize(current.width + step, current.height);\r\n break;\r\n case 'ArrowLeft':\r\n this.applySize(current.width - step, current.height);\r\n break;\r\n case 'ArrowDown':\r\n this.applySize(current.width, current.height + step);\r\n break;\r\n case 'ArrowUp':\r\n this.applySize(current.width, current.height - step);\r\n break;\r\n case 'Home':\r\n this.surface.customSize.set(null);\r\n break;\r\n default:\r\n return;\r\n }\r\n event.preventDefault();\r\n }\r\n\r\n private panelRect(): DOMRect | null {\r\n return (\r\n this.host.nativeElement.closest<HTMLElement>('.cdk-overlay-pane')?.getBoundingClientRect() ??\r\n null\r\n );\r\n }\r\n\r\n private applySize(width: number, height: number): void {\r\n const maxWidth = window.innerWidth - VIEWPORT_MARGIN;\r\n const maxHeight = window.innerHeight - VIEWPORT_MARGIN;\r\n this.surface.customSize.set({\r\n width: Math.min(Math.max(width, MIN_WIDTH), maxWidth),\r\n height: Math.min(Math.max(height, MIN_HEIGHT), maxHeight),\r\n });\r\n }\r\n}\r\n","import { cva, type VariantProps } from 'class-variance-authority';\r\nimport { glassSurface } from '@mesgflow/ui-kit/core';\r\n\r\n/**\r\n * Boyut ölçeği CSS `min()` ile viewport'a göre kendini sınırlıyor —\r\n * `max-w-[560px]` gibi ayrı bir \"hiçbir zaman viewport'tan taşma\" class'ıyla\r\n * `cn()`/tailwind-merge üzerinden birleştirilemezdi (ikisi aynı utility\r\n * grubu — `max-width` — sonuncusu kazanır, ikisi birden UYGULANMAZ). Tek\r\n * arbitrary value'da `min(N, 100vw-2rem)` ile ikisi birden garanti ediliyor.\r\n *\r\n * `state` (normal/maximized/sheet/drawer) boyut eksenine dik, tek-seçim bir eksen —\r\n * `Dialog` (dialog.ts) `DialogSurface`'ten okuyup hesaplıyor, tüketici\r\n * tarafından doğrudan set edilmiyor. `drawer` boyut ölçeğini (sm/md/lg/xl)\r\n * `normal` ile PAYLAŞIR ama genişliği AYNI şekilde uygulamaz — aşağıdaki\r\n * `compoundVariants`'a bak.\r\n *\r\n * **`drawer` neden `width` de alıyor, `max-width` yetmiyor mu**: sağa yaslı\r\n * `GlobalPositionStrategy` (`dialog.service.ts`) overlay wrapper'a\r\n * `align-items:flex-start` veriyor — bu, cross-axis stretch'i KAPATIYOR, yani\r\n * `.cdk-overlay-pane` içeriğine göre daralıyor (shrink-to-fit). Böyle bir\r\n * (genişliği belirsiz/auto) kapsayıcı içinde `mf-dialog`'un tabandaki\r\n * `w-full`'u (`width:100%`) CSS Sizing L3'e göre `width:auto`'ya döner —\r\n * yani panel `max-w-[min(N,...)]` TAVANINA hiç ulaşmadan, içeriğin doğal\r\n * genişliğinde kalır. `normal` (ortada yüzen) dialog için bu doğru davranış\r\n * (kısa bir onay kutusu tavana kadar zorla GENİŞLEMEMELİ), ama drawer için\r\n * YANLIŞ — üç CRUD formu içerik uzunluğuna göre üç farklı genişlikte açılırdı\r\n * (gerçek, gözlemlenen bir regresyon). Çözüm: `calc(100vw-2rem)` viewport'a\r\n * göre DEFINITE bir uzunluk — parent'ın genişliği belirsiz olsa bile bu\r\n * paradoksu atlıyor. `width` + `max-width` aynı ifadeyi taşıdığı için\r\n * `max-width` drawer'da fiilen artık gereksiz ama zararsız kalıyor.\r\n *\r\n * **`maximized` neden kendi `max-w-none`'ını taşıyor**: `size` (sm/md/lg/xl)\r\n * her zaman uygulanır, `state` ondan BAĞIMSIZ bir eksendir — `maximized` kendi\r\n * `max-w-none`'ını taşımazsa, `size`'ın `max-w-[min(N,...)]`'i (aynı `max-width`\r\n * grubu, ama `size` `state`'ten ÖNCE değerlendirildiği için `state` sonuncusu\r\n * kazanmadıkça) tek başına kalır ve `w-screen`'i geçersiz kılar — gerçek,\r\n * gözlemlenen bir regresyon: `maximizable:true, size:'lg'` bir dialog\r\n * büyütüldüğünde yükseklik `h-[100dvh]`'e ulaşırken genişlik hâlâ `lg`'nin\r\n * 720px tavanına sıkışıp kalıyordu (\"kenarlar kısa, sadece boyu uzuyor\").\r\n */\r\n/**\r\n * Panel yüzeyi `glassSurface` (bkz. `@mesgflow/ui-kit/core` — mikro\r\n * glassmorphism, 2026-09 Deep Emerald geçişi): arkadaki içerik `backdrop-blur`\r\n * destekleyen tarayıcılarda hafifçe görünür kalır, backdrop\r\n * (`.mf-dialog-backdrop`, motion.css) ayrıca karartıyor. `maximized` durumu\r\n * TAM VIEWPORT'u kapladığı için (arkasında blur'lanacak sayfa içeriği yok,\r\n * sadece backdrop) camı KAPATIP düz `bg-surface`'e döner — hem maliyetsiz hem\r\n * anlamsız bir blur'dan kaçınır.\r\n */\r\nexport const dialogVariants = cva(\r\n `relative flex w-full flex-col overflow-hidden border shadow-3 ${glassSurface}`,\r\n {\r\n variants: {\r\n size: {\r\n sm: 'max-w-[min(440px,calc(100vw-2rem))]',\r\n md: 'max-w-[min(560px,calc(100vw-2rem))]',\r\n lg: 'max-w-[min(720px,calc(100vw-2rem))]',\r\n xl: 'max-w-[min(960px,calc(100vw-2rem))]',\r\n full: 'max-w-none',\r\n },\r\n state: {\r\n normal: 'rounded-xl max-h-[85vh]',\r\n maximized:\r\n 'h-[100dvh] max-h-none w-screen max-w-none rounded-none supports-[backdrop-filter]:bg-surface supports-[backdrop-filter]:backdrop-blur-none',\r\n sheet: 'w-screen rounded-t-xl rounded-b-none max-h-[92dvh]',\r\n drawer: 'max-h-none',\r\n },\r\n /** Çekmecenin fiziksel kenarı — yalnızca `state: 'drawer'` ile anlamlı. */\r\n side: {\r\n none: '',\r\n right: '',\r\n left: '',\r\n top: '',\r\n bottom: '',\r\n },\r\n },\r\n compoundVariants: [\r\n // Yan çekmeceler: tam yükseklik, boyut ölçeği GENİŞLİK olarak.\r\n { state: 'drawer', side: ['left', 'right'], class: 'h-[100dvh]' },\r\n { state: 'drawer', side: 'right', class: 'rounded-l-xl rounded-r-none' },\r\n { state: 'drawer', side: 'left', class: 'rounded-r-xl rounded-l-none' },\r\n {\r\n state: 'drawer',\r\n side: ['left', 'right'],\r\n size: 'sm',\r\n class: 'w-[min(440px,calc(100vw-2rem))]',\r\n },\r\n {\r\n state: 'drawer',\r\n side: ['left', 'right'],\r\n size: 'md',\r\n class: 'w-[min(560px,calc(100vw-2rem))]',\r\n },\r\n {\r\n state: 'drawer',\r\n side: ['left', 'right'],\r\n size: 'lg',\r\n class: 'w-[min(720px,calc(100vw-2rem))]',\r\n },\r\n {\r\n state: 'drawer',\r\n side: ['left', 'right'],\r\n size: 'xl',\r\n class: 'w-[min(960px,calc(100vw-2rem))]',\r\n },\r\n // Üst/alt paneller: tam genişlik, içerik yüksekliğinde (en çok %85).\r\n { state: 'drawer', side: ['top', 'bottom'], class: 'w-screen max-w-none max-h-[85dvh]' },\r\n { state: 'drawer', side: 'top', class: 'rounded-b-xl rounded-t-none' },\r\n { state: 'drawer', side: 'bottom', class: 'rounded-t-xl rounded-b-none' },\r\n ],\r\n defaultVariants: { size: 'md', state: 'normal', side: 'none' },\r\n },\r\n);\r\n\r\nexport type DialogVariants = VariantProps<typeof dialogVariants>;\r\n","import { DialogRef } from '@angular/cdk/dialog';\r\nimport { CdkDrag, CdkDragHandle } from '@angular/cdk/drag-drop';\r\nimport {\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n afterNextRender,\r\n booleanAttribute,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { cn, MF_DIALOG_LABELS, nextId } from '@mesgflow/ui-kit/core';\r\nimport { Button } from '@mesgflow/ui-kit/button';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { MfDialogRef } from './dialog-ref';\r\nimport { DialogResizeHandle } from './dialog-resize-handle';\r\nimport type { DialogSize } from './dialog.model';\r\nimport { DialogSurface } from './dialog.surface';\r\nimport { dialogVariants } from './dialog.variants';\r\n\r\nconst DRAG_MIN_VISIBLE = 48;\r\n\r\n/**\r\n * `<mf-dialog [title]=\"...\" [subtitle]=\"...\" [icon]=\"'group'\" (close)=\"onCancel()\">`\r\n * — `DialogService.open()`'ın açtığı her içerik component'i (tüketicinin kendi\r\n * form component'i, ör. `ConfirmDialog`) kendi kök elemanı olarak bunu kullanır. CDK Dialog'un\r\n * kendisi (bkz. dialog.service.ts) hiçbir görsel çerçeve DAYATMIYOR (backdrop hariç) —\r\n * panel görünümü (yuvarlak köşe/gölge/header/footer/kapatma düğmesi) TAMAMEN burada,\r\n * tek yerde yaşıyor.\r\n *\r\n * Boyut/placement/maximize/drag/resize/sheet durumu kendi `@Input()`'ları DEĞİL,\r\n * `DialogSurface` (DI ile enjekte edilir) — bkz. o dosyanın doc yorumu. `title`/\r\n * `subtitle`/`icon`/`fillBody` ise İÇERİĞE ait olduğu için normal input —\r\n * `[dialog-header]` slot'u tamamen özel bir başlık gerektiren durumlar için (bkz.\r\n * ConfirmDialog) kaçış kapısı olarak kalıyor.\r\n *\r\n * `stateVariant()` sırası (sheet → maximized → drawer → normal) bilinçli: mobil\r\n * sheet her zaman kazanır, ardından drag/resize/mobil-sheet'in yalnızca `normal`'da\r\n * açık olması (bkz. `dragEnabled`/`resizeHandleVisible`) drawer'da bu ikisinin\r\n * otomatik kapalı kalmasını BEDAVA sağlıyor — ayrı bir kontrol gerekmiyor.\r\n */\r\n@Component({\r\n selector: 'mf-dialog',\r\n exportAs: 'mfDialog',\r\n imports: [Button, Icon, DialogResizeHandle, CdkDragHandle],\r\n hostDirectives: [CdkDrag],\r\n providers: [\r\n {\r\n provide: DialogSurface,\r\n useFactory: () =>\r\n inject(DialogSurface, { optional: true, skipSelf: true }) ?? new DialogSurface(),\r\n },\r\n ],\r\n host: {\r\n '[class]': 'hostClasses()',\r\n '[style.width.px]': 'customWidth()',\r\n '[style.height.px]': 'customHeight()',\r\n // Çekmece kenarları FİZİKSEL çözülür (`DialogService` RTL'i zaten hesaba kattı) —\r\n // motion.css'in `--mf-dir` çevirmesi burada çift çevirme yapmasın.\r\n '[style.--mf-dir]': \"stateVariant() === 'drawer' ? 1 : null\",\r\n '(keydown.control.enter)': 'requestSubmit()',\r\n '(keydown.meta.enter)': 'requestSubmit()',\r\n },\r\n templateUrl: './dialog.html',\r\n})\r\nexport class Dialog {\r\n readonly title = input('');\r\n readonly subtitle = input('');\r\n readonly icon = input('');\r\n /** Sadece `DialogSurface` DI ile enjekte edilmediğinde (ör. statik bir önizleme/demo) etkili — gerçek dialog'larda `DialogService.open({ size })` kullanılır. */\r\n readonly size = input<DialogSize | undefined>(undefined);\r\n /**\r\n * `true` ise gövde kendi kaydırmasını KAPATIR (`overflow:hidden`) ve kalan\r\n * yüksekliği içeriğe `flex-1` ile devreder — içeriğin KENDİ tek scroll alanını\r\n * kurması beklenir (ör. uzun bir liste içeren bir form). \"Tek kaydırma bölgesi\"\r\n * kuralının uygulama noktası: dialog gövdesi + içerik aynı anda kaymaz.\r\n */\r\n readonly fillBody = input(false);\r\n /**\r\n * `true` (varsayılan): kapat (X) düğmesi `close` olayını yayınladıktan SONRA\r\n * dialog'u kendisi de kapatır (`MfDialogRef.close()` — idempotent, tüketicinin\r\n * `(close)` handler'ında sonuçla yaptığı kapanış önce davranır ve kazanır).\r\n * `false`: yalnızca `close` yayınlanır — kapanışı tamamen tüketici yönetir.\r\n */\r\n readonly autoClose = input(true, { transform: booleanAttribute });\r\n /**\r\n * Kapat (X) düğmesinin erişilebilir adı — verilmezse `MfLabels.dialog.close`\r\n * (\"Close dialog\" / \"Pencereyi kapat\"). İçerikte aynı adlı bir birincil eylem\r\n * varsa (ör. \"İki adımlı doğrulamayı kapat\" diyaloğunun \"Kapat\"ı) iki düğme\r\n * ekran okuyucuda ayrışsın diye.\r\n */\r\n readonly closeLabel = input<string>();\r\n /**\r\n * X düğmesi çizilsin mi. Verilmezse `DialogOptions.disableClose`'un tersi —\r\n * Escape/backdrop'la kapanmayan bir dialog'da X de yoktur (kullanıcı bir\r\n * eylem seçmek zorunda).\r\n */\r\n readonly showClose = input<boolean | undefined>(undefined);\r\n // `close` adı native DOM `close` olayıyla çakışıyor (@angular-eslint/no-output-native);\r\n // mevcut public API — yeniden adlandırma kırıcı, ileri bir sürümde ele alınacak.\r\n // eslint-disable-next-line @angular-eslint/no-output-native\r\n readonly close = output<void>();\r\n\r\n protected readonly surface = inject(DialogSurface);\r\n protected readonly labels = inject(MF_DIALOG_LABELS);\r\n /** Görünür başlığın id'si — CDK konteynerinin `aria-labelledby`'ı buna bağlanır. */\r\n protected readonly titleId = nextId('mf-dialog-title');\r\n\r\n private readonly mfRef = inject(MfDialogRef, { optional: true });\r\n private readonly cdkRef = inject(DialogRef, { optional: true });\r\n\r\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly cdkDrag = inject(CdkDrag, { self: true });\r\n private readonly scrollBody = viewChild<ElementRef<HTMLElement>>('scrollBody');\r\n\r\n protected readonly scrolledFromTop = signal(false);\r\n protected readonly hasMoreBelow = signal(false);\r\n\r\n protected readonly stateVariant = computed<'normal' | 'maximized' | 'sheet' | 'drawer'>(() => {\r\n if (this.surface.sheet()) return 'sheet';\r\n if (this.surface.maximized() || this.size() === 'full') return 'maximized';\r\n if (this.surface.side()) return 'drawer';\r\n return 'normal';\r\n });\r\n\r\n protected readonly dragEnabled = computed(\r\n () => this.surface.draggable() && this.stateVariant() === 'normal',\r\n );\r\n protected readonly resizeHandleVisible = computed(\r\n () => this.surface.resizable() && this.stateVariant() === 'normal',\r\n );\r\n /** Drawer zaten tam yükseklik — büyütme düğmesinin anlamı yok, `surface.maximizable()` `true` olsa bile gizlenir. */\r\n protected readonly closeVisible = computed(\r\n () => this.showClose() ?? !this.surface.disableClose(),\r\n );\r\n protected readonly maximizeVisible = computed(\r\n () => this.surface.maximizable() && this.stateVariant() !== 'drawer',\r\n );\r\n\r\n protected readonly hostClasses = computed(() => {\r\n const closing = this.surface.closing();\r\n const state = this.stateVariant();\r\n const side = state === 'drawer' ? (this.surface.side() ?? 'right') : null;\r\n // Kenar başına FİZİKSEL kayma (host `--mf-dir: 1` sabitler — bkz. host bağlaması).\r\n const animateBase =\r\n state === 'sheet' || side === 'bottom'\r\n ? 'sheet'\r\n : side === 'right'\r\n ? 'drawer'\r\n : side === 'left'\r\n ? 'drawer-start'\r\n : side === 'top'\r\n ? 'drawer-top'\r\n : 'dialog';\r\n return cn(\r\n dialogVariants({ size: this.size() ?? this.surface.size(), state, side: side ?? 'none' }),\r\n state === 'normal' && this.surface.customSize() ? 'max-w-none max-h-none' : '',\r\n `animate-${animateBase}-${closing ? 'out' : 'in'}`,\r\n );\r\n });\r\n\r\n protected readonly customWidth = computed(() =>\r\n this.stateVariant() === 'normal' ? this.surface.customSize()?.width : undefined,\r\n );\r\n protected readonly customHeight = computed(() =>\r\n this.stateVariant() === 'normal' ? this.surface.customSize()?.height : undefined,\r\n );\r\n\r\n /** Kenara/tam ekrana yaslı yüzeyler (drawer, mobil sheet, maximized): bölgeler KALICI\r\n * çizgiyle ayrılır — header/content/footer iskeleti her zaman aynı görünür. Ortada\r\n * yüzen klasik dialog (`normal`, ör. ConfirmDialog) bugünkü kaydırma-gölgesi davranışını\r\n * korur — kısa bir onay kutusu gereksiz çizgi kazanmaz. */\r\n protected readonly framed = computed(() => this.stateVariant() !== 'normal');\r\n\r\n protected readonly headerBorder = computed(() => this.framed() || this.scrolledFromTop());\r\n protected readonly footerBorder = computed(() => this.framed() || this.hasMoreBelow());\r\n\r\n constructor() {\r\n this.cdkDrag.rootElementSelector = '.cdk-overlay-pane';\r\n this.cdkDrag.constrainPosition = (point, _dragRef, dimensions) => ({\r\n x: Math.min(\r\n Math.max(point.x, DRAG_MIN_VISIBLE - dimensions.width),\r\n window.innerWidth - DRAG_MIN_VISIBLE,\r\n ),\r\n y: Math.min(Math.max(point.y, 0), window.innerHeight - DRAG_MIN_VISIBLE),\r\n });\r\n\r\n effect(() => {\r\n this.cdkDrag.disabled = !this.dragEnabled();\r\n });\r\n\r\n effect(() => {\r\n if (this.surface.maximized() || this.surface.sheet()) {\r\n this.cdkDrag.reset();\r\n this.surface.customSize.set(null);\r\n }\r\n });\r\n\r\n // Erişilebilir ad: `ariaLabel` verilmemiş bir dialog'da CDK konteyneri görünür\r\n // başlığa `aria-labelledby` ile bağlanır (MatDialogTitle'ın kullandığı AYNI kanca).\r\n // Başlık sonradan boşalırsa/değişirse effect cleanup'ı kaydı geri alır.\r\n effect((onCleanup) => {\r\n // `DialogRef.containerInstance` tipi bu (CdkDialogContainer'a ait) metotları taşımıyor.\r\n const container = this.cdkRef?.containerInstance as unknown as\r\n | { _addAriaLabelledBy?(id: string): void; _removeAriaLabelledBy?(id: string): void }\r\n | null\r\n | undefined;\r\n if (!this.title() || !container?._addAriaLabelledBy) return;\r\n container._addAriaLabelledBy(this.titleId);\r\n onCleanup(() => container._removeAriaLabelledBy?.(this.titleId));\r\n });\r\n\r\n const destroyRef = inject(DestroyRef);\r\n afterNextRender(() => {\r\n this.updateScrollShadow();\r\n const el = this.scrollBody()?.nativeElement;\r\n if (!el || typeof ResizeObserver === 'undefined') return;\r\n const observer = new ResizeObserver(() => this.updateScrollShadow());\r\n observer.observe(el);\r\n destroyRef.onDestroy(() => observer.disconnect());\r\n });\r\n }\r\n\r\n /** Kapat (X): önce `close` olayı (tüketici sonuçla kapatabilsin), sonra — `autoClose` ise — ref'in kendisi. */\r\n protected onDismiss(): void {\r\n this.close.emit();\r\n if (this.autoClose()) (this.mfRef ?? this.cdkRef)?.close();\r\n }\r\n\r\n protected updateScrollShadow(): void {\r\n const el = this.scrollBody()?.nativeElement;\r\n if (!el) return;\r\n this.scrolledFromTop.set(el.scrollTop > 1);\r\n this.hasMoreBelow.set(el.scrollHeight - el.clientHeight - el.scrollTop > 1);\r\n }\r\n\r\n /**\r\n * Ctrl/Cmd+Enter — tek yerde çözülür, her form bedava kazanır. Kaydet düğmesi\r\n * footer slot'unda `<form>`'un DIŞINDA yaşıyor (`form=\"role-form\"` attribute\r\n * ilişkilendirmesiyle çalışıyor) — bu yüzden düğmeye tıklamayı taklit etmek\r\n * yerine doğrudan `<form>` üzerinde `requestSubmit()` çağrılıyor; bu da native\r\n * kısıt doğrulamasını çalıştırıp mevcut `(submit)` bağlamasını tetikler.\r\n */\r\n protected requestSubmit(): void {\r\n this.elementRef.nativeElement.querySelector('form')?.requestSubmit();\r\n }\r\n}\r\n","<div\r\n class=\"flex shrink-0 items-start justify-between gap-3 px-6 pt-5 pb-4\"\r\n [class.border-b]=\"headerBorder()\"\r\n [class.border-border]=\"headerBorder()\"\r\n>\r\n <ng-content select=\"[dialog-header]\">\r\n @if (icon()) {\r\n <span\r\n class=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-md bg-surface-alt text-fg-muted\"\r\n >\r\n <span mfIcon [size]=\"20\">{{ icon() }}</span>\r\n </span>\r\n }\r\n <div\r\n cdkDragHandle\r\n class=\"min-w-0 flex-1 pt-0.5\"\r\n [class.cursor-grab]=\"dragEnabled()\"\r\n [class.active:cursor-grabbing]=\"dragEnabled()\"\r\n >\r\n @if (title()) {\r\n <h2 [id]=\"titleId\" class=\"truncate font-display text-title text-fg\">{{ title() }}</h2>\r\n }\r\n @if (subtitle()) {\r\n <p class=\"mt-0.5 truncate text-sm text-fg-muted\">{{ subtitle() }}</p>\r\n }\r\n </div>\r\n </ng-content>\r\n\r\n <div class=\"flex shrink-0 items-center gap-1\">\r\n @if (maximizeVisible()) {\r\n <button\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"neutral\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"surface.maximized() ? labels().fullscreenExit : labels().fullscreenEnter\"\r\n (click)=\"surface.toggleMaximize()\"\r\n >\r\n <span mfIcon [size]=\"18\">{{ surface.maximized() ? 'fullscreen_exit' : 'fullscreen' }}</span>\r\n </button>\r\n }\r\n @if (closeVisible()) {\r\n <button\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"neutral\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"closeLabel() || labels().close\"\r\n (click)=\"onDismiss()\"\r\n >\r\n <span mfIcon [size]=\"20\">close</span>\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n\r\n<div\r\n #scrollBody\r\n class=\"flex-1 min-h-0 px-6\"\r\n [class.py-4]=\"framed()\"\r\n [class.overflow-y-auto]=\"!fillBody()\"\r\n [class.flex]=\"fillBody()\"\r\n [class.flex-col]=\"fillBody()\"\r\n [class.overflow-hidden]=\"fillBody()\"\r\n (scroll)=\"updateScrollShadow()\"\r\n>\r\n <ng-content />\r\n</div>\r\n\r\n<div\r\n class=\"shrink-0 px-6 py-4 [&:not(:has(*))]:hidden\"\r\n [class.border-t]=\"footerBorder()\"\r\n [class.border-border]=\"footerBorder()\"\r\n>\r\n <ng-content select=\"[dialog-footer]\" />\r\n</div>\r\n\r\n@if (resizeHandleVisible()) {\r\n <button\r\n mfDialogResizeHandle\r\n type=\"button\"\r\n [ariaLabel]=\"labels().resize\"\r\n class=\"absolute right-1 bottom-1 flex h-4 w-4 cursor-se-resize items-center justify-center rounded-xs text-fg-subtle hover:text-fg-muted focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\"\r\n >\r\n <span mfIcon [size]=\"14\">south_east</span>\r\n </button>\r\n}\r\n","import { Component, computed, inject, signal } from '@angular/core';\r\nimport { Button } from '@mesgflow/ui-kit/button';\r\nimport type { ButtonTone } from '@mesgflow/ui-kit/button';\r\nimport { MF_DIALOG_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Dialog } from './dialog';\r\nimport { injectDialogData, injectDialogRef } from './dialog-ref';\r\nimport type { ConfirmDialogData, ConfirmTone } from './dialog.model';\r\n\r\nconst TONE_ICON: Record<ConfirmTone, string> = {\r\n danger: 'warning',\r\n warning: 'warning',\r\n info: 'info',\r\n success: 'check_circle',\r\n neutral: 'help',\r\n};\r\n\r\n/** Rozet renkleri Badge'in `badge.variants.ts`'teki tonal işaret rol token'ını (`bg-X-tint text-X-tint-fg`) birebir izliyor. */\r\nconst TONE_BADGE_CLASS: Record<ConfirmTone, string> = {\r\n danger: 'bg-danger-tint text-danger-tint-fg',\r\n warning: 'bg-warning-tint text-warning-tint-fg',\r\n info: 'bg-info-tint text-info-tint-fg',\r\n success: 'bg-success-tint text-success-tint-fg',\r\n neutral: 'bg-surface-alt text-fg-muted',\r\n};\r\n\r\n/**\r\n * Onay diyaloğunun içerik component'i — `DialogService.confirm()`/`confirmDelete()`/\r\n * `alert()` (bkz. dialog.service.ts) bunu açıp `DialogRef<boolean>`'ı `Promise`'e\r\n * çeviriyor. `Dialog`'un (dialog.ts) `[dialog-header]` kaçış kapısını kullanıyor —\r\n * ton'a göre renkli ikon rozeti, generic `Dialog`'un kendi `[icon]` input'unun\r\n * desteklemediği bir şey (o sadece nötr bir rozet çizer), bu yüzden kendi başlığını\r\n * kendi çiziyor.\r\n */\r\n@Component({\r\n selector: 'mf-confirm-dialog',\r\n imports: [Dialog, Button, Icon],\r\n host: { class: 'contents' },\r\n templateUrl: './confirm-dialog.html',\r\n})\r\nexport class ConfirmDialog {\r\n protected readonly data = injectDialogData<ConfirmDialogData>();\r\n private readonly dialogRef = injectDialogRef<boolean, ConfirmDialog>();\r\n protected readonly labels = inject(MF_DIALOG_LABELS);\r\n\r\n protected readonly tone = computed<ConfirmTone>(() => this.data.tone ?? 'neutral');\r\n protected readonly toneIcon = computed(() => TONE_ICON[this.tone()]);\r\n protected readonly toneBadgeClass = computed(() => TONE_BADGE_CLASS[this.tone()]);\r\n\r\n /** Her ton `filled` — warning da diğer tonlarla aynı `bg-X-fill` rol deseninde dolu blok kullanıyor (bkz. button.variants.ts), eski `outlined` istisnası kaldırıldı. */\r\n protected readonly confirmTone = computed<ButtonTone>(() => {\r\n const tone = this.tone();\r\n if (tone === 'danger') return 'danger';\r\n if (tone === 'warning') return 'warning';\r\n return 'primary';\r\n });\r\n\r\n protected readonly submitting = signal(false);\r\n protected readonly actionError = signal<string | null>(null);\r\n\r\n protected onCancel(): void {\r\n this.dialogRef.close(false);\r\n }\r\n\r\n protected async onConfirm(): Promise<void> {\r\n if (!this.data.action) {\r\n this.dialogRef.close(true);\r\n return;\r\n }\r\n\r\n this.submitting.set(true);\r\n this.actionError.set(null);\r\n this.dialogRef.disableClose = true;\r\n try {\r\n await this.data.action();\r\n this.dialogRef.close(true);\r\n } catch {\r\n this.actionError.set(this.labels().errorGeneric);\r\n } finally {\r\n this.submitting.set(false);\r\n this.dialogRef.disableClose = false;\r\n }\r\n }\r\n}\r\n","<mf-dialog size=\"sm\" (close)=\"onCancel()\">\r\n <div dialog-header class=\"flex items-start gap-3\">\r\n <span\r\n class=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-md\"\r\n [class]=\"toneBadgeClass()\"\r\n >\r\n <span mfIcon [size]=\"22\">{{ toneIcon() }}</span>\r\n </span>\r\n <div class=\"min-w-0 flex-1 pt-1.5\">\r\n <h2 class=\"truncate font-display text-title text-fg\">{{ data.title }}</h2>\r\n </div>\r\n </div>\r\n\r\n <p class=\"text-sm text-fg-muted\">{{ data.content }}</p>\r\n\r\n @if (actionError()) {\r\n <p class=\"mt-3 text-sm text-danger\">{{ actionError() }}</p>\r\n }\r\n\r\n <div dialog-footer class=\"flex justify-end gap-2\">\r\n @if (!data.alert) {\r\n <button\r\n mfButton\r\n appearance=\"outlined\"\r\n tone=\"neutral\"\r\n type=\"button\"\r\n [disabled]=\"submitting()\"\r\n (click)=\"onCancel()\"\r\n >\r\n {{ data.cancelLabel ?? labels().confirmCancel }}\r\n </button>\r\n }\r\n <button\r\n mfButton\r\n [tone]=\"confirmTone()\"\r\n appearance=\"filled\"\r\n type=\"button\"\r\n [disabled]=\"submitting()\"\r\n [loading]=\"submitting()\"\r\n (click)=\"onConfirm()\"\r\n >\r\n {{ data.confirmLabel ?? (data.alert ? labels().confirmOk : labels().confirmConfirm) }}\r\n </button>\r\n </div>\r\n</mf-dialog>\r\n","import { Dialog as CdkDialog, type DialogRef } from '@angular/cdk/dialog';\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { BreakpointObserver } from '@angular/cdk/layout';\r\nimport { createGlobalPositionStrategy } from '@angular/cdk/overlay';\r\nimport type { ComponentType } from '@angular/cdk/portal';\r\nimport { Injectable, Injector, inject, type TemplateRef } from '@angular/core';\r\nimport { MF_DIALOG_LABELS, exitDurationMs } from '@mesgflow/ui-kit/core';\r\nimport { ConfirmDialog } from './confirm-dialog';\r\nimport { MfDialogRef } from './dialog-ref';\r\nimport type { ConfirmDialogData, DialogOptions, DialogPlacement, DrawerSide } from './dialog.model';\r\nimport { DialogSurface } from './dialog.surface';\r\n\r\nconst SHEET_QUERY = '(max-width: 639.98px)';\r\n\r\n/** Mantıksal yerleşimi fiziksel kenara çevirir (`start`/`end` RTL'de yer değiştirir). */\r\nfunction sideOf(placement: DialogPlacement, rtl: boolean): DrawerSide | null {\r\n switch (placement) {\r\n case 'center':\r\n return null;\r\n case 'start':\r\n return rtl ? 'right' : 'left';\r\n case 'end':\r\n return rtl ? 'left' : 'right';\r\n default:\r\n return placement;\r\n }\r\n}\r\n\r\nfunction normalizeClass(value: string | string[] | undefined): string[] {\r\n if (!value) return [];\r\n return Array.isArray(value) ? value : [value];\r\n}\r\n\r\n/**\r\n * Dialog açmanın tek, merkezi noktası — `@angular/cdk/dialog`'un `Dialog`\r\n * servisi ÜZERİNE ince bir katman (focus-trap/ESC/backdrop-click/geri-scroll-\r\n * engelleme davranışının TAMAMI CDK'dan geliyor, burada TEKRAR YAZILMADI — bkz.\r\n * projects/ui-kit/README.md \"a11y checklist\" bölümündeki \"elle yazmak son çare\" ilkesi).\r\n *\r\n * `open()` kite ait `MfDialogRef` döndürür (CDK `DialogRef` yüzeyini delege eder +\r\n * `afterClosed()`/`state`/`surface`). İçerik component'i `injectDialogRef()`/\r\n * `injectDialogData()` (bkz. dialog-ref.ts) kullanır — CDK'nın kendi `DialogRef`/\r\n * `DIALOG_DATA` token'larını inject etmek de çalışmaya devam eder. Boyut/placement/maximize/drag/resize/sheet durumu\r\n * `DialogSurface` (bkz. o dosya) üzerinden, `providers` ile o dialog'un injector'ına\r\n * verilir — `Dialog` (dialog.ts) bunu DI'dan okuyarak render eder.\r\n *\r\n * **Tek kural**: kayıt oluştur/düzenle → `openDrawer()` (sağdan, `placement:'right'`);\r\n * onayla/bilgilendir/sil → `confirm()`/`confirmDelete()`/`alert()` (merkezi, `size:'sm'`).\r\n * Drawer ayrı bir primitif DEĞİL — `placement` sadece konum stratejisini ve\r\n * `Dialog.stateVariant()`'ı değiştiren bir eksen, geri kalan her şey (CDK Dialog,\r\n * closePredicate, kirli-form koruması, mobil sheet, kaydırma gölgesi) ortak.\r\n *\r\n * Kapanış animasyonu: CDK'nın `DialogRef.close()`'u `overlayRef.dispose()`'u SENKRON\r\n * çağırıyor, bir \"kapanıyor\" olayı/kancası yok. `closePredicate` bunun için bilinçli\r\n * bir kaçamak — `false` döndürmek kapanmayı iptal ediyor: ilk çağrıda `surface.closing`'i\r\n * `true` yapıp gerçek kapanmayı `exitDurationMs()` kadar geciktiriyoruz (panel bu sürede `Dialog`'un\r\n * kendi reaktif `animate-dialog-out`/`animate-sheet-out`/`animate-drawer-out` class'ıyla\r\n * görsel olarak kapanır), ikinci çağrıda (zaten `closing()===true`) gerçek `dispose()`'a\r\n * izin veriyoruz. ESC/backdrop/programatik `dialogRef.close(...)` HEPSİ bu predicate'ten\r\n * geçtiği için davranış tekdüze. Animasyon sürerken gelen EK `close()` çağrıları\r\n * yok sayılır (`disposeArmed` yalnızca zamanlayıcı tarafından kurulur) — X düğmesi +\r\n * tüketicinin `(close)` handler'ı aynı anda kapatsa bile animasyon kesilmez. `prefers-reduced-motion` gecikmeyi tamamen atlıyor —\r\n * AMA kirli-form kontrolünden SONRA: koruma reduced-motion kullanıcılarında da çalışmalı.\r\n *\r\n * **Kirli form koruması**: `surface.isDirty()` `true` dönerse kapanış iptal edilip\r\n * `confirmDiscard()` (kendi içindeki `ConfirmDialog`, ayrı/temiz bir `DialogSurface`\r\n * ile) açılır; kullanıcı onaylarsa `surface.markClean()` + gerçek `close()`. İçerik\r\n * component'i `constructor()`'da `surface.registerDirty(() => ...)` ile kendi\r\n * \"değişti mi\" sorusunu kaydeder.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class DialogService {\r\n private readonly cdkDialog = inject(CdkDialog);\r\n private readonly injector = inject(Injector);\r\n private readonly breakpointObserver = inject(BreakpointObserver);\r\n private readonly labels = inject(MF_DIALOG_LABELS);\r\n private readonly dir = inject(Directionality, { optional: true });\r\n\r\n /** `ref` başına `DialogSurface` — tüketicinin kendi URL senkronizasyon mantığı, kirli-form durumunu PROAKTİF sormak için kullanabilir (kendi `closePredicate`'inin async akışıyla yarışmamak için). */\r\n // `DialogRef<D, C>`'nin `config.providers` callback'i kendi generic'lerine yapısal\r\n // olarak döngüsel referans veriyor (bkz. @angular/cdk/dialog) — `unknown` kullanmak\r\n // `ref`'i somut `DialogRef<R, C>` tipiyle çağıran DIŞARIDAKİ tüketicileri (public API)\r\n // derleme zamanında kırar. Registry nesne KİMLİĞİNE göre çalışıyor, tür parametreleri\r\n // ilgisiz; `any` burada BİLEREK.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private readonly surfaces = new WeakMap<DialogRef<any, any>, DialogSurface>();\r\n\r\n /**\r\n * Bir component'i ya da bir `TemplateRef'i açar (şablon yolu `<mf-drawer>` gibi\r\n * bildirimsel sarmalayıcılar içindir — şablonun injector'ı da `DialogSurface'i görür).\r\n */\r\n open<R = void, D = undefined, C = unknown>(\r\n component: ComponentType<C> | TemplateRef<C>,\r\n options?: DialogOptions<D>,\r\n ): MfDialogRef<R, C> {\r\n const surface = new DialogSurface();\r\n const placement = options?.placement ?? 'center';\r\n surface.size.set(options?.size ?? 'md');\r\n surface.placement.set(placement);\r\n const side = sideOf(placement, this.dir?.value === 'rtl');\r\n surface.side.set(side);\r\n const sheetOnMobile = (options?.sheetOnMobile ?? true) && side !== 'top' && side !== 'bottom';\r\n surface.maximizable.set(options?.maximizable ?? false);\r\n surface.draggable.set(options?.draggable ?? false);\r\n surface.resizable.set(options?.resizable ?? false);\r\n surface.disableClose.set(options?.disableClose ?? false);\r\n\r\n const position = createGlobalPositionStrategy(this.injector);\r\n const place = () => {\r\n if (side === 'right') position.right('0').top('0');\r\n else if (side === 'left') position.left('0').top('0');\r\n else if (side === 'top') position.top('0').left('0');\r\n else if (side === 'bottom') position.bottom('0').left('0');\r\n else position.centerHorizontally().centerVertically();\r\n };\r\n place();\r\n // Çıkış süresi CSS token'ından (`--mf-duration-exit`); reduced-motion'da 0.\r\n const exitMs = exitDurationMs();\r\n // Gerçek dispose'a SADECE çıkış zamanlayıcısı izin verir — bkz. sınıf yorumu.\r\n let disposeArmed = false;\r\n // Kirli-form onayı açıkken ikinci bir onay yığılmasın.\r\n let discardPending = false;\r\n let mfRef: MfDialogRef<R, C> | undefined;\r\n\r\n // CDK iki aşırı yükü (component / şablon) çalışma zamanında ayırt eder.\r\n const ref = this.cdkDialog.open<R, D, C>(component as ComponentType<C>, {\r\n data: options?.data,\r\n panelClass: normalizeClass(options?.panelClass),\r\n backdropClass: 'mf-dialog-backdrop',\r\n positionStrategy: position,\r\n autoFocus: 'first-tabbable',\r\n restoreFocus: true,\r\n disableClose: options?.disableClose ?? false,\r\n // CDK'nın kendi tarayıcı geri/ileri tuşu dinleyicisi (varsayılan `true`) —\r\n // tüketici derin-bağlantı/URL senkronizasyonunu KENDİ route effect'i\r\n // üzerinden yönetiyorsa (kirli-form kontrolü + confirmDiscard + URL\r\n // senkronu dahil), CDK'nın PARALEL ve koordinasyonsuz kendi `close()`\r\n // çağrısı (kendi closePredicate'inden geçerek KENDİ confirmDiscard'ını\r\n // açar) tüketicininkiyle AYNI ANDA iki ayrı \"Kaydedilmemiş değişiklikler\"\r\n // onayı açılmasına yol açabilir — gerçek bir kullanıcı senaryosunda\r\n // tekrarlanan, doğrulanmış bir çakışma.\r\n closeOnNavigation: false,\r\n // `aria-modal` — arka plan zaten `aria-hidden`, ama ekran okuyucuların sanal imleci\r\n // için modal olduğunu açıkça söylemek WAI-ARIA dialog deseninin gereği.\r\n ariaModal: true,\r\n // Verilmezse CDK konteyneri `<mf-dialog>`'un görünür başlığına `aria-labelledby` ile\r\n // bağlanır (bkz. dialog.ts — `_addAriaLabelledBy`).\r\n ariaLabel: options?.ariaLabel,\r\n providers: (cdkRef) => {\r\n mfRef = new MfDialogRef<R, C>(cdkRef as DialogRef<R, C>, surface);\r\n return [\r\n { provide: DialogSurface, useValue: surface },\r\n { provide: MfDialogRef, useValue: mfRef },\r\n ];\r\n },\r\n closePredicate: (result) => {\r\n // Çıkış animasyonu bitti — zamanlayıcının kendi çağrısı, gerçek dispose'a izin ver.\r\n if (disposeArmed) return true;\r\n // Animasyon ya da kirli-form onayı sürerken gelen ek çağrılar yok sayılır.\r\n if (surface.closing() || discardPending) return false;\r\n\r\n // Kirli form koruması reduced-motion kısa devresinden ÖNCE kontrol edilir — aksi halde\r\n // \"animasyonu azalt\" açık kullanıcılarda bu koruma hiç çalışmazdı.\r\n if (surface.isDirty()) {\r\n discardPending = true;\r\n void this.confirmDiscard().then((discard) => {\r\n discardPending = false;\r\n if (!discard) return;\r\n surface.markClean();\r\n ref.close(result as R | undefined);\r\n });\r\n return false;\r\n }\r\n\r\n if (exitMs === 0) return true;\r\n surface.closing.set(true);\r\n ref.overlayRef.backdropElement?.classList.add('is-closing');\r\n setTimeout(() => {\r\n disposeArmed = true;\r\n ref.close(result as R | undefined);\r\n }, exitMs);\r\n return false;\r\n },\r\n });\r\n\r\n this.surfaces.set(ref, surface);\r\n\r\n const breakpointSub = this.breakpointObserver.observe(SHEET_QUERY).subscribe(({ matches }) => {\r\n const sheet = matches && sheetOnMobile;\r\n surface.sheet.set(sheet);\r\n if (sheet) position.centerHorizontally().bottom('0');\r\n else place();\r\n position.apply();\r\n });\r\n ref.closed.subscribe(() => breakpointSub.unsubscribe());\r\n\r\n // `providers` fabrikası CDK `open()` içinde SENKRON çağrılır — burada her zaman dolu.\r\n return mfRef ?? new MfDialogRef<R, C>(ref, surface);\r\n }\r\n\r\n /**\r\n * Kayıt oluştur/düzenle formlarının TEK açılış noktası — sağdan drawer.\r\n * `maximizable` bilerek zorla kapatılıyor: drawer zaten tam yükseklik, büyütme\r\n * düğmesinin anlamı yok (bkz. `Dialog.maximizeVisible`).\r\n *\r\n * Varsayılan genişlik `md` (560px) — CRUD formları `size` GEÇMEZ, hepsi aynı\r\n * genişlikte açılmalı. İstisna: iki sütunlu bir form (sol dikey ray + sağ\r\n * panel gibi) `md` içine sığmazsa `xl` (960px) geçilebilir.\r\n */\r\n openDrawer<R = void, D = undefined, C = unknown>(\r\n component: ComponentType<C>,\r\n options?: Omit<DialogOptions<D>, 'placement'> & {\r\n placement?: Exclude<DialogPlacement, 'center'>;\r\n },\r\n ): MfDialogRef<R, C> {\r\n return this.open<R, D, C>(component, {\r\n ...options,\r\n placement: options?.placement ?? 'right',\r\n maximizable: false,\r\n });\r\n }\r\n\r\n /** `Promise<boolean>` döner — `if (await dialog.confirm(...))` çağıran taraf için `.subscribe()` zincirinden daha sade. */\r\n confirm(data: ConfirmDialogData): Promise<boolean> {\r\n const ref = this.open<boolean, ConfirmDialogData, ConfirmDialog>(ConfirmDialog, {\r\n data,\r\n size: 'sm',\r\n // `data.title` her zaman görünür bir başlık taşıyor — CDK'nın dialog konteynerine\r\n // erişilebilir ad olarak veriliyor (axe: `aria-dialog-name`); çağıran taraf\r\n // `ConfirmDialogData`'da ayrı bir `ariaLabel` alanı sağlayamıyor zaten.\r\n ariaLabel: data.title,\r\n });\r\n return ref.afterClosed().then((result) => !!result);\r\n }\r\n\r\n /**\r\n * Kirli-form kapanış korumasının kendi onay diyaloğu — `confirmDiscard`'ın açtığı\r\n * `ConfirmDialog`'un `DialogSurface`'i her zaman temiz (yeni instance), bu yüzden\r\n * özyineleme sorunsuz. `closePredicate` içinden (ESC/backdrop/X) VE tüketicinin\r\n * kendi route senkronizasyonundan (URL değişip panel PROAKTİF kapatılmadan\r\n * önce) iki ayrı yoldan çağrılabildiği için `public`.\r\n *\r\n * `tone: 'warning'` — onay butonu artık DOLU warning (bkz.\r\n * `button.variants.ts`/`confirm-dialog.ts`, eski `outlined` istisnası\r\n * kaldırıldı).\r\n */\r\n confirmDiscard(): Promise<boolean> {\r\n const t = this.labels().discard;\r\n return this.confirm({\r\n title: t.title,\r\n content: t.content,\r\n tone: 'warning',\r\n confirmLabel: t.confirm,\r\n cancelLabel: t.cancel,\r\n });\r\n }\r\n\r\n /**\r\n * Tüketici bir ref'i kapatmadan ÖNCE kirli mi diye sormak istiyorsa — kendi `closePredicate`'inin\r\n * async akışıyla yarışmamak için `DialogSurface`'e doğrudan erişim. `MfDialogRef` için\r\n * `ref.surface` tercih edilir; ham CDK ref'i (ör. içerikte inject edilen) de kabul edilir.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n getSurface(ref: DialogRef<any, any> | MfDialogRef<any, any>): DialogSurface | undefined {\r\n return ref instanceof MfDialogRef ? ref.surface : this.surfaces.get(ref);\r\n }\r\n\r\n /** `confirm()`'in silme kısayolu — `tone:'danger'` + varsayılan \"Sil\" etiketi. */\r\n confirmDelete(data: Omit<ConfirmDialogData, 'tone'>): Promise<boolean> {\r\n const confirmLabel = data.confirmLabel ?? this.labels().confirmDelete;\r\n return this.confirm({ ...data, tone: 'danger', confirmLabel });\r\n }\r\n\r\n /** Tek butonlu bilgilendirme modu — sonuç önemsiz olduğu için `Promise<void>` döner. */\r\n alert(data: Omit<ConfirmDialogData, 'alert'>): Promise<void> {\r\n const ref = this.open<boolean, ConfirmDialogData, ConfirmDialog>(ConfirmDialog, {\r\n data: { ...data, alert: true },\r\n size: 'sm',\r\n ariaLabel: data.title,\r\n });\r\n return ref.afterClosed().then(() => undefined);\r\n }\r\n}\r\n","// `MF_DIALOG_LABELS`/`MfDialogLabels` artık `@mesgflow/ui-kit/core`'da yaşıyor\r\n// (bkz. `core/i18n/tokens.ts` — MF_LABELS'ın bir seçicisi) — buradan AYRICA\r\n// re-export etmek `ng build ui-kit`'de TS2308 (ambiguous export) veriyor, çünkü\r\n// birincil barrel zaten hem `./core`'u hem `./dialog`'u `export *` ediyor.\r\n// Tüketici `import { MF_DIALOG_LABELS } from '@mesgflow/ui-kit'` (birincil barrel)\r\n// veya `'@mesgflow/ui-kit/core'` kullanır.\r\nexport * from './confirm-dialog';\r\nexport * from './dialog';\r\nexport * from './dialog-ref';\r\nexport * from './dialog-resize-handle';\r\nexport * from './dialog.model';\r\nexport * from './dialog.service';\r\nexport * from './dialog.surface';\r\nexport * from './dialog.variants';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["CdkDialog"],"mappings":"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"}