@mesgflow/ui-kit 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +200 -0
- package/fesm2022/mesgflow-ui-kit-accordion.mjs +75 -0
- package/fesm2022/mesgflow-ui-kit-accordion.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-alert.mjs +165 -0
- package/fesm2022/mesgflow-ui-kit-alert.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-avatar-group.mjs +88 -0
- package/fesm2022/mesgflow-ui-kit-avatar-group.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-avatar.mjs +123 -0
- package/fesm2022/mesgflow-ui-kit-avatar.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-badge.mjs +68 -0
- package/fesm2022/mesgflow-ui-kit-badge.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-banner.mjs +111 -0
- package/fesm2022/mesgflow-ui-kit-banner.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-box-input.mjs +78 -0
- package/fesm2022/mesgflow-ui-kit-box-input.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-brand.mjs +120 -0
- package/fesm2022/mesgflow-ui-kit-brand.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-breadcrumb.mjs +84 -0
- package/fesm2022/mesgflow-ui-kit-breadcrumb.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-button-group.mjs +37 -0
- package/fesm2022/mesgflow-ui-kit-button-group.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-button.mjs +359 -0
- package/fesm2022/mesgflow-ui-kit-button.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-card.mjs +128 -0
- package/fesm2022/mesgflow-ui-kit-card.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-chart.mjs +538 -0
- package/fesm2022/mesgflow-ui-kit-chart.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-checkbox.mjs +45 -0
- package/fesm2022/mesgflow-ui-kit-checkbox.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-chip.mjs +123 -0
- package/fesm2022/mesgflow-ui-kit-chip.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-code-block.mjs +71 -0
- package/fesm2022/mesgflow-ui-kit-code-block.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-collapsible.mjs +89 -0
- package/fesm2022/mesgflow-ui-kit-collapsible.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-color-picker.mjs +210 -0
- package/fesm2022/mesgflow-ui-kit-color-picker.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-combobox.mjs +181 -0
- package/fesm2022/mesgflow-ui-kit-combobox.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-command.mjs +491 -0
- package/fesm2022/mesgflow-ui-kit-command.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-context-menu.mjs +92 -0
- package/fesm2022/mesgflow-ui-kit-context-menu.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-copy-button.mjs +167 -0
- package/fesm2022/mesgflow-ui-kit-copy-button.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-core.mjs +624 -0
- package/fesm2022/mesgflow-ui-kit-core.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-date-picker.mjs +643 -0
- package/fesm2022/mesgflow-ui-kit-date-picker.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-description-list.mjs +76 -0
- package/fesm2022/mesgflow-ui-kit-description-list.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-dialog.mjs +700 -0
- package/fesm2022/mesgflow-ui-kit-dialog.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-divider.mjs +62 -0
- package/fesm2022/mesgflow-ui-kit-divider.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-dropzone.mjs +126 -0
- package/fesm2022/mesgflow-ui-kit-dropzone.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-empty-state.mjs +70 -0
- package/fesm2022/mesgflow-ui-kit-empty-state.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-field.mjs +42 -0
- package/fesm2022/mesgflow-ui-kit-field.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-hover-card.mjs +171 -0
- package/fesm2022/mesgflow-ui-kit-hover-card.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs +258 -0
- package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-icon.mjs +174 -0
- package/fesm2022/mesgflow-ui-kit-icon.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-input.mjs +448 -0
- package/fesm2022/mesgflow-ui-kit-input.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-kbd.mjs +24 -0
- package/fesm2022/mesgflow-ui-kit-kbd.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-link.mjs +48 -0
- package/fesm2022/mesgflow-ui-kit-link.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-menu.mjs +105 -0
- package/fesm2022/mesgflow-ui-kit-menu.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-number-input.mjs +153 -0
- package/fesm2022/mesgflow-ui-kit-number-input.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-otp-input.mjs +164 -0
- package/fesm2022/mesgflow-ui-kit-otp-input.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-page-header.mjs +83 -0
- package/fesm2022/mesgflow-ui-kit-page-header.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-pagination.mjs +99 -0
- package/fesm2022/mesgflow-ui-kit-pagination.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-password-input.mjs +120 -0
- package/fesm2022/mesgflow-ui-kit-password-input.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-popover.mjs +213 -0
- package/fesm2022/mesgflow-ui-kit-popover.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-progress.mjs +82 -0
- package/fesm2022/mesgflow-ui-kit-progress.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-radio.mjs +123 -0
- package/fesm2022/mesgflow-ui-kit-radio.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-rating.mjs +116 -0
- package/fesm2022/mesgflow-ui-kit-rating.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-scroll-area.mjs +84 -0
- package/fesm2022/mesgflow-ui-kit-scroll-area.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-search-input.mjs +154 -0
- package/fesm2022/mesgflow-ui-kit-search-input.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-segmented-control.mjs +95 -0
- package/fesm2022/mesgflow-ui-kit-segmented-control.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-select.mjs +227 -0
- package/fesm2022/mesgflow-ui-kit-select.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-sidebar.mjs +449 -0
- package/fesm2022/mesgflow-ui-kit-sidebar.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-skeleton.mjs +74 -0
- package/fesm2022/mesgflow-ui-kit-skeleton.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-slider.mjs +179 -0
- package/fesm2022/mesgflow-ui-kit-slider.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-spinner.mjs +67 -0
- package/fesm2022/mesgflow-ui-kit-spinner.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-splitter.mjs +97 -0
- package/fesm2022/mesgflow-ui-kit-splitter.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-stat-tile.mjs +98 -0
- package/fesm2022/mesgflow-ui-kit-stat-tile.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-stepper.mjs +133 -0
- package/fesm2022/mesgflow-ui-kit-stepper.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-switch.mjs +73 -0
- package/fesm2022/mesgflow-ui-kit-switch.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-table.mjs +1783 -0
- package/fesm2022/mesgflow-ui-kit-table.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-tabs.mjs +569 -0
- package/fesm2022/mesgflow-ui-kit-tabs.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-tag-input.mjs +138 -0
- package/fesm2022/mesgflow-ui-kit-tag-input.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-theme-switcher.mjs +53 -0
- package/fesm2022/mesgflow-ui-kit-theme-switcher.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-theming.mjs +1016 -0
- package/fesm2022/mesgflow-ui-kit-theming.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-time-picker.mjs +138 -0
- package/fesm2022/mesgflow-ui-kit-time-picker.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-timeline.mjs +91 -0
- package/fesm2022/mesgflow-ui-kit-timeline.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-toast.mjs +202 -0
- package/fesm2022/mesgflow-ui-kit-toast.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-toggle.mjs +243 -0
- package/fesm2022/mesgflow-ui-kit-toggle.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-toolbar.mjs +99 -0
- package/fesm2022/mesgflow-ui-kit-toolbar.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-tooltip.mjs +160 -0
- package/fesm2022/mesgflow-ui-kit-tooltip.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-tour.mjs +272 -0
- package/fesm2022/mesgflow-ui-kit-tour.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-tree-select.mjs +177 -0
- package/fesm2022/mesgflow-ui-kit-tree-select.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-tree.mjs +82 -0
- package/fesm2022/mesgflow-ui-kit-tree.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit.mjs +12851 -0
- package/fesm2022/mesgflow-ui-kit.mjs.map +1 -0
- package/package.json +374 -0
- package/preset.css +20 -0
- package/tokens/color.css +693 -0
- package/tokens/contrast.css +68 -0
- package/tokens/elevation.css +68 -0
- package/tokens/motion.css +277 -0
- package/tokens/radius.css +69 -0
- package/tokens/typography.css +127 -0
- package/tokens.css +41 -0
- package/types/mesgflow-ui-kit-accordion.d.ts +42 -0
- package/types/mesgflow-ui-kit-alert.d.ts +60 -0
- package/types/mesgflow-ui-kit-avatar-group.d.ts +28 -0
- package/types/mesgflow-ui-kit-avatar.d.ts +23 -0
- package/types/mesgflow-ui-kit-badge.d.ts +39 -0
- package/types/mesgflow-ui-kit-banner.d.ts +42 -0
- package/types/mesgflow-ui-kit-box-input.d.ts +45 -0
- package/types/mesgflow-ui-kit-brand.d.ts +48 -0
- package/types/mesgflow-ui-kit-breadcrumb.d.ts +26 -0
- package/types/mesgflow-ui-kit-button-group.d.ts +17 -0
- package/types/mesgflow-ui-kit-button.d.ts +75 -0
- package/types/mesgflow-ui-kit-card.d.ts +71 -0
- package/types/mesgflow-ui-kit-chart.d.ts +242 -0
- package/types/mesgflow-ui-kit-checkbox.d.ts +17 -0
- package/types/mesgflow-ui-kit-chip.d.ts +46 -0
- package/types/mesgflow-ui-kit-code-block.d.ts +56 -0
- package/types/mesgflow-ui-kit-collapsible.d.ts +39 -0
- package/types/mesgflow-ui-kit-color-picker.d.ts +78 -0
- package/types/mesgflow-ui-kit-combobox.d.ts +74 -0
- package/types/mesgflow-ui-kit-command.d.ts +185 -0
- package/types/mesgflow-ui-kit-context-menu.d.ts +40 -0
- package/types/mesgflow-ui-kit-copy-button.d.ts +47 -0
- package/types/mesgflow-ui-kit-core.d.ts +508 -0
- package/types/mesgflow-ui-kit-date-picker.d.ts +215 -0
- package/types/mesgflow-ui-kit-description-list.d.ts +23 -0
- package/types/mesgflow-ui-kit-dialog.d.ts +342 -0
- package/types/mesgflow-ui-kit-divider.d.ts +23 -0
- package/types/mesgflow-ui-kit-dropzone.d.ts +47 -0
- package/types/mesgflow-ui-kit-empty-state.d.ts +18 -0
- package/types/mesgflow-ui-kit-field.d.ts +26 -0
- package/types/mesgflow-ui-kit-hover-card.d.ts +52 -0
- package/types/mesgflow-ui-kit-i18n-tr.d.ts +14 -0
- package/types/mesgflow-ui-kit-icon.d.ts +76 -0
- package/types/mesgflow-ui-kit-input.d.ts +186 -0
- package/types/mesgflow-ui-kit-kbd.d.ts +9 -0
- package/types/mesgflow-ui-kit-link.d.ts +20 -0
- package/types/mesgflow-ui-kit-menu.d.ts +53 -0
- package/types/mesgflow-ui-kit-number-input.d.ts +55 -0
- package/types/mesgflow-ui-kit-otp-input.d.ts +44 -0
- package/types/mesgflow-ui-kit-page-header.d.ts +31 -0
- package/types/mesgflow-ui-kit-pagination.d.ts +50 -0
- package/types/mesgflow-ui-kit-password-input.d.ts +33 -0
- package/types/mesgflow-ui-kit-popover.d.ts +62 -0
- package/types/mesgflow-ui-kit-progress.d.ts +32 -0
- package/types/mesgflow-ui-kit-radio.d.ts +59 -0
- package/types/mesgflow-ui-kit-rating.d.ts +56 -0
- package/types/mesgflow-ui-kit-scroll-area.d.ts +27 -0
- package/types/mesgflow-ui-kit-search-input.d.ts +72 -0
- package/types/mesgflow-ui-kit-segmented-control.d.ts +54 -0
- package/types/mesgflow-ui-kit-select.d.ts +89 -0
- package/types/mesgflow-ui-kit-sidebar.d.ts +224 -0
- package/types/mesgflow-ui-kit-skeleton.d.ts +29 -0
- package/types/mesgflow-ui-kit-slider.d.ts +40 -0
- package/types/mesgflow-ui-kit-spinner.d.ts +31 -0
- package/types/mesgflow-ui-kit-splitter.d.ts +40 -0
- package/types/mesgflow-ui-kit-stat-tile.d.ts +54 -0
- package/types/mesgflow-ui-kit-stepper.d.ts +48 -0
- package/types/mesgflow-ui-kit-switch.d.ts +34 -0
- package/types/mesgflow-ui-kit-table.d.ts +805 -0
- package/types/mesgflow-ui-kit-tabs.d.ts +269 -0
- package/types/mesgflow-ui-kit-tag-input.d.ts +33 -0
- package/types/mesgflow-ui-kit-theme-switcher.d.ts +27 -0
- package/types/mesgflow-ui-kit-theming.d.ts +745 -0
- package/types/mesgflow-ui-kit-time-picker.d.ts +54 -0
- package/types/mesgflow-ui-kit-timeline.d.ts +27 -0
- package/types/mesgflow-ui-kit-toast.d.ts +94 -0
- package/types/mesgflow-ui-kit-toggle.d.ts +110 -0
- package/types/mesgflow-ui-kit-toolbar.d.ts +52 -0
- package/types/mesgflow-ui-kit-tooltip.d.ts +55 -0
- package/types/mesgflow-ui-kit-tour.d.ts +66 -0
- package/types/mesgflow-ui-kit-tree-select.d.ts +65 -0
- package/types/mesgflow-ui-kit-tree.d.ts +44 -0
- package/types/mesgflow-ui-kit.d.ts +5444 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesgflow-ui-kit-dialog.mjs","sources":["../../../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 { signal } from '@angular/core';\r\nimport type { DialogPlacement, DialogSize } 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 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: 'h-[100dvh] max-h-none rounded-l-xl rounded-r-none',\r\n },\r\n },\r\n compoundVariants: [\r\n { state: 'drawer', size: 'sm', class: 'w-[min(440px,calc(100vw-2rem))]' },\r\n { state: 'drawer', size: 'md', class: 'w-[min(560px,calc(100vw-2rem))]' },\r\n { state: 'drawer', size: 'lg', class: 'w-[min(720px,calc(100vw-2rem))]' },\r\n { state: 'drawer', size: 'xl', class: 'w-[min(960px,calc(100vw-2rem))]' },\r\n ],\r\n defaultVariants: { size: 'md', state: 'normal' },\r\n },\r\n);\r\n\r\nexport type DialogVariants = VariantProps<typeof dialogVariants>;\r\n","import { CdkDrag, CdkDragHandle } from '@angular/cdk/drag-drop';\r\nimport {\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n afterNextRender,\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 } from '@mesgflow/ui-kit/core';\r\nimport { Button } from '@mesgflow/ui-kit/button';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\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 '(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 // `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\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.placement() === 'right') 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 animateBase = state === 'sheet' ? 'sheet' : state === 'drawer' ? 'drawer' : 'dialog';\r\n return cn(\r\n dialogVariants({ size: this.size() ?? this.surface.size(), state }),\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 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 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 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)=\"close.emit()\"\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 { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';\r\nimport { 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 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 = inject<ConfirmDialogData>(DIALOG_DATA);\r\n private readonly dialogRef = inject(DialogRef<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 (click)=\"onConfirm()\"\r\n >\r\n @if (submitting()) {\r\n <span mfIcon [size]=\"16\" class=\"animate-spin\">progress_activity</span>\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 { 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 } from '@angular/core';\r\nimport { MF_DIALOG_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { ConfirmDialog } from './confirm-dialog';\r\nimport type { ConfirmDialogData, DialogOptions } from './dialog.model';\r\nimport { DialogSurface } from './dialog.surface';\r\n\r\n/** `--duration-fast` (styles.css) ile birebir — `animate-dialog-out`/`animate-sheet-out` keyframe'lerinin süresi. */\r\nconst EXIT_MS = 120;\r\nconst SHEET_QUERY = '(max-width: 639.98px)';\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 * İçerik component'i (tüketicinin kendi form component'i, ör. `ConfirmDialog`) `@angular/cdk/dialog`'un\r\n * KENDİ `DIALOG_DATA`/`DialogRef` token'larını doğrudan `inject()` eder — ekstra bir\r\n * sarmalayıcı token'a gerek yok. 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ı `EXIT_MS` 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. `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\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 open<R = void, D = undefined, C = unknown>(\r\n component: ComponentType<C>,\r\n options?: DialogOptions<D>,\r\n ): DialogRef<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 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 if (placement === 'right') position.right('0').top('0');\r\n else position.centerHorizontally().centerVertically();\r\n const reducedMotion =\r\n typeof matchMedia !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n\r\n const ref = this.cdkDialog.open<R, D, C>(component, {\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 ariaLabel: options?.ariaLabel,\r\n providers: [{ provide: DialogSurface, useValue: surface }],\r\n closePredicate: (result) => {\r\n // Çıkış animasyonu turu — ikinci çağrı, gerçek dispose'a izin ver.\r\n if (surface.closing()) return true;\r\n\r\n // Kirli form koruması `reducedMotion`'DAN Ö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 void this.confirmDiscard().then((discard) => {\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 (reducedMotion) return true;\r\n surface.closing.set(true);\r\n ref.overlayRef.backdropElement?.classList.add('is-closing');\r\n setTimeout(() => ref.close(result as R | undefined), EXIT_MS);\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 surface.sheet.set(matches);\r\n if (matches) {\r\n position.centerHorizontally().bottom('0');\r\n } else if (placement === 'right') {\r\n position.right('0').top('0');\r\n } else {\r\n position.centerHorizontally().centerVertically();\r\n }\r\n position.apply();\r\n });\r\n ref.closed.subscribe(() => breakpointSub.unsubscribe());\r\n\r\n return ref;\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 ): DialogRef<R, C> {\r\n return this.open<R, D, C>(component, { ...options, placement: 'right', maximizable: false });\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 new Promise((resolve) => ref.closed.subscribe((result) => resolve(!!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 /** Tüketici bir ref'i kapatmadan ÖNCE kirli mi diye sormak istiyorsa — kendi `closePredicate`'inin async akışıyla yarışmamak için `DialogSurface`'e doğrudan erişim. */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n getSurface(ref: DialogRef<any, any>): DialogSurface | undefined {\r\n return 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 new Promise((resolve) => ref.closed.subscribe(() => resolve()));\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-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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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, computed, Component } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* `<mf-divider />` (düz çizgi) veya `<mf-divider label="veya" />` (ortasında
|
|
6
|
+
* metin, ör. iki giriş yöntemini ayırmak için). `vertical` yönlendirmede
|
|
7
|
+
* `label` YOKSAYILIR — dikey bir çizginin ortasına metin sığdırmak pratik
|
|
8
|
+
* bir kullanım alanı değil.
|
|
9
|
+
*
|
|
10
|
+
* Etiketli halde iç çizgi parçaları `aria-hidden` — erişilebilir isim tek
|
|
11
|
+
* seferde, host'un `role="separator"` içeriğinden (görünür metinden) gelir,
|
|
12
|
+
* ayrı bir `aria-label` gerekmez.
|
|
13
|
+
*/
|
|
14
|
+
class Divider {
|
|
15
|
+
orientation = input('horizontal', /* @ts-ignore */
|
|
16
|
+
...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
|
|
17
|
+
label = input('', /* @ts-ignore */
|
|
18
|
+
...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
|
|
19
|
+
hostClasses = computed(() => {
|
|
20
|
+
if (this.label() && this.orientation() === 'horizontal') {
|
|
21
|
+
return 'flex items-center gap-3';
|
|
22
|
+
}
|
|
23
|
+
return this.orientation() === 'vertical'
|
|
24
|
+
? 'inline-block h-full w-px bg-border'
|
|
25
|
+
: 'block h-px w-full bg-border';
|
|
26
|
+
}, /* @ts-ignore */
|
|
27
|
+
...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
|
|
28
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Divider, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
29
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Divider, isStandalone: true, selector: "mf-divider", inputs: { orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "separator" }, properties: { "class": "hostClasses()", "attr.aria-orientation": "orientation()" } }, exportAs: ["mfDivider"], ngImport: i0, template: `
|
|
30
|
+
@if (label() && orientation() === 'horizontal') {
|
|
31
|
+
<span class="h-px flex-1 bg-border" aria-hidden="true"></span>
|
|
32
|
+
<span class="text-fg-muted shrink-0 text-xs">{{ label() }}</span>
|
|
33
|
+
<span class="h-px flex-1 bg-border" aria-hidden="true"></span>
|
|
34
|
+
}
|
|
35
|
+
`, isInline: true });
|
|
36
|
+
}
|
|
37
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Divider, decorators: [{
|
|
38
|
+
type: Component,
|
|
39
|
+
args: [{
|
|
40
|
+
selector: 'mf-divider',
|
|
41
|
+
exportAs: 'mfDivider',
|
|
42
|
+
host: {
|
|
43
|
+
'[class]': 'hostClasses()',
|
|
44
|
+
role: 'separator',
|
|
45
|
+
'[attr.aria-orientation]': 'orientation()',
|
|
46
|
+
},
|
|
47
|
+
template: `
|
|
48
|
+
@if (label() && orientation() === 'horizontal') {
|
|
49
|
+
<span class="h-px flex-1 bg-border" aria-hidden="true"></span>
|
|
50
|
+
<span class="text-fg-muted shrink-0 text-xs">{{ label() }}</span>
|
|
51
|
+
<span class="h-px flex-1 bg-border" aria-hidden="true"></span>
|
|
52
|
+
}
|
|
53
|
+
`,
|
|
54
|
+
}]
|
|
55
|
+
}], propDecorators: { orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }] } });
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Generated bundle index. Do not edit.
|
|
59
|
+
*/
|
|
60
|
+
|
|
61
|
+
export { Divider };
|
|
62
|
+
//# sourceMappingURL=mesgflow-ui-kit-divider.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesgflow-ui-kit-divider.mjs","sources":["../../../projects/ui-kit/divider/divider.ts","../../../projects/ui-kit/divider/mesgflow-ui-kit-divider.ts"],"sourcesContent":["import { Component, computed, input } from '@angular/core';\r\n\r\nexport type DividerOrientation = 'horizontal' | 'vertical';\r\n\r\n/**\r\n * `<mf-divider />` (düz çizgi) veya `<mf-divider label=\"veya\" />` (ortasında\r\n * metin, ör. iki giriş yöntemini ayırmak için). `vertical` yönlendirmede\r\n * `label` YOKSAYILIR — dikey bir çizginin ortasına metin sığdırmak pratik\r\n * bir kullanım alanı değil.\r\n *\r\n * Etiketli halde iç çizgi parçaları `aria-hidden` — erişilebilir isim tek\r\n * seferde, host'un `role=\"separator\"` içeriğinden (görünür metinden) gelir,\r\n * ayrı bir `aria-label` gerekmez.\r\n */\r\n@Component({\r\n selector: 'mf-divider',\r\n exportAs: 'mfDivider',\r\n host: {\r\n '[class]': 'hostClasses()',\r\n role: 'separator',\r\n '[attr.aria-orientation]': 'orientation()',\r\n },\r\n template: `\r\n @if (label() && orientation() === 'horizontal') {\r\n <span class=\"h-px flex-1 bg-border\" aria-hidden=\"true\"></span>\r\n <span class=\"text-fg-muted shrink-0 text-xs\">{{ label() }}</span>\r\n <span class=\"h-px flex-1 bg-border\" aria-hidden=\"true\"></span>\r\n }\r\n `,\r\n})\r\nexport class Divider {\r\n readonly orientation = input<DividerOrientation>('horizontal');\r\n readonly label = input('');\r\n\r\n protected readonly hostClasses = computed(() => {\r\n if (this.label() && this.orientation() === 'horizontal') {\r\n return 'flex items-center gap-3';\r\n }\r\n return this.orientation() === 'vertical'\r\n ? 'inline-block h-full w-px bg-border'\r\n : 'block h-px w-full bg-border';\r\n });\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAIA;;;;;;;;;AASG;MAiBU,OAAO,CAAA;IACT,WAAW,GAAG,KAAK,CAAqB,YAAY;oFAAC;IACrD,KAAK,GAAG,KAAK,CAAC,EAAE;8EAAC;AAEP,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC7C,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,YAAY,EAAE;AACvD,YAAA,OAAO,yBAAyB;QAClC;AACA,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,KAAK;AAC5B,cAAE;cACA,6BAA6B;IACnC,CAAC;oFAAC;uGAXS,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAP,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,WAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,eAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EARR,CAAA;;;;;;AAMT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAEU,OAAO,EAAA,UAAA,EAAA,CAAA;kBAhBnB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,QAAQ,EAAE,WAAW;AACrB,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,eAAe;AAC1B,wBAAA,IAAI,EAAE,WAAW;AACjB,wBAAA,yBAAyB,EAAE,eAAe;AAC3C,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA;;;;;;AAMT,EAAA,CAAA;AACF,iBAAA;;;AC7BD;;AAEG;;"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, output, inject, computed, signal, viewChild, Component } from '@angular/core';
|
|
3
|
+
import { MF_DROPZONE_LABELS, cn } from '@mesgflow/ui-kit/core';
|
|
4
|
+
import { Icon } from '@mesgflow/ui-kit/icon';
|
|
5
|
+
import { cva } from 'class-variance-authority';
|
|
6
|
+
|
|
7
|
+
const dropzoneVariants = cva('flex cursor-pointer flex-col items-center justify-center rounded-lg border-2 border-dashed border-border px-6 py-10 text-center ' +
|
|
8
|
+
'transition-colors duration-fast ease-emphasis hover:border-border-strong hover:bg-surface-alt ' +
|
|
9
|
+
'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring', {
|
|
10
|
+
variants: {
|
|
11
|
+
dragOver: {
|
|
12
|
+
true: 'border-accent bg-primary-tint',
|
|
13
|
+
false: '',
|
|
14
|
+
},
|
|
15
|
+
disabled: {
|
|
16
|
+
true: 'pointer-events-none opacity-50',
|
|
17
|
+
false: '',
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
defaultVariants: { dragOver: false, disabled: false },
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* `<mf-dropzone accept="image/*" [maxSizeBytes]="5_000_000" (filesSelected)="upload($event)" />`
|
|
25
|
+
*
|
|
26
|
+
* Görsel/dosya yükleme — sürükle-bırak + tıkla-seç, boyut/tip doğrulaması.
|
|
27
|
+
* Yükleme İLERLEMESİNİ TAŞIMAZ (bkz. `Progress` primitifi — tüketici kendi
|
|
28
|
+
* yükleme state'ini `DropzoneRejection`/`filesSelected`'tan sonra ayrı
|
|
29
|
+
* yönetir, bu component sadece "hangi dosyalar seçildi/reddedildi"yi bildirir).
|
|
30
|
+
*/
|
|
31
|
+
class Dropzone {
|
|
32
|
+
accept = input('', /* @ts-ignore */
|
|
33
|
+
...(ngDevMode ? [{ debugName: "accept" }] : /* istanbul ignore next */ []));
|
|
34
|
+
multiple = input(false, /* @ts-ignore */
|
|
35
|
+
...(ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []));
|
|
36
|
+
maxSizeBytes = input(null, /* @ts-ignore */
|
|
37
|
+
...(ngDevMode ? [{ debugName: "maxSizeBytes" }] : /* istanbul ignore next */ []));
|
|
38
|
+
disabled = input(false, /* @ts-ignore */
|
|
39
|
+
...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
|
|
40
|
+
label = input(/* @ts-ignore */
|
|
41
|
+
...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
|
|
42
|
+
filesSelected = output();
|
|
43
|
+
rejected = output();
|
|
44
|
+
dropzoneLabels = inject(MF_DROPZONE_LABELS);
|
|
45
|
+
effectiveLabel = computed(() => this.label() ?? this.dropzoneLabels().label, /* @ts-ignore */
|
|
46
|
+
...(ngDevMode ? [{ debugName: "effectiveLabel" }] : /* istanbul ignore next */ []));
|
|
47
|
+
dragOver = signal(false, /* @ts-ignore */
|
|
48
|
+
...(ngDevMode ? [{ debugName: "dragOver" }] : /* istanbul ignore next */ []));
|
|
49
|
+
fileInput = viewChild('fileInput', /* @ts-ignore */
|
|
50
|
+
...(ngDevMode ? [{ debugName: "fileInput" }] : /* istanbul ignore next */ []));
|
|
51
|
+
classes = computed(() => cn(dropzoneVariants({ dragOver: this.dragOver(), disabled: this.disabled() })), /* @ts-ignore */
|
|
52
|
+
...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
53
|
+
onDragOver(event) {
|
|
54
|
+
event.preventDefault();
|
|
55
|
+
if (this.disabled())
|
|
56
|
+
return;
|
|
57
|
+
this.dragOver.set(true);
|
|
58
|
+
}
|
|
59
|
+
onDragLeave() {
|
|
60
|
+
this.dragOver.set(false);
|
|
61
|
+
}
|
|
62
|
+
onDrop(event) {
|
|
63
|
+
event.preventDefault();
|
|
64
|
+
this.dragOver.set(false);
|
|
65
|
+
if (this.disabled())
|
|
66
|
+
return;
|
|
67
|
+
this.handleFiles(Array.from(event.dataTransfer?.files ?? []));
|
|
68
|
+
}
|
|
69
|
+
onFileInputChange(event) {
|
|
70
|
+
const input = event.target;
|
|
71
|
+
this.handleFiles(Array.from(input.files ?? []));
|
|
72
|
+
input.value = '';
|
|
73
|
+
}
|
|
74
|
+
browse() {
|
|
75
|
+
if (this.disabled())
|
|
76
|
+
return;
|
|
77
|
+
this.fileInput()?.nativeElement.click();
|
|
78
|
+
}
|
|
79
|
+
handleFiles(files) {
|
|
80
|
+
const list = this.multiple() ? files : files.slice(0, 1);
|
|
81
|
+
const accepted = [];
|
|
82
|
+
const rejected = [];
|
|
83
|
+
for (const file of list) {
|
|
84
|
+
const maxSize = this.maxSizeBytes();
|
|
85
|
+
if (maxSize != null && file.size > maxSize) {
|
|
86
|
+
rejected.push({ file, reason: 'size' });
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const accept = this.accept();
|
|
90
|
+
if (accept && !this.matchesAccept(file, accept)) {
|
|
91
|
+
rejected.push({ file, reason: 'type' });
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
accepted.push(file);
|
|
95
|
+
}
|
|
96
|
+
if (accepted.length > 0)
|
|
97
|
+
this.filesSelected.emit(accepted);
|
|
98
|
+
if (rejected.length > 0)
|
|
99
|
+
this.rejected.emit(rejected);
|
|
100
|
+
}
|
|
101
|
+
matchesAccept(file, accept) {
|
|
102
|
+
return accept
|
|
103
|
+
.split(',')
|
|
104
|
+
.map((p) => p.trim())
|
|
105
|
+
.some((pattern) => {
|
|
106
|
+
if (pattern.endsWith('/*'))
|
|
107
|
+
return file.type.startsWith(pattern.slice(0, -1));
|
|
108
|
+
if (pattern.startsWith('.'))
|
|
109
|
+
return file.name.toLowerCase().endsWith(pattern.toLowerCase());
|
|
110
|
+
return file.type === pattern;
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Dropzone, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
114
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.1.6", type: Dropzone, isStandalone: true, selector: "mf-dropzone", inputs: { accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, maxSizeBytes: { classPropertyName: "maxSizeBytes", publicName: "maxSizeBytes", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filesSelected: "filesSelected", rejected: "rejected" }, host: { classAttribute: "block" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, isSignal: true }], exportAs: ["mfDropzone"], ngImport: i0, template: "<div\r\n [class]=\"classes()\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-disabled]=\"disabled() || null\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave()\"\r\n (drop)=\"onDrop($event)\"\r\n (click)=\"browse()\"\r\n (keydown.enter)=\"browse()\"\r\n (keydown.space)=\"$event.preventDefault(); browse()\"\r\n>\r\n <span mfIcon [size]=\"28\" class=\"text-fg-subtle\">upload_file</span>\r\n <p class=\"mt-2 text-sm text-fg-muted\">{{ effectiveLabel() }}</p>\r\n</div>\r\n<!--\r\n B\u0130LEREK yukar\u0131daki role=\"button\" div'inin DI\u015EINDA, karde\u015F konumda \u2014 axe-core'un\r\n `nested-interactive` kural\u0131 (interaktif bir rol i\u00E7inde ger\u00E7ek bir native form\r\n kontrol\u00FC bar\u0131nd\u0131rmak) `aria-hidden=\"true\"` ile bile tatmin olmuyor (ger\u00E7ek\r\n bulgu); ger\u00E7ek d\u00FCnyadaki dosya-y\u00FCkleme bile\u015Fenlerinin standart \u00E7\u00F6z\u00FCm\u00FC de bu \u2014\r\n native input DOM'da tetikleyicinin d\u0131\u015F\u0131nda durur, `browse()` `#fileInput`\r\n referans\u0131yla programatik olarak t\u0131klat\u0131r.\r\n-->\r\n<input\r\n #fileInput\r\n type=\"file\"\r\n class=\"hidden\"\r\n tabindex=\"-1\"\r\n aria-hidden=\"true\"\r\n [accept]=\"accept()\"\r\n [multiple]=\"multiple()\"\r\n [disabled]=\"disabled()\"\r\n (change)=\"onFileInputChange($event)\"\r\n/>\r\n", dependencies: [{ kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }] });
|
|
115
|
+
}
|
|
116
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Dropzone, decorators: [{
|
|
117
|
+
type: Component,
|
|
118
|
+
args: [{ selector: 'mf-dropzone', host: { class: 'block' }, exportAs: 'mfDropzone', imports: [Icon], template: "<div\r\n [class]=\"classes()\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-disabled]=\"disabled() || null\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave()\"\r\n (drop)=\"onDrop($event)\"\r\n (click)=\"browse()\"\r\n (keydown.enter)=\"browse()\"\r\n (keydown.space)=\"$event.preventDefault(); browse()\"\r\n>\r\n <span mfIcon [size]=\"28\" class=\"text-fg-subtle\">upload_file</span>\r\n <p class=\"mt-2 text-sm text-fg-muted\">{{ effectiveLabel() }}</p>\r\n</div>\r\n<!--\r\n B\u0130LEREK yukar\u0131daki role=\"button\" div'inin DI\u015EINDA, karde\u015F konumda \u2014 axe-core'un\r\n `nested-interactive` kural\u0131 (interaktif bir rol i\u00E7inde ger\u00E7ek bir native form\r\n kontrol\u00FC bar\u0131nd\u0131rmak) `aria-hidden=\"true\"` ile bile tatmin olmuyor (ger\u00E7ek\r\n bulgu); ger\u00E7ek d\u00FCnyadaki dosya-y\u00FCkleme bile\u015Fenlerinin standart \u00E7\u00F6z\u00FCm\u00FC de bu \u2014\r\n native input DOM'da tetikleyicinin d\u0131\u015F\u0131nda durur, `browse()` `#fileInput`\r\n referans\u0131yla programatik olarak t\u0131klat\u0131r.\r\n-->\r\n<input\r\n #fileInput\r\n type=\"file\"\r\n class=\"hidden\"\r\n tabindex=\"-1\"\r\n aria-hidden=\"true\"\r\n [accept]=\"accept()\"\r\n [multiple]=\"multiple()\"\r\n [disabled]=\"disabled()\"\r\n (change)=\"onFileInputChange($event)\"\r\n/>\r\n" }]
|
|
119
|
+
}], propDecorators: { accept: [{ type: i0.Input, args: [{ isSignal: true, alias: "accept", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], maxSizeBytes: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxSizeBytes", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], filesSelected: [{ type: i0.Output, args: ["filesSelected"] }], rejected: [{ type: i0.Output, args: ["rejected"] }], fileInput: [{ type: i0.ViewChild, args: ['fileInput', { isSignal: true }] }] } });
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Generated bundle index. Do not edit.
|
|
123
|
+
*/
|
|
124
|
+
|
|
125
|
+
export { Dropzone, dropzoneVariants };
|
|
126
|
+
//# sourceMappingURL=mesgflow-ui-kit-dropzone.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesgflow-ui-kit-dropzone.mjs","sources":["../../../projects/ui-kit/dropzone/dropzone.variants.ts","../../../projects/ui-kit/dropzone/dropzone.ts","../../../projects/ui-kit/dropzone/dropzone.html","../../../projects/ui-kit/dropzone/mesgflow-ui-kit-dropzone.ts"],"sourcesContent":["import { cva } from 'class-variance-authority';\r\n\r\nexport const dropzoneVariants = cva(\r\n 'flex cursor-pointer flex-col items-center justify-center rounded-lg border-2 border-dashed border-border px-6 py-10 text-center ' +\r\n 'transition-colors duration-fast ease-emphasis hover:border-border-strong hover:bg-surface-alt ' +\r\n 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring',\r\n {\r\n variants: {\r\n dragOver: {\r\n true: 'border-accent bg-primary-tint',\r\n false: '',\r\n },\r\n disabled: {\r\n true: 'pointer-events-none opacity-50',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: { dragOver: false, disabled: false },\r\n },\r\n);\r\n","import {\r\n Component,\r\n ElementRef,\r\n computed,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { cn, MF_DROPZONE_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { dropzoneVariants } from './dropzone.variants';\r\n\r\nexport interface DropzoneRejection {\r\n file: File;\r\n reason: 'size' | 'type';\r\n}\r\n\r\n/**\r\n * `<mf-dropzone accept=\"image/*\" [maxSizeBytes]=\"5_000_000\" (filesSelected)=\"upload($event)\" />`\r\n *\r\n * Görsel/dosya yükleme — sürükle-bırak + tıkla-seç, boyut/tip doğrulaması.\r\n * Yükleme İLERLEMESİNİ TAŞIMAZ (bkz. `Progress` primitifi — tüketici kendi\r\n * yükleme state'ini `DropzoneRejection`/`filesSelected`'tan sonra ayrı\r\n * yönetir, bu component sadece \"hangi dosyalar seçildi/reddedildi\"yi bildirir).\r\n */\r\n@Component({\r\n selector: 'mf-dropzone',\r\n host: { class: 'block' },\r\n exportAs: 'mfDropzone',\r\n imports: [Icon],\r\n templateUrl: './dropzone.html',\r\n})\r\nexport class Dropzone {\r\n readonly accept = input('');\r\n readonly multiple = input(false);\r\n readonly maxSizeBytes = input<number | null>(null);\r\n readonly disabled = input(false);\r\n readonly label = input<string>();\r\n\r\n readonly filesSelected = output<File[]>();\r\n readonly rejected = output<DropzoneRejection[]>();\r\n\r\n private readonly dropzoneLabels = inject(MF_DROPZONE_LABELS);\r\n protected readonly effectiveLabel = computed(() => this.label() ?? this.dropzoneLabels().label);\r\n\r\n protected readonly dragOver = signal(false);\r\n protected readonly fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\r\n\r\n protected readonly classes = computed(() =>\r\n cn(dropzoneVariants({ dragOver: this.dragOver(), disabled: this.disabled() })),\r\n );\r\n\r\n protected onDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n if (this.disabled()) return;\r\n this.dragOver.set(true);\r\n }\r\n\r\n protected onDragLeave(): void {\r\n this.dragOver.set(false);\r\n }\r\n\r\n protected onDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n this.dragOver.set(false);\r\n if (this.disabled()) return;\r\n this.handleFiles(Array.from(event.dataTransfer?.files ?? []));\r\n }\r\n\r\n protected onFileInputChange(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n this.handleFiles(Array.from(input.files ?? []));\r\n input.value = '';\r\n }\r\n\r\n protected browse(): void {\r\n if (this.disabled()) return;\r\n this.fileInput()?.nativeElement.click();\r\n }\r\n\r\n private handleFiles(files: File[]): void {\r\n const list = this.multiple() ? files : files.slice(0, 1);\r\n const accepted: File[] = [];\r\n const rejected: DropzoneRejection[] = [];\r\n\r\n for (const file of list) {\r\n const maxSize = this.maxSizeBytes();\r\n if (maxSize != null && file.size > maxSize) {\r\n rejected.push({ file, reason: 'size' });\r\n continue;\r\n }\r\n const accept = this.accept();\r\n if (accept && !this.matchesAccept(file, accept)) {\r\n rejected.push({ file, reason: 'type' });\r\n continue;\r\n }\r\n accepted.push(file);\r\n }\r\n\r\n if (accepted.length > 0) this.filesSelected.emit(accepted);\r\n if (rejected.length > 0) this.rejected.emit(rejected);\r\n }\r\n\r\n private matchesAccept(file: File, accept: string): boolean {\r\n return accept\r\n .split(',')\r\n .map((p) => p.trim())\r\n .some((pattern) => {\r\n if (pattern.endsWith('/*')) return file.type.startsWith(pattern.slice(0, -1));\r\n if (pattern.startsWith('.')) return file.name.toLowerCase().endsWith(pattern.toLowerCase());\r\n return file.type === pattern;\r\n });\r\n }\r\n}\r\n","<div\r\n [class]=\"classes()\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-disabled]=\"disabled() || null\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave()\"\r\n (drop)=\"onDrop($event)\"\r\n (click)=\"browse()\"\r\n (keydown.enter)=\"browse()\"\r\n (keydown.space)=\"$event.preventDefault(); browse()\"\r\n>\r\n <span mfIcon [size]=\"28\" class=\"text-fg-subtle\">upload_file</span>\r\n <p class=\"mt-2 text-sm text-fg-muted\">{{ effectiveLabel() }}</p>\r\n</div>\r\n<!--\r\n BİLEREK yukarıdaki role=\"button\" div'inin DIŞINDA, kardeş konumda — axe-core'un\r\n `nested-interactive` kuralı (interaktif bir rol içinde gerçek bir native form\r\n kontrolü barındırmak) `aria-hidden=\"true\"` ile bile tatmin olmuyor (gerçek\r\n bulgu); gerçek dünyadaki dosya-yükleme bileşenlerinin standart çözümü de bu —\r\n native input DOM'da tetikleyicinin dışında durur, `browse()` `#fileInput`\r\n referansıyla programatik olarak tıklatır.\r\n-->\r\n<input\r\n #fileInput\r\n type=\"file\"\r\n class=\"hidden\"\r\n tabindex=\"-1\"\r\n aria-hidden=\"true\"\r\n [accept]=\"accept()\"\r\n [multiple]=\"multiple()\"\r\n [disabled]=\"disabled()\"\r\n (change)=\"onFileInputChange($event)\"\r\n/>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, Component } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* `<mf-empty-state title="..." description="...">`
|
|
6
|
+
* `<svg illustration>...</svg>` (opsiyonel, BÜYÜK bir çizim/grafik slotu —
|
|
7
|
+
* `icon`'un yerine geçer, ikisi BİRLİKTE kullanılmaz)
|
|
8
|
+
* `<span icon mfIcon>inbox</span>` (opsiyonel küçük ikon slotu)
|
|
9
|
+
* `<button mfButton action>...</button>` (opsiyonel aksiyon slotu)
|
|
10
|
+
* `</mf-empty-state>`
|
|
11
|
+
*/
|
|
12
|
+
class EmptyState {
|
|
13
|
+
title = input.required(/* @ts-ignore */
|
|
14
|
+
...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
|
|
15
|
+
description = input('', /* @ts-ignore */
|
|
16
|
+
...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
|
|
17
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: EmptyState, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
18
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: EmptyState, isStandalone: true, selector: "mf-empty-state", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "block" }, ngImport: i0, template: `
|
|
19
|
+
<div
|
|
20
|
+
class="flex flex-col items-center justify-center gap-3 rounded-lg border border-dashed border-border p-10 text-center"
|
|
21
|
+
>
|
|
22
|
+
<div class="max-w-48">
|
|
23
|
+
<ng-content select="[illustration]" />
|
|
24
|
+
</div>
|
|
25
|
+
<div class="text-fg-subtle">
|
|
26
|
+
<ng-content select="[icon]" />
|
|
27
|
+
</div>
|
|
28
|
+
<div>
|
|
29
|
+
<p class="font-display text-title text-fg">{{ title() }}</p>
|
|
30
|
+
@if (description()) {
|
|
31
|
+
<p class="mt-1 text-sm text-fg-subtle">{{ description() }}</p>
|
|
32
|
+
}
|
|
33
|
+
</div>
|
|
34
|
+
<ng-content select="[action]" />
|
|
35
|
+
</div>
|
|
36
|
+
`, isInline: true });
|
|
37
|
+
}
|
|
38
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: EmptyState, decorators: [{
|
|
39
|
+
type: Component,
|
|
40
|
+
args: [{
|
|
41
|
+
selector: 'mf-empty-state',
|
|
42
|
+
host: { class: 'block' },
|
|
43
|
+
template: `
|
|
44
|
+
<div
|
|
45
|
+
class="flex flex-col items-center justify-center gap-3 rounded-lg border border-dashed border-border p-10 text-center"
|
|
46
|
+
>
|
|
47
|
+
<div class="max-w-48">
|
|
48
|
+
<ng-content select="[illustration]" />
|
|
49
|
+
</div>
|
|
50
|
+
<div class="text-fg-subtle">
|
|
51
|
+
<ng-content select="[icon]" />
|
|
52
|
+
</div>
|
|
53
|
+
<div>
|
|
54
|
+
<p class="font-display text-title text-fg">{{ title() }}</p>
|
|
55
|
+
@if (description()) {
|
|
56
|
+
<p class="mt-1 text-sm text-fg-subtle">{{ description() }}</p>
|
|
57
|
+
}
|
|
58
|
+
</div>
|
|
59
|
+
<ng-content select="[action]" />
|
|
60
|
+
</div>
|
|
61
|
+
`,
|
|
62
|
+
}]
|
|
63
|
+
}], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }] } });
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Generated bundle index. Do not edit.
|
|
67
|
+
*/
|
|
68
|
+
|
|
69
|
+
export { EmptyState };
|
|
70
|
+
//# sourceMappingURL=mesgflow-ui-kit-empty-state.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesgflow-ui-kit-empty-state.mjs","sources":["../../../projects/ui-kit/empty-state/empty-state.ts","../../../projects/ui-kit/empty-state/mesgflow-ui-kit-empty-state.ts"],"sourcesContent":["import { Component, input } from '@angular/core';\r\n\r\n/**\r\n * `<mf-empty-state title=\"...\" description=\"...\">`\r\n * `<svg illustration>...</svg>` (opsiyonel, BÜYÜK bir çizim/grafik slotu —\r\n * `icon`'un yerine geçer, ikisi BİRLİKTE kullanılmaz)\r\n * `<span icon mfIcon>inbox</span>` (opsiyonel küçük ikon slotu)\r\n * `<button mfButton action>...</button>` (opsiyonel aksiyon slotu)\r\n * `</mf-empty-state>`\r\n */\r\n@Component({\r\n selector: 'mf-empty-state',\r\n host: { class: 'block' },\r\n template: `\r\n <div\r\n class=\"flex flex-col items-center justify-center gap-3 rounded-lg border border-dashed border-border p-10 text-center\"\r\n >\r\n <div class=\"max-w-48\">\r\n <ng-content select=\"[illustration]\" />\r\n </div>\r\n <div class=\"text-fg-subtle\">\r\n <ng-content select=\"[icon]\" />\r\n </div>\r\n <div>\r\n <p class=\"font-display text-title text-fg\">{{ title() }}</p>\r\n @if (description()) {\r\n <p class=\"mt-1 text-sm text-fg-subtle\">{{ description() }}</p>\r\n }\r\n </div>\r\n <ng-content select=\"[action]\" />\r\n </div>\r\n `,\r\n})\r\nexport class EmptyState {\r\n readonly title = input.required<string>();\r\n readonly description = input<string>('');\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAEA;;;;;;;AAOG;MAwBU,UAAU,CAAA;IACZ,KAAK,GAAG,KAAK,CAAC,QAAQ;8EAAU;IAChC,WAAW,GAAG,KAAK,CAAS,EAAE;oFAAC;uGAF7B,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EApBX,CAAA;;;;;;;;;;;;;;;;;;AAkBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAEU,UAAU,EAAA,UAAA,EAAA,CAAA;kBAvBtB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;AACxB,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;;;;;;;AAkBT,EAAA,CAAA;AACF,iBAAA;;;AChCD;;AAEG;;"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, Component } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* `<mf-field label="E-posta" [error]="emailError()">
|
|
6
|
+
* <input mfInput type="email" [id]="..." />
|
|
7
|
+
* </mf-field>`
|
|
8
|
+
* `for`/`id` eşleşmesi (a11y) ÇAĞIRAN ekranın sorumluluğunda — bu component
|
|
9
|
+
* label'ı otomatik bir input'a bağlamıyor (projected content'in id'sini bilmiyor).
|
|
10
|
+
*
|
|
11
|
+
* `error`, `string | undefined` kabul eder (sadece `string` DEĞİL) — çağıran
|
|
12
|
+
* genelde `shared/forms/http-error.ts`'teki `resolveFieldError()`'ı doğrudan
|
|
13
|
+
* bağlar, o da hata yokken `undefined` döner (boş string'e zorlamaya gerek yok).
|
|
14
|
+
*/
|
|
15
|
+
class Field {
|
|
16
|
+
label = input('', /* @ts-ignore */
|
|
17
|
+
...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
|
|
18
|
+
for = input('', /* @ts-ignore */
|
|
19
|
+
...(ngDevMode ? [{ debugName: "for" }] : /* istanbul ignore next */ []));
|
|
20
|
+
hint = input('', /* @ts-ignore */
|
|
21
|
+
...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
|
|
22
|
+
error = input('', /* @ts-ignore */
|
|
23
|
+
...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
|
|
24
|
+
required = input(false, /* @ts-ignore */
|
|
25
|
+
...(ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []));
|
|
26
|
+
/** `true` ise kalan yüksekliği doldurur (`flex-1 min-h-0`) — projected içeriğin kendi tek scroll alanı olduğu durumlar için (ör. uzun bir liste içeren form, bkz. `Dialog.fillBody`). */
|
|
27
|
+
grow = input(false, /* @ts-ignore */
|
|
28
|
+
...(ngDevMode ? [{ debugName: "grow" }] : /* istanbul ignore next */ []));
|
|
29
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Field, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
30
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Field, isStandalone: true, selector: "mf-field", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, for: { classPropertyName: "for", publicName: "for", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, grow: { classPropertyName: "grow", publicName: "grow", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "block" }, ngImport: i0, template: "<div class=\"flex flex-col gap-1.5\" [class.min-h-0]=\"grow()\" [class.flex-1]=\"grow()\">\r\n @if (label()) {\r\n <label [attr.for]=\"for() || null\" class=\"text-label text-fg-muted\">\r\n {{ label() }}\r\n @if (required()) {\r\n <span class=\"text-danger\">*</span>\r\n }\r\n </label>\r\n }\r\n <ng-content />\r\n @if (error()) {\r\n <p class=\"text-xs text-danger\">{{ error() }}</p>\r\n } @else if (hint()) {\r\n <p class=\"text-xs text-fg-subtle\">{{ hint() }}</p>\r\n }\r\n</div>\r\n" });
|
|
31
|
+
}
|
|
32
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Field, decorators: [{
|
|
33
|
+
type: Component,
|
|
34
|
+
args: [{ selector: 'mf-field', host: { class: 'block' }, template: "<div class=\"flex flex-col gap-1.5\" [class.min-h-0]=\"grow()\" [class.flex-1]=\"grow()\">\r\n @if (label()) {\r\n <label [attr.for]=\"for() || null\" class=\"text-label text-fg-muted\">\r\n {{ label() }}\r\n @if (required()) {\r\n <span class=\"text-danger\">*</span>\r\n }\r\n </label>\r\n }\r\n <ng-content />\r\n @if (error()) {\r\n <p class=\"text-xs text-danger\">{{ error() }}</p>\r\n } @else if (hint()) {\r\n <p class=\"text-xs text-fg-subtle\">{{ hint() }}</p>\r\n }\r\n</div>\r\n" }]
|
|
35
|
+
}], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], for: [{ type: i0.Input, args: [{ isSignal: true, alias: "for", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], grow: [{ type: i0.Input, args: [{ isSignal: true, alias: "grow", required: false }] }] } });
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Generated bundle index. Do not edit.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
export { Field };
|
|
42
|
+
//# sourceMappingURL=mesgflow-ui-kit-field.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesgflow-ui-kit-field.mjs","sources":["../../../projects/ui-kit/field/field.ts","../../../projects/ui-kit/field/field.html","../../../projects/ui-kit/field/mesgflow-ui-kit-field.ts"],"sourcesContent":["import { Component, input } from '@angular/core';\r\n\r\n/**\r\n * `<mf-field label=\"E-posta\" [error]=\"emailError()\">\r\n * <input mfInput type=\"email\" [id]=\"...\" />\r\n * </mf-field>`\r\n * `for`/`id` eşleşmesi (a11y) ÇAĞIRAN ekranın sorumluluğunda — bu component\r\n * label'ı otomatik bir input'a bağlamıyor (projected content'in id'sini bilmiyor).\r\n *\r\n * `error`, `string | undefined` kabul eder (sadece `string` DEĞİL) — çağıran\r\n * genelde `shared/forms/http-error.ts`'teki `resolveFieldError()`'ı doğrudan\r\n * bağlar, o da hata yokken `undefined` döner (boş string'e zorlamaya gerek yok).\r\n */\r\n@Component({\r\n selector: 'mf-field',\r\n host: { class: 'block' },\r\n templateUrl: './field.html',\r\n})\r\nexport class Field {\r\n readonly label = input<string>('');\r\n readonly for = input<string>('');\r\n readonly hint = input<string>('');\r\n readonly error = input<string | undefined>('');\r\n readonly required = input(false);\r\n /** `true` ise kalan yüksekliği doldurur (`flex-1 min-h-0`) — projected içeriğin kendi tek scroll alanı olduğu durumlar için (ör. uzun bir liste içeren form, bkz. `Dialog.fillBody`). */\r\n readonly grow = input(false);\r\n}\r\n","<div class=\"flex flex-col gap-1.5\" [class.min-h-0]=\"grow()\" [class.flex-1]=\"grow()\">\r\n @if (label()) {\r\n <label [attr.for]=\"for() || null\" class=\"text-label text-fg-muted\">\r\n {{ label() }}\r\n @if (required()) {\r\n <span class=\"text-danger\">*</span>\r\n }\r\n </label>\r\n }\r\n <ng-content />\r\n @if (error()) {\r\n <p class=\"text-xs text-danger\">{{ error() }}</p>\r\n } @else if (hint()) {\r\n <p class=\"text-xs text-fg-subtle\">{{ hint() }}</p>\r\n }\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAEA;;;;;;;;;;AAUG;MAMU,KAAK,CAAA;IACP,KAAK,GAAG,KAAK,CAAS,EAAE;8EAAC;IACzB,GAAG,GAAG,KAAK,CAAS,EAAE;4EAAC;IACvB,IAAI,GAAG,KAAK,CAAS,EAAE;6EAAC;IACxB,KAAK,GAAG,KAAK,CAAqB,EAAE;8EAAC;IACrC,QAAQ,GAAG,KAAK,CAAC,KAAK;iFAAC;;IAEvB,IAAI,GAAG,KAAK,CAAC,KAAK;6EAAC;uGAPjB,KAAK,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAL,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAK,g0BClBlB,ohBAgBA,EAAA,CAAA;;2FDEa,KAAK,EAAA,UAAA,EAAA,CAAA;kBALjB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,EAAA,IAAA,EACd,EAAE,KAAK,EAAE,OAAO,EAAE,EAAA,QAAA,EAAA,ohBAAA,EAAA;;;AEf1B;;AAEG;;"}
|