@mesgflow/ui-kit 0.6.0 → 0.7.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 (199) hide show
  1. package/README.md +56 -5
  2. package/fesm2022/mesgflow-ui-kit-accordion.mjs +3 -2
  3. package/fesm2022/mesgflow-ui-kit-accordion.mjs.map +1 -1
  4. package/fesm2022/mesgflow-ui-kit-agenda.mjs +208 -0
  5. package/fesm2022/mesgflow-ui-kit-agenda.mjs.map +1 -0
  6. package/fesm2022/mesgflow-ui-kit-aspect-ratio.mjs +37 -0
  7. package/fesm2022/mesgflow-ui-kit-aspect-ratio.mjs.map +1 -0
  8. package/fesm2022/mesgflow-ui-kit-blocks.mjs +207 -0
  9. package/fesm2022/mesgflow-ui-kit-blocks.mjs.map +1 -0
  10. package/fesm2022/mesgflow-ui-kit-box-input.mjs +2 -2
  11. package/fesm2022/mesgflow-ui-kit-box-input.mjs.map +1 -1
  12. package/fesm2022/mesgflow-ui-kit-button.mjs +188 -242
  13. package/fesm2022/mesgflow-ui-kit-button.mjs.map +1 -1
  14. package/fesm2022/mesgflow-ui-kit-card.mjs +37 -16
  15. package/fesm2022/mesgflow-ui-kit-card.mjs.map +1 -1
  16. package/fesm2022/mesgflow-ui-kit-carousel.mjs +308 -0
  17. package/fesm2022/mesgflow-ui-kit-carousel.mjs.map +1 -0
  18. package/fesm2022/mesgflow-ui-kit-checkbox.mjs +16 -21
  19. package/fesm2022/mesgflow-ui-kit-checkbox.mjs.map +1 -1
  20. package/fesm2022/mesgflow-ui-kit-chip.mjs +2 -2
  21. package/fesm2022/mesgflow-ui-kit-chip.mjs.map +1 -1
  22. package/fesm2022/mesgflow-ui-kit-code-block.mjs +9 -5
  23. package/fesm2022/mesgflow-ui-kit-code-block.mjs.map +1 -1
  24. package/fesm2022/mesgflow-ui-kit-color-picker.mjs +6 -4
  25. package/fesm2022/mesgflow-ui-kit-color-picker.mjs.map +1 -1
  26. package/fesm2022/mesgflow-ui-kit-combobox.mjs +145 -65
  27. package/fesm2022/mesgflow-ui-kit-combobox.mjs.map +1 -1
  28. package/fesm2022/mesgflow-ui-kit-context-menu.mjs +4 -6
  29. package/fesm2022/mesgflow-ui-kit-context-menu.mjs.map +1 -1
  30. package/fesm2022/mesgflow-ui-kit-core.mjs +441 -128
  31. package/fesm2022/mesgflow-ui-kit-core.mjs.map +1 -1
  32. package/fesm2022/mesgflow-ui-kit-countdown.mjs +149 -0
  33. package/fesm2022/mesgflow-ui-kit-countdown.mjs.map +1 -0
  34. package/fesm2022/mesgflow-ui-kit-date-picker.mjs +131 -10
  35. package/fesm2022/mesgflow-ui-kit-date-picker.mjs.map +1 -1
  36. package/fesm2022/mesgflow-ui-kit-dialog.mjs +117 -34
  37. package/fesm2022/mesgflow-ui-kit-dialog.mjs.map +1 -1
  38. package/fesm2022/mesgflow-ui-kit-drawer.mjs +109 -0
  39. package/fesm2022/mesgflow-ui-kit-drawer.mjs.map +1 -0
  40. package/fesm2022/mesgflow-ui-kit-dropzone.mjs +3 -3
  41. package/fesm2022/mesgflow-ui-kit-dropzone.mjs.map +1 -1
  42. package/fesm2022/mesgflow-ui-kit-field.mjs +53 -12
  43. package/fesm2022/mesgflow-ui-kit-field.mjs.map +1 -1
  44. package/fesm2022/mesgflow-ui-kit-file-upload.mjs +356 -0
  45. package/fesm2022/mesgflow-ui-kit-file-upload.mjs.map +1 -0
  46. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs +131 -0
  47. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs.map +1 -1
  48. package/fesm2022/mesgflow-ui-kit-icon.mjs +6 -1
  49. package/fesm2022/mesgflow-ui-kit-icon.mjs.map +1 -1
  50. package/fesm2022/mesgflow-ui-kit-icons-lucide.mjs +371 -0
  51. package/fesm2022/mesgflow-ui-kit-icons-lucide.mjs.map +1 -0
  52. package/fesm2022/mesgflow-ui-kit-inline-edit.mjs +279 -0
  53. package/fesm2022/mesgflow-ui-kit-inline-edit.mjs.map +1 -0
  54. package/fesm2022/mesgflow-ui-kit-input.mjs +147 -4
  55. package/fesm2022/mesgflow-ui-kit-input.mjs.map +1 -1
  56. package/fesm2022/mesgflow-ui-kit-lightbox.mjs +299 -0
  57. package/fesm2022/mesgflow-ui-kit-lightbox.mjs.map +1 -0
  58. package/fesm2022/mesgflow-ui-kit-link.mjs +2 -2
  59. package/fesm2022/mesgflow-ui-kit-link.mjs.map +1 -1
  60. package/fesm2022/mesgflow-ui-kit-listbox.mjs +151 -0
  61. package/fesm2022/mesgflow-ui-kit-listbox.mjs.map +1 -0
  62. package/fesm2022/mesgflow-ui-kit-mention.mjs +283 -0
  63. package/fesm2022/mesgflow-ui-kit-mention.mjs.map +1 -0
  64. package/fesm2022/mesgflow-ui-kit-menu.mjs +169 -5
  65. package/fesm2022/mesgflow-ui-kit-menu.mjs.map +1 -1
  66. package/fesm2022/mesgflow-ui-kit-nav-menu.mjs +276 -0
  67. package/fesm2022/mesgflow-ui-kit-nav-menu.mjs.map +1 -0
  68. package/fesm2022/mesgflow-ui-kit-notification-center.mjs +281 -0
  69. package/fesm2022/mesgflow-ui-kit-notification-center.mjs.map +1 -0
  70. package/fesm2022/mesgflow-ui-kit-number-input.mjs +7 -4
  71. package/fesm2022/mesgflow-ui-kit-number-input.mjs.map +1 -1
  72. package/fesm2022/mesgflow-ui-kit-pagination.mjs +4 -3
  73. package/fesm2022/mesgflow-ui-kit-pagination.mjs.map +1 -1
  74. package/fesm2022/mesgflow-ui-kit-password-input.mjs +7 -2
  75. package/fesm2022/mesgflow-ui-kit-password-input.mjs.map +1 -1
  76. package/fesm2022/mesgflow-ui-kit-popover.mjs +9 -49
  77. package/fesm2022/mesgflow-ui-kit-popover.mjs.map +1 -1
  78. package/fesm2022/mesgflow-ui-kit-progress.mjs +162 -21
  79. package/fesm2022/mesgflow-ui-kit-progress.mjs.map +1 -1
  80. package/fesm2022/mesgflow-ui-kit-radio.mjs +4 -6
  81. package/fesm2022/mesgflow-ui-kit-radio.mjs.map +1 -1
  82. package/fesm2022/mesgflow-ui-kit-rating.mjs +2 -2
  83. package/fesm2022/mesgflow-ui-kit-rating.mjs.map +1 -1
  84. package/fesm2022/mesgflow-ui-kit-search-input.mjs +9 -5
  85. package/fesm2022/mesgflow-ui-kit-search-input.mjs.map +1 -1
  86. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs +12 -8
  87. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs.map +1 -1
  88. package/fesm2022/mesgflow-ui-kit-select.mjs +3 -2
  89. package/fesm2022/mesgflow-ui-kit-select.mjs.map +1 -1
  90. package/fesm2022/mesgflow-ui-kit-sidebar.mjs +16 -13
  91. package/fesm2022/mesgflow-ui-kit-sidebar.mjs.map +1 -1
  92. package/fesm2022/mesgflow-ui-kit-skeleton.mjs +4 -3
  93. package/fesm2022/mesgflow-ui-kit-skeleton.mjs.map +1 -1
  94. package/fesm2022/mesgflow-ui-kit-slider.mjs +250 -3
  95. package/fesm2022/mesgflow-ui-kit-slider.mjs.map +1 -1
  96. package/fesm2022/mesgflow-ui-kit-sortable.mjs +526 -0
  97. package/fesm2022/mesgflow-ui-kit-sortable.mjs.map +1 -0
  98. package/fesm2022/mesgflow-ui-kit-spinner.mjs +42 -13
  99. package/fesm2022/mesgflow-ui-kit-spinner.mjs.map +1 -1
  100. package/fesm2022/mesgflow-ui-kit-split-button.mjs +205 -0
  101. package/fesm2022/mesgflow-ui-kit-split-button.mjs.map +1 -0
  102. package/fesm2022/mesgflow-ui-kit-splitter.mjs +210 -3
  103. package/fesm2022/mesgflow-ui-kit-splitter.mjs.map +1 -1
  104. package/fesm2022/mesgflow-ui-kit-stat-tile.mjs +11 -4
  105. package/fesm2022/mesgflow-ui-kit-stat-tile.mjs.map +1 -1
  106. package/fesm2022/mesgflow-ui-kit-stepper.mjs +167 -60
  107. package/fesm2022/mesgflow-ui-kit-stepper.mjs.map +1 -1
  108. package/fesm2022/mesgflow-ui-kit-switch.mjs +2 -2
  109. package/fesm2022/mesgflow-ui-kit-switch.mjs.map +1 -1
  110. package/fesm2022/mesgflow-ui-kit-table.mjs +16 -10
  111. package/fesm2022/mesgflow-ui-kit-table.mjs.map +1 -1
  112. package/fesm2022/mesgflow-ui-kit-tabs.mjs +410 -169
  113. package/fesm2022/mesgflow-ui-kit-tabs.mjs.map +1 -1
  114. package/fesm2022/mesgflow-ui-kit-tag-input.mjs +7 -2
  115. package/fesm2022/mesgflow-ui-kit-tag-input.mjs.map +1 -1
  116. package/fesm2022/mesgflow-ui-kit-theming.mjs +4 -4
  117. package/fesm2022/mesgflow-ui-kit-theming.mjs.map +1 -1
  118. package/fesm2022/mesgflow-ui-kit-time-picker.mjs +3 -3
  119. package/fesm2022/mesgflow-ui-kit-time-picker.mjs.map +1 -1
  120. package/fesm2022/mesgflow-ui-kit-toast.mjs +113 -30
  121. package/fesm2022/mesgflow-ui-kit-toast.mjs.map +1 -1
  122. package/fesm2022/mesgflow-ui-kit-toggle.mjs +3 -2
  123. package/fesm2022/mesgflow-ui-kit-toggle.mjs.map +1 -1
  124. package/fesm2022/mesgflow-ui-kit-toolbar.mjs +4 -2
  125. package/fesm2022/mesgflow-ui-kit-toolbar.mjs.map +1 -1
  126. package/fesm2022/mesgflow-ui-kit-tooltip.mjs +73 -50
  127. package/fesm2022/mesgflow-ui-kit-tooltip.mjs.map +1 -1
  128. package/fesm2022/mesgflow-ui-kit-tour.mjs +8 -20
  129. package/fesm2022/mesgflow-ui-kit-tour.mjs.map +1 -1
  130. package/fesm2022/mesgflow-ui-kit-transfer-list.mjs +288 -0
  131. package/fesm2022/mesgflow-ui-kit-transfer-list.mjs.map +1 -0
  132. package/fesm2022/mesgflow-ui-kit-tree.mjs +1 -1
  133. package/fesm2022/mesgflow-ui-kit-tree.mjs.map +1 -1
  134. package/fesm2022/mesgflow-ui-kit-virtual-list.mjs +109 -0
  135. package/fesm2022/mesgflow-ui-kit-virtual-list.mjs.map +1 -0
  136. package/fesm2022/mesgflow-ui-kit.mjs +92 -12836
  137. package/fesm2022/mesgflow-ui-kit.mjs.map +1 -1
  138. package/package.json +87 -3
  139. package/schematics/collection.json +10 -0
  140. package/schematics/migration.json +10 -0
  141. package/schematics/migrations/v0-7.cjs +70 -0
  142. package/schematics/ng-add/index.cjs +234 -0
  143. package/schematics/ng-add/schema.json +43 -0
  144. package/tokens/color.css +96 -0
  145. package/tokens/controls.css +145 -0
  146. package/tokens/elevation.css +62 -6
  147. package/tokens/motion.css +304 -66
  148. package/tokens/radius.css +14 -0
  149. package/tokens.css +1 -0
  150. package/tokens.json +1583 -0
  151. package/types/mesgflow-ui-kit-agenda.d.ts +49 -0
  152. package/types/mesgflow-ui-kit-aspect-ratio.d.ts +18 -0
  153. package/types/mesgflow-ui-kit-blocks.d.ts +128 -0
  154. package/types/mesgflow-ui-kit-button.d.ts +23 -38
  155. package/types/mesgflow-ui-kit-card.d.ts +26 -16
  156. package/types/mesgflow-ui-kit-carousel.d.ts +51 -0
  157. package/types/mesgflow-ui-kit-checkbox.d.ts +8 -5
  158. package/types/mesgflow-ui-kit-code-block.d.ts +4 -1
  159. package/types/mesgflow-ui-kit-combobox.d.ts +47 -22
  160. package/types/mesgflow-ui-kit-core.d.ts +271 -21
  161. package/types/mesgflow-ui-kit-countdown.d.ts +47 -0
  162. package/types/mesgflow-ui-kit-date-picker.d.ts +31 -1
  163. package/types/mesgflow-ui-kit-dialog.d.ts +29 -6
  164. package/types/mesgflow-ui-kit-drawer.d.ts +45 -0
  165. package/types/mesgflow-ui-kit-field.d.ts +17 -8
  166. package/types/mesgflow-ui-kit-file-upload.d.ts +64 -0
  167. package/types/mesgflow-ui-kit-hover-card.d.ts +2 -2
  168. package/types/mesgflow-ui-kit-icons-lucide.d.ts +27 -0
  169. package/types/mesgflow-ui-kit-inline-edit.d.ts +42 -0
  170. package/types/mesgflow-ui-kit-input.d.ts +64 -2
  171. package/types/mesgflow-ui-kit-lightbox.d.ts +54 -0
  172. package/types/mesgflow-ui-kit-listbox.d.ts +30 -0
  173. package/types/mesgflow-ui-kit-mention.d.ts +59 -0
  174. package/types/mesgflow-ui-kit-menu.d.ts +41 -2
  175. package/types/mesgflow-ui-kit-nav-menu.d.ts +58 -0
  176. package/types/mesgflow-ui-kit-notification-center.d.ts +41 -0
  177. package/types/mesgflow-ui-kit-number-input.d.ts +3 -1
  178. package/types/mesgflow-ui-kit-password-input.d.ts +3 -1
  179. package/types/mesgflow-ui-kit-popover.d.ts +13 -5
  180. package/types/mesgflow-ui-kit-progress.d.ts +33 -12
  181. package/types/mesgflow-ui-kit-radio.d.ts +2 -2
  182. package/types/mesgflow-ui-kit-search-input.d.ts +3 -1
  183. package/types/mesgflow-ui-kit-segmented-control.d.ts +4 -0
  184. package/types/mesgflow-ui-kit-sidebar.d.ts +1 -1
  185. package/types/mesgflow-ui-kit-slider.d.ts +60 -1
  186. package/types/mesgflow-ui-kit-sortable.d.ts +103 -0
  187. package/types/mesgflow-ui-kit-spinner.d.ts +5 -8
  188. package/types/mesgflow-ui-kit-split-button.d.ts +47 -0
  189. package/types/mesgflow-ui-kit-splitter.d.ts +64 -1
  190. package/types/mesgflow-ui-kit-stat-tile.d.ts +3 -0
  191. package/types/mesgflow-ui-kit-stepper.d.ts +54 -32
  192. package/types/mesgflow-ui-kit-table.d.ts +2 -0
  193. package/types/mesgflow-ui-kit-tabs.d.ts +193 -93
  194. package/types/mesgflow-ui-kit-tag-input.d.ts +3 -1
  195. package/types/mesgflow-ui-kit-toast.d.ts +48 -22
  196. package/types/mesgflow-ui-kit-tooltip.d.ts +15 -12
  197. package/types/mesgflow-ui-kit-transfer-list.d.ts +34 -0
  198. package/types/mesgflow-ui-kit-virtual-list.d.ts +35 -0
  199. package/types/mesgflow-ui-kit.d.ts +87 -5444
