@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
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, inject, computed, Component } from '@angular/core';
2
+ import { input, booleanAttribute, inject, computed, Component } from '@angular/core';
3
3
  import { MF_PROGRESS_LABELS, cn } from '@mesgflow/ui-kit/core';
4
4
  import { cva } from 'class-variance-authority';
5
5
 
@@ -8,42 +8,138 @@ const progressTrackVariants = cva('relative block w-full overflow-hidden rounded
8
8
  size: {
9
9
  sm: 'h-1',
10
10
  md: 'h-1.5',
11
+ lg: 'h-2.5',
11
12
  },
12
13
  },
13
14
  defaultVariants: { size: 'md' },
14
15
  });
15
16
 
17
+ /** Halka çapı (px) ve çizgi kalınlığı — boyut ekseni doğrusal çubuğun kalınlığıyla eşleşir. */
18
+ const RING = {
19
+ sm: { size: 32, stroke: 3 },
20
+ md: { size: 48, stroke: 4 },
21
+ lg: { size: 72, stroke: 6 },
22
+ };
23
+ const RING_TONE = {
24
+ primary: 'text-accent',
25
+ success: 'text-success',
26
+ warning: 'text-warning',
27
+ danger: 'text-danger',
28
+ info: 'text-info',
29
+ help: 'text-help',
30
+ };
31
+ const BAR_TONE = {
32
+ primary: 'bg-accent-fill',
33
+ success: 'bg-success-fill',
34
+ warning: 'bg-warning-fill',
35
+ danger: 'bg-danger-fill',
36
+ info: 'bg-info-fill',
37
+ help: 'bg-help-fill',
38
+ };
16
39
  /**
17
- * `<mf-progress [value]="42" />` (belirlenmiş) veya `<mf-progress
18
- * indeterminate />` (belirsiz — yükleme/tarama gibi süresi bilinmeyen
19
- * işlemler). `animate-progress-slide` keyframe'i `Table`'ın `showStaleOverlay`
20
- * şeridiyle AYNI (tokens.css'te tek tanım, bkz. table.html) — iki yerde ayrı
21
- * ayrı animasyon TANIMLANMADI.
40
+ * `<mf-progress [value]="42" />` · `<mf-progress indeterminate />` ·
41
+ * `<mf-progress variant="ring" [value]="72" showValue />`
42
+ *
43
+ * - `linear` (varsayılan): ince çubuk; belirsiz modda kayan şerit
44
+ * (`animate-progress-slide`, Table'ın yenileme göstergesiyle aynı).
45
+ * - `ring`: dairesel gösterge — `stroke-dashoffset` geçişiyle akıcı dolar,
46
+ * belirsiz modda döner (`animate-spin-slow`). `showValue` ortada yüzdeyi yazar.
47
+ * - `tone`: dolgu rengi (kota uyarısı, hata vb.).
48
+ *
49
+ * `role="progressbar"` + `aria-valuenow` (belirsizde yazılmaz) host'ta.
22
50
  */
