@mesgflow/ui-kit 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +200 -0
  3. package/fesm2022/mesgflow-ui-kit-accordion.mjs +75 -0
  4. package/fesm2022/mesgflow-ui-kit-accordion.mjs.map +1 -0
  5. package/fesm2022/mesgflow-ui-kit-alert.mjs +165 -0
  6. package/fesm2022/mesgflow-ui-kit-alert.mjs.map +1 -0
  7. package/fesm2022/mesgflow-ui-kit-avatar-group.mjs +88 -0
  8. package/fesm2022/mesgflow-ui-kit-avatar-group.mjs.map +1 -0
  9. package/fesm2022/mesgflow-ui-kit-avatar.mjs +123 -0
  10. package/fesm2022/mesgflow-ui-kit-avatar.mjs.map +1 -0
  11. package/fesm2022/mesgflow-ui-kit-badge.mjs +68 -0
  12. package/fesm2022/mesgflow-ui-kit-badge.mjs.map +1 -0
  13. package/fesm2022/mesgflow-ui-kit-banner.mjs +111 -0
  14. package/fesm2022/mesgflow-ui-kit-banner.mjs.map +1 -0
  15. package/fesm2022/mesgflow-ui-kit-box-input.mjs +78 -0
  16. package/fesm2022/mesgflow-ui-kit-box-input.mjs.map +1 -0
  17. package/fesm2022/mesgflow-ui-kit-brand.mjs +120 -0
  18. package/fesm2022/mesgflow-ui-kit-brand.mjs.map +1 -0
  19. package/fesm2022/mesgflow-ui-kit-breadcrumb.mjs +84 -0
  20. package/fesm2022/mesgflow-ui-kit-breadcrumb.mjs.map +1 -0
  21. package/fesm2022/mesgflow-ui-kit-button-group.mjs +37 -0
  22. package/fesm2022/mesgflow-ui-kit-button-group.mjs.map +1 -0
  23. package/fesm2022/mesgflow-ui-kit-button.mjs +359 -0
  24. package/fesm2022/mesgflow-ui-kit-button.mjs.map +1 -0
  25. package/fesm2022/mesgflow-ui-kit-card.mjs +128 -0
  26. package/fesm2022/mesgflow-ui-kit-card.mjs.map +1 -0
  27. package/fesm2022/mesgflow-ui-kit-chart.mjs +538 -0
  28. package/fesm2022/mesgflow-ui-kit-chart.mjs.map +1 -0
  29. package/fesm2022/mesgflow-ui-kit-checkbox.mjs +45 -0
  30. package/fesm2022/mesgflow-ui-kit-checkbox.mjs.map +1 -0
  31. package/fesm2022/mesgflow-ui-kit-chip.mjs +123 -0
  32. package/fesm2022/mesgflow-ui-kit-chip.mjs.map +1 -0
  33. package/fesm2022/mesgflow-ui-kit-code-block.mjs +71 -0
  34. package/fesm2022/mesgflow-ui-kit-code-block.mjs.map +1 -0
  35. package/fesm2022/mesgflow-ui-kit-collapsible.mjs +89 -0
  36. package/fesm2022/mesgflow-ui-kit-collapsible.mjs.map +1 -0
  37. package/fesm2022/mesgflow-ui-kit-color-picker.mjs +210 -0
  38. package/fesm2022/mesgflow-ui-kit-color-picker.mjs.map +1 -0
  39. package/fesm2022/mesgflow-ui-kit-combobox.mjs +181 -0
  40. package/fesm2022/mesgflow-ui-kit-combobox.mjs.map +1 -0
  41. package/fesm2022/mesgflow-ui-kit-command.mjs +491 -0
  42. package/fesm2022/mesgflow-ui-kit-command.mjs.map +1 -0
  43. package/fesm2022/mesgflow-ui-kit-context-menu.mjs +92 -0
  44. package/fesm2022/mesgflow-ui-kit-context-menu.mjs.map +1 -0
  45. package/fesm2022/mesgflow-ui-kit-copy-button.mjs +167 -0
  46. package/fesm2022/mesgflow-ui-kit-copy-button.mjs.map +1 -0
  47. package/fesm2022/mesgflow-ui-kit-core.mjs +624 -0
  48. package/fesm2022/mesgflow-ui-kit-core.mjs.map +1 -0
  49. package/fesm2022/mesgflow-ui-kit-date-picker.mjs +643 -0
  50. package/fesm2022/mesgflow-ui-kit-date-picker.mjs.map +1 -0
  51. package/fesm2022/mesgflow-ui-kit-description-list.mjs +76 -0
  52. package/fesm2022/mesgflow-ui-kit-description-list.mjs.map +1 -0
  53. package/fesm2022/mesgflow-ui-kit-dialog.mjs +700 -0
  54. package/fesm2022/mesgflow-ui-kit-dialog.mjs.map +1 -0
  55. package/fesm2022/mesgflow-ui-kit-divider.mjs +62 -0
  56. package/fesm2022/mesgflow-ui-kit-divider.mjs.map +1 -0
  57. package/fesm2022/mesgflow-ui-kit-dropzone.mjs +126 -0
  58. package/fesm2022/mesgflow-ui-kit-dropzone.mjs.map +1 -0
  59. package/fesm2022/mesgflow-ui-kit-empty-state.mjs +70 -0
  60. package/fesm2022/mesgflow-ui-kit-empty-state.mjs.map +1 -0
  61. package/fesm2022/mesgflow-ui-kit-field.mjs +42 -0
  62. package/fesm2022/mesgflow-ui-kit-field.mjs.map +1 -0
  63. package/fesm2022/mesgflow-ui-kit-hover-card.mjs +171 -0
  64. package/fesm2022/mesgflow-ui-kit-hover-card.mjs.map +1 -0
  65. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs +258 -0
  66. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs.map +1 -0
  67. package/fesm2022/mesgflow-ui-kit-icon.mjs +174 -0
  68. package/fesm2022/mesgflow-ui-kit-icon.mjs.map +1 -0
  69. package/fesm2022/mesgflow-ui-kit-input.mjs +448 -0
  70. package/fesm2022/mesgflow-ui-kit-input.mjs.map +1 -0
  71. package/fesm2022/mesgflow-ui-kit-kbd.mjs +24 -0
  72. package/fesm2022/mesgflow-ui-kit-kbd.mjs.map +1 -0
  73. package/fesm2022/mesgflow-ui-kit-link.mjs +48 -0
  74. package/fesm2022/mesgflow-ui-kit-link.mjs.map +1 -0
  75. package/fesm2022/mesgflow-ui-kit-menu.mjs +105 -0
  76. package/fesm2022/mesgflow-ui-kit-menu.mjs.map +1 -0
  77. package/fesm2022/mesgflow-ui-kit-number-input.mjs +153 -0
  78. package/fesm2022/mesgflow-ui-kit-number-input.mjs.map +1 -0
  79. package/fesm2022/mesgflow-ui-kit-otp-input.mjs +164 -0
  80. package/fesm2022/mesgflow-ui-kit-otp-input.mjs.map +1 -0
  81. package/fesm2022/mesgflow-ui-kit-page-header.mjs +83 -0
  82. package/fesm2022/mesgflow-ui-kit-page-header.mjs.map +1 -0
  83. package/fesm2022/mesgflow-ui-kit-pagination.mjs +99 -0
  84. package/fesm2022/mesgflow-ui-kit-pagination.mjs.map +1 -0
  85. package/fesm2022/mesgflow-ui-kit-password-input.mjs +120 -0
  86. package/fesm2022/mesgflow-ui-kit-password-input.mjs.map +1 -0
  87. package/fesm2022/mesgflow-ui-kit-popover.mjs +213 -0
  88. package/fesm2022/mesgflow-ui-kit-popover.mjs.map +1 -0
  89. package/fesm2022/mesgflow-ui-kit-progress.mjs +82 -0
  90. package/fesm2022/mesgflow-ui-kit-progress.mjs.map +1 -0
  91. package/fesm2022/mesgflow-ui-kit-radio.mjs +123 -0
  92. package/fesm2022/mesgflow-ui-kit-radio.mjs.map +1 -0
  93. package/fesm2022/mesgflow-ui-kit-rating.mjs +116 -0
  94. package/fesm2022/mesgflow-ui-kit-rating.mjs.map +1 -0
  95. package/fesm2022/mesgflow-ui-kit-scroll-area.mjs +84 -0
  96. package/fesm2022/mesgflow-ui-kit-scroll-area.mjs.map +1 -0
  97. package/fesm2022/mesgflow-ui-kit-search-input.mjs +154 -0
  98. package/fesm2022/mesgflow-ui-kit-search-input.mjs.map +1 -0
  99. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs +95 -0
  100. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs.map +1 -0
  101. package/fesm2022/mesgflow-ui-kit-select.mjs +227 -0
  102. package/fesm2022/mesgflow-ui-kit-select.mjs.map +1 -0
  103. package/fesm2022/mesgflow-ui-kit-sidebar.mjs +449 -0
  104. package/fesm2022/mesgflow-ui-kit-sidebar.mjs.map +1 -0
  105. package/fesm2022/mesgflow-ui-kit-skeleton.mjs +74 -0
  106. package/fesm2022/mesgflow-ui-kit-skeleton.mjs.map +1 -0
  107. package/fesm2022/mesgflow-ui-kit-slider.mjs +179 -0
  108. package/fesm2022/mesgflow-ui-kit-slider.mjs.map +1 -0
  109. package/fesm2022/mesgflow-ui-kit-spinner.mjs +67 -0
  110. package/fesm2022/mesgflow-ui-kit-spinner.mjs.map +1 -0
  111. package/fesm2022/mesgflow-ui-kit-splitter.mjs +97 -0
  112. package/fesm2022/mesgflow-ui-kit-splitter.mjs.map +1 -0
  113. package/fesm2022/mesgflow-ui-kit-stat-tile.mjs +98 -0
  114. package/fesm2022/mesgflow-ui-kit-stat-tile.mjs.map +1 -0
  115. package/fesm2022/mesgflow-ui-kit-stepper.mjs +133 -0
  116. package/fesm2022/mesgflow-ui-kit-stepper.mjs.map +1 -0
  117. package/fesm2022/mesgflow-ui-kit-switch.mjs +73 -0
  118. package/fesm2022/mesgflow-ui-kit-switch.mjs.map +1 -0
  119. package/fesm2022/mesgflow-ui-kit-table.mjs +1783 -0
  120. package/fesm2022/mesgflow-ui-kit-table.mjs.map +1 -0
  121. package/fesm2022/mesgflow-ui-kit-tabs.mjs +569 -0
  122. package/fesm2022/mesgflow-ui-kit-tabs.mjs.map +1 -0
  123. package/fesm2022/mesgflow-ui-kit-tag-input.mjs +138 -0
  124. package/fesm2022/mesgflow-ui-kit-tag-input.mjs.map +1 -0
  125. package/fesm2022/mesgflow-ui-kit-theme-switcher.mjs +53 -0
  126. package/fesm2022/mesgflow-ui-kit-theme-switcher.mjs.map +1 -0
  127. package/fesm2022/mesgflow-ui-kit-theming.mjs +1016 -0
  128. package/fesm2022/mesgflow-ui-kit-theming.mjs.map +1 -0
  129. package/fesm2022/mesgflow-ui-kit-time-picker.mjs +138 -0
  130. package/fesm2022/mesgflow-ui-kit-time-picker.mjs.map +1 -0
  131. package/fesm2022/mesgflow-ui-kit-timeline.mjs +91 -0
  132. package/fesm2022/mesgflow-ui-kit-timeline.mjs.map +1 -0
  133. package/fesm2022/mesgflow-ui-kit-toast.mjs +202 -0
  134. package/fesm2022/mesgflow-ui-kit-toast.mjs.map +1 -0
  135. package/fesm2022/mesgflow-ui-kit-toggle.mjs +243 -0
  136. package/fesm2022/mesgflow-ui-kit-toggle.mjs.map +1 -0
  137. package/fesm2022/mesgflow-ui-kit-toolbar.mjs +99 -0
  138. package/fesm2022/mesgflow-ui-kit-toolbar.mjs.map +1 -0
  139. package/fesm2022/mesgflow-ui-kit-tooltip.mjs +160 -0
  140. package/fesm2022/mesgflow-ui-kit-tooltip.mjs.map +1 -0
  141. package/fesm2022/mesgflow-ui-kit-tour.mjs +272 -0
  142. package/fesm2022/mesgflow-ui-kit-tour.mjs.map +1 -0
  143. package/fesm2022/mesgflow-ui-kit-tree-select.mjs +177 -0
  144. package/fesm2022/mesgflow-ui-kit-tree-select.mjs.map +1 -0
  145. package/fesm2022/mesgflow-ui-kit-tree.mjs +82 -0
  146. package/fesm2022/mesgflow-ui-kit-tree.mjs.map +1 -0
  147. package/fesm2022/mesgflow-ui-kit.mjs +12851 -0
  148. package/fesm2022/mesgflow-ui-kit.mjs.map +1 -0
  149. package/package.json +374 -0
  150. package/preset.css +20 -0
  151. package/tokens/color.css +693 -0
  152. package/tokens/contrast.css +68 -0
  153. package/tokens/elevation.css +68 -0
  154. package/tokens/motion.css +277 -0
  155. package/tokens/radius.css +69 -0
  156. package/tokens/typography.css +127 -0
  157. package/tokens.css +41 -0
  158. package/types/mesgflow-ui-kit-accordion.d.ts +42 -0
  159. package/types/mesgflow-ui-kit-alert.d.ts +60 -0
  160. package/types/mesgflow-ui-kit-avatar-group.d.ts +28 -0
  161. package/types/mesgflow-ui-kit-avatar.d.ts +23 -0
  162. package/types/mesgflow-ui-kit-badge.d.ts +39 -0
  163. package/types/mesgflow-ui-kit-banner.d.ts +42 -0
  164. package/types/mesgflow-ui-kit-box-input.d.ts +45 -0
  165. package/types/mesgflow-ui-kit-brand.d.ts +48 -0
  166. package/types/mesgflow-ui-kit-breadcrumb.d.ts +26 -0
  167. package/types/mesgflow-ui-kit-button-group.d.ts +17 -0
  168. package/types/mesgflow-ui-kit-button.d.ts +75 -0
  169. package/types/mesgflow-ui-kit-card.d.ts +71 -0
  170. package/types/mesgflow-ui-kit-chart.d.ts +242 -0
  171. package/types/mesgflow-ui-kit-checkbox.d.ts +17 -0
  172. package/types/mesgflow-ui-kit-chip.d.ts +46 -0
  173. package/types/mesgflow-ui-kit-code-block.d.ts +56 -0
  174. package/types/mesgflow-ui-kit-collapsible.d.ts +39 -0
  175. package/types/mesgflow-ui-kit-color-picker.d.ts +78 -0
  176. package/types/mesgflow-ui-kit-combobox.d.ts +74 -0
  177. package/types/mesgflow-ui-kit-command.d.ts +185 -0
  178. package/types/mesgflow-ui-kit-context-menu.d.ts +40 -0
  179. package/types/mesgflow-ui-kit-copy-button.d.ts +47 -0
  180. package/types/mesgflow-ui-kit-core.d.ts +508 -0
  181. package/types/mesgflow-ui-kit-date-picker.d.ts +215 -0
  182. package/types/mesgflow-ui-kit-description-list.d.ts +23 -0
  183. package/types/mesgflow-ui-kit-dialog.d.ts +342 -0
  184. package/types/mesgflow-ui-kit-divider.d.ts +23 -0
  185. package/types/mesgflow-ui-kit-dropzone.d.ts +47 -0
  186. package/types/mesgflow-ui-kit-empty-state.d.ts +18 -0
  187. package/types/mesgflow-ui-kit-field.d.ts +26 -0
  188. package/types/mesgflow-ui-kit-hover-card.d.ts +52 -0
  189. package/types/mesgflow-ui-kit-i18n-tr.d.ts +14 -0
  190. package/types/mesgflow-ui-kit-icon.d.ts +76 -0
  191. package/types/mesgflow-ui-kit-input.d.ts +186 -0
  192. package/types/mesgflow-ui-kit-kbd.d.ts +9 -0
  193. package/types/mesgflow-ui-kit-link.d.ts +20 -0
  194. package/types/mesgflow-ui-kit-menu.d.ts +53 -0
  195. package/types/mesgflow-ui-kit-number-input.d.ts +55 -0
  196. package/types/mesgflow-ui-kit-otp-input.d.ts +44 -0
  197. package/types/mesgflow-ui-kit-page-header.d.ts +31 -0
  198. package/types/mesgflow-ui-kit-pagination.d.ts +50 -0
  199. package/types/mesgflow-ui-kit-password-input.d.ts +33 -0
  200. package/types/mesgflow-ui-kit-popover.d.ts +62 -0
  201. package/types/mesgflow-ui-kit-progress.d.ts +32 -0
  202. package/types/mesgflow-ui-kit-radio.d.ts +59 -0
  203. package/types/mesgflow-ui-kit-rating.d.ts +56 -0
  204. package/types/mesgflow-ui-kit-scroll-area.d.ts +27 -0
  205. package/types/mesgflow-ui-kit-search-input.d.ts +72 -0
  206. package/types/mesgflow-ui-kit-segmented-control.d.ts +54 -0
  207. package/types/mesgflow-ui-kit-select.d.ts +89 -0
  208. package/types/mesgflow-ui-kit-sidebar.d.ts +224 -0
  209. package/types/mesgflow-ui-kit-skeleton.d.ts +29 -0
  210. package/types/mesgflow-ui-kit-slider.d.ts +40 -0
  211. package/types/mesgflow-ui-kit-spinner.d.ts +31 -0
  212. package/types/mesgflow-ui-kit-splitter.d.ts +40 -0
  213. package/types/mesgflow-ui-kit-stat-tile.d.ts +54 -0
  214. package/types/mesgflow-ui-kit-stepper.d.ts +48 -0
  215. package/types/mesgflow-ui-kit-switch.d.ts +34 -0
  216. package/types/mesgflow-ui-kit-table.d.ts +805 -0
  217. package/types/mesgflow-ui-kit-tabs.d.ts +269 -0
  218. package/types/mesgflow-ui-kit-tag-input.d.ts +33 -0
  219. package/types/mesgflow-ui-kit-theme-switcher.d.ts +27 -0
  220. package/types/mesgflow-ui-kit-theming.d.ts +745 -0
  221. package/types/mesgflow-ui-kit-time-picker.d.ts +54 -0
  222. package/types/mesgflow-ui-kit-timeline.d.ts +27 -0
  223. package/types/mesgflow-ui-kit-toast.d.ts +94 -0
  224. package/types/mesgflow-ui-kit-toggle.d.ts +110 -0
  225. package/types/mesgflow-ui-kit-toolbar.d.ts +52 -0
  226. package/types/mesgflow-ui-kit-tooltip.d.ts +55 -0
  227. package/types/mesgflow-ui-kit-tour.d.ts +66 -0
  228. package/types/mesgflow-ui-kit-tree-select.d.ts +65 -0
  229. package/types/mesgflow-ui-kit-tree.d.ts +44 -0
  230. package/types/mesgflow-ui-kit.d.ts +5444 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesgflow-ui-kit-chart.mjs","sources":["../../../projects/ui-kit/chart/chart-colors.ts","../../../projects/ui-kit/chart/chart-scale.ts","../../../projects/ui-kit/chart/bar-chart.ts","../../../projects/ui-kit/chart/bar-chart.html","../../../projects/ui-kit/chart/bar-list.ts","../../../projects/ui-kit/chart/line-chart.ts","../../../projects/ui-kit/chart/line-chart.html","../../../projects/ui-kit/chart/sparkline.ts","../../../projects/ui-kit/chart/sparkline.html","../../../projects/ui-kit/chart/mesgflow-ui-kit-chart.ts"],"sourcesContent":["/**\r\n * Kategorik grafik renkleri — `color.css`'in `--mf-chart-1..8` rol token'larına SABİT sıralı\r\n * referans (dataviz doktrini: \"Assign categorical hues in fixed order, never cycled\"). Sekiz\r\n * slotun sırası CVD güvenlik mekanizmasıdır (bkz. color.css yorumu — `validate_palette.js` ile\r\n * iki modda doğrulandı); 9. ve sonraki seriler ASLA döngüye girip 1. seriyle aynı rengi almaz,\r\n * nötr \"Diğer\" (`chart-other`) rengine düşer — tüketici o serileri tek bir \"Diğer\"de toplamalı\r\n * veya küçük çoklulara bölmeli.\r\n *\r\n * Renk VARLIĞI izler, sırasını DEĞİL: bir filtre seri sayısını değiştirdiğinde kalan seriler\r\n * yeniden boyanmasın diye tüketici `slot`'u varlığa bağlı SABİT bir değerden türetmeli (ör. seri\r\n * tanımındaki `colorIndex`), o anki dizideki pozisyondan değil.\r\n *\r\n * Class isimleri TAM/LİTERAL string — Tailwind'in JIT tarayıcısı çalışma zamanında birleştirilen\r\n * (`` `fill-chart-${n}` ``) isimleri göremez. Tema utility'leri (`fill-chart-1`) değeri\r\n * `var(--mf-chart-1)` olarak GÖMER — `--color-chart-*` takma adının `:root`'tan budanmasından\r\n * etkilenmez (bkz. color.css / `docs/tr/mimari.md` \"@theme inline\" notu).\r\n */\r\nexport const MF_CHART_SLOT_COUNT = 8;\r\n\r\nconst FILL = [\r\n 'fill-chart-1',\r\n 'fill-chart-2',\r\n 'fill-chart-3',\r\n 'fill-chart-4',\r\n 'fill-chart-5',\r\n 'fill-chart-6',\r\n 'fill-chart-7',\r\n 'fill-chart-8',\r\n] as const;\r\n\r\nconst STROKE = [\r\n 'stroke-chart-1',\r\n 'stroke-chart-2',\r\n 'stroke-chart-3',\r\n 'stroke-chart-4',\r\n 'stroke-chart-5',\r\n 'stroke-chart-6',\r\n 'stroke-chart-7',\r\n 'stroke-chart-8',\r\n] as const;\r\n\r\nconst BG = [\r\n 'bg-chart-1',\r\n 'bg-chart-2',\r\n 'bg-chart-3',\r\n 'bg-chart-4',\r\n 'bg-chart-5',\r\n 'bg-chart-6',\r\n 'bg-chart-7',\r\n 'bg-chart-8',\r\n] as const;\r\n\r\nfunction slotClass(classes: readonly string[], other: string, slot: number): string {\r\n return Number.isInteger(slot) && slot >= 0 && slot < classes.length ? classes[slot] : other;\r\n}\r\n\r\n/** SVG dolgu (bar/alan/nokta). `slot` 0 tabanlı; 0-7 dışı → \"Diğer\". */\r\nexport function chartFillClass(slot: number): string {\r\n return slotClass(FILL, 'fill-chart-other', slot);\r\n}\r\n\r\n/** SVG çizgi (line/sparkline). `slot` 0 tabanlı; 0-7 dışı → \"Diğer\". */\r\nexport function chartStrokeClass(slot: number): string {\r\n return slotClass(STROKE, 'stroke-chart-other', slot);\r\n}\r\n\r\n/** HTML zemin (lejant/tooltip anahtarı, BarList çubuğu). `slot` 0 tabanlı; 0-7 dışı → \"Diğer\". */\r\nexport function chartBgClass(slot: number): string {\r\n return slotClass(BG, 'bg-chart-other', slot);\r\n}\r\n","/**\r\n * \"Temiz\" eksen işaretleri — dataviz: y ekseni işaretleri yuvarlak sayılara oturur (0 / 250 /\r\n * 500, asla 0 / 237 / 474). Heckbert'in \"nice numbers\" algoritması: aralığı 1/2/5 × 10^n\r\n * adımlarına yuvarlar, dönen ilk/son işaret ölçeğin alt/üst sınırı olur (veri onların İÇİNDE).\r\n * Tüm değerler aynıysa (ör. hepsi 0) ölçek çökmesin diye aralık 1 birim açılır.\r\n */\r\nexport function niceTicks(min: number, max: number, count = 4): number[] {\r\n if (!Number.isFinite(min) || !Number.isFinite(max)) return [0, 1];\r\n if (min === max) {\r\n if (min === 0) return [0, 1];\r\n min = Math.min(0, min);\r\n max = Math.max(0, max);\r\n }\r\n\r\n const span = niceNumber(max - min, false);\r\n const step = niceNumber(span / Math.max(1, count), true);\r\n const start = Math.floor(min / step) * step;\r\n const end = Math.ceil(max / step) * step;\r\n\r\n const ticks: number[] = [];\r\n for (let value = start; value <= end + step / 2; value += step) {\r\n // Kayan nokta birikimini temizle (0.30000000000000004 → 0.3).\r\n ticks.push(Number(value.toPrecision(12)));\r\n }\r\n return ticks;\r\n}\r\n\r\nfunction niceNumber(range: number, round: boolean): number {\r\n const exponent = Math.floor(Math.log10(range));\r\n const fraction = range / 10 ** exponent;\r\n let nice: number;\r\n if (round) {\r\n nice = fraction < 1.5 ? 1 : fraction < 3 ? 2 : fraction < 7 ? 5 : 10;\r\n } else {\r\n nice = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\r\n }\r\n return nice * 10 ** exponent;\r\n}\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { chartFillClass } from './chart-colors';\r\n\r\nexport interface BarChartPoint {\r\n label: string;\r\n value: number;\r\n}\r\n\r\ninterface BarChartBar extends BarChartPoint {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n squareFootY: number;\r\n squareFootHeight: number;\r\n labelY: number;\r\n}\r\n\r\nconst PLOT_WIDTH = 300;\r\nconst PLOT_HEIGHT = 80;\r\nconst BASELINE_Y = 96;\r\nconst VIEW_HEIGHT = 132;\r\nconst MAX_BAR_WIDTH = 24;\r\n/** dataviz \"4px rounded data-end, square at the baseline\" — üstü yuvarlak tam boy dikdörtgen + tabana yapışık düz bir dikdörtgen üst üste, alt köşeleri KARELER. */\r\nconst SQUARE_FOOT = 4;\r\n\r\n/**\r\n * `<mf-bar-chart [points]=\"monthly\" [ariaLabel]=\"'Son 6 ayda katılan üyeler'\" />`\r\n *\r\n * Tek seri, elle yazılmış inline SVG — grafik kütüphanesi eklenmedi (bu kitin\r\n * \"npm paketi olmayan, kaynağı elinde\" doktrini). Tek seri olduğu için LEJANT yok (dataviz doktrini: \"a single\r\n * series needs no legend box\"), değerler her çubuğun tepesinde DOĞRUDAN etiketlenir (6 nokta —\r\n * \"her noktayı etiketleme\" uyarısının kapsamı yoğun serilere yönelik, 6 noktada tamamı okunabilir).\r\n */\r\n@Component({\r\n selector: 'mf-bar-chart',\r\n host: { class: 'block' },\r\n templateUrl: './bar-chart.html',\r\n})\r\nexport class BarChart {\r\n readonly points = input.required<BarChartPoint[]>();\r\n readonly ariaLabel = input('');\r\n readonly valueFormatter = input<(value: number) => string>((value) => `${value}`);\r\n\r\n protected readonly viewBox = `0 0 ${PLOT_WIDTH} ${VIEW_HEIGHT}`;\r\n protected readonly baselineY = BASELINE_Y;\r\n protected readonly fillClass = chartFillClass(0);\r\n\r\n protected readonly bars = computed<BarChartBar[]>(() => {\r\n const points = this.points();\r\n if (points.length === 0) return [];\r\n\r\n const max = Math.max(1, ...points.map((point) => point.value));\r\n const slotWidth = PLOT_WIDTH / points.length;\r\n const width = Math.min(MAX_BAR_WIDTH, slotWidth * 0.5);\r\n\r\n return points.map((point, index) => {\r\n const height = (point.value / max) * PLOT_HEIGHT;\r\n const squareFootHeight = Math.min(height, SQUARE_FOOT);\r\n return {\r\n ...point,\r\n width,\r\n x: index * slotWidth + (slotWidth - width) / 2,\r\n y: BASELINE_Y - height,\r\n height,\r\n squareFootY: BASELINE_Y - squareFootHeight,\r\n squareFootHeight,\r\n labelY: BASELINE_Y - height - 6,\r\n };\r\n });\r\n });\r\n}\r\n","@if (bars().length > 0) {\r\n <svg\r\n [attr.viewBox]=\"viewBox\"\r\n class=\"h-auto w-full\"\r\n role=\"img\"\r\n [attr.aria-label]=\"ariaLabel()\"\r\n preserveAspectRatio=\"xMidYMid meet\"\r\n >\r\n <title>{{ ariaLabel() }}</title>\r\n\r\n <line\r\n x1=\"0\"\r\n [attr.y1]=\"baselineY\"\r\n [attr.x2]=\"300\"\r\n [attr.y2]=\"baselineY\"\r\n class=\"stroke-border\"\r\n stroke-width=\"1\"\r\n />\r\n\r\n @for (bar of bars(); track bar.label) {\r\n <g>\r\n <title>{{ bar.label }}: {{ valueFormatter()(bar.value) }}</title>\r\n <rect\r\n [attr.x]=\"bar.x\"\r\n [attr.y]=\"bar.y\"\r\n [attr.width]=\"bar.width\"\r\n [attr.height]=\"bar.height\"\r\n rx=\"4\"\r\n [class]=\"fillClass\"\r\n />\r\n <rect\r\n [attr.x]=\"bar.x\"\r\n [attr.y]=\"bar.squareFootY\"\r\n [attr.width]=\"bar.width\"\r\n [attr.height]=\"bar.squareFootHeight\"\r\n [class]=\"fillClass\"\r\n />\r\n <text\r\n [attr.x]=\"bar.x + bar.width / 2\"\r\n [attr.y]=\"bar.labelY\"\r\n text-anchor=\"middle\"\r\n class=\"fill-fg-subtle text-[9px] font-mono tabular-nums\"\r\n >\r\n {{ valueFormatter()(bar.value) }}\r\n </text>\r\n <text\r\n [attr.x]=\"bar.x + bar.width / 2\"\r\n y=\"118\"\r\n text-anchor=\"middle\"\r\n class=\"fill-fg-subtle text-[9px]\"\r\n >\r\n {{ bar.label }}\r\n </text>\r\n </g>\r\n }\r\n </svg>\r\n} @else {\r\n <p class=\"text-sm text-fg-subtle\">—</p>\r\n}\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { chartBgClass } from './chart-colors';\r\n\r\nexport interface BarListItem {\r\n label: string;\r\n value: number;\r\n /**\r\n * Opsiyonel SABİT kategorik slot (0-7) — aynı varlık (ör. 'Yönetici') başka bir grafikte de\r\n * aynı renkle görünsün isteniyorsa. Verilmezse satır tek serinin rengini (slot 0) alır.\r\n */\r\n colorIndex?: number;\r\n}\r\n\r\ninterface BarListRow extends BarListItem {\r\n percent: number;\r\n colorClass: string;\r\n}\r\n\r\n/**\r\n * `<mf-bar-list [items]=\"roleDistribution\" />`\r\n *\r\n * Yatay oranlı liste — TEK bir ölçünün nominal kategorileri: kimliği METİN etiketi, büyüklüğü bar\r\n * uzunluğu + sayı taşır. Bu yüzden bütün çubuklar TEK serinin rengini (slot 0) alır — dataviz\r\n * doktrini: nominal çubukları sıraya/değere göre renklendirmek, uzunluğun zaten gösterdiğini\r\n * renkle tekrar kodlar ve \"renk varlığı izler, sırasını değil\" kuralını çiğner (eskiden\r\n * pozisyona göre boyanıyordu — veri sırası değişince aynı rol başka renge bürünüyordu).\r\n * Varlığa kalıcı bir renk bağlamak için öğe başına `colorIndex`.\r\n */\r\n@Component({\r\n selector: 'mf-bar-list',\r\n host: { class: 'block' },\r\n template: `\r\n <ul class=\"m-0 flex list-none flex-col gap-3 p-0\">\r\n @for (row of rows(); track row.label) {\r\n <li class=\"flex items-center gap-3\">\r\n <span class=\"min-w-0 flex-1 truncate text-sm text-fg-muted\">{{ row.label }}</span>\r\n <div class=\"h-1.5 w-20 shrink-0 overflow-hidden rounded-full bg-surface-alt\">\r\n <div\r\n class=\"h-full rounded-full\"\r\n [class]=\"row.colorClass\"\r\n [style.width.%]=\"row.percent\"\r\n ></div>\r\n </div>\r\n <span class=\"w-8 shrink-0 text-end font-mono text-xs tabular-nums text-fg-subtle\">{{\r\n valueFormatter()(row.value)\r\n }}</span>\r\n </li>\r\n } @empty {\r\n <li class=\"text-sm text-fg-subtle\">—</li>\r\n }\r\n </ul>\r\n `,\r\n})\r\nexport class BarList {\r\n readonly items = input.required<BarListItem[]>();\r\n readonly valueFormatter = input<(value: number) => string>((value) => `${value}`);\r\n\r\n protected readonly rows = computed<BarListRow[]>(() => {\r\n const items = this.items();\r\n const max = Math.max(1, ...items.map((item) => item.value));\r\n return items.map((item) => ({\r\n ...item,\r\n percent: Math.round((item.value / max) * 100),\r\n colorClass: chartBgClass(item.colorIndex ?? 0),\r\n }));\r\n });\r\n}\r\n","import {\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n afterNextRender,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { MF_CHART_LABELS, focusRecipe, overlaySurface } from '@mesgflow/ui-kit/core';\r\nimport { chartBgClass, chartFillClass, chartStrokeClass } from './chart-colors';\r\nimport { niceTicks } from './chart-scale';\r\n\r\nexport interface LineChartSeries {\r\n name: string;\r\n values: readonly number[];\r\n /**\r\n * SABİT kategorik slot (0-7). Renk VARLIĞI izlemeli — bir filtre seri sayısını değiştirince\r\n * kalan seriler yeniden boyanmasın diye kalıcı bir değer verin. Verilmezse dizideki pozisyon.\r\n */\r\n colorIndex?: number;\r\n}\r\n\r\ninterface PlotPoint {\r\n x: number;\r\n y: number;\r\n}\r\n\r\ninterface PlotSeries {\r\n name: string;\r\n values: readonly number[];\r\n points: PlotPoint[];\r\n path: string;\r\n areaPath: string;\r\n strokeClass: string;\r\n fillClass: string;\r\n keyClass: string;\r\n}\r\n\r\ninterface AxisTick {\r\n value: number;\r\n y: number;\r\n label: string;\r\n}\r\n\r\ninterface XLabel {\r\n x: number;\r\n text: string;\r\n anchor: 'start' | 'middle' | 'end';\r\n}\r\n\r\nconst PAD_TOP = 12;\r\nconst PAD_BOTTOM = 28;\r\nconst PAD_LEFT = 44;\r\nconst PAD_RIGHT = 16;\r\n/** Tek seride uç değer etiketi çizginin SAĞINA yazıldığı için ek boşluk. */\r\nconst PAD_RIGHT_END_LABEL = 52;\r\n/** `ResizeObserver` gelene kadar (SSR/jsdom/ilk kare) kullanılan genişlik. */\r\nconst FALLBACK_WIDTH = 600;\r\n/** X ekseni etiketleri arasındaki en küçük boşluk — sığmıyorsa etiketler seyreltilir. */\r\nconst X_LABEL_MIN_GAP = 56;\r\n\r\nconst defaultFormatter = (value: number) => new Intl.NumberFormat().format(value);\r\n\r\n/**\r\n * `<mf-line-chart [labels]=\"months\" [series]=\"series\" ariaLabel=\"Aylık aktif kullanıcı\" area />`\r\n *\r\n * Çok serili çizgi / alan grafiği — elle yazılmış SVG, grafik kütüphanesi YOK (kitin bağımlılık\r\n * politikası). Dataviz metoduna göre:\r\n * - 2px çizgi, yuvarlak birleşim; uç noktada ≥8px işaret + 2px yüzey halkası; alan dolgusu\r\n * serinin %10'u (doygun blok değil, \"yıkama\").\r\n * - Y ekseni temiz sayılara (`niceTicks`), ızgara 1px düz hairline; TEK eksen (çift y ekseni yok).\r\n * - ≥2 seride lejant HER ZAMAN var; tek seride lejant yok (başlık seriyi adlandırır), uç değer\r\n * çizginin ucunda doğrudan etiketlenir. Metin ASLA seri rengini taşımaz.\r\n * - Hover katmanı varsayılan: crosshair en yakın X'e oturur, TEK tooltip o X'teki TÜM serileri\r\n * listeler (değer önde/güçlü, seri adı ikincil, çizgi anahtarı). Klavyede aynı bilgi: odakta\r\n * ←/→/Home/End, `aria-live` ile okunur.\r\n * - Tooltip hiçbir değeri KAPILAMAZ: \"Tablo olarak göster\" ile aynı veri HTML tablosu olarak.\r\n *\r\n * Genişlik kapsayıcıdan (`ResizeObserver`) okunur ve çizim gerçek piksellerle yapılır — sabit\r\n * `viewBox` ölçeklemesinin aksine etiketler dar kartta küçülmez, çizgiler kalınlaşmaz.\r\n */\r\n@Component({\r\n selector: 'mf-line-chart',\r\n exportAs: 'mfLineChart',\r\n host: { class: 'block' },\r\n templateUrl: './line-chart.html',\r\n})\r\nexport class LineChart {\r\n readonly labels = input.required<readonly string[]>();\r\n readonly series = input.required<readonly LineChartSeries[]>();\r\n readonly ariaLabel = input.required<string>();\r\n readonly area = input(false, { transform: booleanAttribute });\r\n readonly height = input(220);\r\n readonly valueFormatter = input<(value: number) => string>(defaultFormatter);\r\n\r\n protected readonly i18n = inject(MF_CHART_LABELS);\r\n protected readonly focusRecipe = focusRecipe;\r\n protected readonly tooltipSurface = overlaySurface;\r\n\r\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n protected readonly width = signal(FALLBACK_WIDTH);\r\n protected readonly activeIndex = signal<number | null>(null);\r\n protected readonly tableView = signal(false);\r\n\r\n protected readonly single = computed(() => this.series().length === 1);\r\n protected readonly padRight = computed(() => (this.single() ? PAD_RIGHT_END_LABEL : PAD_RIGHT));\r\n protected readonly plotBottom = computed(() => this.height() - PAD_BOTTOM);\r\n protected readonly plotLeft = PAD_LEFT;\r\n protected readonly plotRight = computed(() => this.width() - this.padRight());\r\n\r\n private readonly domain = computed(() => {\r\n const all = this.series().flatMap((s) => s.values);\r\n if (all.length === 0) return [0, 1];\r\n return niceTicks(Math.min(0, ...all), Math.max(...all));\r\n });\r\n\r\n private readonly scaleY = computed(() => {\r\n const ticks = this.domain();\r\n const min = ticks[0];\r\n const max = ticks[ticks.length - 1];\r\n const top = PAD_TOP;\r\n const bottom = this.plotBottom();\r\n return (value: number) => bottom - ((value - min) / (max - min)) * (bottom - top);\r\n });\r\n\r\n private readonly scaleX = computed(() => {\r\n const count = this.labels().length;\r\n const left = PAD_LEFT;\r\n const plotWidth = Math.max(0, this.plotRight() - left);\r\n if (count <= 1) return () => left + plotWidth / 2;\r\n return (index: number) => left + (index * plotWidth) / (count - 1);\r\n });\r\n\r\n protected readonly yTicks = computed<AxisTick[]>(() => {\r\n const y = this.scaleY();\r\n const format = this.valueFormatter();\r\n return this.domain().map((value) => ({ value, y: y(value), label: format(value) }));\r\n });\r\n\r\n protected readonly xLabels = computed<XLabel[]>(() => {\r\n const labels = this.labels();\r\n const x = this.scaleX();\r\n const count = labels.length;\r\n const plotWidth = this.plotRight() - PAD_LEFT;\r\n const fit = Math.max(1, Math.floor(plotWidth / X_LABEL_MIN_GAP));\r\n const step = Math.max(1, Math.ceil(count / fit));\r\n return labels.flatMap((text, index) => {\r\n if (index % step !== 0) return [];\r\n const anchor: XLabel['anchor'] =\r\n count > 1 && index === 0 ? 'start' : count > 1 && index === count - 1 ? 'end' : 'middle';\r\n return [{ x: x(index), text, anchor }];\r\n });\r\n });\r\n\r\n /** Alan dolgusunun ve eksen çizgisinin oturduğu taban — 0 ölçekteyse 0, değilse alt sınır. */\r\n protected readonly baselineY = computed(() => {\r\n const ticks = this.domain();\r\n const zero = ticks[0] <= 0 && ticks[ticks.length - 1] >= 0 ? 0 : ticks[0];\r\n return this.scaleY()(zero);\r\n });\r\n\r\n protected readonly plotSeries = computed<PlotSeries[]>(() => {\r\n const x = this.scaleX();\r\n const y = this.scaleY();\r\n const base = this.baselineY();\r\n return this.series().map((s, index) => {\r\n const slot = s.colorIndex ?? index;\r\n const points = s.values.map((value, i) => ({ x: x(i), y: y(value) }));\r\n const path = points.map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x} ${p.y}`).join(' ');\r\n const first = points[0];\r\n const last = points[points.length - 1];\r\n const areaPath = points.length > 1 ? `${path} L${last.x} ${base} L${first.x} ${base} Z` : '';\r\n return {\r\n name: s.name,\r\n values: s.values,\r\n points,\r\n path,\r\n areaPath,\r\n strokeClass: chartStrokeClass(slot),\r\n fillClass: chartFillClass(slot),\r\n keyClass: chartBgClass(slot),\r\n };\r\n });\r\n });\r\n\r\n protected readonly activeX = computed(() => {\r\n const index = this.activeIndex();\r\n return index === null ? null : this.scaleX()(index);\r\n });\r\n\r\n /** Tooltip crosshair'in sağında; grafiğin sağ yarısındaysa taşmasın diye solunda. */\r\n protected readonly tooltipStyle = computed(() => {\r\n const x = this.activeX();\r\n if (x === null) return null;\r\n return x > this.width() / 2 ? { right: `${this.width() - x + 12}px` } : { left: `${x + 12}px` };\r\n });\r\n\r\n protected readonly readout = computed(() => {\r\n const index = this.activeIndex();\r\n if (index === null) return null;\r\n const format = this.valueFormatter();\r\n return {\r\n label: this.labels()[index] ?? '',\r\n rows: this.plotSeries().map((s) => ({\r\n name: s.name,\r\n keyClass: s.keyClass,\r\n value: s.values[index] === undefined ? '—' : format(s.values[index]),\r\n })),\r\n };\r\n });\r\n\r\n protected readonly liveText = computed(() => {\r\n const readout = this.readout();\r\n if (!readout) return '';\r\n return `${readout.label}: ${readout.rows.map((r) => `${r.name} ${r.value}`).join(', ')}`;\r\n });\r\n\r\n protected readonly tableRows = computed(() => {\r\n const format = this.valueFormatter();\r\n return this.labels().map((label, index) => ({\r\n label,\r\n values: this.series().map((s) =>\r\n s.values[index] === undefined ? '—' : format(s.values[index]),\r\n ),\r\n }));\r\n });\r\n\r\n constructor() {\r\n const destroyRef = inject(DestroyRef);\r\n afterNextRender(() => {\r\n const host = this.elementRef.nativeElement;\r\n if (host.clientWidth > 0) this.width.set(host.clientWidth);\r\n if (typeof ResizeObserver === 'undefined') return;\r\n const observer = new ResizeObserver(([entry]) => {\r\n const next = Math.round(entry.contentRect.width);\r\n if (next > 0) this.width.set(next);\r\n });\r\n observer.observe(host);\r\n destroyRef.onDestroy(() => observer.disconnect());\r\n });\r\n }\r\n\r\n protected toggleTable(): void {\r\n this.activeIndex.set(null);\r\n this.tableView.update((value) => !value);\r\n }\r\n\r\n protected onPointerMove(event: PointerEvent): void {\r\n const count = this.labels().length;\r\n if (count === 0) return;\r\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\r\n const plotWidth = this.plotRight() - PAD_LEFT;\r\n const ratio = count <= 1 ? 0 : (event.clientX - rect.left - PAD_LEFT) / plotWidth;\r\n this.activeIndex.set(clamp(Math.round(ratio * (count - 1)), 0, count - 1));\r\n }\r\n\r\n protected onFocus(): void {\r\n if (this.activeIndex() === null && this.labels().length > 0) {\r\n this.activeIndex.set(this.labels().length - 1);\r\n }\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent): void {\r\n const count = this.labels().length;\r\n if (count === 0) return;\r\n const current = this.activeIndex() ?? count - 1;\r\n const next: Record<string, number | null> = {\r\n ArrowLeft: clamp(current - 1, 0, count - 1),\r\n ArrowRight: clamp(current + 1, 0, count - 1),\r\n Home: 0,\r\n End: count - 1,\r\n Escape: null,\r\n };\r\n if (!(event.key in next)) return;\r\n event.preventDefault();\r\n this.activeIndex.set(next[event.key]);\r\n }\r\n}\r\n\r\nfunction clamp(value: number, min: number, max: number): number {\r\n return Math.min(max, Math.max(min, value));\r\n}\r\n","<figure class=\"m-0 flex flex-col gap-3\">\r\n <div class=\"flex flex-wrap items-center justify-between gap-x-4 gap-y-2\">\r\n @if (plotSeries().length > 1) {\r\n <ul class=\"m-0 flex list-none flex-wrap gap-x-4 gap-y-1 p-0\">\r\n @for (s of plotSeries(); track s.name) {\r\n <li class=\"flex items-center gap-1.5 text-xs text-fg-muted\">\r\n <span class=\"h-0.5 w-3 shrink-0 rounded-full\" [class]=\"s.keyClass\"></span>\r\n {{ s.name }}\r\n </li>\r\n }\r\n </ul>\r\n } @else {\r\n <span></span>\r\n }\r\n <button\r\n type=\"button\"\r\n [class]=\"\r\n 'rounded-sm text-xs text-fg-muted underline-offset-2 transition-colors duration-fast ease-emphasis hover:text-fg hover:underline ' +\r\n focusRecipe\r\n \"\r\n (click)=\"toggleTable()\"\r\n >\r\n {{ tableView() ? i18n().showChart : i18n().showTable }}\r\n </button>\r\n </div>\r\n\r\n @if (tableView()) {\r\n <div class=\"overflow-x-auto\">\r\n <table class=\"w-full border-collapse text-sm\">\r\n <caption class=\"sr-only\">\r\n {{\r\n ariaLabel()\r\n }}\r\n </caption>\r\n <thead>\r\n <tr class=\"border-b border-border\">\r\n <th scope=\"col\" class=\"py-2 pe-4 text-start text-eyebrow text-fg-subtle\">\r\n {{ i18n().category }}\r\n </th>\r\n @for (s of series(); track s.name) {\r\n <th scope=\"col\" class=\"py-2 ps-4 text-end text-eyebrow text-fg-subtle\">\r\n {{ s.name }}\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of tableRows(); track $index) {\r\n <tr class=\"border-b border-border-subtle last:border-b-0\">\r\n <th scope=\"row\" class=\"py-2 pe-4 text-start font-normal text-fg-muted\">\r\n {{ row.label }}\r\n </th>\r\n @for (value of row.values; track $index) {\r\n <td class=\"py-2 ps-4 text-end tabular-nums text-fg\">{{ value }}</td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n } @else {\r\n <div\r\n tabindex=\"0\"\r\n role=\"group\"\r\n [attr.aria-label]=\"ariaLabel()\"\r\n [class]=\"'relative touch-pan-y rounded-sm ' + focusRecipe\"\r\n [style.height.px]=\"height()\"\r\n (pointermove)=\"onPointerMove($event)\"\r\n (pointerleave)=\"activeIndex.set(null)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"activeIndex.set(null)\"\r\n (keydown)=\"onKeydown($event)\"\r\n >\r\n <svg\r\n [attr.width]=\"width()\"\r\n [attr.height]=\"height()\"\r\n class=\"block overflow-visible\"\r\n aria-hidden=\"true\"\r\n >\r\n @for (tick of yTicks(); track tick.value) {\r\n <line\r\n [attr.x1]=\"plotLeft\"\r\n [attr.x2]=\"plotRight()\"\r\n [attr.y1]=\"tick.y\"\r\n [attr.y2]=\"tick.y\"\r\n class=\"stroke-border\"\r\n stroke-width=\"1\"\r\n shape-rendering=\"crispEdges\"\r\n />\r\n <text\r\n [attr.x]=\"plotLeft - 8\"\r\n [attr.y]=\"tick.y\"\r\n text-anchor=\"end\"\r\n dominant-baseline=\"middle\"\r\n class=\"fill-fg-subtle text-caption tabular-nums\"\r\n >\r\n {{ tick.label }}\r\n </text>\r\n }\r\n\r\n <line\r\n [attr.x1]=\"plotLeft\"\r\n [attr.x2]=\"plotRight()\"\r\n [attr.y1]=\"baselineY()\"\r\n [attr.y2]=\"baselineY()\"\r\n class=\"stroke-border-strong\"\r\n stroke-width=\"1\"\r\n shape-rendering=\"crispEdges\"\r\n />\r\n\r\n @for (label of xLabels(); track $index) {\r\n <text\r\n [attr.x]=\"label.x\"\r\n [attr.y]=\"plotBottom() + 18\"\r\n [attr.text-anchor]=\"label.anchor\"\r\n class=\"fill-fg-subtle text-caption\"\r\n >\r\n {{ label.text }}\r\n </text>\r\n }\r\n\r\n @if (area()) {\r\n @for (s of plotSeries(); track s.name) {\r\n <path [attr.d]=\"s.areaPath\" [class]=\"s.fillClass\" fill-opacity=\"0.1\" />\r\n }\r\n }\r\n\r\n @for (s of plotSeries(); track s.name) {\r\n <path\r\n [attr.d]=\"s.path\"\r\n fill=\"none\"\r\n [class]=\"s.strokeClass\"\r\n stroke-width=\"2\"\r\n stroke-linejoin=\"round\"\r\n stroke-linecap=\"round\"\r\n />\r\n }\r\n\r\n @if (activeX() !== null) {\r\n <line\r\n [attr.x1]=\"activeX()\"\r\n [attr.x2]=\"activeX()\"\r\n [attr.y1]=\"12\"\r\n [attr.y2]=\"plotBottom()\"\r\n class=\"stroke-border-strong\"\r\n stroke-width=\"1\"\r\n shape-rendering=\"crispEdges\"\r\n />\r\n }\r\n\r\n @for (s of plotSeries(); track s.name) {\r\n @let point = activeIndex() !== null ? s.points[activeIndex()!] : s.points.at(-1);\r\n @if (point) {\r\n <circle\r\n [attr.cx]=\"point.x\"\r\n [attr.cy]=\"point.y\"\r\n r=\"4\"\r\n [class]=\"s.fillClass + ' stroke-surface'\"\r\n stroke-width=\"2\"\r\n />\r\n }\r\n }\r\n\r\n @if (single() && activeIndex() === null) {\r\n @let last = plotSeries()[0].points.at(-1);\r\n @if (last) {\r\n <text\r\n [attr.x]=\"last.x + 10\"\r\n [attr.y]=\"last.y\"\r\n dominant-baseline=\"middle\"\r\n class=\"fill-fg text-caption font-medium tabular-nums\"\r\n >\r\n {{ valueFormatter()(plotSeries()[0].values.at(-1)!) }}\r\n </text>\r\n }\r\n }\r\n </svg>\r\n\r\n @if (readout(); as r) {\r\n <div\r\n aria-hidden=\"true\"\r\n [class]=\"tooltipSurface + ' pointer-events-none absolute top-0 z-10 min-w-32 px-3 py-2'\"\r\n [style.left]=\"tooltipStyle()?.left\"\r\n [style.right]=\"tooltipStyle()?.right\"\r\n >\r\n <p class=\"mb-1.5 text-caption text-fg-subtle\">{{ r.label }}</p>\r\n <ul class=\"m-0 flex list-none flex-col gap-1 p-0\">\r\n @for (row of r.rows; track row.name) {\r\n <li class=\"flex items-center gap-2 text-xs\">\r\n <span class=\"h-0.5 w-3 shrink-0 rounded-full\" [class]=\"row.keyClass\"></span>\r\n <span class=\"font-medium tabular-nums text-fg\">{{ row.value }}</span>\r\n <span class=\"text-fg-muted\">{{ row.name }}</span>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n }\r\n\r\n <div class=\"sr-only\" aria-live=\"polite\">{{ liveText() }}</div>\r\n </div>\r\n }\r\n</figure>\r\n","import { Component, booleanAttribute, computed, input } from '@angular/core';\r\n\r\nconst INSET = 4;\r\n\r\n/**\r\n * `<mf-sparkline [values]=\"last12\" ariaLabel=\"Son 12 ay: 120'den 184'e\" />`\r\n *\r\n * Eksensiz, etkileşimsiz trend glifi — StatTile'ın \"trend\" satırı (dataviz figür sözleşmesi:\r\n * çizgi geri planda kalan tonla, GÜNCEL dönem vurgu renginde). Değerin kendisi yanındaki metinde\r\n * yazdığı için hover katmanı YOK; `ariaLabel` verilmezse süs sayılır (`aria-hidden`).\r\n * Gerçek piksellerle çizilir (sabit `width`/`height`) — `viewBox` ölçeklemesi uç noktayı\r\n * elipse çevirirdi.\r\n */\r\n@Component({\r\n selector: 'mf-sparkline',\r\n host: { class: 'inline-block align-middle leading-none' },\r\n templateUrl: './sparkline.html',\r\n})\r\nexport class Sparkline {\r\n readonly values = input.required<readonly number[]>();\r\n readonly ariaLabel = input('');\r\n readonly width = input(96);\r\n readonly height = input(28);\r\n readonly area = input(false, { transform: booleanAttribute });\r\n\r\n protected readonly geometry = computed(() => {\r\n const values = this.values();\r\n const width = this.width();\r\n const height = this.height();\r\n if (values.length === 0) return { line: '', area: '', end: null };\r\n\r\n const min = Math.min(...values);\r\n const max = Math.max(...values);\r\n const span = max - min || 1;\r\n const stepX = values.length > 1 ? (width - INSET * 2) / (values.length - 1) : 0;\r\n const points = values.map((value, index) => ({\r\n x: values.length > 1 ? INSET + index * stepX : width / 2,\r\n y: height - INSET - ((value - min) / span) * (height - INSET * 2),\r\n }));\r\n const line = points.map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x} ${p.y}`).join(' ');\r\n const first = points[0];\r\n const end = points[points.length - 1];\r\n const area = points.length > 1 ? `${line} L${end.x} ${height} L${first.x} ${height} Z` : '';\r\n return { line, area, end };\r\n });\r\n}\r\n","<svg\r\n [attr.width]=\"width()\"\r\n [attr.height]=\"height()\"\r\n class=\"block overflow-visible\"\r\n [attr.role]=\"ariaLabel() ? 'img' : null\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n [attr.aria-hidden]=\"ariaLabel() ? null : 'true'\"\r\n>\r\n @if (area() && geometry().area) {\r\n <path [attr.d]=\"geometry().area\" class=\"fill-chart-1\" fill-opacity=\"0.1\" />\r\n }\r\n <path\r\n [attr.d]=\"geometry().line\"\r\n fill=\"none\"\r\n class=\"stroke-chart-other\"\r\n stroke-width=\"1.5\"\r\n stroke-linejoin=\"round\"\r\n stroke-linecap=\"round\"\r\n />\r\n @if (geometry().end; as end) {\r\n <circle\r\n [attr.cx]=\"end.x\"\r\n [attr.cy]=\"end.y\"\r\n r=\"3\"\r\n class=\"fill-chart-1 stroke-surface\"\r\n stroke-width=\"1.5\"\r\n />\r\n }\r\n</svg>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, computed, Directive } from '@angular/core';
3
+ import { cn } from '@mesgflow/ui-kit/core';
4
+
5
+ const SIZE_CLASSES = { sm: 'h-3.5 w-3.5', md: 'h-4 w-4', lg: 'h-5 w-5' };
6
+ /**
7
+ * `<input type="checkbox" mfCheckbox">` — `accent-color` (modern tarayıcı
8
+ * desteği) native checkbox'ın kendi tik/kutu görselini renklendiriyor, ayrı
9
+ * bir cva şemasına gerek yok (Switch'in aksine burada özel track+thumb
10
+ * görseli istemiyoruz, native checkbox görünümü + marka rengi yeterli).
11
+ */
12
+ class Checkbox {
13
+ size = input('md', /* @ts-ignore */
14
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
15
+ classes = computed(() => cn(
16
+ // `accent-color` (tik/kutu rengi) BİLEREK Button'daki "büyük dolu blok
17
+ // dark modda parlamaz" kuralının DIŞINDA — burada işaretlenmiş bir
18
+ // checkbox küçük/ince bir öğe, dark modda 400 basamağına parlaması
19
+ // (`Tailwind'in accent-* utility'si "accent-color" CSS property'sini
20
+ // besliyor, tek class'ta iki değer alamıyor, o yüzden burada tek yerde
21
+ // manuel dark: eşleniği var) okunabilirliği artırıyor. Focus artık
22
+ // tüm primitifler genelinde tek mekanizma olan native `outline`
23
+ // (bkz. button.variants.ts'teki focus notu) — eski `ring-2 ring-offset-2`
24
+ // box-shadow'u kalktı.
25
+ SIZE_CLASSES[this.size()], 'shrink-0 rounded-xs border-border accent-primary-600 dark:accent-primary-400 transition-colors duration-fast ease-emphasis ' +
26
+ 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring ' +
27
+ 'disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50'), /* @ts-ignore */
28
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
29
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Checkbox, deps: [], target: i0.ɵɵFactoryTarget.Directive });
30
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: Checkbox, isStandalone: true, selector: "input[type=checkbox][mfCheckbox]", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0 });
31
+ }
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Checkbox, decorators: [{
33
+ type: Directive,
34
+ args: [{
35
+ selector: 'input[type=checkbox][mfCheckbox]',
36
+ host: { '[class]': 'classes()' },
37
+ }]
38
+ }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
39
+
40
+ /**
41
+ * Generated bundle index. Do not edit.
42
+ */
43
+
44
+ export { Checkbox };
45
+ //# sourceMappingURL=mesgflow-ui-kit-checkbox.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesgflow-ui-kit-checkbox.mjs","sources":["../../../projects/ui-kit/checkbox/checkbox.ts","../../../projects/ui-kit/checkbox/mesgflow-ui-kit-checkbox.ts"],"sourcesContent":["import { Directive, computed, input } from '@angular/core';\r\nimport { cn, type MfSize } from '@mesgflow/ui-kit/core';\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=\"checkbox\" mfCheckbox\">` — `accent-color` (modern tarayıcı\r\n * desteği) native checkbox'ın kendi tik/kutu görselini renklendiriyor, ayrı\r\n * bir cva şemasına gerek yok (Switch'in aksine burada özel track+thumb\r\n * görseli istemiyoruz, native checkbox görünümü + marka rengi yeterli).\r\n */\r\n@Directive({\r\n selector: 'input[type=checkbox][mfCheckbox]',\r\n host: { '[class]': 'classes()' },\r\n})\r\nexport class Checkbox {\r\n readonly size = input<MfSize>('md');\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n // `accent-color` (tik/kutu rengi) BİLEREK Button'daki \"büyük dolu blok\r\n // dark modda parlamaz\" kuralının DIŞINDA — burada işaretlenmiş bir\r\n // checkbox küçük/ince bir öğe, dark modda 400 basamağına parlaması\r\n // (`Tailwind'in accent-* utility'si \"accent-color\" CSS property'sini\r\n // besliyor, tek class'ta iki değer alamıyor, o yüzden burada tek yerde\r\n // manuel dark: eşleniği var) okunabilirliği artırıyor. Focus artık\r\n // tüm primitifler genelinde tek mekanizma olan native `outline`\r\n // (bkz. button.variants.ts'teki focus notu) — eski `ring-2 ring-offset-2`\r\n // box-shadow'u kalktı.\r\n SIZE_CLASSES[this.size()],\r\n 'shrink-0 rounded-xs 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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAGA,MAAM,YAAY,GAA2B,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE;AAEhG;;;;;AAKG;MAKU,QAAQ,CAAA;IACV,IAAI,GAAG,KAAK,CAAS,IAAI;6EAAC;AAEhB,IAAA,OAAO,GAAG,QAAQ,CAAC,MACpC,EAAE;;;;;;;;;;AAUA,IAAA,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EACzB,6HAA6H;QAC3H,gHAAgH;AAChH,QAAA,8EAA8E,CACjF;gFACF;uGAnBU,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAR,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kCAAA,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,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAR,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAJpB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kCAAkC;AAC5C,oBAAA,IAAI,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE;AACjC,iBAAA;;;ACdD;;AAEG;;"}
@@ -0,0 +1,123 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, output, inject, computed, Component } from '@angular/core';
3
+ import { MF_CHIP_LABELS, cn } from '@mesgflow/ui-kit/core';
4
+ import { Icon } from '@mesgflow/ui-kit/icon';
5
+ import { cva } from 'class-variance-authority';
6
+
7
+ /**
8
+ * Badge (bkz. badge.variants.ts) ile AYNI tonal işaret rol token'ı
9
+ * (`bg-X-tint text-X-tint-fg`) — chip Badge'in ETKİLEŞİMLİ (kaldırılabilir/
10
+ * seçilebilir) hali, o yüzden aynı görsel aileyi paylaşıyor. `text-eyebrow`'un
11
+ * mono/büyük-harf kimliği BİLEREK burada YOK — chip genelde "Rol: Yönetici"
12
+ * gibi okunabilir, karma büyük/küçük harfli içerik taşıyor (Badge'in kısa
13
+ * durum etiketlerinin aksine).
14
+ */
15
+ const chipVariants = cva('inline-flex items-center gap-1 rounded-full text-xs font-medium transition-colors duration-fast ease-emphasis', {
16
+ variants: {
17
+ tone: {
18
+ neutral: 'bg-surface-alt text-fg-muted',
19
+ primary: 'bg-primary-tint text-primary-tint-fg',
20
+ success: 'bg-success-tint text-success-tint-fg',
21
+ warning: 'bg-warning-tint text-warning-tint-fg',
22
+ danger: 'bg-danger-tint text-danger-tint-fg',
23
+ info: 'bg-info-tint text-info-tint-fg',
24
+ help: 'bg-help-tint text-help-tint-fg',
25
+ },
26
+ size: {
27
+ sm: 'py-1 pe-1.5 ps-2.5',
28
+ md: 'py-1.5 pe-2 ps-3',
29
+ },
30
+ /** Seçili durumdaki bir chip (ör. filtrelenebilir bir etiket listesi) — tona bakmaksızın TEK bir vurgu mekanizması (`ring-current`), her tonun kendi seçili basamağını tanımlamasına gerek kalmadan. */
31
+ selected: {
32
+ true: 'ring-1 ring-inset ring-current',
33
+ false: '',
34
+ },
35
+ disabled: {
36
+ true: 'pointer-events-none opacity-50',
37
+ false: '',
38
+ },
39
+ },
40
+ defaultVariants: { tone: 'neutral', size: 'md', selected: false, disabled: false },
41
+ });
42
+
43
+ /**
44
+ * `<mf-chip removable (removed)="onRemove()">Rol: Yönetici</mf-chip>` — asıl
45
+ * içerik `<ng-content />` ile projekte edilir (ör. `TableFilterBar`'ın
46
+ * kendi tıklanabilir düzenleme düğmesi, bkz. `table-filter-bar.html`); Chip
47
+ * SADECE kabuğu (tonal dolgu + opsiyonel kaldırma düğmesi) sağlar, içeriğin
48
+ * kendi tıklama davranışına karışmaz.
49
+ */
50
+ class Chip {
51
+ tone = input('neutral', /* @ts-ignore */
52
+ ...(ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []));
53
+ size = input('md', /* @ts-ignore */
54
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
55
+ selected = input(false, /* @ts-ignore */
56
+ ...(ngDevMode ? [{ debugName: "selected" }] : /* istanbul ignore next */ []));
57
+ disabled = input(false, /* @ts-ignore */
58
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
59
+ removable = input(false, /* @ts-ignore */
60
+ ...(ngDevMode ? [{ debugName: "removable" }] : /* istanbul ignore next */ []));
61
+ removeLabel = input(/* @ts-ignore */
62
+ ...(ngDevMode ? [undefined, { debugName: "removeLabel" }] : /* istanbul ignore next */ []));
63
+ removed = output();
64
+ chipLabels = inject(MF_CHIP_LABELS);
65
+ effectiveRemoveLabel = computed(() => this.removeLabel() ?? this.chipLabels().remove, /* @ts-ignore */
66
+ ...(ngDevMode ? [{ debugName: "effectiveRemoveLabel" }] : /* istanbul ignore next */ []));
67
+ classes = computed(() => cn(chipVariants({
68
+ tone: this.tone(),
69
+ size: this.size(),
70
+ selected: this.selected(),
71
+ disabled: this.disabled(),
72
+ })), /* @ts-ignore */
73
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
74
+ onRemoveClick(event) {
75
+ event.stopPropagation();
76
+ this.removed.emit();
77
+ }
78
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Chip, deps: [], target: i0.ɵɵFactoryTarget.Component });
79
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Chip, isStandalone: true, selector: "mf-chip", inputs: { tone: { classPropertyName: "tone", publicName: "tone", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, removable: { classPropertyName: "removable", publicName: "removable", isSignal: true, isRequired: false, transformFunction: null }, removeLabel: { classPropertyName: "removeLabel", publicName: "removeLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { removed: "removed" }, host: { properties: { "class": "classes()" } }, exportAs: ["mfChip"], ngImport: i0, template: `
80
+ <ng-content />
81
+ @if (removable()) {
82
+ <button
83
+ type="button"
84
+ class="text-fg-subtle hover:text-danger -me-1 shrink-0 appearance-none border-0 bg-transparent p-0.5 transition-colors duration-fast ease-emphasis disabled:pointer-events-none"
85
+ [attr.aria-label]="effectiveRemoveLabel()"
86
+ [disabled]="disabled()"
87
+ (click)="onRemoveClick($event)"
88
+ >
89
+ <span mfIcon [size]="14">close</span>
90
+ </button>
91
+ }
92
+ `, isInline: true, dependencies: [{ kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }] });
93
+ }
94
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Chip, decorators: [{
95
+ type: Component,
96
+ args: [{
97
+ selector: 'mf-chip',
98
+ exportAs: 'mfChip',
99
+ imports: [Icon],
100
+ host: { '[class]': 'classes()' },
101
+ template: `
102
+ <ng-content />
103
+ @if (removable()) {
104
+ <button
105
+ type="button"
106
+ class="text-fg-subtle hover:text-danger -me-1 shrink-0 appearance-none border-0 bg-transparent p-0.5 transition-colors duration-fast ease-emphasis disabled:pointer-events-none"
107
+ [attr.aria-label]="effectiveRemoveLabel()"
108
+ [disabled]="disabled()"
109
+ (click)="onRemoveClick($event)"
110
+ >
111
+ <span mfIcon [size]="14">close</span>
112
+ </button>
113
+ }
114
+ `,
115
+ }]
116
+ }], propDecorators: { tone: [{ type: i0.Input, args: [{ isSignal: true, alias: "tone", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], removable: [{ type: i0.Input, args: [{ isSignal: true, alias: "removable", required: false }] }], removeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "removeLabel", required: false }] }], removed: [{ type: i0.Output, args: ["removed"] }] } });
117
+
118
+ /**
119
+ * Generated bundle index. Do not edit.
120
+ */
121
+
122
+ export { Chip, chipVariants };
123
+ //# sourceMappingURL=mesgflow-ui-kit-chip.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesgflow-ui-kit-chip.mjs","sources":["../../../projects/ui-kit/chip/chip.variants.ts","../../../projects/ui-kit/chip/chip.ts","../../../projects/ui-kit/chip/mesgflow-ui-kit-chip.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\r\n\r\n/**\r\n * Badge (bkz. badge.variants.ts) ile AYNI tonal işaret rol token'ı\r\n * (`bg-X-tint text-X-tint-fg`) — chip Badge'in ETKİLEŞİMLİ (kaldırılabilir/\r\n * seçilebilir) hali, o yüzden aynı görsel aileyi paylaşıyor. `text-eyebrow`'un\r\n * mono/büyük-harf kimliği BİLEREK burada YOK — chip genelde \"Rol: Yönetici\"\r\n * gibi okunabilir, karma büyük/küçük harfli içerik taşıyor (Badge'in kısa\r\n * durum etiketlerinin aksine).\r\n */\r\nexport const chipVariants = cva(\r\n 'inline-flex items-center gap-1 rounded-full text-xs font-medium transition-colors duration-fast ease-emphasis',\r\n {\r\n variants: {\r\n tone: {\r\n neutral: 'bg-surface-alt text-fg-muted',\r\n primary: 'bg-primary-tint text-primary-tint-fg',\r\n success: 'bg-success-tint text-success-tint-fg',\r\n warning: 'bg-warning-tint text-warning-tint-fg',\r\n danger: 'bg-danger-tint text-danger-tint-fg',\r\n info: 'bg-info-tint text-info-tint-fg',\r\n help: 'bg-help-tint text-help-tint-fg',\r\n },\r\n size: {\r\n sm: 'py-1 pe-1.5 ps-2.5',\r\n md: 'py-1.5 pe-2 ps-3',\r\n },\r\n /** Seçili durumdaki bir chip (ör. filtrelenebilir bir etiket listesi) — tona bakmaksızın TEK bir vurgu mekanizması (`ring-current`), her tonun kendi seçili basamağını tanımlamasına gerek kalmadan. */\r\n selected: {\r\n true: 'ring-1 ring-inset ring-current',\r\n false: '',\r\n },\r\n disabled: {\r\n true: 'pointer-events-none opacity-50',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: { tone: 'neutral', size: 'md', selected: false, disabled: false },\r\n },\r\n);\r\n\r\nexport type ChipTone = VariantProps<typeof chipVariants>['tone'];\r\nexport type ChipSize = VariantProps<typeof chipVariants>['size'];\r\n","import { Component, computed, inject, input, output } from '@angular/core';\r\nimport { cn, MF_CHIP_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { chipVariants, type ChipSize, type ChipTone } from './chip.variants';\r\n\r\n/**\r\n * `<mf-chip removable (removed)=\"onRemove()\">Rol: Yönetici</mf-chip>` — asıl\r\n * içerik `<ng-content />` ile projekte edilir (ör. `TableFilterBar`'ın\r\n * kendi tıklanabilir düzenleme düğmesi, bkz. `table-filter-bar.html`); Chip\r\n * SADECE kabuğu (tonal dolgu + opsiyonel kaldırma düğmesi) sağlar, içeriğin\r\n * kendi tıklama davranışına karışmaz.\r\n */\r\n@Component({\r\n selector: 'mf-chip',\r\n exportAs: 'mfChip',\r\n imports: [Icon],\r\n host: { '[class]': 'classes()' },\r\n template: `\r\n <ng-content />\r\n @if (removable()) {\r\n <button\r\n type=\"button\"\r\n class=\"text-fg-subtle hover:text-danger -me-1 shrink-0 appearance-none border-0 bg-transparent p-0.5 transition-colors duration-fast ease-emphasis disabled:pointer-events-none\"\r\n [attr.aria-label]=\"effectiveRemoveLabel()\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"onRemoveClick($event)\"\r\n >\r\n <span mfIcon [size]=\"14\">close</span>\r\n </button>\r\n }\r\n `,\r\n})\r\nexport class Chip {\r\n readonly tone = input<ChipTone>('neutral');\r\n readonly size = input<ChipSize>('md');\r\n readonly selected = input(false);\r\n readonly disabled = input(false);\r\n readonly removable = input(false);\r\n readonly removeLabel = input<string>();\r\n\r\n readonly removed = output<void>();\r\n\r\n private readonly chipLabels = inject(MF_CHIP_LABELS);\r\n protected readonly effectiveRemoveLabel = computed(\r\n () => this.removeLabel() ?? this.chipLabels().remove,\r\n );\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n chipVariants({\r\n tone: this.tone(),\r\n size: this.size(),\r\n selected: this.selected(),\r\n disabled: this.disabled(),\r\n }),\r\n ),\r\n );\r\n\r\n protected onRemoveClick(event: Event): void {\r\n event.stopPropagation();\r\n this.removed.emit();\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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"}
@@ -0,0 +1,71 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, input, booleanAttribute, inject, computed, Component } from '@angular/core';
3
+ import { MF_COPY_LABELS, cn } from '@mesgflow/ui-kit/core';
4
+ import { CopyButton } from '@mesgflow/ui-kit/copy-button';
5
+ import { Icon } from '@mesgflow/ui-kit/icon';
6
+
7
+ /** Varsayılan `null` — kit vurgulama kütüphanesi GÖMMEZ (bağımlılık politikası); düz metin. */
8
+ const MF_CODE_HIGHLIGHTER = new InjectionToken('mesgflow.code-highlighter', { factory: () => null });
9
+ /** `providers: [provideCodeHighlighter((code, lang) => hljs.highlight(code, { language: lang ?? 'plaintext' }).value)]` */
10
+ function provideCodeHighlighter(highlighter) {
11
+ return { provide: MF_CODE_HIGHLIGHTER, useValue: highlighter };
12
+ }
13
+
14
+ /**
15
+ * `<mf-code-block [code]="snippet" filename="app.config.ts" language="ts" lineNumbers />`
16
+ *
17
+ * Başlık şeridi (dosya adı · dil rozeti · kopyala) yalnızca `filename`/`language` verilince
18
+ * çizilir; yoksa kopyala düğmesi sağ üst köşede yüzer. Kaydırma alanı odaklanabilir ve adlı bir
19
+ * `role="group"` (klavyeyle kaydırılabilsin — axe `scrollable-region-focusable`). `region`
20
+ * DEĞİL: region bir landmark; bir sayfadaki onlarca "Kod" bölgesi landmark listesini kirletip
21
+ * axe `landmark-unique` ihlali veriyordu (showcase rota taramasında yakalandı).
22
+ *
23
+ * Satır numaraları kaydırma alanının İÇİNDE, yatayda yapışkan (`sticky start-0`) bir oluk —
24
+ * dikey kaydırmada satırlarla hizalı kalır, yatayda yerinde durur; seçimle kopyalanmaz.
25
+ * `wrap` satır kaydırır ama numaralarla birlikte kullanılamaz (kaydırılan satır numara
26
+ * hizasını bozar) — ikisi birden verilirse `lineNumbers` kazanır.
27
+ *
28
+ * Vurgulama isteğe bağlı: `provideCodeHighlighter()` (bkz. `code-highlighter.ts`).
29
+ */
30
+ class CodeBlock {
31
+ code = input.required(/* @ts-ignore */
32
+ ...(ngDevMode ? [{ debugName: "code" }] : /* istanbul ignore next */ []));
33
+ language = input(/* @ts-ignore */
34
+ ...(ngDevMode ? [undefined, { debugName: "language" }] : /* istanbul ignore next */ []));
35
+ filename = input(/* @ts-ignore */
36
+ ...(ngDevMode ? [undefined, { debugName: "filename" }] : /* istanbul ignore next */ []));
37
+ lineNumbers = input(false, { ...(ngDevMode ? { debugName: "lineNumbers" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
38
+ wrap = input(false, { ...(ngDevMode ? { debugName: "wrap" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
39
+ copyable = input(true, { ...(ngDevMode ? { debugName: "copyable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
40
+ /** Kaydırma alanının azami yüksekliği (CSS uzunluğu, ör. `'20rem'`); verilmezse sınırsız. */
41
+ maxHeight = input(/* @ts-ignore */
42
+ ...(ngDevMode ? [undefined, { debugName: "maxHeight" }] : /* istanbul ignore next */ []));
43
+ highlighter = inject(MF_CODE_HIGHLIGHTER);
44
+ labels = inject(MF_COPY_LABELS);
45
+ hasHeader = computed(() => !!(this.filename() || this.language()), /* @ts-ignore */
46
+ ...(ngDevMode ? [{ debugName: "hasHeader" }] : /* istanbul ignore next */ []));
47
+ regionLabel = computed(() => this.filename() || this.labels().code, /* @ts-ignore */
48
+ ...(ngDevMode ? [{ debugName: "regionLabel" }] : /* istanbul ignore next */ []));
49
+ highlighted = computed(() => this.highlighter ? this.highlighter(this.code(), this.language()) : null, /* @ts-ignore */
50
+ ...(ngDevMode ? [{ debugName: "highlighted" }] : /* istanbul ignore next */ []));
51
+ /** Sondaki satır sonu boş bir satır numarası üretmesin. */
52
+ lines = computed(() => Array.from({ length: this.code().replace(/\n$/, '').split('\n').length }, (_, i) => i + 1), /* @ts-ignore */
53
+ ...(ngDevMode ? [{ debugName: "lines" }] : /* istanbul ignore next */ []));
54
+ wraps = computed(() => this.wrap() && !this.lineNumbers(), /* @ts-ignore */
55
+ ...(ngDevMode ? [{ debugName: "wraps" }] : /* istanbul ignore next */ []));
56
+ preClasses = computed(() => cn('m-0 flex-1 py-4 pe-4 font-mono text-sm leading-relaxed text-fg-muted', this.lineNumbers() ? 'ps-2' : 'ps-4', this.wraps() ? 'whitespace-pre-wrap break-words' : 'whitespace-pre', !this.hasHeader() && this.copyable() && 'pe-12'), /* @ts-ignore */
57
+ ...(ngDevMode ? [{ debugName: "preClasses" }] : /* istanbul ignore next */ []));
58
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CodeBlock, deps: [], target: i0.ɵɵFactoryTarget.Component });
59
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: CodeBlock, isStandalone: true, selector: "mf-code-block", inputs: { code: { classPropertyName: "code", publicName: "code", isSignal: true, isRequired: true, transformFunction: null }, language: { classPropertyName: "language", publicName: "language", isSignal: true, isRequired: false, transformFunction: null }, filename: { classPropertyName: "filename", publicName: "filename", isSignal: true, isRequired: false, transformFunction: null }, lineNumbers: { classPropertyName: "lineNumbers", publicName: "lineNumbers", isSignal: true, isRequired: false, transformFunction: null }, wrap: { classPropertyName: "wrap", publicName: "wrap", isSignal: true, isRequired: false, transformFunction: null }, copyable: { classPropertyName: "copyable", publicName: "copyable", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "block" }, exportAs: ["mfCodeBlock"], ngImport: i0, template: "<figure class=\"m-0 overflow-hidden rounded-lg border border-border bg-surface-sunken\">\r\n @if (hasHeader()) {\r\n <figcaption\r\n class=\"flex min-h-10 items-center gap-2 border-b border-border ps-4 pe-1.5 text-xs text-fg-muted\"\r\n >\r\n @if (filename()) {\r\n <span mfIcon [size]=\"14\" class=\"shrink-0 text-fg-subtle\">description</span>\r\n <span class=\"min-w-0 truncate font-mono\">{{ filename() }}</span>\r\n }\r\n <span class=\"ms-auto flex shrink-0 items-center gap-1\">\r\n @if (language()) {\r\n <span\r\n class=\"rounded-xs bg-surface-alt px-1.5 py-0.5 font-mono text-eyebrow text-fg-subtle uppercase\"\r\n >{{ language() }}</span\r\n >\r\n }\r\n @if (copyable()) {\r\n <mf-copy-button [value]=\"code()\" />\r\n }\r\n </span>\r\n </figcaption>\r\n }\r\n\r\n <div class=\"relative\">\r\n @if (!hasHeader() && copyable()) {\r\n <mf-copy-button class=\"absolute end-2 top-2 z-[2]\" [value]=\"code()\" />\r\n }\r\n <div\r\n tabindex=\"0\"\r\n role=\"group\"\r\n [attr.aria-label]=\"regionLabel()\"\r\n class=\"overflow-auto outline-none focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring\"\r\n [style.max-height]=\"maxHeight() ?? null\"\r\n >\r\n <div class=\"flex\" [class.min-w-max]=\"!wraps()\">\r\n @if (lineNumbers()) {\r\n <div\r\n aria-hidden=\"true\"\r\n class=\"sticky start-0 z-[1] shrink-0 bg-surface-sunken py-4 ps-4 pe-2 text-end font-mono text-sm leading-relaxed text-fg-subtle tabular-nums select-none\"\r\n >\r\n @for (line of lines(); track line) {\r\n <div>{{ line }}</div>\r\n }\r\n </div>\r\n }\r\n <!-- \u0130\u00E7erik tek sat\u0131rda: <pre> i\u00E7indeki \u015Fablon bo\u015Fluklar\u0131 koda s\u0131zmas\u0131n. -->\r\n @if (highlighted(); as html) {\r\n <pre [class]=\"preClasses()\"><code [innerHTML]=\"html\"></code></pre>\r\n } @else {\r\n <pre [class]=\"preClasses()\"><code>{{ code() }}</code></pre>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</figure>\r\n", dependencies: [{ kind: "component", type: CopyButton, selector: "mf-copy-button", inputs: ["value", "label"], exportAs: ["mfCopyButton"] }, { kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }] });
60
+ }
61
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CodeBlock, decorators: [{
62
+ type: Component,
63
+ args: [{ selector: 'mf-code-block', exportAs: 'mfCodeBlock', imports: [CopyButton, Icon], host: { class: 'block' }, template: "<figure class=\"m-0 overflow-hidden rounded-lg border border-border bg-surface-sunken\">\r\n @if (hasHeader()) {\r\n <figcaption\r\n class=\"flex min-h-10 items-center gap-2 border-b border-border ps-4 pe-1.5 text-xs text-fg-muted\"\r\n >\r\n @if (filename()) {\r\n <span mfIcon [size]=\"14\" class=\"shrink-0 text-fg-subtle\">description</span>\r\n <span class=\"min-w-0 truncate font-mono\">{{ filename() }}</span>\r\n }\r\n <span class=\"ms-auto flex shrink-0 items-center gap-1\">\r\n @if (language()) {\r\n <span\r\n class=\"rounded-xs bg-surface-alt px-1.5 py-0.5 font-mono text-eyebrow text-fg-subtle uppercase\"\r\n >{{ language() }}</span\r\n >\r\n }\r\n @if (copyable()) {\r\n <mf-copy-button [value]=\"code()\" />\r\n }\r\n </span>\r\n </figcaption>\r\n }\r\n\r\n <div class=\"relative\">\r\n @if (!hasHeader() && copyable()) {\r\n <mf-copy-button class=\"absolute end-2 top-2 z-[2]\" [value]=\"code()\" />\r\n }\r\n <div\r\n tabindex=\"0\"\r\n role=\"group\"\r\n [attr.aria-label]=\"regionLabel()\"\r\n class=\"overflow-auto outline-none focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring\"\r\n [style.max-height]=\"maxHeight() ?? null\"\r\n >\r\n <div class=\"flex\" [class.min-w-max]=\"!wraps()\">\r\n @if (lineNumbers()) {\r\n <div\r\n aria-hidden=\"true\"\r\n class=\"sticky start-0 z-[1] shrink-0 bg-surface-sunken py-4 ps-4 pe-2 text-end font-mono text-sm leading-relaxed text-fg-subtle tabular-nums select-none\"\r\n >\r\n @for (line of lines(); track line) {\r\n <div>{{ line }}</div>\r\n }\r\n </div>\r\n }\r\n <!-- \u0130\u00E7erik tek sat\u0131rda: <pre> i\u00E7indeki \u015Fablon bo\u015Fluklar\u0131 koda s\u0131zmas\u0131n. -->\r\n @if (highlighted(); as html) {\r\n <pre [class]=\"preClasses()\"><code [innerHTML]=\"html\"></code></pre>\r\n } @else {\r\n <pre [class]=\"preClasses()\"><code>{{ code() }}</code></pre>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</figure>\r\n" }]
64
+ }], propDecorators: { code: [{ type: i0.Input, args: [{ isSignal: true, alias: "code", required: true }] }], language: [{ type: i0.Input, args: [{ isSignal: true, alias: "language", required: false }] }], filename: [{ type: i0.Input, args: [{ isSignal: true, alias: "filename", required: false }] }], lineNumbers: [{ type: i0.Input, args: [{ isSignal: true, alias: "lineNumbers", required: false }] }], wrap: [{ type: i0.Input, args: [{ isSignal: true, alias: "wrap", required: false }] }], copyable: [{ type: i0.Input, args: [{ isSignal: true, alias: "copyable", required: false }] }], maxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxHeight", required: false }] }] } });
65
+
66
+ /**
67
+ * Generated bundle index. Do not edit.
68
+ */
69
+
70
+ export { CodeBlock, MF_CODE_HIGHLIGHTER, provideCodeHighlighter };
71
+ //# sourceMappingURL=mesgflow-ui-kit-code-block.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesgflow-ui-kit-code-block.mjs","sources":["../../../projects/ui-kit/code-block/code-highlighter.ts","../../../projects/ui-kit/code-block/code-block.ts","../../../projects/ui-kit/code-block/code-block.html","../../../projects/ui-kit/code-block/mesgflow-ui-kit-code-block.ts"],"sourcesContent":["import { InjectionToken, type Provider } from '@angular/core';\r\n\r\n/**\r\n * Kod → vurgulanmış HTML. Dönüş `[innerHTML]` ile basılır: düz `string` Angular'ın sanitizer'ından\r\n * geçer (sınıflar kalır, satır içi `style` atılır — highlight.js/Prism gibi SINIF tabanlı\r\n * vurgulayıcılar olduğu gibi çalışır). Satır içi renk kullanan bir çıktıya (ör. varsayılan shiki)\r\n * güveniyorsanız `DomSanitizer.bypassSecurityTrustHtml` çıktısını döndürün — sorumluluk sizde.\r\n * (Tip `object`: kit `@angular/platform-browser`'a peer bağımlılık eklemesin diye `SafeHtml` yerine.)\r\n */\r\nexport type MfCodeHighlighter = (code: string, language: string | undefined) => string | object;\r\n\r\n/** Varsayılan `null` — kit vurgulama kütüphanesi GÖMMEZ (bağımlılık politikası); düz metin. */\r\nexport const MF_CODE_HIGHLIGHTER = new InjectionToken<MfCodeHighlighter | null>(\r\n 'mesgflow.code-highlighter',\r\n { factory: () => null },\r\n);\r\n\r\n/** `providers: [provideCodeHighlighter((code, lang) => hljs.highlight(code, { language: lang ?? 'plaintext' }).value)]` */\r\nexport function provideCodeHighlighter(highlighter: MfCodeHighlighter): Provider {\r\n return { provide: MF_CODE_HIGHLIGHTER, useValue: highlighter };\r\n}\r\n","import { Component, booleanAttribute, computed, inject, input } from '@angular/core';\r\nimport { MF_COPY_LABELS, cn } from '@mesgflow/ui-kit/core';\r\nimport { CopyButton } from '@mesgflow/ui-kit/copy-button';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { MF_CODE_HIGHLIGHTER } from './code-highlighter';\r\n\r\n/**\r\n * `<mf-code-block [code]=\"snippet\" filename=\"app.config.ts\" language=\"ts\" lineNumbers />`\r\n *\r\n * Başlık şeridi (dosya adı · dil rozeti · kopyala) yalnızca `filename`/`language` verilince\r\n * çizilir; yoksa kopyala düğmesi sağ üst köşede yüzer. Kaydırma alanı odaklanabilir ve adlı bir\r\n * `role=\"group\"` (klavyeyle kaydırılabilsin — axe `scrollable-region-focusable`). `region`\r\n * DEĞİL: region bir landmark; bir sayfadaki onlarca \"Kod\" bölgesi landmark listesini kirletip\r\n * axe `landmark-unique` ihlali veriyordu (showcase rota taramasında yakalandı).\r\n *\r\n * Satır numaraları kaydırma alanının İÇİNDE, yatayda yapışkan (`sticky start-0`) bir oluk —\r\n * dikey kaydırmada satırlarla hizalı kalır, yatayda yerinde durur; seçimle kopyalanmaz.\r\n * `wrap` satır kaydırır ama numaralarla birlikte kullanılamaz (kaydırılan satır numara\r\n * hizasını bozar) — ikisi birden verilirse `lineNumbers` kazanır.\r\n *\r\n * Vurgulama isteğe bağlı: `provideCodeHighlighter()` (bkz. `code-highlighter.ts`).\r\n */\r\n@Component({\r\n selector: 'mf-code-block',\r\n exportAs: 'mfCodeBlock',\r\n imports: [CopyButton, Icon],\r\n host: { class: 'block' },\r\n templateUrl: './code-block.html',\r\n})\r\nexport class CodeBlock {\r\n readonly code = input.required<string>();\r\n readonly language = input<string>();\r\n readonly filename = input<string>();\r\n readonly lineNumbers = input(false, { transform: booleanAttribute });\r\n readonly wrap = input(false, { transform: booleanAttribute });\r\n readonly copyable = input(true, { transform: booleanAttribute });\r\n /** Kaydırma alanının azami yüksekliği (CSS uzunluğu, ör. `'20rem'`); verilmezse sınırsız. */\r\n readonly maxHeight = input<string>();\r\n\r\n private readonly highlighter = inject(MF_CODE_HIGHLIGHTER);\r\n private readonly labels = inject(MF_COPY_LABELS);\r\n\r\n protected readonly hasHeader = computed(() => !!(this.filename() || this.language()));\r\n protected readonly regionLabel = computed(() => this.filename() || this.labels().code);\r\n protected readonly highlighted = computed(() =>\r\n this.highlighter ? this.highlighter(this.code(), this.language()) : null,\r\n );\r\n /** Sondaki satır sonu boş bir satır numarası üretmesin. */\r\n protected readonly lines = computed(() =>\r\n Array.from({ length: this.code().replace(/\\n$/, '').split('\\n').length }, (_, i) => i + 1),\r\n );\r\n protected readonly wraps = computed(() => this.wrap() && !this.lineNumbers());\r\n\r\n protected readonly preClasses = computed(() =>\r\n cn(\r\n 'm-0 flex-1 py-4 pe-4 font-mono text-sm leading-relaxed text-fg-muted',\r\n this.lineNumbers() ? 'ps-2' : 'ps-4',\r\n this.wraps() ? 'whitespace-pre-wrap break-words' : 'whitespace-pre',\r\n !this.hasHeader() && this.copyable() && 'pe-12',\r\n ),\r\n );\r\n}\r\n","<figure class=\"m-0 overflow-hidden rounded-lg border border-border bg-surface-sunken\">\r\n @if (hasHeader()) {\r\n <figcaption\r\n class=\"flex min-h-10 items-center gap-2 border-b border-border ps-4 pe-1.5 text-xs text-fg-muted\"\r\n >\r\n @if (filename()) {\r\n <span mfIcon [size]=\"14\" class=\"shrink-0 text-fg-subtle\">description</span>\r\n <span class=\"min-w-0 truncate font-mono\">{{ filename() }}</span>\r\n }\r\n <span class=\"ms-auto flex shrink-0 items-center gap-1\">\r\n @if (language()) {\r\n <span\r\n class=\"rounded-xs bg-surface-alt px-1.5 py-0.5 font-mono text-eyebrow text-fg-subtle uppercase\"\r\n >{{ language() }}</span\r\n >\r\n }\r\n @if (copyable()) {\r\n <mf-copy-button [value]=\"code()\" />\r\n }\r\n </span>\r\n </figcaption>\r\n }\r\n\r\n <div class=\"relative\">\r\n @if (!hasHeader() && copyable()) {\r\n <mf-copy-button class=\"absolute end-2 top-2 z-[2]\" [value]=\"code()\" />\r\n }\r\n <div\r\n tabindex=\"0\"\r\n role=\"group\"\r\n [attr.aria-label]=\"regionLabel()\"\r\n class=\"overflow-auto outline-none focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring\"\r\n [style.max-height]=\"maxHeight() ?? null\"\r\n >\r\n <div class=\"flex\" [class.min-w-max]=\"!wraps()\">\r\n @if (lineNumbers()) {\r\n <div\r\n aria-hidden=\"true\"\r\n class=\"sticky start-0 z-[1] shrink-0 bg-surface-sunken py-4 ps-4 pe-2 text-end font-mono text-sm leading-relaxed text-fg-subtle tabular-nums select-none\"\r\n >\r\n @for (line of lines(); track line) {\r\n <div>{{ line }}</div>\r\n }\r\n </div>\r\n }\r\n <!-- İçerik tek satırda: <pre> içindeki şablon boşlukları koda sızmasın. -->\r\n @if (highlighted(); as html) {\r\n <pre [class]=\"preClasses()\"><code [innerHTML]=\"html\"></code></pre>\r\n } @else {\r\n <pre [class]=\"preClasses()\"><code>{{ code() }}</code></pre>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</figure>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import * as i0 from '@angular/core';
2
+ import { model, input, booleanAttribute, Component, inject, Directive, computed } from '@angular/core';
3
+
4
+ let collapsibleIdSeq = 0;
5
+ /**
6
+ * `<mf-collapsible [(open)]="advanced">
7
+ * <button mfButton mfCollapsibleTrigger>Gelişmiş ayarlar</button>
8
+ * <mf-collapsible-content>…</mf-collapsible-content>
9
+ * </mf-collapsible>`
10
+ *
11
+ * Tek bir aç/kapa bölümü (WAI-ARIA "disclosure"). Birden çok bölüm ve "yalnızca biri açık"
12
+ * kuralı için `Accordion`. Tetikleyici herhangi bir `<button>` — görünümü tüketicide.
13
+ */
14
+ class Collapsible {
15
+ open = model(false, /* @ts-ignore */
16
+ ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
17
+ disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
18
+ contentId = `mf-collapsible-${++collapsibleIdSeq}`;
19
+ toggle() {
20
+ if (!this.disabled())
21
+ this.open.update((open) => !open);
22
+ }
23
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Collapsible, deps: [], target: i0.ɵɵFactoryTarget.Component });
24
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: Collapsible, isStandalone: true, selector: "mf-collapsible", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange" }, host: { properties: { "attr.data-state": "open() ? 'open' : 'closed'" }, classAttribute: "block" }, exportAs: ["mfCollapsible"], ngImport: i0, template: '<ng-content />', isInline: true });
25
+ }
26
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Collapsible, decorators: [{
27
+ type: Component,
28
+ args: [{
29
+ selector: 'mf-collapsible',
30
+ exportAs: 'mfCollapsible',
31
+ host: { class: 'block', '[attr.data-state]': "open() ? 'open' : 'closed'" },
32
+ template: '<ng-content />',
33
+ }]
34
+ }], propDecorators: { open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
35
+ /** `button[mfCollapsibleTrigger]` — `aria-expanded`/`aria-controls` bağlı; bkz. `Collapsible`. */
36
+ class CollapsibleTrigger {
37
+ collapsible = inject(Collapsible);
38
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CollapsibleTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
39
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.6", type: CollapsibleTrigger, isStandalone: true, selector: "button[mfCollapsibleTrigger]", host: { listeners: { "click": "collapsible.toggle()" }, properties: { "attr.aria-expanded": "collapsible.open()", "attr.aria-controls": "collapsible.contentId", "attr.data-state": "collapsible.open() ? 'open' : 'closed'", "disabled": "collapsible.disabled()" } }, exportAs: ["mfCollapsibleTrigger"], ngImport: i0 });
40
+ }
41
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CollapsibleTrigger, decorators: [{
42
+ type: Directive,
43
+ args: [{
44
+ selector: 'button[mfCollapsibleTrigger]',
45
+ exportAs: 'mfCollapsibleTrigger',
46
+ host: {
47
+ '[attr.aria-expanded]': 'collapsible.open()',
48
+ '[attr.aria-controls]': 'collapsible.contentId',
49
+ '[attr.data-state]': "collapsible.open() ? 'open' : 'closed'",
50
+ '[disabled]': 'collapsible.disabled()',
51
+ '(click)': 'collapsible.toggle()',
52
+ },
53
+ }]
54
+ }] });
55
+ /**
56
+ * Yükseklik `grid-template-rows: 0fr → 1fr` ile animasyonlanır — içerik yüksekliği ölçülmez
57
+ * (JS yok, içerik sonradan büyüse de doğru). Kapalıyken `inert`: içindeki odaklanabilir öğeler
58
+ * sekme sırasından ve erişilebilirlik ağacından çıkar (yalnızca `height: 0` bunu yapmazdı).
59
+ * `prefers-reduced-motion`'da geçiş süresi tokens/motion.css'teki genel kuralla sıfırlanır.
60
+ */
61
+ class CollapsibleContent {
62
+ collapsible = inject(Collapsible);
63
+ classes = computed(() => 'grid transition-[grid-template-rows,opacity] duration-base ease-emphasis ' +
64
+ (this.collapsible.open() ? 'grid-rows-[1fr] opacity-100' : 'grid-rows-[0fr] opacity-0'), /* @ts-ignore */
65
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
66
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CollapsibleContent, deps: [], target: i0.ɵɵFactoryTarget.Component });
67
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.6", type: CollapsibleContent, isStandalone: true, selector: "mf-collapsible-content", host: { properties: { "id": "collapsible.contentId", "attr.inert": "collapsible.open() ? null : \"\"", "attr.data-state": "collapsible.open() ? 'open' : 'closed'", "class": "classes()" } }, exportAs: ["mfCollapsibleContent"], ngImport: i0, template: '<div class="min-h-0 overflow-hidden"><ng-content /></div>', isInline: true });
68
+ }
69
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CollapsibleContent, decorators: [{
70
+ type: Component,
71
+ args: [{
72
+ selector: 'mf-collapsible-content',
73
+ exportAs: 'mfCollapsibleContent',
74
+ host: {
75
+ '[id]': 'collapsible.contentId',
76
+ '[attr.inert]': 'collapsible.open() ? null : ""',
77
+ '[attr.data-state]': "collapsible.open() ? 'open' : 'closed'",
78
+ '[class]': 'classes()',
79
+ },
80
+ template: '<div class="min-h-0 overflow-hidden"><ng-content /></div>',
81
+ }]
82
+ }] });
83
+
84
+ /**
85
+ * Generated bundle index. Do not edit.
86
+ */
87
+
88
+ export { Collapsible, CollapsibleContent, CollapsibleTrigger };
89
+ //# sourceMappingURL=mesgflow-ui-kit-collapsible.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesgflow-ui-kit-collapsible.mjs","sources":["../../../projects/ui-kit/collapsible/collapsible.ts","../../../projects/ui-kit/collapsible/mesgflow-ui-kit-collapsible.ts"],"sourcesContent":["import {\r\n Component,\r\n Directive,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n input,\r\n model,\r\n} from '@angular/core';\r\n\r\nlet collapsibleIdSeq = 0;\r\n\r\n/**\r\n * `<mf-collapsible [(open)]=\"advanced\">\r\n * <button mfButton mfCollapsibleTrigger>Gelişmiş ayarlar</button>\r\n * <mf-collapsible-content>…</mf-collapsible-content>\r\n * </mf-collapsible>`\r\n *\r\n * Tek bir aç/kapa bölümü (WAI-ARIA \"disclosure\"). Birden çok bölüm ve \"yalnızca biri açık\"\r\n * kuralı için `Accordion`. Tetikleyici herhangi bir `<button>` — görünümü tüketicide.\r\n */\r\n@Component({\r\n selector: 'mf-collapsible',\r\n exportAs: 'mfCollapsible',\r\n host: { class: 'block', '[attr.data-state]': \"open() ? 'open' : 'closed'\" },\r\n template: '<ng-content />',\r\n})\r\nexport class Collapsible {\r\n readonly open = model(false);\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n\r\n readonly contentId = `mf-collapsible-${++collapsibleIdSeq}`;\r\n\r\n toggle(): void {\r\n if (!this.disabled()) this.open.update((open) => !open);\r\n }\r\n}\r\n\r\n/** `button[mfCollapsibleTrigger]` — `aria-expanded`/`aria-controls` bağlı; bkz. `Collapsible`. */\r\n@Directive({\r\n selector: 'button[mfCollapsibleTrigger]',\r\n exportAs: 'mfCollapsibleTrigger',\r\n host: {\r\n '[attr.aria-expanded]': 'collapsible.open()',\r\n '[attr.aria-controls]': 'collapsible.contentId',\r\n '[attr.data-state]': \"collapsible.open() ? 'open' : 'closed'\",\r\n '[disabled]': 'collapsible.disabled()',\r\n '(click)': 'collapsible.toggle()',\r\n },\r\n})\r\nexport class CollapsibleTrigger {\r\n protected readonly collapsible = inject(Collapsible);\r\n}\r\n\r\n/**\r\n * Yükseklik `grid-template-rows: 0fr → 1fr` ile animasyonlanır — içerik yüksekliği ölçülmez\r\n * (JS yok, içerik sonradan büyüse de doğru). Kapalıyken `inert`: içindeki odaklanabilir öğeler\r\n * sekme sırasından ve erişilebilirlik ağacından çıkar (yalnızca `height: 0` bunu yapmazdı).\r\n * `prefers-reduced-motion`'da geçiş süresi tokens/motion.css'teki genel kuralla sıfırlanır.\r\n */\r\n@Component({\r\n selector: 'mf-collapsible-content',\r\n exportAs: 'mfCollapsibleContent',\r\n host: {\r\n '[id]': 'collapsible.contentId',\r\n '[attr.inert]': 'collapsible.open() ? null : \"\"',\r\n '[attr.data-state]': \"collapsible.open() ? 'open' : 'closed'\",\r\n '[class]': 'classes()',\r\n },\r\n template: '<div class=\"min-h-0 overflow-hidden\"><ng-content /></div>',\r\n})\r\nexport class CollapsibleContent {\r\n protected readonly collapsible = inject(Collapsible);\r\n\r\n protected readonly classes = computed(\r\n () =>\r\n 'grid transition-[grid-template-rows,opacity] duration-base ease-emphasis ' +\r\n (this.collapsible.open() ? 'grid-rows-[1fr] opacity-100' : 'grid-rows-[0fr] opacity-0'),\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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"}