@@ -0,0 +1,207 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Directive, input, booleanAttribute, output, inject, contentChild, signal, computed, Component, linkedSignal } from '@angular/core';
3
+ import { Alert } from '@mesgflow/ui-kit/alert';
4
+ import { Button } from '@mesgflow/ui-kit/button';
5
+ import { Checkbox } from '@mesgflow/ui-kit/checkbox';
6
+ import { MF_AUTH_CARD_LABELS, nextId, MF_INVITE_MEMBERS_LABELS } from '@mesgflow/ui-kit/core';
7
+ import { Divider } from '@mesgflow/ui-kit/divider';
8
+ import { Field } from '@mesgflow/ui-kit/field';
9
+ import { Input } from '@mesgflow/ui-kit/input';
10
+ import { PasswordInput } from '@mesgflow/ui-kit/password-input';
11
+ import { Select } from '@mesgflow/ui-kit/select';
12
+ import { TagInput } from '@mesgflow/ui-kit/tag-input';
13
+
14
+ const EMAIL$1 = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
15
+ /**
16
+ * `<div mfAuthProviders>…GitHub/Google düğmeleri…</div>` — `mf-auth-card`
17
+ * içinde e-posta formunun üstünde, ayırıcıyla birlikte gösterilir.
18
+ */
19
+ class AuthProviders {
20
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AuthProviders, deps: [], target: i0.ɵɵFactoryTarget.Directive });
21
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.6", type: AuthProviders, isStandalone: true, selector: "[mfAuthProviders]", host: { classAttribute: "grid gap-2 @xs:grid-cols-2" }, ngImport: i0 });
22
+ }
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AuthProviders, decorators: [{
24
+ type: Directive,
25
+ args: [{ selector: '[mfAuthProviders]', host: { class: 'grid gap-2 @xs:grid-cols-2' } }]
26
+ }] });
27
+ /**
28
+ * `<mf-auth-card [loading]="busy()" [error]="err()" (signIn)="login($event)" (forgotPassword)="…" (signUp)="…" />`
29
+ *
30
+ * Kullanıma hazır giriş kartı (Login bloğunun tüketilebilir hâli): başlık,
31
+ * isteğe bağlı sosyal sağlayıcı slotu (`[mfAuthProviders]`), e-posta +
32
+ * parola (göster/gizle), "beni hatırla", gönder ve kayıt bağlantısı.
33
+ *
34
+ * - Doğrulama yerleşik: boş/geçersiz e-posta ve boş parola alanın altında
35
+ * (`mf-field`, `aria-invalid` + `aria-describedby`) gösterilir; `signIn`
36
+ * yalnızca geçerli değerlerle yayılır.
37
+ * - Sunucu hatası `error` girdisiyle üstte bir `role="alert"` uyarısı olur.
38
+ * - Tüm metinler `MfLabels.authCard` — `title`/`description` girdileri
39
+ * yalnızca bu örnek için ezer.
40
+ * - Kapsayıcı sorgusuyla (`@container`) dar yerlerde tek sütun.
41
+ */
42
+ class AuthCard {
43
+ title = input(/* @ts-ignore */
44
+ ...(ngDevMode ? [undefined, { debugName: "title" }] : /* istanbul ignore next */ []));
45
+ description = input(/* @ts-ignore */
46
+ ...(ngDevMode ? [undefined, { debugName: "description" }] : /* istanbul ignore next */ []));
47
+ loading = input(false, { ...(ngDevMode ? { debugName: "loading" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
48
+ /** Sunucudan dönen hata metni — boşsa uyarı gösterilmez. */
49
+ error = input(null, /* @ts-ignore */
50
+ ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
51
+ showRemember = input(true, { ...(ngDevMode ? { debugName: "showRemember" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
52
+ /** `false` ise "parolamı unuttum" bağlantısı gizlenir. */
53
+ showForgotPassword = input(true, { ...(ngDevMode ? { debugName: "showForgotPassword" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
54
+ /** `false` ise alttaki kayıt satırı gizlenir. */
55
+ showSignUp = input(true, { ...(ngDevMode ? { debugName: "showSignUp" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
56
+ signIn = output();
57
+ forgotPassword = output();
58
+ signUp = output();
59
+ errorDismissed = output();
60
+ labels = inject(MF_AUTH_CARD_LABELS);
61
+ ids = { email: nextId('mf-auth-email'), password: nextId('mf-auth-password') };
62
+ providers = contentChild(AuthProviders, /* @ts-ignore */
63
+ ...(ngDevMode ? [{ debugName: "providers" }] : /* istanbul ignore next */ []));
64
+ email = signal('', /* @ts-ignore */
65
+ ...(ngDevMode ? [{ debugName: "email" }] : /* istanbul ignore next */ []));
66
+ password = signal('', /* @ts-ignore */
67
+ ...(ngDevMode ? [{ debugName: "password" }] : /* istanbul ignore next */ []));
68
+ remember = signal(true, /* @ts-ignore */
69
+ ...(ngDevMode ? [{ debugName: "remember" }] : /* istanbul ignore next */ []));
70
+ submitted = signal(false, /* @ts-ignore */
71
+ ...(ngDevMode ? [{ debugName: "submitted" }] : /* istanbul ignore next */ []));
72
+ emailError = computed(() => {
73
+ if (!this.submitted())
74
+ return undefined;
75
+ const value = this.email().trim();
76
+ if (!value)
77
+ return this.labels().emailRequired;
78
+ return EMAIL$1.test(value) ? undefined : this.labels().emailInvalid;
79
+ }, /* @ts-ignore */
80
+ ...(ngDevMode ? [{ debugName: "emailError" }] : /* istanbul ignore next */ []));
81
+ passwordError = computed(() => this.submitted() && !this.password() ? this.labels().passwordRequired : undefined, /* @ts-ignore */
82
+ ...(ngDevMode ? [{ debugName: "passwordError" }] : /* istanbul ignore next */ []));
83
+ submit(event) {
84
+ event.preventDefault();
85
+ this.submitted.set(true);
86
+ if (this.emailError() || this.passwordError() || this.loading())
87
+ return;
88
+ this.signIn.emit({
89
+ email: this.email().trim(),
90
+ password: this.password(),
91
+ remember: this.showRemember() && this.remember(),
92
+ });
93
+ }
94
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AuthCard, deps: [], target: i0.ɵɵFactoryTarget.Component });
95
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: AuthCard, isStandalone: true, selector: "mf-auth-card", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, showRemember: { classPropertyName: "showRemember", publicName: "showRemember", isSignal: true, isRequired: false, transformFunction: null }, showForgotPassword: { classPropertyName: "showForgotPassword", publicName: "showForgotPassword", isSignal: true, isRequired: false, transformFunction: null }, showSignUp: { classPropertyName: "showSignUp", publicName: "showSignUp", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { signIn: "signIn", forgotPassword: "forgotPassword", signUp: "signUp", errorDismissed: "errorDismissed" }, host: { classAttribute: "@container block w-full max-w-sm" }, queries: [{ propertyName: "providers", first: true, predicate: AuthProviders, descendants: true, isSignal: true }], exportAs: ["mfAuthCard"], ngImport: i0, template: "<form class=\"flex flex-col gap-5\" novalidate (submit)=\"submit($event)\">\r\n <div>\r\n <h2 class=\"font-display text-title text-fg\">{{ title() ?? labels().title }}</h2>\r\n <p class=\"mt-1 text-sm text-fg-muted\">{{ description() ?? labels().description }}</p>\r\n </div>\r\n\r\n @if (error()) {\r\n <mf-alert\r\n tone=\"danger\"\r\n [title]=\"labels().errorTitle\"\r\n [dismissible]=\"true\"\r\n (dismissed)=\"errorDismissed.emit()\"\r\n >{{ error() }}</mf-alert\r\n >\r\n }\r\n\r\n @if (providers()) {\r\n <ng-content select=\"[mfAuthProviders]\" />\r\n <mf-divider [label]=\"labels().divider\" />\r\n }\r\n\r\n <mf-field [label]=\"labels().email\" [for]=\"ids.email\" [error]=\"emailError()\" [required]=\"true\">\r\n <input\r\n mfInput\r\n [id]=\"ids.email\"\r\n type=\"email\"\r\n autocomplete=\"email\"\r\n [placeholder]=\"labels().emailPlaceholder\"\r\n [value]=\"email()\"\r\n [hasError]=\"!!emailError()\"\r\n (input)=\"email.set($any($event.target).value)\"\r\n />\r\n </mf-field>\r\n\r\n <div class=\"flex flex-col gap-1.5\">\r\n <div class=\"flex items-center justify-between gap-3\">\r\n <label [for]=\"ids.password\" class=\"text-label text-fg-muted\">{{ labels().password }}</label>\r\n @if (showForgotPassword()) {\r\n <button mfButton type=\"button\" appearance=\"link\" size=\"xs\" (click)=\"forgotPassword.emit()\">\r\n {{ labels().forgotPassword }}\r\n </button>\r\n }\r\n </div>\r\n <mf-password-input\r\n [inputId]=\"ids.password\"\r\n [(value)]=\"password\"\r\n [fullWidth]=\"true\"\r\n [hasError]=\"!!passwordError()\"\r\n />\r\n @if (passwordError(); as message) {\r\n <p class=\"text-sm text-danger\" aria-live=\"polite\">{{ message }}</p>\r\n }\r\n </div>\r\n\r\n @if (showRemember()) {\r\n <label class=\"flex items-center gap-2 text-sm text-fg-muted\">\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"remember()\"\r\n (change)=\"remember.set($any($event.target).checked)\"\r\n />\r\n {{ labels().remember }}\r\n </label>\r\n }\r\n\r\n <button mfButton type=\"submit\" size=\"lg\" [loading]=\"loading()\">{{ labels().submit }}</button>\r\n\r\n @if (showSignUp()) {\r\n <p class=\"text-center text-sm text-fg-muted\">\r\n {{ labels().noAccount }}\r\n <button mfButton type=\"button\" appearance=\"link\" size=\"sm\" (click)=\"signUp.emit()\">\r\n {{ labels().signUp }}\r\n </button>\r\n </p>\r\n }\r\n</form>\r\n", dependencies: [{ kind: "component", type: Alert, selector: "mf-alert", inputs: ["tone", "title", "icon", "dismissible", "dismissLabel"], outputs: ["dismissed"], exportAs: ["mfAlert"] }, { kind: "component", type: Button, selector: "button[mfButton], a[mfButton]", inputs: ["tone", "appearance", "size", "shape", "type", "loading", "iconStart", "iconEnd"], exportAs: ["mfButton"] }, { kind: "directive", type: Checkbox, selector: "input[type=checkbox][mfCheckbox]", inputs: ["size", "indeterminate"] }, { kind: "component", type: Divider, selector: "mf-divider", inputs: ["orientation", "label"], exportAs: ["mfDivider"] }, { kind: "component", type: Field, selector: "mf-field", inputs: ["label", "for", "hint", "error", "required", "grow"] }, { kind: "directive", type: Input, selector: "input[mfInput]:not([type=checkbox]):not([type=radio]), textarea[mfInput]", inputs: ["size", "hasError", "autosize", "minRows", "maxRows"] }, { kind: "component", type: PasswordInput, selector: "mf-password-input", inputs: ["value", "placeholder", "disabled", "hasError", "inputId", "ariaLabel", "fullWidth", "showLabel", "hideLabel"], outputs: ["valueChange"], exportAs: ["mfPasswordInput"] }] });
96
+ }
97
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AuthCard, decorators: [{
98
+ type: Component,
99
+ args: [{ selector: 'mf-auth-card', exportAs: 'mfAuthCard', imports: [Alert, Button, Checkbox, Divider, Field, Input, PasswordInput], host: { class: '@container block w-full max-w-sm' }, template: "<form class=\"flex flex-col gap-5\" novalidate (submit)=\"submit($event)\">\r\n <div>\r\n <h2 class=\"font-display text-title text-fg\">{{ title() ?? labels().title }}</h2>\r\n <p class=\"mt-1 text-sm text-fg-muted\">{{ description() ?? labels().description }}</p>\r\n </div>\r\n\r\n @if (error()) {\r\n <mf-alert\r\n tone=\"danger\"\r\n [title]=\"labels().errorTitle\"\r\n [dismissible]=\"true\"\r\n (dismissed)=\"errorDismissed.emit()\"\r\n >{{ error() }}</mf-alert\r\n >\r\n }\r\n\r\n @if (providers()) {\r\n <ng-content select=\"[mfAuthProviders]\" />\r\n <mf-divider [label]=\"labels().divider\" />\r\n }\r\n\r\n <mf-field [label]=\"labels().email\" [for]=\"ids.email\" [error]=\"emailError()\" [required]=\"true\">\r\n <input\r\n mfInput\r\n [id]=\"ids.email\"\r\n type=\"email\"\r\n autocomplete=\"email\"\r\n [placeholder]=\"labels().emailPlaceholder\"\r\n [value]=\"email()\"\r\n [hasError]=\"!!emailError()\"\r\n (input)=\"email.set($any($event.target).value)\"\r\n />\r\n </mf-field>\r\n\r\n <div class=\"flex flex-col gap-1.5\">\r\n <div class=\"flex items-center justify-between gap-3\">\r\n <label [for]=\"ids.password\" class=\"text-label text-fg-muted\">{{ labels().password }}</label>\r\n @if (showForgotPassword()) {\r\n <button mfButton type=\"button\" appearance=\"link\" size=\"xs\" (click)=\"forgotPassword.emit()\">\r\n {{ labels().forgotPassword }}\r\n </button>\r\n }\r\n </div>\r\n <mf-password-input\r\n [inputId]=\"ids.password\"\r\n [(value)]=\"password\"\r\n [fullWidth]=\"true\"\r\n [hasError]=\"!!passwordError()\"\r\n />\r\n @if (passwordError(); as message) {\r\n <p class=\"text-sm text-danger\" aria-live=\"polite\">{{ message }}</p>\r\n }\r\n </div>\r\n\r\n @if (showRemember()) {\r\n <label class=\"flex items-center gap-2 text-sm text-fg-muted\">\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"remember()\"\r\n (change)=\"remember.set($any($event.target).checked)\"\r\n />\r\n {{ labels().remember }}\r\n </label>\r\n }\r\n\r\n <button mfButton type=\"submit\" size=\"lg\" [loading]=\"loading()\">{{ labels().submit }}</button>\r\n\r\n @if (showSignUp()) {\r\n <p class=\"text-center text-sm text-fg-muted\">\r\n {{ labels().noAccount }}\r\n <button mfButton type=\"button\" appearance=\"link\" size=\"sm\" (click)=\"signUp.emit()\">\r\n {{ labels().signUp }}\r\n </button>\r\n </p>\r\n }\r\n</form>\r\n" }]
100
+ }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], showRemember: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRemember", required: false }] }], showForgotPassword: [{ type: i0.Input, args: [{ isSignal: true, alias: "showForgotPassword", required: false }] }], showSignUp: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSignUp", required: false }] }], signIn: [{ type: i0.Output, args: ["signIn"] }], forgotPassword: [{ type: i0.Output, args: ["forgotPassword"] }], signUp: [{ type: i0.Output, args: ["signUp"] }], errorDismissed: [{ type: i0.Output, args: ["errorDismissed"] }], providers: [{ type: i0.ContentChild, args: [i0.forwardRef(() => AuthProviders), { isSignal: true }] }] } });
101
+
102
+ const EMAIL = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
103
+ /**
104
+ * `<mf-invite-members [roles]="roles" [loading]="sending()" (invite)="send($event)" />`
105
+ *
106
+ * Ekip daveti formu (Invite bloğunun tüketilebilir hâli): etiketli e-posta
107
+ * girişi (Enter/virgül ile birden çok adres), rol seçimi ve gönder. Geçersiz
108
+ * adresler gönderimde listelenir; `invite` yalnızca geçerli adreslerle yayılır
109
+ * ve başarılıysa tüketici `reset()` çağırabilir.
110
+ *
111
+ * Metinler `MfLabels.inviteMembers`; `roles` tüketicinin alanıdır (ör.
112
+ * Yönetici/Düzenleyici/Görüntüleyici). Varsayılan rol listenin ilkidir.
113
+ */
114
+ class InviteMembers {
115
+ roles = input.required(/* @ts-ignore */
116
+ ...(ngDevMode ? [{ debugName: "roles" }] : /* istanbul ignore next */ []));
117
+ loading = input(false, { ...(ngDevMode ? { debugName: "loading" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
118
+ title = input(/* @ts-ignore */
119
+ ...(ngDevMode ? [undefined, { debugName: "title" }] : /* istanbul ignore next */ []));
120
+ description = input(/* @ts-ignore */
121
+ ...(ngDevMode ? [undefined, { debugName: "description" }] : /* istanbul ignore next */ []));
122
+ invite = output();
123
+ labels = inject(MF_INVITE_MEMBERS_LABELS);
124
+ ids = { emails: nextId('mf-invite-emails'), role: nextId('mf-invite-role') };
125
+ emails = signal([], /* @ts-ignore */
126
+ ...(ngDevMode ? [{ debugName: "emails" }] : /* istanbul ignore next */ []));
127
+ role = linkedSignal(() => this.roles()[0]?.value ?? null, /* @ts-ignore */
128
+ ...(ngDevMode ? [{ debugName: "role" }] : /* istanbul ignore next */ []));
129
+ submitted = signal(false, /* @ts-ignore */
130
+ ...(ngDevMode ? [{ debugName: "submitted" }] : /* istanbul ignore next */ []));
131
+ invalid = computed(() => this.emails().filter((e) => !EMAIL.test(e.trim())), /* @ts-ignore */
132
+ ...(ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []));
133
+ error = computed(() => {
134
+ if (!this.submitted())
135
+ return undefined;
136
+ if (!this.emails().length)
137
+ return this.labels().emailsRequired;
138
+ const bad = this.invalid();
139
+ return bad.length ? this.labels().invalidEmails.replace('{emails}', bad.join(', ')) : undefined;
140
+ }, /* @ts-ignore */
141
+ ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
142
+ submit(event) {
143
+ event.preventDefault();
144
+ this.submitted.set(true);
145
+ const role = this.role();
146
+ if (this.error() || role === null || this.loading())
147
+ return;
148
+ this.invite.emit({ emails: this.emails().map((e) => e.trim()), role });
149
+ }
150
+ /** Başarılı gönderimden sonra formu boşaltır. */
151
+ reset() {
152
+ this.emails.set([]);
153
+ this.submitted.set(false);
154
+ }
155
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: InviteMembers, deps: [], target: i0.ɵɵFactoryTarget.Component });
156
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: InviteMembers, isStandalone: true, selector: "mf-invite-members", inputs: { roles: { classPropertyName: "roles", publicName: "roles", isSignal: true, isRequired: true, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { invite: "invite" }, host: { classAttribute: "@container block" }, exportAs: ["mfInviteMembers"], ngImport: i0, template: "<form class=\"flex flex-col gap-4\" novalidate (submit)=\"submit($event)\">\r\n <div>\r\n <h2 class=\"font-display text-title-sm text-fg\">{{ title() ?? labels().title }}</h2>\r\n <p class=\"mt-1 text-sm text-fg-muted\">{{ description() ?? labels().description }}</p>\r\n </div>\r\n\r\n <div class=\"flex flex-col gap-3 @lg:flex-row @lg:items-start\">\r\n <mf-field\r\n class=\"min-w-0 flex-1\"\r\n [label]=\"labels().emails\"\r\n [for]=\"ids.emails\"\r\n [error]=\"error()\"\r\n [required]=\"true\"\r\n >\r\n <mf-tag-input\r\n [inputId]=\"ids.emails\"\r\n [(value)]=\"emails\"\r\n [placeholder]=\"labels().emailsPlaceholder\"\r\n [hasError]=\"!!error()\"\r\n [fullWidth]=\"true\"\r\n [unique]=\"true\"\r\n />\r\n </mf-field>\r\n <mf-field class=\"@lg:w-44\" [label]=\"labels().role\">\r\n <mf-select [ariaLabel]=\"labels().role\" [options]=\"roles()\" [(value)]=\"role\" />\r\n </mf-field>\r\n </div>\r\n\r\n <div class=\"flex justify-end\">\r\n <button mfButton type=\"submit\" iconStart=\"send\" [loading]=\"loading()\">\r\n {{ labels().submit }}\r\n </button>\r\n </div>\r\n</form>\r\n", dependencies: [{ kind: "component", type: Button, selector: "button[mfButton], a[mfButton]", inputs: ["tone", "appearance", "size", "shape", "type", "loading", "iconStart", "iconEnd"], exportAs: ["mfButton"] }, { kind: "component", type: Field, selector: "mf-field", inputs: ["label", "for", "hint", "error", "required", "grow"] }, { kind: "component", type: Select, selector: "mf-select", inputs: ["options", "value", "multiple", "values", "maxVisibleChips", "placeholder", "disabled", "size", "hasError", "ariaLabel"], outputs: ["valueChange", "valuesChange"], exportAs: ["mfSelect"] }, { kind: "component", type: TagInput, selector: "mf-tag-input", inputs: ["value", "placeholder", "disabled", "hasError", "inputId", "ariaLabel", "fullWidth", "removeLabel", "unique"], outputs: ["valueChange"], exportAs: ["mfTagInput"] }] });
157
+ }
158
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: InviteMembers, decorators: [{
159
+ type: Component,
160
+ args: [{ selector: 'mf-invite-members', exportAs: 'mfInviteMembers', imports: [Button, Field, Select, TagInput], host: { class: '@container block' }, template: "<form class=\"flex flex-col gap-4\" novalidate (submit)=\"submit($event)\">\r\n <div>\r\n <h2 class=\"font-display text-title-sm text-fg\">{{ title() ?? labels().title }}</h2>\r\n <p class=\"mt-1 text-sm text-fg-muted\">{{ description() ?? labels().description }}</p>\r\n </div>\r\n\r\n <div class=\"flex flex-col gap-3 @lg:flex-row @lg:items-start\">\r\n <mf-field\r\n class=\"min-w-0 flex-1\"\r\n [label]=\"labels().emails\"\r\n [for]=\"ids.emails\"\r\n [error]=\"error()\"\r\n [required]=\"true\"\r\n >\r\n <mf-tag-input\r\n [inputId]=\"ids.emails\"\r\n [(value)]=\"emails\"\r\n [placeholder]=\"labels().emailsPlaceholder\"\r\n [hasError]=\"!!error()\"\r\n [fullWidth]=\"true\"\r\n [unique]=\"true\"\r\n />\r\n </mf-field>\r\n <mf-field class=\"@lg:w-44\" [label]=\"labels().role\">\r\n <mf-select [ariaLabel]=\"labels().role\" [options]=\"roles()\" [(value)]=\"role\" />\r\n </mf-field>\r\n </div>\r\n\r\n <div class=\"flex justify-end\">\r\n <button mfButton type=\"submit\" iconStart=\"send\" [loading]=\"loading()\">\r\n {{ labels().submit }}\r\n </button>\r\n </div>\r\n</form>\r\n" }]
161
+ }], propDecorators: { roles: [{ type: i0.Input, args: [{ isSignal: true, alias: "roles", required: true }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }], invite: [{ type: i0.Output, args: ["invite"] }] } });
162
+
163
+ /** `mf-settings-section`'ın alt eylem şeridi — sönük zemin, sağa hizalı düğmeler. */
164
+ class SettingsActions {
165
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SettingsActions, deps: [], target: i0.ɵɵFactoryTarget.Directive });
166
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.6", type: SettingsActions, isStandalone: true, selector: "[mfSettingsActions]", host: { classAttribute: "flex flex-wrap items-center justify-end gap-2 border-t border-hairline bg-surface-sunken px-5 py-3" }, ngImport: i0 });
167
+ }
168
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SettingsActions, decorators: [{
169
+ type: Directive,
170
+ args: [{
171
+ selector: '[mfSettingsActions]',
172
+ host: {
173
+ class: 'flex flex-wrap items-center justify-end gap-2 border-t border-hairline bg-surface-sunken px-5 py-3',
174
+ },
175
+ }]
176
+ }] });
177
+ /**
178
+ * `<mf-settings-section heading="Profil" description="Herkese görünen bilgiler.">
179
+ * …alanlar…
180
+ * <div mfSettingsActions><button mfButton>Kaydet</button></div>
181
+ * </mf-settings-section>`
182
+ *
183
+ * Ayarlar sayfalarının iki sütunlu bölüm düzeni (Settings bloğundan): solda
184
+ * başlık + açıklama, sağda kart içinde alanlar, altta isteğe bağlı eylem
185
+ * şeridi. Dar kapsayıcıda tek sütuna iner (`@container`). Bölüm başlığıyla
186
+ * adlandırılmış bir `<section>`; metnin tamamı tüketiciden gelir.
187
+ */
188
+ class SettingsSection {
189
+ heading = input.required(/* @ts-ignore */
190
+ ...(ngDevMode ? [{ debugName: "heading" }] : /* istanbul ignore next */ []));
191
+ description = input(/* @ts-ignore */
192
+ ...(ngDevMode ? [undefined, { debugName: "description" }] : /* istanbul ignore next */ []));
193
+ headingId = nextId('mf-settings-heading');
194
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SettingsSection, deps: [], target: i0.ɵɵFactoryTarget.Component });
195
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: SettingsSection, isStandalone: true, selector: "mf-settings-section", inputs: { heading: { classPropertyName: "heading", publicName: "heading", isSignal: true, isRequired: true, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "@container block" }, exportAs: ["mfSettingsSection"], ngImport: i0, template: "<section\r\n [attr.aria-labelledby]=\"headingId\"\r\n class=\"grid gap-4 @3xl:grid-cols-[16rem_1fr] @3xl:gap-10\"\r\n>\r\n <div>\r\n <h2 [id]=\"headingId\" class=\"font-display text-title-sm text-fg\">{{ heading() }}</h2>\r\n @if (description()) {\r\n <p class=\"mt-1 text-sm text-fg-muted\">{{ description() }}</p>\r\n }\r\n </div>\r\n <div class=\"overflow-hidden rounded-xl border border-hairline bg-surface\">\r\n <div class=\"flex flex-col gap-5 p-5 @md:p-6\"><ng-content /></div>\r\n <ng-content select=\"[mfSettingsActions]\" />\r\n </div>\r\n</section>\r\n" });
196
+ }
197
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SettingsSection, decorators: [{
198
+ type: Component,
199
+ args: [{ selector: 'mf-settings-section', exportAs: 'mfSettingsSection', host: { class: '@container block' }, template: "<section\r\n [attr.aria-labelledby]=\"headingId\"\r\n class=\"grid gap-4 @3xl:grid-cols-[16rem_1fr] @3xl:gap-10\"\r\n>\r\n <div>\r\n <h2 [id]=\"headingId\" class=\"font-display text-title-sm text-fg\">{{ heading() }}</h2>\r\n @if (description()) {\r\n <p class=\"mt-1 text-sm text-fg-muted\">{{ description() }}</p>\r\n }\r\n </div>\r\n <div class=\"overflow-hidden rounded-xl border border-hairline bg-surface\">\r\n <div class=\"flex flex-col gap-5 p-5 @md:p-6\"><ng-content /></div>\r\n <ng-content select=\"[mfSettingsActions]\" />\r\n </div>\r\n</section>\r\n" }]
200
+ }], propDecorators: { heading: [{ type: i0.Input, args: [{ isSignal: true, alias: "heading", required: true }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }] } });
201
+
202
+ /**
203
+ * Generated bundle index. Do not edit.
204
+ */
205
+
206
+ export { AuthCard, AuthProviders, InviteMembers, SettingsActions, SettingsSection };
207
+ //# sourceMappingURL=mesgflow-ui-kit-blocks.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesgflow-ui-kit-blocks.mjs","sources":["../../../projects/ui-kit/blocks/auth-card.ts","../../../projects/ui-kit/blocks/auth-card.html","../../../projects/ui-kit/blocks/invite-members.ts","../../../projects/ui-kit/blocks/invite-members.html","../../../projects/ui-kit/blocks/settings-section.ts","../../../projects/ui-kit/blocks/settings-section.html","../../../projects/ui-kit/blocks/mesgflow-ui-kit-blocks.ts"],"sourcesContent":["import {\r\n Component,\r\n Directive,\r\n booleanAttribute,\r\n computed,\r\n contentChild,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { Alert } from '@mesgflow/ui-kit/alert';\r\nimport { Button } from '@mesgflow/ui-kit/button';\r\nimport { Checkbox } from '@mesgflow/ui-kit/checkbox';\r\nimport { MF_AUTH_CARD_LABELS, nextId } from '@mesgflow/ui-kit/core';\r\nimport { Divider } from '@mesgflow/ui-kit/divider';\r\nimport { Field } from '@mesgflow/ui-kit/field';\r\nimport { Input } from '@mesgflow/ui-kit/input';\r\nimport { PasswordInput } from '@mesgflow/ui-kit/password-input';\r\n\r\nexport interface AuthCredentials {\r\n email: string;\r\n password: string;\r\n remember: boolean;\r\n}\r\n\r\nconst EMAIL = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n\r\n/**\r\n * `<div mfAuthProviders>…GitHub/Google düğmeleri…</div>` — `mf-auth-card`\r\n * içinde e-posta formunun üstünde, ayırıcıyla birlikte gösterilir.\r\n */\r\n@Directive({ selector: '[mfAuthProviders]', host: { class: 'grid gap-2 @xs:grid-cols-2' } })\r\nexport class AuthProviders {}\r\n\r\n/**\r\n * `<mf-auth-card [loading]=\"busy()\" [error]=\"err()\" (signIn)=\"login($event)\" (forgotPassword)=\"…\" (signUp)=\"…\" />`\r\n *\r\n * Kullanıma hazır giriş kartı (Login bloğunun tüketilebilir hâli): başlık,\r\n * isteğe bağlı sosyal sağlayıcı slotu (`[mfAuthProviders]`), e-posta +\r\n * parola (göster/gizle), \"beni hatırla\", gönder ve kayıt bağlantısı.\r\n *\r\n * - Doğrulama yerleşik: boş/geçersiz e-posta ve boş parola alanın altında\r\n * (`mf-field`, `aria-invalid` + `aria-describedby`) gösterilir; `signIn`\r\n * yalnızca geçerli değerlerle yayılır.\r\n * - Sunucu hatası `error` girdisiyle üstte bir `role=\"alert\"` uyarısı olur.\r\n * - Tüm metinler `MfLabels.authCard` — `title`/`description` girdileri\r\n * yalnızca bu örnek için ezer.\r\n * - Kapsayıcı sorgusuyla (`@container`) dar yerlerde tek sütun.\r\n */\r\n@Component({\r\n selector: 'mf-auth-card',\r\n exportAs: 'mfAuthCard',\r\n imports: [Alert, Button, Checkbox, Divider, Field, Input, PasswordInput],\r\n host: { class: '@container block w-full max-w-sm' },\r\n templateUrl: './auth-card.html',\r\n})\r\nexport class AuthCard {\r\n readonly title = input<string>();\r\n readonly description = input<string>();\r\n readonly loading = input(false, { transform: booleanAttribute });\r\n /** Sunucudan dönen hata metni — boşsa uyarı gösterilmez. */\r\n readonly error = input<string | null>(null);\r\n readonly showRemember = input(true, { transform: booleanAttribute });\r\n /** `false` ise \"parolamı unuttum\" bağlantısı gizlenir. */\r\n readonly showForgotPassword = input(true, { transform: booleanAttribute });\r\n /** `false` ise alttaki kayıt satırı gizlenir. */\r\n readonly showSignUp = input(true, { transform: booleanAttribute });\r\n\r\n readonly signIn = output<AuthCredentials>();\r\n readonly forgotPassword = output<void>();\r\n readonly signUp = output<void>();\r\n readonly errorDismissed = output<void>();\r\n\r\n protected readonly labels = inject(MF_AUTH_CARD_LABELS);\r\n protected readonly ids = { email: nextId('mf-auth-email'), password: nextId('mf-auth-password') };\r\n protected readonly providers = contentChild(AuthProviders);\r\n\r\n protected readonly email = signal('');\r\n protected readonly password = signal('');\r\n protected readonly remember = signal(true);\r\n protected readonly submitted = signal(false);\r\n\r\n protected readonly emailError = computed(() => {\r\n if (!this.submitted()) return undefined;\r\n const value = this.email().trim();\r\n if (!value) return this.labels().emailRequired;\r\n return EMAIL.test(value) ? undefined : this.labels().emailInvalid;\r\n });\r\n protected readonly passwordError = computed(() =>\r\n this.submitted() && !this.password() ? this.labels().passwordRequired : undefined,\r\n );\r\n\r\n protected submit(event: Event): void {\r\n event.preventDefault();\r\n this.submitted.set(true);\r\n if (this.emailError() || this.passwordError() || this.loading()) return;\r\n this.signIn.emit({\r\n email: this.email().trim(),\r\n password: this.password(),\r\n remember: this.showRemember() && this.remember(),\r\n });\r\n }\r\n}\r\n","<form class=\"flex flex-col gap-5\" novalidate (submit)=\"submit($event)\">\r\n <div>\r\n <h2 class=\"font-display text-title text-fg\">{{ title() ?? labels().title }}</h2>\r\n <p class=\"mt-1 text-sm text-fg-muted\">{{ description() ?? labels().description }}</p>\r\n </div>\r\n\r\n @if (error()) {\r\n <mf-alert\r\n tone=\"danger\"\r\n [title]=\"labels().errorTitle\"\r\n [dismissible]=\"true\"\r\n (dismissed)=\"errorDismissed.emit()\"\r\n >{{ error() }}</mf-alert\r\n >\r\n }\r\n\r\n @if (providers()) {\r\n <ng-content select=\"[mfAuthProviders]\" />\r\n <mf-divider [label]=\"labels().divider\" />\r\n }\r\n\r\n <mf-field [label]=\"labels().email\" [for]=\"ids.email\" [error]=\"emailError()\" [required]=\"true\">\r\n <input\r\n mfInput\r\n [id]=\"ids.email\"\r\n type=\"email\"\r\n autocomplete=\"email\"\r\n [placeholder]=\"labels().emailPlaceholder\"\r\n [value]=\"email()\"\r\n [hasError]=\"!!emailError()\"\r\n (input)=\"email.set($any($event.target).value)\"\r\n />\r\n </mf-field>\r\n\r\n <div class=\"flex flex-col gap-1.5\">\r\n <div class=\"flex items-center justify-between gap-3\">\r\n <label [for]=\"ids.password\" class=\"text-label text-fg-muted\">{{ labels().password }}</label>\r\n @if (showForgotPassword()) {\r\n <button mfButton type=\"button\" appearance=\"link\" size=\"xs\" (click)=\"forgotPassword.emit()\">\r\n {{ labels().forgotPassword }}\r\n </button>\r\n }\r\n </div>\r\n <mf-password-input\r\n [inputId]=\"ids.password\"\r\n [(value)]=\"password\"\r\n [fullWidth]=\"true\"\r\n [hasError]=\"!!passwordError()\"\r\n />\r\n @if (passwordError(); as message) {\r\n <p class=\"text-sm text-danger\" aria-live=\"polite\">{{ message }}</p>\r\n }\r\n </div>\r\n\r\n @if (showRemember()) {\r\n <label class=\"flex items-center gap-2 text-sm text-fg-muted\">\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"remember()\"\r\n (change)=\"remember.set($any($event.target).checked)\"\r\n />\r\n {{ labels().remember }}\r\n </label>\r\n }\r\n\r\n <button mfButton type=\"submit\" size=\"lg\" [loading]=\"loading()\">{{ labels().submit }}</button>\r\n\r\n @if (showSignUp()) {\r\n <p class=\"text-center text-sm text-fg-muted\">\r\n {{ labels().noAccount }}\r\n <button mfButton type=\"button\" appearance=\"link\" size=\"sm\" (click)=\"signUp.emit()\">\r\n {{ labels().signUp }}\r\n </button>\r\n </p>\r\n }\r\n</form>\r\n","import {\r\n Component,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n input,\r\n linkedSignal,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { Button } from '@mesgflow/ui-kit/button';\r\nimport { MF_INVITE_MEMBERS_LABELS, nextId } from '@mesgflow/ui-kit/core';\r\nimport { Field } from '@mesgflow/ui-kit/field';\r\nimport { Select, type SelectOption } from '@mesgflow/ui-kit/select';\r\nimport { TagInput } from '@mesgflow/ui-kit/tag-input';\r\n\r\nexport interface MemberInvite<R = string> {\r\n emails: string[];\r\n role: R;\r\n}\r\n\r\nconst EMAIL = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n\r\n/**\r\n * `<mf-invite-members [roles]=\"roles\" [loading]=\"sending()\" (invite)=\"send($event)\" />`\r\n *\r\n * Ekip daveti formu (Invite bloğunun tüketilebilir hâli): etiketli e-posta\r\n * girişi (Enter/virgül ile birden çok adres), rol seçimi ve gönder. Geçersiz\r\n * adresler gönderimde listelenir; `invite` yalnızca geçerli adreslerle yayılır\r\n * ve başarılıysa tüketici `reset()` çağırabilir.\r\n *\r\n * Metinler `MfLabels.inviteMembers`; `roles` tüketicinin alanıdır (ör.\r\n * Yönetici/Düzenleyici/Görüntüleyici). Varsayılan rol listenin ilkidir.\r\n */\r\n@Component({\r\n selector: 'mf-invite-members',\r\n exportAs: 'mfInviteMembers',\r\n imports: [Button, Field, Select, TagInput],\r\n host: { class: '@container block' },\r\n templateUrl: './invite-members.html',\r\n})\r\nexport class InviteMembers<R = string> {\r\n readonly roles = input.required<SelectOption<R>[]>();\r\n readonly loading = input(false, { transform: booleanAttribute });\r\n readonly title = input<string>();\r\n readonly description = input<string>();\r\n\r\n readonly invite = output<MemberInvite<R>>();\r\n\r\n protected readonly labels = inject(MF_INVITE_MEMBERS_LABELS);\r\n protected readonly ids = { emails: nextId('mf-invite-emails'), role: nextId('mf-invite-role') };\r\n protected readonly emails = signal<string[]>([]);\r\n protected readonly role = linkedSignal<R | null>(() => this.roles()[0]?.value ?? null);\r\n protected readonly submitted = signal(false);\r\n\r\n protected readonly invalid = computed(() => this.emails().filter((e) => !EMAIL.test(e.trim())));\r\n protected readonly error = computed(() => {\r\n if (!this.submitted()) return undefined;\r\n if (!this.emails().length) return this.labels().emailsRequired;\r\n const bad = this.invalid();\r\n return bad.length ? this.labels().invalidEmails.replace('{emails}', bad.join(', ')) : undefined;\r\n });\r\n\r\n protected submit(event: Event): void {\r\n event.preventDefault();\r\n this.submitted.set(true);\r\n const role = this.role();\r\n if (this.error() || role === null || this.loading()) return;\r\n this.invite.emit({ emails: this.emails().map((e) => e.trim()), role });\r\n }\r\n\r\n /** Başarılı gönderimden sonra formu boşaltır. */\r\n reset(): void {\r\n this.emails.set([]);\r\n this.submitted.set(false);\r\n }\r\n}\r\n","<form class=\"flex flex-col gap-4\" novalidate (submit)=\"submit($event)\">\r\n <div>\r\n <h2 class=\"font-display text-title-sm text-fg\">{{ title() ?? labels().title }}</h2>\r\n <p class=\"mt-1 text-sm text-fg-muted\">{{ description() ?? labels().description }}</p>\r\n </div>\r\n\r\n <div class=\"flex flex-col gap-3 @lg:flex-row @lg:items-start\">\r\n <mf-field\r\n class=\"min-w-0 flex-1\"\r\n [label]=\"labels().emails\"\r\n [for]=\"ids.emails\"\r\n [error]=\"error()\"\r\n [required]=\"true\"\r\n >\r\n <mf-tag-input\r\n [inputId]=\"ids.emails\"\r\n [(value)]=\"emails\"\r\n [placeholder]=\"labels().emailsPlaceholder\"\r\n [hasError]=\"!!error()\"\r\n [fullWidth]=\"true\"\r\n [unique]=\"true\"\r\n />\r\n </mf-field>\r\n <mf-field class=\"@lg:w-44\" [label]=\"labels().role\">\r\n <mf-select [ariaLabel]=\"labels().role\" [options]=\"roles()\" [(value)]=\"role\" />\r\n </mf-field>\r\n </div>\r\n\r\n <div class=\"flex justify-end\">\r\n <button mfButton type=\"submit\" iconStart=\"send\" [loading]=\"loading()\">\r\n {{ labels().submit }}\r\n </button>\r\n </div>\r\n</form>\r\n","import { Component, Directive, input } from '@angular/core';\r\nimport { nextId } from '@mesgflow/ui-kit/core';\r\n\r\n/** `mf-settings-section`'ın alt eylem şeridi — sönük zemin, sağa hizalı düğmeler. */\r\n@Directive({\r\n selector: '[mfSettingsActions]',\r\n host: {\r\n class:\r\n 'flex flex-wrap items-center justify-end gap-2 border-t border-hairline bg-surface-sunken px-5 py-3',\r\n },\r\n})\r\nexport class SettingsActions {}\r\n\r\n/**\r\n * `<mf-settings-section heading=\"Profil\" description=\"Herkese görünen bilgiler.\">\r\n * …alanlar…\r\n * <div mfSettingsActions><button mfButton>Kaydet</button></div>\r\n * </mf-settings-section>`\r\n *\r\n * Ayarlar sayfalarının iki sütunlu bölüm düzeni (Settings bloğundan): solda\r\n * başlık + açıklama, sağda kart içinde alanlar, altta isteğe bağlı eylem\r\n * şeridi. Dar kapsayıcıda tek sütuna iner (`@container`). Bölüm başlığıyla\r\n * adlandırılmış bir `<section>`; metnin tamamı tüketiciden gelir.\r\n */\r\n@Component({\r\n selector: 'mf-settings-section',\r\n exportAs: 'mfSettingsSection',\r\n host: { class: '@container block' },\r\n templateUrl: './settings-section.html',\r\n})\r\nexport class SettingsSection {\r\n readonly heading = input.required<string>();\r\n readonly description = input<string>();\r\n protected readonly headingId = nextId('mf-settings-heading');\r\n}\r\n","<section\r\n [attr.aria-labelledby]=\"headingId\"\r\n class=\"grid gap-4 @3xl:grid-cols-[16rem_1fr] @3xl:gap-10\"\r\n>\r\n <div>\r\n <h2 [id]=\"headingId\" class=\"font-display text-title-sm text-fg\">{{ heading() }}</h2>\r\n @if (description()) {\r\n <p class=\"mt-1 text-sm text-fg-muted\">{{ description() }}</p>\r\n }\r\n </div>\r\n <div class=\"overflow-hidden rounded-xl border border-hairline bg-surface\">\r\n <div class=\"flex flex-col gap-5 p-5 @md:p-6\"><ng-content /></div>\r\n <ng-content select=\"[mfSettingsActions]\" />\r\n </div>\r\n</section>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["EMAIL"],"mappings":"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"}
@@ -63,11 +63,11 @@ class BoxInput extends ValueAccessorBase {
63
63
  }
64
64
  }