23
51
  class Progress {
24
52
  value = input(0, /* @ts-ignore */
25
53
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
26
- indeterminate = input(false, /* @ts-ignore */
27
- ...(ngDevMode ? [{ debugName: "indeterminate" }] : /* istanbul ignore next */ []));
54
+ indeterminate = input(false, { ...(ngDevMode ? { debugName: "indeterminate" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
28
55
  size = input('md', /* @ts-ignore */
29
56
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
30
- /** `role="progressbar"` için ARIA gerektirdiği erişilebilir ad — bağlamına göre (ör. "Loading", "File upload") override edilmeli; verilmezse `MF_PROGRESS_LABELS`. */
57
+ variant = input('linear', /* @ts-ignore */
58
+ ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
59
+ tone = input('primary', /* @ts-ignore */
60
+ ...(ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []));
61
+ /** Yalnızca `ring`: ortada yüzde metni. */
62
+ showValue = input(false, { ...(ngDevMode ? { debugName: "showValue" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
63
+ /** `role="progressbar"` için erişilebilir ad — verilmezse `MF_PROGRESS_LABELS`. */
31
64
  ariaLabel = input(/* @ts-ignore */
32
65
  ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
33
66
  progressLabels = inject(MF_PROGRESS_LABELS);
34
67
  effectiveAriaLabel = computed(() => this.ariaLabel() ?? this.progressLabels().ariaLabel, /* @ts-ignore */
35
68
  ...(ngDevMode ? [{ debugName: "effectiveAriaLabel" }] : /* istanbul ignore next */ []));
36
- clampedValue = computed(() => Math.min(100, Math.max(0, this.value())), /* @ts-ignore */
69
+ clampedValue = computed(() => Math.round(Math.min(100, Math.max(0, this.value()))), /* @ts-ignore */
37
70
  ...(ngDevMode ? [{ debugName: "clampedValue" }] : /* istanbul ignore next */ []));
38
- trackClasses = computed(() => cn(progressTrackVariants({ size: this.size() })), /* @ts-ignore */
39
- ...(ngDevMode ? [{ debugName: "trackClasses" }] : /* istanbul ignore next */ []));
71
+ ring = computed(() => RING[this.size() ?? 'md'], /* @ts-ignore */
72
+ ...(ngDevMode ? [{ debugName: "ring" }] : /* istanbul ignore next */ []));
73
+ radius = computed(() => (this.ring().size - this.ring().stroke) / 2, /* @ts-ignore */
74
+ ...(ngDevMode ? [{ debugName: "radius" }] : /* istanbul ignore next */ []));
75
+ circumference = computed(() => 2 * Math.PI * this.radius(), /* @ts-ignore */
76
+ ...(ngDevMode ? [{ debugName: "circumference" }] : /* istanbul ignore next */ []));
77
+ dashOffset = computed(() => {
78
+ // Belirsiz halka: çeyrek yay döner.
79
+ const filled = this.indeterminate() ? 25 : this.clampedValue();
80
+ return this.circumference() * (1 - filled / 100);
81
+ }, /* @ts-ignore */
82
+ ...(ngDevMode ? [{ debugName: "dashOffset" }] : /* istanbul ignore next */ []));
83
+ ringToneClass = computed(() => RING_TONE[this.tone()], /* @ts-ignore */
84
+ ...(ngDevMode ? [{ debugName: "ringToneClass" }] : /* istanbul ignore next */ []));
85
+ barToneClass = computed(() => BAR_TONE[this.tone()], /* @ts-ignore */
86
+ ...(ngDevMode ? [{ debugName: "barToneClass" }] : /* istanbul ignore next */ []));
87
+ hostClasses = computed(() => this.variant() === 'ring'
88
+ ? cn('relative inline-flex shrink-0 items-center justify-center')
89
+ : cn(progressTrackVariants({ size: this.size() })), /* @ts-ignore */
90
+ ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
40
91
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Progress, deps: [], target: i0.ɵɵFactoryTarget.Component });
41
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Progress, isStandalone: true, selector: "mf-progress", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "progressbar" }, properties: { "attr.aria-valuenow": "indeterminate() ? null : clampedValue()", "attr.aria-valuemin": "0", "attr.aria-valuemax": "100", "attr.aria-label": "effectiveAriaLabel()", "class": "trackClasses()" } }, ngImport: i0, template: `
42
- @if (indeterminate()) {
43
- <div class="h-full w-1/3 animate-progress-slide bg-accent-fill" aria-hidden="true"></div>
92
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Progress, isStandalone: true, selector: "mf-progress", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, tone: { classPropertyName: "tone", publicName: "tone", isSignal: true, isRequired: false, transformFunction: null }, showValue: { classPropertyName: "showValue", publicName: "showValue", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "progressbar" }, properties: { "attr.aria-valuenow": "indeterminate() ? null : clampedValue()", "attr.aria-valuemin": "0", "attr.aria-valuemax": "100", "attr.aria-label": "effectiveAriaLabel()", "class": "hostClasses()" } }, ngImport: i0, template: `
93
+ @if (variant() === 'ring') {
94
+ <svg
95
+ [attr.width]="ring().size"
96
+ [attr.height]="ring().size"
97
+ [attr.viewBox]="'0 0 ' + ring().size + ' ' + ring().size"
98
+ class="-rotate-90 rtl:scale-x-[-1]"
99
+ [class]="ringToneClass()"
100
+ [class.animate-spin-slow]="indeterminate()"
101
+ aria-hidden="true"
102
+ >
103
+ <circle
104
+ [attr.cx]="ring().size / 2"
105
+ [attr.cy]="ring().size / 2"
106
+ [attr.r]="radius()"
107
+ fill="none"
108
+ stroke="currentColor"
109
+ stroke-opacity="0.15"
110
+ [attr.stroke-width]="ring().stroke"
111
+ />
112
+ <circle
113
+ [attr.cx]="ring().size / 2"
114
+ [attr.cy]="ring().size / 2"
115
+ [attr.r]="radius()"
116
+ fill="none"
117
+ stroke="currentColor"
118
+ stroke-linecap="round"
119
+ [attr.stroke-width]="ring().stroke"
120
+ [attr.stroke-dasharray]="circumference()"
121
+ [attr.stroke-dashoffset]="dashOffset()"
122
+ class="transition-[stroke-dashoffset] duration-slow ease-emphasis"
123
+ />
124
+ </svg>
125
+ @if (showValue() && !indeterminate()) {
126
+ <span
127
+ class="absolute inset-0 flex items-center justify-center font-medium text-fg tabular-nums"
128
+ [class]="size() === 'lg' ? 'text-base' : 'text-[0.6875rem]'"
129
+ aria-hidden="true"
130
+ >{{ clampedValue() }}%</span
131
+ >
132
+ }
133
+ } @else if (indeterminate()) {
134
+ <div
135
+ class="h-full w-1/3 animate-progress-slide"
136
+ [class]="barToneClass()"
137
+ aria-hidden="true"
138
+ ></div>
44
139
  } @else {
45
140
  <div
46
- class="h-full rounded-full bg-accent-fill transition-[width] duration-base ease-out"
141
+ class="h-full rounded-full transition-[width] duration-slow ease-emphasis"
142
+ [class]="barToneClass()"
47
143
  [style.width.%]="clampedValue()"
48
144
  ></div>
49
145
  }
@@ -59,20 +155,65 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
59
155
  '[attr.aria-valuemin]': '0',
60
156
  '[attr.aria-valuemax]': '100',
61
157
  '[attr.aria-label]': 'effectiveAriaLabel()',
62
- '[class]': 'trackClasses()',
158
+ '[class]': 'hostClasses()',
63
159
  },
64
160
  template: `
65
- @if (indeterminate()) {
66
- <div class="h-full w-1/3 animate-progress-slide bg-accent-fill" aria-hidden="true"></div>
161
+ @if (variant() === 'ring') {
162
+ <svg
163
+ [attr.width]="ring().size"
164
+ [attr.height]="ring().size"
165
+ [attr.viewBox]="'0 0 ' + ring().size + ' ' + ring().size"
166
+ class="-rotate-90 rtl:scale-x-[-1]"
167
+ [class]="ringToneClass()"
168
+ [class.animate-spin-slow]="indeterminate()"
169
+ aria-hidden="true"
170
+ >
171
+ <circle
172
+ [attr.cx]="ring().size / 2"
173
+ [attr.cy]="ring().size / 2"
174
+ [attr.r]="radius()"
175
+ fill="none"
176
+ stroke="currentColor"
177
+ stroke-opacity="0.15"
178
+ [attr.stroke-width]="ring().stroke"
179
+ />
180
+ <circle
181
+ [attr.cx]="ring().size / 2"
182
+ [attr.cy]="ring().size / 2"
183
+ [attr.r]="radius()"
184
+ fill="none"
185
+ stroke="currentColor"
186
+ stroke-linecap="round"
187
+ [attr.stroke-width]="ring().stroke"
188
+ [attr.stroke-dasharray]="circumference()"
189
+ [attr.stroke-dashoffset]="dashOffset()"
190
+ class="transition-[stroke-dashoffset] duration-slow ease-emphasis"
191
+ />
192
+ </svg>
193
+ @if (showValue() && !indeterminate()) {
194
+ <span
195
+ class="absolute inset-0 flex items-center justify-center font-medium text-fg tabular-nums"
196
+ [class]="size() === 'lg' ? 'text-base' : 'text-[0.6875rem]'"
197
+ aria-hidden="true"
198
+ >{{ clampedValue() }}%</span
199
+ >
200
+ }
201
+ } @else if (indeterminate()) {
202
+ <div
203
+ class="h-full w-1/3 animate-progress-slide"
204
+ [class]="barToneClass()"
205
+ aria-hidden="true"
206
+ ></div>
67
207
  } @else {
68
208
  <div
69
- class="h-full rounded-full bg-accent-fill transition-[width] duration-base ease-out"
209
+ class="h-full rounded-full transition-[width] duration-slow ease-emphasis"
210
+ [class]="barToneClass()"
70
211
  [style.width.%]="clampedValue()"
71
212
  ></div>
72
213
  }
73
214
  `,
74
215
  }]
75
- }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
216
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], tone: [{ type: i0.Input, args: [{ isSignal: true, alias: "tone", required: false }] }], showValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "showValue", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
76
217
 
77
218
  /**
78
219
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"mesgflow-ui-kit-progress.mjs","sources":["../../../projects/ui-kit/progress/progress.variants.ts","../../../projects/ui-kit/progress/progress.ts","../../../projects/ui-kit/progress/mesgflow-ui-kit-progress.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\r\n\r\nexport const progressTrackVariants = cva(\r\n 'relative block w-full overflow-hidden rounded-full bg-primary-tint',\r\n {\r\n variants: {\r\n size: {\r\n sm: 'h-1',\r\n md: 'h-1.5',\r\n },\r\n },\r\n defaultVariants: { size: 'md' },\r\n },\r\n);\r\n\r\nexport type ProgressSize = VariantProps<typeof progressTrackVariants>['size'];\r\n","import { Component, computed, inject, input } from '@angular/core';\r\nimport { cn, MF_PROGRESS_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { progressTrackVariants, type ProgressSize } from './progress.variants';\r\n\r\n/**\r\n * `<mf-progress [value]=\"42\" />` (belirlenmiş) veya `<mf-progress\r\n * indeterminate />` (belirsiz — yükleme/tarama gibi süresi bilinmeyen\r\n * işlemler). `animate-progress-slide` keyframe'i `Table`'ın `showStaleOverlay`\r\n * şeridiyle AYNI (tokens.css'te tek tanım, bkz. table.html) — iki yerde ayrı\r\n * ayrı animasyon TANIMLANMADI.\r\n */\r\n@Component({\r\n selector: 'mf-progress',\r\n host: {\r\n role: 'progressbar',\r\n '[attr.aria-valuenow]': 'indeterminate() ? null : clampedValue()',\r\n '[attr.aria-valuemin]': '0',\r\n '[attr.aria-valuemax]': '100',\r\n '[attr.aria-label]': 'effectiveAriaLabel()',\r\n '[class]': 'trackClasses()',\r\n },\r\n template: `\r\n @if (indeterminate()) {\r\n <div class=\"h-full w-1/3 animate-progress-slide bg-accent-fill\" aria-hidden=\"true\"></div>\r\n } @else {\r\n <div\r\n class=\"h-full rounded-full bg-accent-fill transition-[width] duration-base ease-out\"\r\n [style.width.%]=\"clampedValue()\"\r\n ></div>\r\n }\r\n `,\r\n})\r\nexport class Progress {\r\n readonly value = input(0);\r\n readonly indeterminate = input(false);\r\n readonly size = input<ProgressSize>('md');\r\n /** `role=\"progressbar\"` için ARIA gerektirdiği erişilebilir ad — bağlamına göre (ör. \"Loading\", \"File upload\") override edilmeli; verilmezse `MF_PROGRESS_LABELS`. */\r\n readonly ariaLabel = input<string>();\r\n\r\n private readonly progressLabels = inject(MF_PROGRESS_LABELS);\r\n protected readonly effectiveAriaLabel = computed(\r\n () => this.ariaLabel() ?? this.progressLabels().ariaLabel,\r\n );\r\n\r\n protected readonly clampedValue = computed(() => Math.min(100, Math.max(0, this.value())));\r\n protected readonly trackClasses = computed(() =>\r\n cn(progressTrackVariants({ size: this.size() })),\r\n );\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAEO,MAAM,qBAAqB,GAAG,GAAG,CACtC,oEAAoE,EACpE;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,KAAK;AACT,YAAA,EAAE,EAAE,OAAO;AACZ,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;AAChC,CAAA;;ACRH;;;;;;AAMG;MAsBU,QAAQ,CAAA;IACV,KAAK,GAAG,KAAK,CAAC,CAAC;8EAAC;IAChB,aAAa,GAAG,KAAK,CAAC,KAAK;sFAAC;IAC5B,IAAI,GAAG,KAAK,CAAe,IAAI;6EAAC;;AAEhC,IAAA,SAAS,GAAG,KAAK;6FAAU;AAEnB,IAAA,cAAc,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACzC,IAAA,kBAAkB,GAAG,QAAQ,CAC9C,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,SAAS;2FAC1D;IAEkB,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;qFAAC;AACvE,IAAA,YAAY,GAAG,QAAQ,CAAC,MACzC,EAAE,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;qFACjD;uGAfU,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,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,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,aAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,yCAAA,EAAA,oBAAA,EAAA,GAAA,EAAA,oBAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,OAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAXT,CAAA;;;;;;;;;AAST,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAEU,QAAQ,EAAA,UAAA,EAAA,CAAA;kBArBpB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,IAAI,EAAE;AACJ,wBAAA,IAAI,EAAE,aAAa;AACnB,wBAAA,sBAAsB,EAAE,yCAAyC;AACjE,wBAAA,sBAAsB,EAAE,GAAG;AAC3B,wBAAA,sBAAsB,EAAE,KAAK;AAC7B,wBAAA,mBAAmB,EAAE,sBAAsB;AAC3C,wBAAA,SAAS,EAAE,gBAAgB;AAC5B,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;AAST,EAAA,CAAA;AACF,iBAAA;;;AC/BD;;AAEG;;"}
1
+ {"version":3,"file":"mesgflow-ui-kit-progress.mjs","sources":["../../../projects/ui-kit/progress/progress.variants.ts","../../../projects/ui-kit/progress/progress.ts","../../../projects/ui-kit/progress/mesgflow-ui-kit-progress.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\r\n\r\nexport const progressTrackVariants = cva(\r\n 'relative block w-full overflow-hidden rounded-full bg-primary-tint',\r\n {\r\n variants: {\r\n size: {\r\n sm: 'h-1',\r\n md: 'h-1.5',\r\n lg: 'h-2.5',\r\n },\r\n },\r\n defaultVariants: { size: 'md' },\r\n },\r\n);\r\n\r\nexport type ProgressSize = VariantProps<typeof progressTrackVariants>['size'];\r\n","import { Component, booleanAttribute, computed, inject, input } from '@angular/core';\r\nimport { cn, MF_PROGRESS_LABELS, type MfTone } from '@mesgflow/ui-kit/core';\r\nimport { progressTrackVariants, type ProgressSize } from './progress.variants';\r\n\r\nexport type ProgressVariant = 'linear' | 'ring';\r\nexport type ProgressTone = Exclude<MfTone, 'neutral'>;\r\n\r\n/** Halka çapı (px) ve çizgi kalınlığı — boyut ekseni doğrusal çubuğun kalınlığıyla eşleşir. */\r\nconst RING: Record<NonNullable<ProgressSize>, { size: number; stroke: number }> = {\r\n sm: { size: 32, stroke: 3 },\r\n md: { size: 48, stroke: 4 },\r\n lg: { size: 72, stroke: 6 },\r\n};\r\n\r\nconst RING_TONE: Record<ProgressTone, string> = {\r\n primary: 'text-accent',\r\n success: 'text-success',\r\n warning: 'text-warning',\r\n danger: 'text-danger',\r\n info: 'text-info',\r\n help: 'text-help',\r\n};\r\n\r\nconst BAR_TONE: Record<ProgressTone, string> = {\r\n primary: 'bg-accent-fill',\r\n success: 'bg-success-fill',\r\n warning: 'bg-warning-fill',\r\n danger: 'bg-danger-fill',\r\n info: 'bg-info-fill',\r\n help: 'bg-help-fill',\r\n};\r\n\r\n/**\r\n * `<mf-progress [value]=\"42\" />` · `<mf-progress indeterminate />` ·\r\n * `<mf-progress variant=\"ring\" [value]=\"72\" showValue />`\r\n *\r\n * - `linear` (varsayılan): ince çubuk; belirsiz modda kayan şerit\r\n * (`animate-progress-slide`, Table'ın yenileme göstergesiyle aynı).\r\n * - `ring`: dairesel gösterge — `stroke-dashoffset` geçişiyle akıcı dolar,\r\n * belirsiz modda döner (`animate-spin-slow`). `showValue` ortada yüzdeyi yazar.\r\n * - `tone`: dolgu rengi (kota uyarısı, hata vb.).\r\n *\r\n * `role=\"progressbar\"` + `aria-valuenow` (belirsizde yazılmaz) host'ta.\r\n */\r\n@Component({\r\n selector: 'mf-progress',\r\n host: {\r\n role: 'progressbar',\r\n '[attr.aria-valuenow]': 'indeterminate() ? null : clampedValue()',\r\n '[attr.aria-valuemin]': '0',\r\n '[attr.aria-valuemax]': '100',\r\n '[attr.aria-label]': 'effectiveAriaLabel()',\r\n '[class]': 'hostClasses()',\r\n },\r\n template: `\r\n @if (variant() === 'ring') {\r\n <svg\r\n [attr.width]=\"ring().size\"\r\n [attr.height]=\"ring().size\"\r\n [attr.viewBox]=\"'0 0 ' + ring().size + ' ' + ring().size\"\r\n class=\"-rotate-90 rtl:scale-x-[-1]\"\r\n [class]=\"ringToneClass()\"\r\n [class.animate-spin-slow]=\"indeterminate()\"\r\n aria-hidden=\"true\"\r\n >\r\n <circle\r\n [attr.cx]=\"ring().size / 2\"\r\n [attr.cy]=\"ring().size / 2\"\r\n [attr.r]=\"radius()\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-opacity=\"0.15\"\r\n [attr.stroke-width]=\"ring().stroke\"\r\n />\r\n <circle\r\n [attr.cx]=\"ring().size / 2\"\r\n [attr.cy]=\"ring().size / 2\"\r\n [attr.r]=\"radius()\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-linecap=\"round\"\r\n [attr.stroke-width]=\"ring().stroke\"\r\n [attr.stroke-dasharray]=\"circumference()\"\r\n [attr.stroke-dashoffset]=\"dashOffset()\"\r\n class=\"transition-[stroke-dashoffset] duration-slow ease-emphasis\"\r\n />\r\n </svg>\r\n @if (showValue() && !indeterminate()) {\r\n <span\r\n class=\"absolute inset-0 flex items-center justify-center font-medium text-fg tabular-nums\"\r\n [class]=\"size() === 'lg' ? 'text-base' : 'text-[0.6875rem]'\"\r\n aria-hidden=\"true\"\r\n >{{ clampedValue() }}%</span\r\n >\r\n }\r\n } @else if (indeterminate()) {\r\n <div\r\n class=\"h-full w-1/3 animate-progress-slide\"\r\n [class]=\"barToneClass()\"\r\n aria-hidden=\"true\"\r\n ></div>\r\n } @else {\r\n <div\r\n class=\"h-full rounded-full transition-[width] duration-slow ease-emphasis\"\r\n [class]=\"barToneClass()\"\r\n [style.width.%]=\"clampedValue()\"\r\n ></div>\r\n }\r\n `,\r\n})\r\nexport class Progress {\r\n readonly value = input(0);\r\n readonly indeterminate = input(false, { transform: booleanAttribute });\r\n readonly size = input<ProgressSize>('md');\r\n readonly variant = input<ProgressVariant>('linear');\r\n readonly tone = input<ProgressTone>('primary');\r\n /** Yalnızca `ring`: ortada yüzde metni. */\r\n readonly showValue = input(false, { transform: booleanAttribute });\r\n /** `role=\"progressbar\"` için erişilebilir ad — verilmezse `MF_PROGRESS_LABELS`. */\r\n readonly ariaLabel = input<string>();\r\n\r\n private readonly progressLabels = inject(MF_PROGRESS_LABELS);\r\n protected readonly effectiveAriaLabel = computed(\r\n () => this.ariaLabel() ?? this.progressLabels().ariaLabel,\r\n );\r\n\r\n protected readonly clampedValue = computed(() =>\r\n Math.round(Math.min(100, Math.max(0, this.value()))),\r\n );\r\n\r\n protected readonly ring = computed(() => RING[this.size() ?? 'md']);\r\n protected readonly radius = computed(() => (this.ring().size - this.ring().stroke) / 2);\r\n protected readonly circumference = computed(() => 2 * Math.PI * this.radius());\r\n protected readonly dashOffset = computed(() => {\r\n // Belirsiz halka: çeyrek yay döner.\r\n const filled = this.indeterminate() ? 25 : this.clampedValue();\r\n return this.circumference() * (1 - filled / 100);\r\n });\r\n\r\n protected readonly ringToneClass = computed(() => RING_TONE[this.tone()]);\r\n protected readonly barToneClass = computed(() => BAR_TONE[this.tone()]);\r\n\r\n protected readonly hostClasses = computed(() =>\r\n this.variant() === 'ring'\r\n ? cn('relative inline-flex shrink-0 items-center justify-center')\r\n : cn(progressTrackVariants({ size: this.size() })),\r\n );\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { model, input, computed, forwardRef, Component, inject, Directive } from '@angular/core';
3
- import { nextId, cn } from '@mesgflow/ui-kit/core';
3
+ import { nextId, cn, focusRecipe } from '@mesgflow/ui-kit/core';
4
4
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
5
5
 
6
6
  /**
@@ -75,8 +75,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
75
75
  const SIZE_CLASSES = { sm: 'h-3.5 w-3.5', md: 'h-4 w-4', lg: 'h-5 w-5' };
76
76
  /**
77
77
  * `<input type="radio" mfRadio [value]="'pro'" />` — `Checkbox` (bkz.
78
- * checkbox.ts) ile AYNI "native accent-color" deseni, `rounded-full` dışında
79
- * fark yok. Bir `mf-radio-group` ATASI ZORUNLU — `name`/`checked`/`disabled`
78
+ * checkbox.ts) ile AYNI desen — native input + `mf-radio` görsel katmanı
79
+ * (styles/tokens/controls.css, yay eğrisiyle büyüyen nokta). Bir `mf-radio-group` ATASI ZORUNLU — `name`/`checked`/`disabled`
80
80
  * DI ile ondan okunur (bkz. `radio-group.ts`'in JSDoc'u); grup dışında
81
81
  * kullanılırsa `inject(RadioGroup)` hata fırlatır (fail-fast).
82
82
  */
@@ -88,9 +88,7 @@ class Radio {
88
88
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
89
89
  disabled = input(false, /* @ts-ignore */
90
90
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
91
- classes = computed(() => cn(SIZE_CLASSES[this.size()], 'shrink-0 rounded-full border-border accent-primary-600 dark:accent-primary-400 transition-colors duration-fast ease-emphasis ' +
92
- 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring ' +
93
- 'disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50'), /* @ts-ignore */
91
+ classes = computed(() => cn('mf-radio', SIZE_CLASSES[this.size()], focusRecipe), /* @ts-ignore */
94
92
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
95
93
  onChange() {
96
94
  const value = this.value();
@@ -1 +1 @@
1
- {"version":3,"file":"mesgflow-ui-kit-radio.mjs","sources":["../../../projects/ui-kit/radio/radio-group.ts","../../../projects/ui-kit/radio/radio.ts","../../../projects/ui-kit/radio/mesgflow-ui-kit-radio.ts"],"sourcesContent":["import { Component, computed, forwardRef, input, model } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport { nextId } from '@mesgflow/ui-kit/core';\r\n\r\nexport type RadioGroupOrientation = 'horizontal' | 'vertical';\r\n\r\n/**\r\n * `<mf-radio-group [(value)]=\"plan\"><label><input type=\"radio\" mfRadio\r\n * [value]=\"'pro'\" /> Pro</label>...</mf-radio-group>`\r\n *\r\n * Projekte edilen `input[mfRadio]` öğeleri DI ile bu bileşene bağlanır\r\n * (`Radio`'nun `inject(RadioGroup)`'u — bkz. `radio.ts`), `name`/`checked`/\r\n * `disabled` GRUPTAN gelir; her `mfRadio` KENDİ `mf-radio-group` atası\r\n * DIŞINDA kullanılamaz.\r\n *\r\n * Ok tuşu navigasyonu/roving tabindex için ÖZEL bir odak yöneticisi\r\n * (`@angular/aria`'da radio pattern'i olmadığı için akla gelen CDK\r\n * `FocusKeyManager`) BİLEREK YOK — hepsi AYNI native `name` attribute'unu\r\n * paylaşan gerçek `<input type=\"radio\">` öğeleri olduğu için tarayıcı bunu\r\n * ZATEN ücretsiz sağlıyor (native radio grubu semantiği). Üstüne bir odak\r\n * yöneticisi eklemek gerçek davranışı TEKRARLAYIP çakıştırırdı.\r\n */\r\n@Component({\r\n selector: 'mf-radio-group',\r\n exportAs: 'mfRadioGroup',\r\n host: {\r\n role: 'radiogroup',\r\n '[class]': 'hostClasses()',\r\n '[attr.aria-label]': 'ariaLabel() || null',\r\n '[attr.aria-orientation]': 'orientation()',\r\n },\r\n template: '<ng-content />',\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RadioGroup), multi: true },\r\n ],\r\n})\r\nexport class RadioGroup<T = unknown> implements ControlValueAccessor {\r\n readonly value = model<T | null>(null);\r\n readonly name = input(nextId('mf-radio-group'));\r\n readonly orientation = input<RadioGroupOrientation>('vertical');\r\n readonly disabled = input(false);\r\n readonly ariaLabel = input('');\r\n\r\n private onChange: (value: T | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n protected readonly hostClasses = computed(() =>\r\n this.orientation() === 'horizontal' ? 'flex items-center gap-4' : 'flex flex-col gap-2',\r\n );\r\n\r\n writeValue(value: T | null): void {\r\n this.value.set(value);\r\n }\r\n\r\n registerOnChange(fn: (value: T | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n /** `Radio`'nun `(change)` işleyicisinden çağrılır — bkz. `radio.ts`. */\r\n onRadioChange(value: T): void {\r\n this.value.set(value);\r\n this.onChange(value);\r\n this.onTouched();\r\n }\r\n}\r\n","import { Directive, computed, inject, input } from '@angular/core';\r\nimport { cn, type MfSize } from '@mesgflow/ui-kit/core';\r\nimport { RadioGroup } from './radio-group';\r\n\r\nconst SIZE_CLASSES: Record<MfSize, string> = { sm: 'h-3.5 w-3.5', md: 'h-4 w-4', lg: 'h-5 w-5' };\r\n\r\n/**\r\n * `<input type=\"radio\" mfRadio [value]=\"'pro'\" />` — `Checkbox` (bkz.\r\n * checkbox.ts) ile AYNI \"native accent-color\" deseni, `rounded-full` dışında\r\n * fark yok. Bir `mf-radio-group` ATASI ZORUNLU — `name`/`checked`/`disabled`\r\n * DI ile ondan okunur (bkz. `radio-group.ts`'in JSDoc'u); grup dışında\r\n * kullanılırsa `inject(RadioGroup)` hata fırlatır (fail-fast).\r\n */\r\n@Directive({\r\n selector: 'input[type=radio][mfRadio]',\r\n host: {\r\n '[class]': 'classes()',\r\n '[attr.name]': 'group.name()',\r\n '[checked]': 'group.value() === value()',\r\n '[disabled]': 'group.disabled() || disabled()',\r\n '(change)': 'onChange()',\r\n },\r\n})\r\nexport class Radio<T = unknown> {\r\n protected readonly group = inject<RadioGroup<T>>(RadioGroup);\r\n\r\n readonly size = input<MfSize>('md');\r\n readonly value = input<T | undefined>(undefined);\r\n readonly disabled = input(false);\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n SIZE_CLASSES[this.size()],\r\n 'shrink-0 rounded-full border-border accent-primary-600 dark:accent-primary-400 transition-colors duration-fast ease-emphasis ' +\r\n 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring ' +\r\n 'disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',\r\n ),\r\n );\r\n\r\n protected onChange(): void {\r\n const value = this.value();\r\n if (value !== undefined) {\r\n this.group.onRadioChange(value);\r\n }\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAMA;;;;;;;;;;;;;;;AAeG;MAeU,UAAU,CAAA;IACZ,KAAK,GAAG,KAAK,CAAW,IAAI;8EAAC;AAC7B,IAAA,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC;6EAAC;IACtC,WAAW,GAAG,KAAK,CAAwB,UAAU;oFAAC;IACtD,QAAQ,GAAG,KAAK,CAAC,KAAK;iFAAC;IACvB,SAAS,GAAG,KAAK,CAAC,EAAE;kFAAC;AAEtB,IAAA,QAAQ,GAA8B,MAAK,EAAE,CAAC;AAC9C,IAAA,SAAS,GAAe,MAAK,EAAE,CAAC;AAErB,IAAA,WAAW,GAAG,QAAQ,CAAC,MACxC,IAAI,CAAC,WAAW,EAAE,KAAK,YAAY,GAAG,yBAAyB,GAAG,qBAAqB;oFACxF;AAED,IAAA,UAAU,CAAC,KAAe,EAAA;AACxB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;IACvB;AAEA,IAAA,gBAAgB,CAAC,EAA6B,EAAA;AAC5C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;;AAGA,IAAA,aAAa,CAAC,KAAQ,EAAA;AACpB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpB,IAAI,CAAC,SAAS,EAAE;IAClB;uGA/BW,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,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,YAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,eAAA,EAAA,EAAA,EAAA,SAAA,EAJV;AACT,YAAA,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;AACvF,SAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAHS,gBAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAKf,UAAU,EAAA,UAAA,EAAA,CAAA;kBAdtB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,IAAI,EAAE;AACJ,wBAAA,IAAI,EAAE,YAAY;AAClB,wBAAA,SAAS,EAAE,eAAe;AAC1B,wBAAA,mBAAmB,EAAE,qBAAqB;AAC1C,wBAAA,yBAAyB,EAAE,eAAe;AAC3C,qBAAA;AACD,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,SAAS,EAAE;AACT,wBAAA,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;AACvF,qBAAA;AACF,iBAAA;;;AC/BD,MAAM,YAAY,GAA2B,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE;AAEhG;;;;;;AAMG;MAWU,KAAK,CAAA;AACG,IAAA,KAAK,GAAG,MAAM,CAAgB,UAAU,CAAC;IAEnD,IAAI,GAAG,KAAK,CAAS,IAAI;6EAAC;IAC1B,KAAK,GAAG,KAAK,CAAgB,SAAS;8EAAC;IACvC,QAAQ,GAAG,KAAK,CAAC,KAAK;iFAAC;AAEb,IAAA,OAAO,GAAG,QAAQ,CAAC,MACpC,EAAE,CACA,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EACzB,+HAA+H;QAC7H,gHAAgH;AAChH,QAAA,8EAA8E,CACjF;gFACF;IAES,QAAQ,GAAA;AAChB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,YAAA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC;QACjC;IACF;uGArBW,KAAK,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAL,KAAK,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,YAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,SAAA,EAAA,2BAAA,EAAA,UAAA,EAAA,gCAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAL,KAAK,EAAA,UAAA,EAAA,CAAA;kBAVjB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,4BAA4B;AACtC,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,aAAa,EAAE,cAAc;AAC7B,wBAAA,WAAW,EAAE,2BAA2B;AACxC,wBAAA,YAAY,EAAE,gCAAgC;AAC9C,wBAAA,UAAU,EAAE,YAAY;AACzB,qBAAA;AACF,iBAAA;;;ACtBD;;AAEG;;"}
1
+ {"version":3,"file":"mesgflow-ui-kit-radio.mjs","sources":["../../../projects/ui-kit/radio/radio-group.ts","../../../projects/ui-kit/radio/radio.ts","../../../projects/ui-kit/radio/mesgflow-ui-kit-radio.ts"],"sourcesContent":["import { Component, computed, forwardRef, input, model } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport { nextId } from '@mesgflow/ui-kit/core';\r\n\r\nexport type RadioGroupOrientation = 'horizontal' | 'vertical';\r\n\r\n/**\r\n * `<mf-radio-group [(value)]=\"plan\"><label><input type=\"radio\" mfRadio\r\n * [value]=\"'pro'\" /> Pro</label>...</mf-radio-group>`\r\n *\r\n * Projekte edilen `input[mfRadio]` öğeleri DI ile bu bileşene bağlanır\r\n * (`Radio`'nun `inject(RadioGroup)`'u — bkz. `radio.ts`), `name`/`checked`/\r\n * `disabled` GRUPTAN gelir; her `mfRadio` KENDİ `mf-radio-group` atası\r\n * DIŞINDA kullanılamaz.\r\n *\r\n * Ok tuşu navigasyonu/roving tabindex için ÖZEL bir odak yöneticisi\r\n * (`@angular/aria`'da radio pattern'i olmadığı için akla gelen CDK\r\n * `FocusKeyManager`) BİLEREK YOK — hepsi AYNI native `name` attribute'unu\r\n * paylaşan gerçek `<input type=\"radio\">` öğeleri olduğu için tarayıcı bunu\r\n * ZATEN ücretsiz sağlıyor (native radio grubu semantiği). Üstüne bir odak\r\n * yöneticisi eklemek gerçek davranışı TEKRARLAYIP çakıştırırdı.\r\n */\r\n@Component({\r\n selector: 'mf-radio-group',\r\n exportAs: 'mfRadioGroup',\r\n host: {\r\n role: 'radiogroup',\r\n '[class]': 'hostClasses()',\r\n '[attr.aria-label]': 'ariaLabel() || null',\r\n '[attr.aria-orientation]': 'orientation()',\r\n },\r\n template: '<ng-content />',\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RadioGroup), multi: true },\r\n ],\r\n})\r\nexport class RadioGroup<T = unknown> implements ControlValueAccessor {\r\n readonly value = model<T | null>(null);\r\n readonly name = input(nextId('mf-radio-group'));\r\n readonly orientation = input<RadioGroupOrientation>('vertical');\r\n readonly disabled = input(false);\r\n readonly ariaLabel = input('');\r\n\r\n private onChange: (value: T | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n protected readonly hostClasses = computed(() =>\r\n this.orientation() === 'horizontal' ? 'flex items-center gap-4' : 'flex flex-col gap-2',\r\n );\r\n\r\n writeValue(value: T | null): void {\r\n this.value.set(value);\r\n }\r\n\r\n registerOnChange(fn: (value: T | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n /** `Radio`'nun `(change)` işleyicisinden çağrılır — bkz. `radio.ts`. */\r\n onRadioChange(value: T): void {\r\n this.value.set(value);\r\n this.onChange(value);\r\n this.onTouched();\r\n }\r\n}\r\n","import { Directive, computed, inject, input } from '@angular/core';\r\nimport { cn, type MfSize, focusRecipe } from '@mesgflow/ui-kit/core';\r\nimport { RadioGroup } from './radio-group';\r\n\r\nconst SIZE_CLASSES: Record<MfSize, string> = { sm: 'h-3.5 w-3.5', md: 'h-4 w-4', lg: 'h-5 w-5' };\r\n\r\n/**\r\n * `<input type=\"radio\" mfRadio [value]=\"'pro'\" />` — `Checkbox` (bkz.\r\n * checkbox.ts) ile AYNI desen — native input + `mf-radio` görsel katmanı\r\n * (styles/tokens/controls.css, yay eğrisiyle büyüyen nokta). Bir `mf-radio-group` ATASI ZORUNLU — `name`/`checked`/`disabled`\r\n * DI ile ondan okunur (bkz. `radio-group.ts`'in JSDoc'u); grup dışında\r\n * kullanılırsa `inject(RadioGroup)` hata fırlatır (fail-fast).\r\n */\r\n@Directive({\r\n selector: 'input[type=radio][mfRadio]',\r\n host: {\r\n '[class]': 'classes()',\r\n '[attr.name]': 'group.name()',\r\n '[checked]': 'group.value() === value()',\r\n '[disabled]': 'group.disabled() || disabled()',\r\n '(change)': 'onChange()',\r\n },\r\n})\r\nexport class Radio<T = unknown> {\r\n protected readonly group = inject<RadioGroup<T>>(RadioGroup);\r\n\r\n readonly size = input<MfSize>('md');\r\n readonly value = input<T | undefined>(undefined);\r\n readonly disabled = input(false);\r\n\r\n protected readonly classes = computed(() =>\r\n cn('mf-radio', SIZE_CLASSES[this.size()], focusRecipe),\r\n );\r\n\r\n protected onChange(): void {\r\n const value = this.value();\r\n if (value !== undefined) {\r\n this.group.onRadioChange(value);\r\n }\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAMA;;;;;;;;;;;;;;;AAeG;MAeU,UAAU,CAAA;IACZ,KAAK,GAAG,KAAK,CAAW,IAAI;8EAAC;AAC7B,IAAA,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC;6EAAC;IACtC,WAAW,GAAG,KAAK,CAAwB,UAAU;oFAAC;IACtD,QAAQ,GAAG,KAAK,CAAC,KAAK;iFAAC;IACvB,SAAS,GAAG,KAAK,CAAC,EAAE;kFAAC;AAEtB,IAAA,QAAQ,GAA8B,MAAK,EAAE,CAAC;AAC9C,IAAA,SAAS,GAAe,MAAK,EAAE,CAAC;AAErB,IAAA,WAAW,GAAG,QAAQ,CAAC,MACxC,IAAI,CAAC,WAAW,EAAE,KAAK,YAAY,GAAG,yBAAyB,GAAG,qBAAqB;oFACxF;AAED,IAAA,UAAU,CAAC,KAAe,EAAA;AACxB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;IACvB;AAEA,IAAA,gBAAgB,CAAC,EAA6B,EAAA;AAC5C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;;AAGA,IAAA,aAAa,CAAC,KAAQ,EAAA;AACpB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpB,IAAI,CAAC,SAAS,EAAE;IAClB;uGA/BW,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,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,YAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,eAAA,EAAA,EAAA,EAAA,SAAA,EAJV;AACT,YAAA,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;AACvF,SAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAHS,gBAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAKf,UAAU,EAAA,UAAA,EAAA,CAAA;kBAdtB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,IAAI,EAAE;AACJ,wBAAA,IAAI,EAAE,YAAY;AAClB,wBAAA,SAAS,EAAE,eAAe;AAC1B,wBAAA,mBAAmB,EAAE,qBAAqB;AAC1C,wBAAA,yBAAyB,EAAE,eAAe;AAC3C,qBAAA;AACD,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,SAAS,EAAE;AACT,wBAAA,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;AACvF,qBAAA;AACF,iBAAA;;;AC/BD,MAAM,YAAY,GAA2B,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE;AAEhG;;;;;;AAMG;MAWU,KAAK,CAAA;AACG,IAAA,KAAK,GAAG,MAAM,CAAgB,UAAU,CAAC;IAEnD,IAAI,GAAG,KAAK,CAAS,IAAI;6EAAC;IAC1B,KAAK,GAAG,KAAK,CAAgB,SAAS;8EAAC;IACvC,QAAQ,GAAG,KAAK,CAAC,KAAK;iFAAC;AAEb,IAAA,OAAO,GAAG,QAAQ,CAAC,MACpC,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,WAAW,CAAC;gFACvD;IAES,QAAQ,GAAA;AAChB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,YAAA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC;QACjC;IACF;uGAhBW,KAAK,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAL,KAAK,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,YAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,SAAA,EAAA,2BAAA,EAAA,UAAA,EAAA,gCAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAL,KAAK,EAAA,UAAA,EAAA,CAAA;kBAVjB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,4BAA4B;AACtC,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,aAAa,EAAE,cAAc;AAC7B,wBAAA,WAAW,EAAE,2BAA2B;AACxC,wBAAA,YAAY,EAAE,gCAAgC;AAC9C,wBAAA,UAAU,EAAE,YAAY;AACzB,qBAAA;AACF,iBAAA;;;ACtBD;;AAEG;;"}
@@ -95,7 +95,7 @@ class Rating extends ValueAccessorBase {
95
95
  this.formDisabled.set(disabled);
96
96
  }
97
97
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Rating, deps: null, target: i0.ɵɵFactoryTarget.Component });
98
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Rating, isStandalone: true, selector: "mf-rating", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, allowClear: { classPropertyName: "allowClear", publicName: "allowClear", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { listeners: { "pointerleave": "hover.set(null)" }, properties: { "attr.role": "readonly() ? 'img' : 'radiogroup'", "attr.aria-label": "hostLabel()", "attr.aria-disabled": "isDisabled() || null" }, classAttribute: "inline-flex" }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Rating), multi: true }], exportAs: ["mfRating"], usesInheritance: true, ngImport: i0, template: "@for (star of stars(); track star) {\r\n <!-- G\u00F6rsel y\u0131ld\u0131z: bo\u015F taban + \u00FCstte doluluk y\u00FCzdesi kadar k\u0131rp\u0131lm\u0131\u015F dolu y\u0131ld\u0131z. -->\r\n <ng-template #glyph>\r\n <span\r\n aria-hidden=\"true\"\r\n class=\"relative block\"\r\n [style.width.px]=\"size()\"\r\n [style.height.px]=\"size()\"\r\n >\r\n <span mfIcon [size]=\"size()\" class=\"absolute inset-0 text-fg-subtle\">star</span>\r\n <span class=\"absolute inset-y-0 start-0 overflow-hidden\" [style.width.%]=\"fill(star)\">\r\n <span mfIcon [size]=\"size()\" [filled]=\"true\" class=\"text-warning\">star</span>\r\n </span>\r\n </span>\r\n </ng-template>\r\n\r\n @if (readonly()) {\r\n <span class=\"p-0.5\"><ng-container [ngTemplateOutlet]=\"glyph\" /></span>\r\n } @else {\r\n <label\r\n class=\"cursor-pointer rounded-sm p-0.5 transition-transform duration-fast ease-spring has-[:focus-visible]:outline has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-1 has-[:focus-visible]:outline-focus-ring hover:scale-110\"\r\n [class.opacity-50]=\"isDisabled()\"\r\n [class.pointer-events-none]=\"isDisabled()\"\r\n (pointerenter)=\"preview(star)\"\r\n >\r\n <input\r\n type=\"radio\"\r\n class=\"sr-only\"\r\n [name]=\"name\"\r\n [value]=\"star\"\r\n [checked]=\"value() === star\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-label]=\"starLabel(star)\"\r\n (click)=\"choose(star)\"\r\n (keydown.delete)=\"clear($event)\"\r\n (keydown.backspace)=\"clear($event)\"\r\n (blur)=\"onTouched()\"\r\n />\r\n <ng-container [ngTemplateOutlet]=\"glyph\" />\r\n </label>\r\n }\r\n}\r\n", dependencies: [{ kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
98
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Rating, isStandalone: true, selector: "mf-rating", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, allowClear: { classPropertyName: "allowClear", publicName: "allowClear", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { listeners: { "pointerleave": "hover.set(null)" }, properties: { "attr.role": "readonly() ? 'img' : 'radiogroup'", "attr.aria-label": "hostLabel()", "attr.aria-disabled": "isDisabled() || null" }, classAttribute: "inline-flex" }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Rating), multi: true }], exportAs: ["mfRating"], usesInheritance: true, ngImport: i0, template: "@for (star of stars(); track star) {\r\n <!-- G\u00F6rsel y\u0131ld\u0131z: bo\u015F taban + \u00FCstte doluluk y\u00FCzdesi kadar k\u0131rp\u0131lm\u0131\u015F dolu y\u0131ld\u0131z. -->\r\n <ng-template #glyph>\r\n <span\r\n aria-hidden=\"true\"\r\n class=\"relative block\"\r\n [style.width.px]=\"size()\"\r\n [style.height.px]=\"size()\"\r\n >\r\n <span mfIcon [size]=\"size()\" class=\"absolute inset-0 text-fg-subtle\">star</span>\r\n <span class=\"absolute inset-y-0 start-0 overflow-hidden\" [style.width.%]=\"fill(star)\">\r\n <span mfIcon [size]=\"size()\" [filled]=\"true\" class=\"absolute top-0 start-0 text-warning\"\r\n >star</span\r\n >\r\n </span>\r\n </span>\r\n </ng-template>\r\n\r\n @if (readonly()) {\r\n <span class=\"p-0.5\"><ng-container [ngTemplateOutlet]=\"glyph\" /></span>\r\n } @else {\r\n <label\r\n class=\"cursor-pointer rounded-sm p-0.5 transition-transform duration-fast ease-spring has-[:focus-visible]:outline has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-1 has-[:focus-visible]:outline-focus-ring hover:scale-110\"\r\n [class.opacity-50]=\"isDisabled()\"\r\n [class.pointer-events-none]=\"isDisabled()\"\r\n (pointerenter)=\"preview(star)\"\r\n >\r\n <input\r\n type=\"radio\"\r\n class=\"sr-only\"\r\n [name]=\"name\"\r\n [value]=\"star\"\r\n [checked]=\"value() === star\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-label]=\"starLabel(star)\"\r\n (click)=\"choose(star)\"\r\n (keydown.delete)=\"clear($event)\"\r\n (keydown.backspace)=\"clear($event)\"\r\n (blur)=\"onTouched()\"\r\n />\r\n <ng-container [ngTemplateOutlet]=\"glyph\" />\r\n </label>\r\n }\r\n}\r\n", dependencies: [{ kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
99
99
  }
100
100
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Rating, decorators: [{
101
101
  type: Component,
@@ -105,7 +105,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
105
105
  '[attr.aria-label]': 'hostLabel()',
106
106
  '[attr.aria-disabled]': 'isDisabled() || null',
107
107
  '(pointerleave)': 'hover.set(null)',
108
- }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Rating), multi: true }], template: "@for (star of stars(); track star) {\r\n <!-- G\u00F6rsel y\u0131ld\u0131z: bo\u015F taban + \u00FCstte doluluk y\u00FCzdesi kadar k\u0131rp\u0131lm\u0131\u015F dolu y\u0131ld\u0131z. -->\r\n <ng-template #glyph>\r\n <span\r\n aria-hidden=\"true\"\r\n class=\"relative block\"\r\n [style.width.px]=\"size()\"\r\n [style.height.px]=\"size()\"\r\n >\r\n <span mfIcon [size]=\"size()\" class=\"absolute inset-0 text-fg-subtle\">star</span>\r\n <span class=\"absolute inset-y-0 start-0 overflow-hidden\" [style.width.%]=\"fill(star)\">\r\n <span mfIcon [size]=\"size()\" [filled]=\"true\" class=\"text-warning\">star</span>\r\n </span>\r\n </span>\r\n </ng-template>\r\n\r\n @if (readonly()) {\r\n <span class=\"p-0.5\"><ng-container [ngTemplateOutlet]=\"glyph\" /></span>\r\n } @else {\r\n <label\r\n class=\"cursor-pointer rounded-sm p-0.5 transition-transform duration-fast ease-spring has-[:focus-visible]:outline has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-1 has-[:focus-visible]:outline-focus-ring hover:scale-110\"\r\n [class.opacity-50]=\"isDisabled()\"\r\n [class.pointer-events-none]=\"isDisabled()\"\r\n (pointerenter)=\"preview(star)\"\r\n >\r\n <input\r\n type=\"radio\"\r\n class=\"sr-only\"\r\n [name]=\"name\"\r\n [value]=\"star\"\r\n [checked]=\"value() === star\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-label]=\"starLabel(star)\"\r\n (click)=\"choose(star)\"\r\n (keydown.delete)=\"clear($event)\"\r\n (keydown.backspace)=\"clear($event)\"\r\n (blur)=\"onTouched()\"\r\n />\r\n <ng-container [ngTemplateOutlet]=\"glyph\" />\r\n </label>\r\n }\r\n}\r\n" }]
108
+ }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Rating), multi: true }], template: "@for (star of stars(); track star) {\r\n <!-- G\u00F6rsel y\u0131ld\u0131z: bo\u015F taban + \u00FCstte doluluk y\u00FCzdesi kadar k\u0131rp\u0131lm\u0131\u015F dolu y\u0131ld\u0131z. -->\r\n <ng-template #glyph>\r\n <span\r\n aria-hidden=\"true\"\r\n class=\"relative block\"\r\n [style.width.px]=\"size()\"\r\n [style.height.px]=\"size()\"\r\n >\r\n <span mfIcon [size]=\"size()\" class=\"absolute inset-0 text-fg-subtle\">star</span>\r\n <span class=\"absolute inset-y-0 start-0 overflow-hidden\" [style.width.%]=\"fill(star)\">\r\n <span mfIcon [size]=\"size()\" [filled]=\"true\" class=\"absolute top-0 start-0 text-warning\"\r\n >star</span\r\n >\r\n </span>\r\n </span>\r\n </ng-template>\r\n\r\n @if (readonly()) {\r\n <span class=\"p-0.5\"><ng-container [ngTemplateOutlet]=\"glyph\" /></span>\r\n } @else {\r\n <label\r\n class=\"cursor-pointer rounded-sm p-0.5 transition-transform duration-fast ease-spring has-[:focus-visible]:outline has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-1 has-[:focus-visible]:outline-focus-ring hover:scale-110\"\r\n [class.opacity-50]=\"isDisabled()\"\r\n [class.pointer-events-none]=\"isDisabled()\"\r\n (pointerenter)=\"preview(star)\"\r\n >\r\n <input\r\n type=\"radio\"\r\n class=\"sr-only\"\r\n [name]=\"name\"\r\n [value]=\"star\"\r\n [checked]=\"value() === star\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-label]=\"starLabel(star)\"\r\n (click)=\"choose(star)\"\r\n (keydown.delete)=\"clear($event)\"\r\n (keydown.backspace)=\"clear($event)\"\r\n (blur)=\"onTouched()\"\r\n />\r\n <ng-container [ngTemplateOutlet]=\"glyph\" />\r\n </label>\r\n }\r\n}\r\n" }]
109
109
  }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], allowClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowClear", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
110
110
 
111
111
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"mesgflow-ui-kit-rating.mjs","sources":["../../../projects/ui-kit/rating/rating.ts","../../../projects/ui-kit/rating/rating.html","../../../projects/ui-kit/rating/mesgflow-ui-kit-rating.ts"],"sourcesContent":["import {\r\n Component,\r\n booleanAttribute,\r\n computed,\r\n forwardRef,\r\n inject,\r\n input,\r\n model,\r\n signal,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport { MF_RATING_LABELS, ValueAccessorBase } from '@mesgflow/ui-kit/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\n\r\nlet ratingIdSeq = 0;\r\n\r\n/**\r\n * `<mf-rating [(value)]=\"score\" />` · salt okunur ortalama: `<mf-rating [value]=\"3.7\" readonly />`\r\n *\r\n * Etkileşimli mod yerel `<input type=\"radio\">`'lar üzerine kurulu (görsel olarak gizli): ok tuşu\r\n * gezinmesi, tek sekme durağı, form davranışı tarayıcıdan gelir — `role=\"radiogroup\"` + her\r\n * yıldız \"3 out of 5\" gibi adlı bir radyo. Üzerine gelince önizleme; seçili yıldıza tekrar\r\n * tıklamak temizler (`allowClear`). Salt okunur mod tek bir `role=\"img\"` (\"3.7 out of 5\");\r\n * ondalıklar yıldızın kısmen dolmasıyla gösterilir (ortalama puanlar için).\r\n */\r\n@Component({\r\n selector: 'mf-rating',\r\n exportAs: 'mfRating',\r\n imports: [Icon, NgTemplateOutlet],\r\n host: {\r\n class: 'inline-flex',\r\n '[attr.role]': \"readonly() ? 'img' : 'radiogroup'\",\r\n '[attr.aria-label]': 'hostLabel()',\r\n '[attr.aria-disabled]': 'isDisabled() || null',\r\n '(pointerleave)': 'hover.set(null)',\r\n },\r\n templateUrl: './rating.html',\r\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Rating), multi: true }],\r\n})\r\nexport class Rating extends ValueAccessorBase<number> implements ControlValueAccessor {\r\n readonly value = model(0);\r\n readonly max = input(5);\r\n readonly readonly = input(false, { transform: booleanAttribute });\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n /** Seçili yıldıza tekrar tıklamak değeri 0'a çeker. */\r\n readonly allowClear = input(true, { transform: booleanAttribute });\r\n readonly size = input(20);\r\n /** Verilmezse `MfLabels.rating.ariaLabel`. */\r\n readonly ariaLabel = input<string>();\r\n\r\n protected readonly labels = inject(MF_RATING_LABELS);\r\n protected readonly name = `mf-rating-${++ratingIdSeq}`;\r\n protected readonly hover = signal<number | null>(null);\r\n private readonly formDisabled = signal(false);\r\n\r\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\r\n protected readonly stars = computed(() => Array.from({ length: this.max() }, (_, i) => i + 1));\r\n /** Görüntülenen değer — önizleme varsa o, yoksa gerçek değer. */\r\n protected readonly shown = computed(() => this.hover() ?? this.value());\r\n\r\n protected readonly hostLabel = computed(() => {\r\n const base = this.ariaLabel() ?? this.labels().ariaLabel;\r\n if (!this.readonly()) return base;\r\n const rounded = Math.round(this.value() * 10) / 10;\r\n return `${base}: ${rounded} ${this.labels().outOf} ${this.max()}`;\r\n });\r\n\r\n /** Yıldızın doluluk yüzdesi (0–100) — salt okunur ondalıklar için kısmi. */\r\n protected fill(star: number): number {\r\n const amount = this.shown() - (star - 1);\r\n return Math.round(Math.min(1, Math.max(0, amount)) * 100);\r\n }\r\n\r\n protected starLabel(star: number): string {\r\n return `${star} ${this.labels().outOf} ${this.max()}`;\r\n }\r\n\r\n /**\r\n * TEK giriş noktası `click`: tarayıcı ok tuşuyla radyo seçiminde de `click` üretir. `change`\r\n * ayrıca dinlenmez — seçili radyoya tıklamak `change` üretmediğinden temizleme yalnızca\r\n * click'te yakalanabiliyor, ikisini birden dinlemek ise yeni seçimde çift tetiklenirdi.\r\n */\r\n protected choose(star: number): void {\r\n if (this.readonly() || this.isDisabled()) return;\r\n const next = this.allowClear() && star === this.value() ? 0 : star;\r\n this.value.set(next);\r\n this.onChange(next);\r\n this.onTouched();\r\n }\r\n\r\n /**\r\n * Klavyeyle temizleme: Delete/Backspace. Seçili radyoda Space tarayıcıda `click` üretmez\r\n * (radyo zaten seçili — gerçek tarayıcıda doğrulandı), bu yüzden fareyle yeniden tıklamanın\r\n * klavye karşılığı ayrı bir tuş.\r\n */\r\n protected clear(event: Event): void {\r\n if (this.readonly() || this.isDisabled() || !this.allowClear() || this.value() === 0) return;\r\n event.preventDefault();\r\n this.value.set(0);\r\n this.onChange(0);\r\n this.onTouched();\r\n }\r\n\r\n protected preview(star: number | null): void {\r\n if (!this.readonly() && !this.isDisabled()) this.hover.set(star);\r\n }\r\n\r\n writeValue(value: number | null): void {\r\n this.value.set(value ?? 0);\r\n }\r\n\r\n setDisabledState(disabled: boolean): void {\r\n this.formDisabled.set(disabled);\r\n }\r\n}\r\n","@for (star of stars(); track star) {\r\n <!-- Görsel yıldız: boş taban + üstte doluluk yüzdesi kadar kırpılmış dolu yıldız. -->\r\n <ng-template #glyph>\r\n <span\r\n aria-hidden=\"true\"\r\n class=\"relative block\"\r\n [style.width.px]=\"size()\"\r\n [style.height.px]=\"size()\"\r\n >\r\n <span mfIcon [size]=\"size()\" class=\"absolute inset-0 text-fg-subtle\">star</span>\r\n <span class=\"absolute inset-y-0 start-0 overflow-hidden\" [style.width.%]=\"fill(star)\">\r\n <span mfIcon [size]=\"size()\" [filled]=\"true\" class=\"text-warning\">star</span>\r\n </span>\r\n </span>\r\n </ng-template>\r\n\r\n @if (readonly()) {\r\n <span class=\"p-0.5\"><ng-container [ngTemplateOutlet]=\"glyph\" /></span>\r\n } @else {\r\n <label\r\n class=\"cursor-pointer rounded-sm p-0.5 transition-transform duration-fast ease-spring has-[:focus-visible]:outline has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-1 has-[:focus-visible]:outline-focus-ring hover:scale-110\"\r\n [class.opacity-50]=\"isDisabled()\"\r\n [class.pointer-events-none]=\"isDisabled()\"\r\n (pointerenter)=\"preview(star)\"\r\n >\r\n <input\r\n type=\"radio\"\r\n class=\"sr-only\"\r\n [name]=\"name\"\r\n [value]=\"star\"\r\n [checked]=\"value() === star\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-label]=\"starLabel(star)\"\r\n (click)=\"choose(star)\"\r\n (keydown.delete)=\"clear($event)\"\r\n (keydown.backspace)=\"clear($event)\"\r\n (blur)=\"onTouched()\"\r\n />\r\n <ng-container [ngTemplateOutlet]=\"glyph\" />\r\n </label>\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;AAeA,IAAI,WAAW,GAAG,CAAC;AAEnB;;;;;;;;AAQG;AAeG,MAAO,MAAO,SAAQ,iBAAyB,CAAA;IAC1C,KAAK,GAAG,KAAK,CAAC,CAAC;8EAAC;IAChB,GAAG,GAAG,KAAK,CAAC,CAAC;4EAAC;IACd,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACxD,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,UAAU,GAAG,KAAK,CAAC,IAAI,kFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACzD,IAAI,GAAG,KAAK,CAAC,EAAE;6EAAC;;AAEhB,IAAA,SAAS,GAAG,KAAK;6FAAU;AAEjB,IAAA,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACjC,IAAA,IAAI,GAAG,CAAA,UAAA,EAAa,EAAE,WAAW,EAAE;IACnC,KAAK,GAAG,MAAM,CAAgB,IAAI;8EAAC;IACrC,YAAY,GAAG,MAAM,CAAC,KAAK;qFAAC;AAE1B,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE;mFAAC;AACnE,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;8EAAC;;AAE3E,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE;8EAAC;AAEpD,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AAC3C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS;AACxD,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAAE,YAAA,OAAO,IAAI;AACjC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE;AAClD,QAAA,OAAO,GAAG,IAAI,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAC,GAAG,EAAE,EAAE;IACnE,CAAC;kFAAC;;AAGQ,IAAA,IAAI,CAAC,IAAY,EAAA;AACzB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,GAAG,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC;IAC3D;AAEU,IAAA,SAAS,CAAC,IAAY,EAAA;AAC9B,QAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE;IACvD;AAEA;;;;AAIG;AACO,IAAA,MAAM,CAAC,IAAY,EAAA;QAC3B,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,KAAK,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI;AAClE,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,EAAE;IAClB;AAEA;;;;AAIG;AACO,IAAA,KAAK,CAAC,KAAY,EAAA;QAC1B,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC;YAAE;QACtF,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AACjB,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChB,IAAI,CAAC,SAAS,EAAE;IAClB;AAEU,IAAA,OAAO,CAAC,IAAmB,EAAA;QACnC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IAClE;AAEA,IAAA,UAAU,CAAC,KAAoB,EAAA;QAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC;IAC5B;AAEA,IAAA,gBAAgB,CAAC,QAAiB,EAAA;AAChC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;IACjC;uGA1EW,MAAM,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAN,MAAM,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,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,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,WAAA,EAAA,mCAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,EAAA,cAAA,EAAA,aAAA,EAAA,EAAA,SAAA,EAFN,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtCjG,mvDA0CA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDbY,IAAI,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAWrB,MAAM,EAAA,UAAA,EAAA,CAAA;kBAdlB,SAAS;+BACE,WAAW,EAAA,QAAA,EACX,UAAU,EAAA,OAAA,EACX,CAAC,IAAI,EAAE,gBAAgB,CAAC,EAAA,IAAA,EAC3B;AACJ,wBAAA,KAAK,EAAE,aAAa;AACpB,wBAAA,aAAa,EAAE,mCAAmC;AAClD,wBAAA,mBAAmB,EAAE,aAAa;AAClC,wBAAA,sBAAsB,EAAE,sBAAsB;AAC9C,wBAAA,gBAAgB,EAAE,iBAAiB;AACpC,qBAAA,EAAA,SAAA,EAEU,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAA,QAAA,EAAA,mvDAAA,EAAA;;;AEtCjG;;AAEG;;"}
1
+ {"version":3,"file":"mesgflow-ui-kit-rating.mjs","sources":["../../../projects/ui-kit/rating/rating.ts","../../../projects/ui-kit/rating/rating.html","../../../projects/ui-kit/rating/mesgflow-ui-kit-rating.ts"],"sourcesContent":["import {\r\n Component,\r\n booleanAttribute,\r\n computed,\r\n forwardRef,\r\n inject,\r\n input,\r\n model,\r\n signal,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport { MF_RATING_LABELS, ValueAccessorBase } from '@mesgflow/ui-kit/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\n\r\nlet ratingIdSeq = 0;\r\n\r\n/**\r\n * `<mf-rating [(value)]=\"score\" />` · salt okunur ortalama: `<mf-rating [value]=\"3.7\" readonly />`\r\n *\r\n * Etkileşimli mod yerel `<input type=\"radio\">`'lar üzerine kurulu (görsel olarak gizli): ok tuşu\r\n * gezinmesi, tek sekme durağı, form davranışı tarayıcıdan gelir — `role=\"radiogroup\"` + her\r\n * yıldız \"3 out of 5\" gibi adlı bir radyo. Üzerine gelince önizleme; seçili yıldıza tekrar\r\n * tıklamak temizler (`allowClear`). Salt okunur mod tek bir `role=\"img\"` (\"3.7 out of 5\");\r\n * ondalıklar yıldızın kısmen dolmasıyla gösterilir (ortalama puanlar için).\r\n */\r\n@Component({\r\n selector: 'mf-rating',\r\n exportAs: 'mfRating',\r\n imports: [Icon, NgTemplateOutlet],\r\n host: {\r\n class: 'inline-flex',\r\n '[attr.role]': \"readonly() ? 'img' : 'radiogroup'\",\r\n '[attr.aria-label]': 'hostLabel()',\r\n '[attr.aria-disabled]': 'isDisabled() || null',\r\n '(pointerleave)': 'hover.set(null)',\r\n },\r\n templateUrl: './rating.html',\r\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Rating), multi: true }],\r\n})\r\nexport class Rating extends ValueAccessorBase<number> implements ControlValueAccessor {\r\n readonly value = model(0);\r\n readonly max = input(5);\r\n readonly readonly = input(false, { transform: booleanAttribute });\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n /** Seçili yıldıza tekrar tıklamak değeri 0'a çeker. */\r\n readonly allowClear = input(true, { transform: booleanAttribute });\r\n readonly size = input(20);\r\n /** Verilmezse `MfLabels.rating.ariaLabel`. */\r\n readonly ariaLabel = input<string>();\r\n\r\n protected readonly labels = inject(MF_RATING_LABELS);\r\n protected readonly name = `mf-rating-${++ratingIdSeq}`;\r\n protected readonly hover = signal<number | null>(null);\r\n private readonly formDisabled = signal(false);\r\n\r\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\r\n protected readonly stars = computed(() => Array.from({ length: this.max() }, (_, i) => i + 1));\r\n /** Görüntülenen değer — önizleme varsa o, yoksa gerçek değer. */\r\n protected readonly shown = computed(() => this.hover() ?? this.value());\r\n\r\n protected readonly hostLabel = computed(() => {\r\n const base = this.ariaLabel() ?? this.labels().ariaLabel;\r\n if (!this.readonly()) return base;\r\n const rounded = Math.round(this.value() * 10) / 10;\r\n return `${base}: ${rounded} ${this.labels().outOf} ${this.max()}`;\r\n });\r\n\r\n /** Yıldızın doluluk yüzdesi (0–100) — salt okunur ondalıklar için kısmi. */\r\n protected fill(star: number): number {\r\n const amount = this.shown() - (star - 1);\r\n return Math.round(Math.min(1, Math.max(0, amount)) * 100);\r\n }\r\n\r\n protected starLabel(star: number): string {\r\n return `${star} ${this.labels().outOf} ${this.max()}`;\r\n }\r\n\r\n /**\r\n * TEK giriş noktası `click`: tarayıcı ok tuşuyla radyo seçiminde de `click` üretir. `change`\r\n * ayrıca dinlenmez — seçili radyoya tıklamak `change` üretmediğinden temizleme yalnızca\r\n * click'te yakalanabiliyor, ikisini birden dinlemek ise yeni seçimde çift tetiklenirdi.\r\n */\r\n protected choose(star: number): void {\r\n if (this.readonly() || this.isDisabled()) return;\r\n const next = this.allowClear() && star === this.value() ? 0 : star;\r\n this.value.set(next);\r\n this.onChange(next);\r\n this.onTouched();\r\n }\r\n\r\n /**\r\n * Klavyeyle temizleme: Delete/Backspace. Seçili radyoda Space tarayıcıda `click` üretmez\r\n * (radyo zaten seçili — gerçek tarayıcıda doğrulandı), bu yüzden fareyle yeniden tıklamanın\r\n * klavye karşılığı ayrı bir tuş.\r\n */\r\n protected clear(event: Event): void {\r\n if (this.readonly() || this.isDisabled() || !this.allowClear() || this.value() === 0) return;\r\n event.preventDefault();\r\n this.value.set(0);\r\n this.onChange(0);\r\n this.onTouched();\r\n }\r\n\r\n protected preview(star: number | null): void {\r\n if (!this.readonly() && !this.isDisabled()) this.hover.set(star);\r\n }\r\n\r\n writeValue(value: number | null): void {\r\n this.value.set(value ?? 0);\r\n }\r\n\r\n setDisabledState(disabled: boolean): void {\r\n this.formDisabled.set(disabled);\r\n }\r\n}\r\n","@for (star of stars(); track star) {\r\n <!-- Görsel yıldız: boş taban + üstte doluluk yüzdesi kadar kırpılmış dolu yıldız. -->\r\n <ng-template #glyph>\r\n <span\r\n aria-hidden=\"true\"\r\n class=\"relative block\"\r\n [style.width.px]=\"size()\"\r\n [style.height.px]=\"size()\"\r\n >\r\n <span mfIcon [size]=\"size()\" class=\"absolute inset-0 text-fg-subtle\">star</span>\r\n <span class=\"absolute inset-y-0 start-0 overflow-hidden\" [style.width.%]=\"fill(star)\">\r\n <span mfIcon [size]=\"size()\" [filled]=\"true\" class=\"absolute top-0 start-0 text-warning\"\r\n >star</span\r\n >\r\n </span>\r\n </span>\r\n </ng-template>\r\n\r\n @if (readonly()) {\r\n <span class=\"p-0.5\"><ng-container [ngTemplateOutlet]=\"glyph\" /></span>\r\n } @else {\r\n <label\r\n class=\"cursor-pointer rounded-sm p-0.5 transition-transform duration-fast ease-spring has-[:focus-visible]:outline has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-1 has-[:focus-visible]:outline-focus-ring hover:scale-110\"\r\n [class.opacity-50]=\"isDisabled()\"\r\n [class.pointer-events-none]=\"isDisabled()\"\r\n (pointerenter)=\"preview(star)\"\r\n >\r\n <input\r\n type=\"radio\"\r\n class=\"sr-only\"\r\n [name]=\"name\"\r\n [value]=\"star\"\r\n [checked]=\"value() === star\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-label]=\"starLabel(star)\"\r\n (click)=\"choose(star)\"\r\n (keydown.delete)=\"clear($event)\"\r\n (keydown.backspace)=\"clear($event)\"\r\n (blur)=\"onTouched()\"\r\n />\r\n <ng-container [ngTemplateOutlet]=\"glyph\" />\r\n </label>\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
4
  import { ValueAccessorBase, MF_SEARCH_INPUT_LABELS } from '@mesgflow/ui-kit/core';
5
5
  import { Icon } from '@mesgflow/ui-kit/icon';
6
6
  import { Input } from '@mesgflow/ui-kit/input';
7
+ import { Spinner } from '@mesgflow/ui-kit/spinner';
7
8
  import { Tooltip } from '@mesgflow/ui-kit/tooltip';
8
9
 
9
10
  /**
@@ -24,6 +25,9 @@ class SearchInput extends ValueAccessorBase {
24
25
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
25
26
  placeholder = input(/* @ts-ignore */
26
27
  ...(ngDevMode ? [undefined, { debugName: "placeholder" }] : /* istanbul ignore next */ []));
28
+ /** İç `<input>`'un id'si — harici bir `<label for>` / `mf-field for` ile ilişkilendirmek için. */
29
+ inputId = input(/* @ts-ignore */
30
+ ...(ngDevMode ? [undefined, { debugName: "inputId" }] : /* istanbul ignore next */ []));
27
31
  ariaLabel = input(/* @ts-ignore */
28
32
  ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
29
33
  tooltipLabel = input(/* @ts-ignore */
@@ -135,16 +139,16 @@ class SearchInput extends ValueAccessorBase {
135
139
  this.inputEl()?.nativeElement.blur();
136
140
  }
137
141
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SearchInput, deps: [], target: i0.ɵɵFactoryTarget.Component });
138
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: SearchInput, isStandalone: true, selector: "mf-search-input", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, tooltipLabel: { classPropertyName: "tooltipLabel", publicName: "tooltipLabel", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, debounceMs: { classPropertyName: "debounceMs", publicName: "debounceMs", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { properties: { "class.w-full": "fullWidth()" }, classAttribute: "inline-block" }, providers: [
142
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: SearchInput, isStandalone: true, selector: "mf-search-input", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, inputId: { classPropertyName: "inputId", publicName: "inputId", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, tooltipLabel: { classPropertyName: "tooltipLabel", publicName: "tooltipLabel", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, debounceMs: { classPropertyName: "debounceMs", publicName: "debounceMs", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { properties: { "class.w-full": "fullWidth()" }, classAttribute: "inline-block" }, providers: [
139
143
  { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SearchInput), multi: true },
140
- ], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true, isSignal: true }, { propertyName: "tooltipRef", first: true, predicate: Tooltip, descendants: true, isSignal: true }], exportAs: ["mfSearchInput"], usesInheritance: true, ngImport: i0, template: "<div class=\"relative inline-flex items-center\" [class.w-full]=\"fullWidth()\">\r\n <span\r\n mfIcon\r\n [size]=\"18\"\r\n class=\"pointer-events-none absolute top-1/2 start-2.5 -translate-y-1/2 text-fg-subtle\"\r\n [class.animate-spin]=\"showSpinner()\"\r\n >{{ showSpinner() ? 'progress_activity' : 'search' }}</span\r\n >\r\n <input\r\n mfInput\r\n #inputEl\r\n type=\"text\"\r\n [class]=\"inputWidthClass()\"\r\n class=\"transition-[width] duration-base ease-out\"\r\n [value]=\"draft()\"\r\n [placeholder]=\"expanded() ? effectivePlaceholder() : ''\"\r\n [attr.aria-label]=\"effectiveAriaLabel()\"\r\n [mfTooltip]=\"expanded() ? '' : effectiveTooltipLabel()\"\r\n (focus)=\"expand()\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (blur)=\"collapseIfEmpty()\"\r\n (keydown.escape)=\"onEscape()\"\r\n />\r\n @if (expanded() && draft()) {\r\n <button\r\n type=\"button\"\r\n class=\"absolute top-1/2 end-2 -translate-y-1/2 appearance-none border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n (click)=\"clear()\"\r\n [attr.aria-label]=\"effectiveClearAriaLabel()\"\r\n >\r\n <span mfIcon [size]=\"16\">close</span>\r\n </button>\r\n }\r\n</div>\r\n", dependencies: [{ kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "directive", type: Input, selector: "input[mfInput]:not([type=checkbox]):not([type=radio]), textarea[mfInput]", inputs: ["size", "hasError", "autosize", "minRows", "maxRows"] }, { kind: "directive", type: Tooltip, selector: "[mfTooltip], [mfTooltipContent]", inputs: ["mfTooltip", "mfTooltipContent", "tooltipPosition"], exportAs: ["mfTooltip"] }] });
144
+ ], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true, isSignal: true }, { propertyName: "tooltipRef", first: true, predicate: Tooltip, descendants: true, isSignal: true }], exportAs: ["mfSearchInput"], usesInheritance: true, ngImport: i0, template: "<div class=\"relative inline-flex items-center\" [class.w-full]=\"fullWidth()\">\r\n @if (showSpinner()) {\r\n <span\r\n aria-hidden=\"true\"\r\n class=\"pointer-events-none absolute top-1/2 start-2.5 inline-flex -translate-y-1/2 text-fg-subtle\"\r\n ><mf-spinner size=\"sm\"\r\n /></span>\r\n } @else {\r\n <span\r\n mfIcon\r\n [size]=\"18\"\r\n class=\"pointer-events-none absolute top-1/2 start-2.5 -translate-y-1/2 text-fg-subtle\"\r\n >search</span\r\n >\r\n }\r\n <input\r\n mfInput\r\n [attr.id]=\"inputId() || null\"\r\n #inputEl\r\n type=\"text\"\r\n [class]=\"inputWidthClass()\"\r\n class=\"transition-[width] duration-base ease-out\"\r\n [value]=\"draft()\"\r\n [placeholder]=\"expanded() ? effectivePlaceholder() : ''\"\r\n [attr.aria-label]=\"effectiveAriaLabel()\"\r\n [mfTooltip]=\"expanded() ? '' : effectiveTooltipLabel()\"\r\n (focus)=\"expand()\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (blur)=\"collapseIfEmpty()\"\r\n (keydown.escape)=\"onEscape()\"\r\n />\r\n @if (expanded() && draft()) {\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex items-center justify-center absolute top-1/2 end-2 -translate-y-1/2 appearance-none border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n (click)=\"clear()\"\r\n [attr.aria-label]=\"effectiveClearAriaLabel()\"\r\n >\r\n <span mfIcon [size]=\"16\">close</span>\r\n </button>\r\n }\r\n</div>\r\n", dependencies: [{ kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "directive", type: Input, selector: "input[mfInput]:not([type=checkbox]):not([type=radio]), textarea[mfInput]", inputs: ["size", "hasError", "autosize", "minRows", "maxRows"] }, { kind: "component", type: Spinner, selector: "mf-spinner", inputs: ["size", "tone", "ariaLabel"], exportAs: ["mfSpinner"] }, { kind: "directive", type: Tooltip, selector: "[mfTooltip], [mfTooltipContent]", inputs: ["mfTooltip", "mfTooltipContent", "tooltipPosition"], exportAs: ["mfTooltip"] }] });
141
145
  }