65
65
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: BoxInput, deps: null, target: i0.ɵɵFactoryTarget.Component });
66
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: BoxInput, isStandalone: true, selector: "mf-box-input", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, unit: { classPropertyName: "unit", publicName: "unit", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { classAttribute: "block" }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => BoxInput), multi: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"inline-flex items-end gap-1.5\">\r\n @for (side of sides; track side) {\r\n <div class=\"flex flex-col items-center gap-1\">\r\n <span class=\"text-xs text-fg-subtle\">{{ sideLabels()[side] }}</span>\r\n <mf-number-input\r\n class=\"w-20\"\r\n [value]=\"sideValue(side)\"\r\n (valueChange)=\"setSide(side, $event)\"\r\n [min]=\"min()\"\r\n [max]=\"max()\"\r\n [unit]=\"unit()\"\r\n [ariaLabel]=\"sideLabels()[side]\"\r\n [disabled]=\"disabled()\"\r\n />\r\n </div>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"mb-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-surface text-fg-subtle transition-colors duration-fast ease-emphasis hover:bg-surface-alt focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring disabled:pointer-events-none disabled:opacity-50\"\r\n [class.text-accent]=\"linked()\"\r\n [class.border-accent]=\"linked()\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"toggleLinked()\"\r\n [attr.aria-pressed]=\"linked()\"\r\n [attr.title]=\"linkToggleTitle()\"\r\n >\r\n <span mfIcon [size]=\"16\">{{ linked() ? 'link' : 'link_off' }}</span>\r\n </button>\r\n</div>\r\n", dependencies: [{ kind: "component", type: NumberInput, selector: "mf-number-input", inputs: ["value", "min", "max", "step", "unit", "disabled", "hasError", "ariaLabel"], outputs: ["valueChange"], exportAs: ["mfNumberInput"] }, { kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }] });
66
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: BoxInput, isStandalone: true, selector: "mf-box-input", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, unit: { classPropertyName: "unit", publicName: "unit", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { classAttribute: "block" }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => BoxInput), multi: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"inline-flex items-end gap-1.5\">\r\n @for (side of sides; track side) {\r\n <div class=\"flex flex-col items-center gap-1\">\r\n <span class=\"text-xs text-fg-subtle\">{{ sideLabels()[side] }}</span>\r\n <mf-number-input\r\n class=\"w-20\"\r\n [value]=\"sideValue(side)\"\r\n (valueChange)=\"setSide(side, $event)\"\r\n [min]=\"min()\"\r\n [max]=\"max()\"\r\n [unit]=\"unit()\"\r\n [ariaLabel]=\"sideLabels()[side]\"\r\n [disabled]=\"disabled()\"\r\n />\r\n </div>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"mb-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-surface text-fg-subtle transition-colors duration-fast ease-emphasis hover:bg-state-hover focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring disabled:pointer-events-none disabled:opacity-50\"\r\n [class.text-accent]=\"linked()\"\r\n [class.border-accent]=\"linked()\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"toggleLinked()\"\r\n [attr.aria-pressed]=\"linked()\"\r\n [attr.title]=\"linkToggleTitle()\"\r\n >\r\n <span mfIcon [size]=\"16\">{{ linked() ? 'link' : 'link_off' }}</span>\r\n </button>\r\n</div>\r\n", dependencies: [{ kind: "component", type: NumberInput, selector: "mf-number-input", inputs: ["value", "min", "max", "step", "unit", "disabled", "hasError", "inputId", "ariaLabel"], outputs: ["valueChange"], exportAs: ["mfNumberInput"] }, { kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }] });
67
67
  }