142
146
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SearchInput, decorators: [{
143
147
  type: Component,
144
- args: [{ selector: 'mf-search-input', exportAs: 'mfSearchInput', imports: [Icon, Input, Tooltip], host: { class: 'inline-block', '[class.w-full]': 'fullWidth()' }, providers: [
148
+ args: [{ selector: 'mf-search-input', exportAs: 'mfSearchInput', imports: [Icon, Input, Spinner, Tooltip], host: { class: 'inline-block', '[class.w-full]': 'fullWidth()' }, providers: [
145
149
  { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SearchInput), multi: true },
146
- ], template: "<div class=\"relative inline-flex items-center\" [class.w-full]=\"fullWidth()\">\r\n <span\r\n mfIcon\r\n [size]=\"18\"\r\n class=\"pointer-events-none absolute top-1/2 start-2.5 -translate-y-1/2 text-fg-subtle\"\r\n [class.animate-spin]=\"showSpinner()\"\r\n >{{ showSpinner() ? 'progress_activity' : 'search' }}</span\r\n >\r\n <input\r\n mfInput\r\n #inputEl\r\n type=\"text\"\r\n [class]=\"inputWidthClass()\"\r\n class=\"transition-[width] duration-base ease-out\"\r\n [value]=\"draft()\"\r\n [placeholder]=\"expanded() ? effectivePlaceholder() : ''\"\r\n [attr.aria-label]=\"effectiveAriaLabel()\"\r\n [mfTooltip]=\"expanded() ? '' : effectiveTooltipLabel()\"\r\n (focus)=\"expand()\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (blur)=\"collapseIfEmpty()\"\r\n (keydown.escape)=\"onEscape()\"\r\n />\r\n @if (expanded() && draft()) {\r\n <button\r\n type=\"button\"\r\n class=\"absolute top-1/2 end-2 -translate-y-1/2 appearance-none border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n (click)=\"clear()\"\r\n [attr.aria-label]=\"effectiveClearAriaLabel()\"\r\n >\r\n <span mfIcon [size]=\"16\">close</span>\r\n </button>\r\n }\r\n</div>\r\n" }]
147
- }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], tooltipLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltipLabel", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], debounceMs: [{ type: i0.Input, args: [{ isSignal: true, alias: "debounceMs", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], inputEl: [{ type: i0.ViewChild, args: ['inputEl', { isSignal: true }] }], tooltipRef: [{ type: i0.ViewChild, args: [i0.forwardRef(() => Tooltip), { isSignal: true }] }] } });
150
+ ], template: "<div class=\"relative inline-flex items-center\" [class.w-full]=\"fullWidth()\">\r\n @if (showSpinner()) {\r\n <span\r\n aria-hidden=\"true\"\r\n class=\"pointer-events-none absolute top-1/2 start-2.5 inline-flex -translate-y-1/2 text-fg-subtle\"\r\n ><mf-spinner size=\"sm\"\r\n /></span>\r\n } @else {\r\n <span\r\n mfIcon\r\n [size]=\"18\"\r\n class=\"pointer-events-none absolute top-1/2 start-2.5 -translate-y-1/2 text-fg-subtle\"\r\n >search</span\r\n >\r\n }\r\n <input\r\n mfInput\r\n [attr.id]=\"inputId() || null\"\r\n #inputEl\r\n type=\"text\"\r\n [class]=\"inputWidthClass()\"\r\n class=\"transition-[width] duration-base ease-out\"\r\n [value]=\"draft()\"\r\n [placeholder]=\"expanded() ? effectivePlaceholder() : ''\"\r\n [attr.aria-label]=\"effectiveAriaLabel()\"\r\n [mfTooltip]=\"expanded() ? '' : effectiveTooltipLabel()\"\r\n (focus)=\"expand()\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (blur)=\"collapseIfEmpty()\"\r\n (keydown.escape)=\"onEscape()\"\r\n />\r\n @if (expanded() && draft()) {\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex items-center justify-center absolute top-1/2 end-2 -translate-y-1/2 appearance-none border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n (click)=\"clear()\"\r\n [attr.aria-label]=\"effectiveClearAriaLabel()\"\r\n >\r\n <span mfIcon [size]=\"16\">close</span>\r\n </button>\r\n }\r\n</div>\r\n" }]
151
+ }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], inputId: [{ type: i0.Input, args: [{ isSignal: true, alias: "inputId", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], tooltipLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltipLabel", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], debounceMs: [{ type: i0.Input, args: [{ isSignal: true, alias: "debounceMs", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], inputEl: [{ type: i0.ViewChild, args: ['inputEl', { isSignal: true }] }], tooltipRef: [{ type: i0.ViewChild, args: [i0.forwardRef(() => Tooltip), { isSignal: true }] }] } });
148
152
 
149
153
  /**
150
154
  * Generated bundle index. Do not edit.