68
68
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: BoxInput, decorators: [{
69
69
  type: Component,
70
- args: [{ selector: 'mf-box-input', imports: [NumberInput, Icon], host: { class: 'block' }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => BoxInput), multi: true }], template: "<div class=\"inline-flex items-end gap-1.5\">\r\n @for (side of sides; track side) {\r\n <div class=\"flex flex-col items-center gap-1\">\r\n <span class=\"text-xs text-fg-subtle\">{{ sideLabels()[side] }}</span>\r\n <mf-number-input\r\n class=\"w-20\"\r\n [value]=\"sideValue(side)\"\r\n (valueChange)=\"setSide(side, $event)\"\r\n [min]=\"min()\"\r\n [max]=\"max()\"\r\n [unit]=\"unit()\"\r\n [ariaLabel]=\"sideLabels()[side]\"\r\n [disabled]=\"disabled()\"\r\n />\r\n </div>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"mb-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-surface text-fg-subtle transition-colors duration-fast ease-emphasis hover:bg-surface-alt focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring disabled:pointer-events-none disabled:opacity-50\"\r\n [class.text-accent]=\"linked()\"\r\n [class.border-accent]=\"linked()\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"toggleLinked()\"\r\n [attr.aria-pressed]=\"linked()\"\r\n [attr.title]=\"linkToggleTitle()\"\r\n >\r\n <span mfIcon [size]=\"16\">{{ linked() ? 'link' : 'link_off' }}</span>\r\n </button>\r\n</div>\r\n" }]
70
+ args: [{ selector: 'mf-box-input', imports: [NumberInput, Icon], host: { class: 'block' }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => BoxInput), multi: true }], template: "<div class=\"inline-flex items-end gap-1.5\">\r\n @for (side of sides; track side) {\r\n <div class=\"flex flex-col items-center gap-1\">\r\n <span class=\"text-xs text-fg-subtle\">{{ sideLabels()[side] }}</span>\r\n <mf-number-input\r\n class=\"w-20\"\r\n [value]=\"sideValue(side)\"\r\n (valueChange)=\"setSide(side, $event)\"\r\n [min]=\"min()\"\r\n [max]=\"max()\"\r\n [unit]=\"unit()\"\r\n [ariaLabel]=\"sideLabels()[side]\"\r\n [disabled]=\"disabled()\"\r\n />\r\n </div>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"mb-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-surface text-fg-subtle transition-colors duration-fast ease-emphasis hover:bg-state-hover focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring disabled:pointer-events-none disabled:opacity-50\"\r\n [class.text-accent]=\"linked()\"\r\n [class.border-accent]=\"linked()\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"toggleLinked()\"\r\n [attr.aria-pressed]=\"linked()\"\r\n [attr.title]=\"linkToggleTitle()\"\r\n >\r\n <span mfIcon [size]=\"16\">{{ linked() ? 'link' : 'link_off' }}</span>\r\n </button>\r\n</div>\r\n" }]
71
71
  }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], unit: [{ type: i0.Input, args: [{ isSignal: true, alias: "unit", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
72
72
 
73
73
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"mesgflow-ui-kit-box-input.mjs","sources":["../../../projects/ui-kit/box-input/box-input.ts","../../../projects/ui-kit/box-input/box-input.html","../../../projects/ui-kit/box-input/mesgflow-ui-kit-box-input.ts"],"sourcesContent":["import { Component, computed, forwardRef, inject, input, model, signal } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport { MF_BOX_INPUT_LABELS, ValueAccessorBase } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { NumberInput } from '@mesgflow/ui-kit/number-input';\r\n\r\nexport interface BoxValue {\r\n top: number;\r\n right: number;\r\n bottom: number;\r\n left: number;\r\n}\r\n\r\nconst SIDES: (keyof BoxValue)[] = ['top', 'right', 'bottom', 'left'];\r\n\r\n/**\r\n * `<mf-box-input [(value)]=\"padding\" unit=\"px\" />` — 4 kenar (padding/\r\n * margin/border) kutu-model girdisi. Bağlantılı mod (varsayılan AÇIK): tek\r\n * input değiştirmek dördünü BİRDEN değiştirir — zincir ikonuna tıklayınca\r\n * kenarlar bağımsızlaşır (kenarı ayırırken mevcut `top` değeri dördüne\r\n * BASILMAZ — sadece tekrar bağlarken senkronlanır). `NumberInput` üstüne\r\n * kompoze edilmiş bir COMPONENT (gerçek iç yapı — bkz. README \"Directive mi,\r\n * component mi?\").\r\n */\r\n@Component({\r\n selector: 'mf-box-input',\r\n imports: [NumberInput, Icon],\r\n host: { class: 'block' },\r\n templateUrl: './box-input.html',\r\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => BoxInput), multi: true }],\r\n})\r\nexport class BoxInput extends ValueAccessorBase<BoxValue> implements ControlValueAccessor {\r\n readonly value = model<BoxValue>({ top: 0, right: 0, bottom: 0, left: 0 });\r\n readonly unit = input('px');\r\n readonly min = input(0);\r\n readonly max = input<number | null>(null);\r\n readonly disabled = input(false);\r\n\r\n protected readonly linked = signal(true);\r\n protected readonly sides = SIDES;\r\n\r\n private readonly boxInputLabels = inject(MF_BOX_INPUT_LABELS);\r\n protected readonly sideLabels = computed(() => {\r\n const labels = this.boxInputLabels();\r\n return { top: labels.top, right: labels.right, bottom: labels.bottom, left: labels.left };\r\n });\r\n protected readonly linkToggleTitle = computed(() =>\r\n this.linked() ? this.boxInputLabels().unlinkSides : this.boxInputLabels().linkSides,\r\n );\r\n\r\n writeValue(value: BoxValue): void {\r\n this.value.set(value);\r\n }\r\n\r\n protected sideValue(side: keyof BoxValue): number {\r\n return this.value()[side];\r\n }\r\n\r\n protected setSide(side: keyof BoxValue, next: number | null): void {\r\n const n = next ?? 0;\r\n if (this.linked()) {\r\n this.value.set({ top: n, right: n, bottom: n, left: n });\r\n } else {\r\n this.value.update((v) => ({ ...v, [side]: n }));\r\n }\r\n this.onChange(this.value());\r\n this.onTouched();\r\n }\r\n\r\n protected toggleLinked(): void {\r\n this.linked.update((v) => !v);\r\n if (this.linked()) {\r\n const t = this.value().top;\r\n this.value.set({ top: t, right: t, bottom: t, left: t });\r\n this.onChange(this.value());\r\n }\r\n }\r\n}\r\n","<div class=\"inline-flex items-end gap-1.5\">\r\n @for (side of sides; track side) {\r\n <div class=\"flex flex-col items-center gap-1\">\r\n <span class=\"text-xs text-fg-subtle\">{{ sideLabels()[side] }}</span>\r\n <mf-number-input\r\n class=\"w-20\"\r\n [value]=\"sideValue(side)\"\r\n (valueChange)=\"setSide(side, $event)\"\r\n [min]=\"min()\"\r\n [max]=\"max()\"\r\n [unit]=\"unit()\"\r\n [ariaLabel]=\"sideLabels()[side]\"\r\n [disabled]=\"disabled()\"\r\n />\r\n </div>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"mb-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-surface text-fg-subtle transition-colors duration-fast ease-emphasis hover:bg-surface-alt focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring disabled:pointer-events-none disabled:opacity-50\"\r\n [class.text-accent]=\"linked()\"\r\n [class.border-accent]=\"linked()\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"toggleLinked()\"\r\n [attr.aria-pressed]=\"linked()\"\r\n [attr.title]=\"linkToggleTitle()\"\r\n >\r\n <span mfIcon [size]=\"16\">{{ linked() ? 'link' : 'link_off' }}</span>\r\n </button>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mesgflow-ui-kit-box-input.mjs","sources":["../../../projects/ui-kit/box-input/box-input.ts","../../../projects/ui-kit/box-input/box-input.html","../../../projects/ui-kit/box-input/mesgflow-ui-kit-box-input.ts"],"sourcesContent":["import { Component, computed, forwardRef, inject, input, model, signal } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport { MF_BOX_INPUT_LABELS, ValueAccessorBase } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { NumberInput } from '@mesgflow/ui-kit/number-input';\r\n\r\nexport interface BoxValue {\r\n top: number;\r\n right: number;\r\n bottom: number;\r\n left: number;\r\n}\r\n\r\nconst SIDES: (keyof BoxValue)[] = ['top', 'right', 'bottom', 'left'];\r\n\r\n/**\r\n * `<mf-box-input [(value)]=\"padding\" unit=\"px\" />` — 4 kenar (padding/\r\n * margin/border) kutu-model girdisi. Bağlantılı mod (varsayılan AÇIK): tek\r\n * input değiştirmek dördünü BİRDEN değiştirir — zincir ikonuna tıklayınca\r\n * kenarlar bağımsızlaşır (kenarı ayırırken mevcut `top` değeri dördüne\r\n * BASILMAZ — sadece tekrar bağlarken senkronlanır). `NumberInput` üstüne\r\n * kompoze edilmiş bir COMPONENT (gerçek iç yapı — bkz. README \"Directive mi,\r\n * component mi?\").\r\n */\r\n@Component({\r\n selector: 'mf-box-input',\r\n imports: [NumberInput, Icon],\r\n host: { class: 'block' },\r\n templateUrl: './box-input.html',\r\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => BoxInput), multi: true }],\r\n})\r\nexport class BoxInput extends ValueAccessorBase<BoxValue> implements ControlValueAccessor {\r\n readonly value = model<BoxValue>({ top: 0, right: 0, bottom: 0, left: 0 });\r\n readonly unit = input('px');\r\n readonly min = input(0);\r\n readonly max = input<number | null>(null);\r\n readonly disabled = input(false);\r\n\r\n protected readonly linked = signal(true);\r\n protected readonly sides = SIDES;\r\n\r\n private readonly boxInputLabels = inject(MF_BOX_INPUT_LABELS);\r\n protected readonly sideLabels = computed(() => {\r\n const labels = this.boxInputLabels();\r\n return { top: labels.top, right: labels.right, bottom: labels.bottom, left: labels.left };\r\n });\r\n protected readonly linkToggleTitle = computed(() =>\r\n this.linked() ? this.boxInputLabels().unlinkSides : this.boxInputLabels().linkSides,\r\n );\r\n\r\n writeValue(value: BoxValue): void {\r\n this.value.set(value);\r\n }\r\n\r\n protected sideValue(side: keyof BoxValue): number {\r\n return this.value()[side];\r\n }\r\n\r\n protected setSide(side: keyof BoxValue, next: number | null): void {\r\n const n = next ?? 0;\r\n if (this.linked()) {\r\n this.value.set({ top: n, right: n, bottom: n, left: n });\r\n } else {\r\n this.value.update((v) => ({ ...v, [side]: n }));\r\n }\r\n this.onChange(this.value());\r\n this.onTouched();\r\n }\r\n\r\n protected toggleLinked(): void {\r\n this.linked.update((v) => !v);\r\n if (this.linked()) {\r\n const t = this.value().top;\r\n this.value.set({ top: t, right: t, bottom: t, left: t });\r\n this.onChange(this.value());\r\n }\r\n }\r\n}\r\n","<div class=\"inline-flex items-end gap-1.5\">\r\n @for (side of sides; track side) {\r\n <div class=\"flex flex-col items-center gap-1\">\r\n <span class=\"text-xs text-fg-subtle\">{{ sideLabels()[side] }}</span>\r\n <mf-number-input\r\n class=\"w-20\"\r\n [value]=\"sideValue(side)\"\r\n (valueChange)=\"setSide(side, $event)\"\r\n [min]=\"min()\"\r\n [max]=\"max()\"\r\n [unit]=\"unit()\"\r\n [ariaLabel]=\"sideLabels()[side]\"\r\n [disabled]=\"disabled()\"\r\n />\r\n </div>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"mb-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-surface text-fg-subtle transition-colors duration-fast ease-emphasis hover:bg-state-hover focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring disabled:pointer-events-none disabled:opacity-50\"\r\n [class.text-accent]=\"linked()\"\r\n [class.border-accent]=\"linked()\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"toggleLinked()\"\r\n [attr.aria-pressed]=\"linked()\"\r\n [attr.title]=\"linkToggleTitle()\"\r\n >\r\n <span mfIcon [size]=\"16\">{{ linked() ? 'link' : 'link_off' }}</span>\r\n </button>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}