@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-tabs.mjs","sources":["../../../projects/ui-kit/tabs/tab-scroller.ts","../../../projects/ui-kit/tabs/tabs.variants.ts","../../../projects/ui-kit/tabs/tab-list.ts","../../../projects/ui-kit/tabs/tab-list.html","../../../projects/ui-kit/tabs/tab.ts","../../../projects/ui-kit/tabs/tab-panel.ts","../../../projects/ui-kit/tabs/tab-strip.ts","../../../projects/ui-kit/tabs/tab-strip.html","../../../projects/ui-kit/tabs/tabs.ts","../../../projects/ui-kit/tabs/mesgflow-ui-kit-tabs.ts"],"sourcesContent":["import {\r\n DestroyRef,\r\n Directive,\r\n ElementRef,\r\n afterNextRender,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { isRtl, scrollFromInlineStart } from '@mesgflow/ui-kit/core';\r\n\r\n/**\r\n * `<div mfTabScroller>` — taşan bir sekme şeridini kaydırılabilir yapar:\r\n * native scrollbar'ı gizler, kenar \"solma\" maskesini (`mask-image`)\r\n * kaydırılabilir yöne göre günceller, `canScrollStart`/`canScrollEnd`\r\n * sinyallerini dışarı verir (ok butonlarının görünürlüğü için — bkz.\r\n * `tab-list.html`/`tab-strip.html`, ikisi de bu directive'i paylaşıyor).\r\n *\r\n * `orientation` varsayılanı `'horizontal'` — `TabStrip` (üst sekme çubuğu)\r\n * bunu hiç geçmez, davranışı DEĞİŞMEZ. Dikey bir grup rayı gerektiren\r\n * tüketiciler `orientation=\"vertical\"` geçer (bkz. `tab-list.ts`).\r\n *\r\n * `mask-image` template'te `[style.mask-image]` ile DEĞİL, doğrudan\r\n * `style.setProperty` ile yazılıyor — Angular'ın stil binding sözdizimi\r\n * tire içeren (`-webkit-`) property adlarını binding adı olarak kabul\r\n * etmiyor, ikisini TEK yerden (burada) senkron yazmak için imperatif yol\r\n * daha güvenli (bkz. Tooltip'in de DOM'a doğrudan yazdığı emsal).\r\n */\r\n@Directive({\r\n selector: '[mfTabScroller]',\r\n host: {\r\n class: '[scrollbar-width:none] [&::-webkit-scrollbar]:hidden',\r\n '[class.flex]': 'orientation() === \"horizontal\"',\r\n '[class.min-w-0]': 'orientation() === \"horizontal\"',\r\n '[class.overflow-x-auto]': 'orientation() === \"horizontal\"',\r\n '[class.min-h-0]': 'orientation() === \"vertical\"',\r\n '[class.overflow-y-auto]': 'orientation() === \"vertical\"',\r\n '(scroll)': 'updateEdges()',\r\n },\r\n})\r\nexport class TabScroller {\r\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n readonly orientation = input<'horizontal' | 'vertical'>('horizontal');\r\n private readonly vertical = computed(() => this.orientation() === 'vertical');\r\n\r\n readonly canScrollStart = signal(false);\r\n readonly canScrollEnd = signal(false);\r\n\r\n constructor() {\r\n const destroyRef = inject(DestroyRef);\r\n\r\n afterNextRender(() => {\r\n this.updateEdges();\r\n if (typeof ResizeObserver === 'undefined') return;\r\n const observer = new ResizeObserver(() => this.updateEdges());\r\n observer.observe(this.el.nativeElement);\r\n destroyRef.onDestroy(() => observer.disconnect());\r\n });\r\n\r\n effect(() => {\r\n const start = this.canScrollStart() ? 24 : 0;\r\n const end = this.canScrollEnd() ? 24 : 0;\r\n // Maske satır başından sonuna — RTL'de başlangıç sağ kenar.\r\n const direction = this.vertical()\r\n ? 'to bottom'\r\n : isRtl(this.el.nativeElement)\r\n ? 'to left'\r\n : 'to right';\r\n const mask = `linear-gradient(${direction}, transparent, black ${start}px, black calc(100% - ${end}px), transparent 100%)`;\r\n this.el.nativeElement.style.setProperty('mask-image', mask);\r\n this.el.nativeElement.style.setProperty('-webkit-mask-image', mask);\r\n });\r\n }\r\n\r\n scrollByDir(dir: -1 | 1): void {\r\n const node = this.el.nativeElement;\r\n if (this.vertical()) node.scrollBy({ top: dir * node.clientHeight * 0.8, behavior: 'smooth' });\r\n else {\r\n // `dir` mantıksal (−1 başa, +1 sona); RTL'de sona gitmek scrollLeft'i AZALTIR.\r\n const sign = isRtl(node) ? -1 : 1;\r\n node.scrollBy({ left: sign * dir * node.clientWidth * 0.8, behavior: 'smooth' });\r\n }\r\n }\r\n\r\n scrollIntoViewIfNeeded(target: HTMLElement): void {\r\n // jsdom (birim testleri) Element.scrollIntoView'ı UYGULAMIYOR — ResizeObserver'daki\r\n // AYNI savunma deseni (bkz. constructor), gerçek tarayıcıda etkisiz bir NO-OP.\r\n target.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });\r\n }\r\n\r\n updateEdges(): void {\r\n const node = this.el.nativeElement;\r\n if (this.vertical()) {\r\n const max = node.scrollHeight - node.clientHeight;\r\n this.canScrollStart.set(node.scrollTop > 1);\r\n this.canScrollEnd.set(max > 1 && node.scrollTop < max - 1);\r\n return;\r\n }\r\n const max = node.scrollWidth - node.clientWidth;\r\n const offset = scrollFromInlineStart(node); // RTL'de scrollLeft negatif\r\n this.canScrollStart.set(offset > 1);\r\n this.canScrollEnd.set(max > 1 && offset < max - 1);\r\n }\r\n}\r\n","import { cva, type VariantProps } from 'class-variance-authority';\r\n\r\nexport type TabsVariant = 'underline' | 'card';\r\nexport type TabsOrientation = 'horizontal' | 'vertical';\r\n\r\n/**\r\n * Bkz. `tab-list.ts`. `underline`'da ray AYRI, kayan bir `<span>` (JS ile\r\n * konumlanır — bkz. `TabList.positionIndicator`); `card`'da ray HER sekmenin\r\n * kendi `box-shadow`'unda yaşar (bkz. `tabVariants` compound'u), çünkü\r\n * `card` görünümünde her sekme zaten kendi kenarlığıyla ayrık bir kutu —\r\n * kayan tek bir gösterge o kutuların üstünden \"kayarak\" geçmezdi, doğal\r\n * durmazdı. `relative` — kayan gösterge `absolute` konumlanıyor buna göre.\r\n *\r\n * `orientation` ekseni sol dikey grup rayı gerektiren ekranlar için eklendi —\r\n * `@angular/aria/tabs`'ın ARIA/klavye desteği zaten yön-agnostik\r\n * (`hostDirectives`'in `orientation` girdisi, bkz. `tab-list.ts`), eksik\r\n * olan sadece bu görsel katmandı.\r\n */\r\nexport const tabListVariants = cva('relative flex', {\r\n variants: {\r\n variant: {\r\n underline: 'gap-1',\r\n card: 'gap-1.5',\r\n },\r\n orientation: {\r\n horizontal: 'min-w-max items-center',\r\n vertical: 'w-full flex-col items-stretch',\r\n },\r\n },\r\n defaultVariants: { variant: 'underline', orientation: 'horizontal' },\r\n});\r\n\r\n/**\r\n * `selected`/`disabled` burada `aria-selected`/`aria-disabled` CSS\r\n * seçicileriyle DEĞİL, `Tab`'ın kendi `computed()`'ıyla (bkz. `tab.ts`)\r\n * okunan sinyal değerleriyle besleniyor — kod tabanındaki yerleşik desen\r\n * (Select'in `optionClasses`, Table'ın `rowClasses`) TS'te hesaplanan koşullu\r\n * class, CSS attribute-selector değil.\r\n */\r\nexport const tabVariants = cva(\r\n 'relative inline-flex shrink-0 cursor-pointer appearance-none items-center gap-1.5 whitespace-nowrap border-0 bg-transparent text-sm text-fg-muted transition-colors duration-fast ease-emphasis active:scale-[0.99] ' +\r\n 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring',\r\n {\r\n variants: {\r\n variant: {\r\n underline: 'rounded-sm px-3 py-2',\r\n card: 'rounded-sm border border-transparent px-3 py-1.5',\r\n },\r\n orientation: {\r\n horizontal: '',\r\n vertical: 'w-full justify-start text-start',\r\n },\r\n selected: {\r\n true: '',\r\n false: 'hover:bg-surface-alt hover:text-fg',\r\n },\r\n disabled: {\r\n true: 'pointer-events-none opacity-50 active:scale-100',\r\n false: '',\r\n },\r\n },\r\n compoundVariants: [\r\n { variant: 'underline', selected: true, class: 'text-fg font-semibold' },\r\n /*\r\n * `card` — aktif sekme `bg-canvas` (içerik zeminiyle birleşir) + 2px dolu\r\n * ray. Yatayda alt kenar, dikeyde ön (sol) kenar — dikey grup rayı bunu\r\n * kullanıyor. Ray rengi `--mf-accent-fill` (mode-swapped: light 900 /\r\n * dark 400) — diğer TÜM \"ray\" kullanımlarıyla (Sidebar aktif nav,\r\n * Table seçili satır, ikisi de `border-s-accent-fill`) TUTARLI. `var()`\r\n * `@theme inline`'ın `--color-accent-fill` katmanını DEĞİL doğrudan\r\n * `--mf-*`'i hedefliyor — `box-shadow` arbitrary value'su bir utility\r\n * DEĞİL, Tailwind'in \"bu inline değişkeni emit et\" taramasına\r\n * güvenmek yerine kaynağa doğrudan bağlanmak daha sağlam.\r\n */\r\n {\r\n variant: 'card',\r\n orientation: 'horizontal',\r\n selected: true,\r\n class:\r\n 'border-border bg-canvas text-fg font-semibold shadow-[inset_0_-2px_0_0_var(--mf-accent-fill)]',\r\n },\r\n {\r\n variant: 'card',\r\n orientation: 'vertical',\r\n selected: true,\r\n class:\r\n 'border-border bg-canvas text-fg font-semibold shadow-[inset_2px_0_0_0_var(--mf-accent-fill)]',\r\n },\r\n ],\r\n defaultVariants: {\r\n variant: 'underline',\r\n orientation: 'horizontal',\r\n selected: false,\r\n disabled: false,\r\n },\r\n },\r\n);\r\n\r\nexport type TabSelected = VariantProps<typeof tabVariants>['selected'];\r\n","import {\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n afterNextRender,\r\n afterRenderEffect,\r\n computed,\r\n inject,\r\n input,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { TabList as AriaTabList } from '@angular/aria/tabs';\r\nimport { Button } from '@mesgflow/ui-kit/button';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { cn, MF_TABS_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { TabScroller } from './tab-scroller';\r\nimport { tabListVariants, type TabsVariant } from './tabs.variants';\r\n\r\n/**\r\n * `<mf-tab-list [(selectedTab)]=\"active\" variant=\"underline\">…</mf-tab-list>`\r\n * — `mf-tabs` içine konur, `mfTab` butonlarını sarar. ARIA/klavye\r\n * (Ok tuşları/Home/End) `@angular/aria/tabs`'ın `TabList` pattern'inden\r\n * `hostDirectives` ile geliyor (bkz. `tabs.ts` üstündeki not).\r\n *\r\n * İki premium detay burada yaşıyor:\r\n * 1. **Kayan ray göstergesi** (`underline` varyantı) — aktif sekme\r\n * değişince `positionIndicator()` DOM'dan `[aria-selected=\"true\"]`\r\n * elemanın `offsetLeft`/`offsetWidth`'ini (yatayda) ya da `offsetTop`/\r\n * `offsetHeight`'ını (dikeyde) ölçüp göstergeyi kaydırıyor (emsal:\r\n * `table-pagination.ts`'in odak restorasyonundaki `afterRenderEffect` +\r\n * `viewChild(ElementRef)` deseni). `ResizeObserver` yeniden boyutlanmada\r\n * (font yüklenmesi, viewport) yeniden ölçer. `card` varyantında AYRI bir\r\n * gösterge YOK — ray her sekmenin kendi `box-shadow`'unda yaşıyor\r\n * (bkz. tabs.variants.ts).\r\n * 2. **Taşma yönetimi** — `mfTabScroller` (bkz. o dosya) kaydırma+kenar\r\n * solma maskesi sağlıyor; ok butonları SADECE o yönde taşma varken\r\n * render edilir. Aktif sekme değişince görünür alana kaydırılır.\r\n *\r\n * `tab-list.html`'deki sarmalayıcı `<div>`'in çapraz eksen hizalaması BİLEREK\r\n * yöne göre koşullu: dikeyde (`flex-col`) çapraz eksen GENİŞLİK olur, `items-\r\n * center` orada \"çocukları raya GERME, kendi içerik genişliğine küçült\" demek\r\n * — bu, genişliğin `mfTabScroller`/`#row`/butonlara hiç iletilmemesine ve\r\n * `truncate`'in (role-form.html'deki İngilizce grup adlarıyla canlı\r\n * doğrulandı) hiç devreye girmeden ham/elipsissiz kırpılmasına yol açan\r\n * GERÇEK bir bugdu. `items-stretch` çapraz ekseni doğru şekilde geriyor —\r\n * bunu tekrar `items-center`'a \"sadeleştirme\".\r\n *\r\n * `orientation` girdisi `@angular/aria`'nın `TabList` pattern'inden\r\n * `hostDirectives` ile geliyor (ARIA/klavye zaten yön-agnostik) — burada\r\n * ikinci kez `input()` olarak TANIMLANMIYOR (NG2017, bkz. `TabPanel.\r\n * preserveContent`'teki aynı kısıt), `ariaTabList.orientation()` üzerinden\r\n * `protected readonly orientation` olarak okunuyor; `Tab` (tab.ts) bunu\r\n * `variant()` ile aynı `inject()` deseniyle ebeveynden alıyor.\r\n */\r\n@Component({\r\n selector: 'mf-tab-list',\r\n imports: [Button, Icon, TabScroller],\r\n hostDirectives: [\r\n {\r\n directive: AriaTabList,\r\n inputs: [\r\n 'orientation',\r\n 'wrap',\r\n 'softDisabled',\r\n 'focusMode',\r\n 'selectionMode',\r\n 'disabled',\r\n 'selectedTab',\r\n ],\r\n outputs: ['selectedTabChange'],\r\n },\r\n ],\r\n host: { class: 'block' },\r\n templateUrl: './tab-list.html',\r\n})\r\nexport class TabList {\r\n readonly variant = input<TabsVariant>('underline');\r\n readonly scrollStartLabel = input<string>();\r\n readonly scrollEndLabel = input<string>();\r\n\r\n private readonly tabsLabels = inject(MF_TABS_LABELS);\r\n protected readonly effectiveScrollStartLabel = computed(\r\n () => this.scrollStartLabel() ?? this.tabsLabels().scrollStart,\r\n );\r\n protected readonly effectiveScrollEndLabel = computed(\r\n () => this.scrollEndLabel() ?? this.tabsLabels().scrollEnd,\r\n );\r\n\r\n /** `mfTab` (bkz. tab.ts) varyantı buradan `inject()` ile okuyor — tek kaynak. */\r\n protected readonly ariaTabList = inject(AriaTabList);\r\n\r\n /** `Tab` (tab.ts) bunu `variant()` ile aynı `inject()` deseniyle okuyor — bu yüzden `public`. */\r\n readonly orientation = computed(() => this.ariaTabList.orientation());\r\n protected readonly isVertical = computed(() => this.orientation() === 'vertical');\r\n\r\n protected readonly listClasses = computed(() =>\r\n cn(tabListVariants({ variant: this.variant(), orientation: this.orientation() })),\r\n );\r\n protected readonly indicatorClasses = computed(() =>\r\n cn(\r\n 'pointer-events-none absolute rounded-full bg-accent-fill opacity-0 transition-[transform,width,height,opacity] duration-base ease-emphasis',\r\n this.isVertical() ? 'top-0 left-0 w-0.5' : 'bottom-0 left-0 h-0.5',\r\n ),\r\n );\r\n\r\n protected readonly scroller = viewChild(TabScroller);\r\n protected readonly showStartArrow = computed(() => this.scroller()?.canScrollStart() ?? false);\r\n protected readonly showEndArrow = computed(() => this.scroller()?.canScrollEnd() ?? false);\r\n\r\n private readonly rowEl = viewChild<ElementRef<HTMLElement>>('row');\r\n private readonly indicatorEl = viewChild<ElementRef<HTMLElement>>('indicator');\r\n\r\n constructor() {\r\n const destroyRef = inject(DestroyRef);\r\n\r\n afterRenderEffect(() => {\r\n this.ariaTabList.selectedTab();\r\n this.positionIndicator();\r\n });\r\n\r\n afterNextRender(() => {\r\n const row = this.rowEl()?.nativeElement;\r\n if (!row || typeof ResizeObserver === 'undefined') return;\r\n const observer = new ResizeObserver(() => this.positionIndicator());\r\n observer.observe(row);\r\n destroyRef.onDestroy(() => observer.disconnect());\r\n });\r\n }\r\n\r\n private positionIndicator(): void {\r\n const row = this.rowEl()?.nativeElement;\r\n const indicator = this.indicatorEl()?.nativeElement;\r\n if (!row || !indicator) return;\r\n\r\n const active = row.querySelector<HTMLElement>('[aria-selected=\"true\"]');\r\n if (!active) {\r\n indicator.style.opacity = '0';\r\n return;\r\n }\r\n indicator.style.opacity = '1';\r\n if (this.isVertical()) {\r\n indicator.style.transform = `translateY(${active.offsetTop}px)`;\r\n indicator.style.height = `${active.offsetHeight}px`;\r\n } else {\r\n indicator.style.transform = `translateX(${active.offsetLeft}px)`;\r\n indicator.style.width = `${active.offsetWidth}px`;\r\n }\r\n this.scroller()?.scrollIntoViewIfNeeded(active);\r\n }\r\n}\r\n","<div\r\n class=\"flex gap-1\"\r\n [class.flex-col]=\"isVertical()\"\r\n [class.items-center]=\"!isVertical()\"\r\n [class.items-stretch]=\"isVertical()\"\r\n>\r\n @if (showStartArrow()) {\r\n <button\r\n mfButton\r\n tone=\"neutral\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n class=\"shrink-0\"\r\n [attr.aria-label]=\"effectiveScrollStartLabel()\"\r\n (click)=\"scroller()?.scrollByDir(-1)\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rtl:-scale-x-100\">{{\r\n isVertical() ? 'keyboard_arrow_up' : 'chevron_left'\r\n }}</span>\r\n </button>\r\n }\r\n\r\n <div mfTabScroller [orientation]=\"orientation()\">\r\n <div #row [class]=\"listClasses()\">\r\n <ng-content />\r\n @if (variant() === 'underline') {\r\n <span #indicator [class]=\"indicatorClasses()\"></span>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (showEndArrow()) {\r\n <button\r\n mfButton\r\n tone=\"neutral\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n class=\"shrink-0\"\r\n [attr.aria-label]=\"effectiveScrollEndLabel()\"\r\n (click)=\"scroller()?.scrollByDir(1)\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rtl:-scale-x-100\">{{\r\n isVertical() ? 'keyboard_arrow_down' : 'chevron_right'\r\n }}</span>\r\n </button>\r\n }\r\n</div>\r\n","import { Directive, computed, inject } from '@angular/core';\r\nimport { Tab as AriaTab } from '@angular/aria/tabs';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\nimport { TabList } from './tab-list';\r\nimport { tabVariants } from './tabs.variants';\r\n\r\n/**\r\n * `<button mfTab value=\"genel\">Genel</button>` — bir `mf-tab-list` içine\r\n * konur. ARIA/klavye/seçim davranışı `@angular/aria/tabs`'ın `Tab`\r\n * pattern'inden `hostDirectives` ile geliyor (bkz. `tabs.ts` üstündeki not);\r\n * bu directive sadece görsel katmanı ekliyor. `value`/`disabled`/`id`\r\n * girdileri `hostDirectives`'in `inputs` listesiyle dışarı açıldı — tüketici\r\n * doğrudan `[value]`/`[disabled]` bağlar, `ngTab` attribute'unu YAZMAZ.\r\n *\r\n * Varyant (`underline`/`card`) ebeveyn `mf-tab-list`'ten `inject()` ile\r\n * okunuyor — `Tab` kendi varyant girdisini TAŞIMIYOR, tek kaynak listede.\r\n */\r\n@Directive({\r\n selector: 'button[mfTab]',\r\n hostDirectives: [{ directive: AriaTab, inputs: ['value', 'disabled', 'id'] }],\r\n host: { '[attr.type]': \"'button'\", '[class]': 'classes()' },\r\n})\r\nexport class Tab {\r\n private readonly ariaTab = inject(AriaTab);\r\n private readonly tabList = inject(TabList, { optional: true });\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n tabVariants({\r\n variant: this.tabList?.variant() ?? 'underline',\r\n orientation: this.tabList?.orientation() ?? 'horizontal',\r\n selected: this.ariaTab.selected(),\r\n disabled: this.ariaTab.disabled(),\r\n }),\r\n ),\r\n );\r\n}\r\n","import { Component, inject } from '@angular/core';\r\nimport { TabPanel as AriaTabPanel } from '@angular/aria/tabs';\r\n\r\n/**\r\n * ```html\r\n * <mf-tab-panel value=\"genel\">\r\n * <ng-template ngTabContent>İçerik…</ng-template>\r\n * </mf-tab-panel>\r\n * ```\r\n *\r\n * `ngTabContent` (`@angular/aria/tabs`'ın `TabContent`'i) doğrudan\r\n * kullanılır — ayrı bir `appTabContent` sarmalayıcı YOK, tek katmanlı bir\r\n * yapıya sarmalayıcı eklemenin karşılığı yok (bkz. `TabContent`'in kendi\r\n * `DeferredContent` mekanizması, panel aktif olana kadar içeriği hiç\r\n * oluşturmaz — lazy). `<ng-content />` bilerek TEK satır: panelin kendi\r\n * `role=\"tabpanel\"`/`tabindex`/`inert` host bağlamaları `hostDirectives`'ten\r\n * geliyor, ekstra bir sarmalayıcıya gerek yok.\r\n *\r\n * `[class.hidden]` ELLE eklendi — `AriaTabPanel`'in `inert` attribute'u\r\n * elemanı erişilebilirlik ağacından/etkileşimden çıkarıyor ama GÖRSEL olarak\r\n * gizlemiyor (kütüphanenin kendi dokümantasyonu: \"Proper styling is required\r\n * for visual hiding\" — gerçek bulgu, ui-kit'te pasif panellerin boş\r\n * dolgulu kutular olarak GÖRÜNÜR kaldığı görüldü).\r\n */\r\n@Component({\r\n selector: 'mf-tab-panel',\r\n hostDirectives: [{ directive: AriaTabPanel, inputs: ['value', 'id'] }],\r\n host: {\r\n class:\r\n 'block focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring',\r\n '[class.hidden]': '!ariaTabPanel.visible()',\r\n },\r\n template: '<ng-content />',\r\n})\r\nexport class TabPanel {\r\n protected readonly ariaTabPanel = inject(AriaTabPanel);\r\n}\r\n","import {\r\n Component,\r\n ElementRef,\r\n computed,\r\n inject,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { cn, MF_TABS_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { TabScroller } from './tab-scroller';\r\nimport { tabVariants } from './tabs.variants';\r\nimport type { TabStripItem } from './tab-strip.model';\r\n\r\n/**\r\n * `<mf-tab-strip [items]=\"items()\" [(activeKey)]=\"active\" (close)=\"onClose($event)\" />`\r\n *\r\n * `mf-tabs`/`mf-tab-list` (bkz. `tabs.ts`) ARIA `tabs` pattern'i PANEL\r\n * varsayar (`aria-controls` gerçek bir `role=tabpanel`'e işaret eder) — bu\r\n * şerit ise bir ROTA/DOKÜMAN şeridi: panel yok, içerik `router-outlet`'ten\r\n * gelir, sekmeler kapatılabilir. Bu yüzden `@angular/aria/tabs`'ı DEĞİL,\r\n * elle roving tabindex kullanıyor (emsal: `table-pagination.ts`'in\r\n * `onNavKeydown`'ı) — ARIA `tab` rolü/`aria-selected` yine de elle\r\n * uygulanıyor, sadece pattern motoru YOK.\r\n *\r\n * Ok tuşları SADECE odağı taşır (`activeKey` DEĞİŞMEZ) — her ok vuruşunda\r\n * gerçek bir router navigasyonu tetiklemek (bkz. `TabsStore.activate`)\r\n * pahalı/istenmeyen bir yan etki olurdu. `Enter`/`Space` ya da tık asıl\r\n * seçimi commit eder. `Delete` odaktaki (kapatılabilir) sekmeyi kapatır.\r\n *\r\n * Kapatma butonu gerçek bir `<button>` ama tab elemanının kendisi `role=tab`\r\n * taşıyan bir `<div>` — `mfTab`'ın (aria Tabs sisteminin) aksine burada bir\r\n * `<button>` İÇİNE başka bir interaktif eleman GÖMÜLMÜYOR (geçersiz HTML\r\n * olurdu, bkz. `table-filter-bar.html`'deki chip deseni — aynı gerekçeyle\r\n * orada da İKİ KARDEŞ buton var, iç içe değil). Kapatma butonu bilerek\r\n * `tabindex=\"-1\"` — birincil roving-tabindex sırasının parçası değil (fare/\r\n * dokunma birincil, `Delete` tuşu klavye eşdeğeri).\r\n *\r\n * Sağ tık menüsü TAMAMEN tüketiciye ait — bu bileşen belirli bir dropdown\r\n * kütüphanesini BİLMİYOR (bkz. projects/ui-kit/README.md \"Directive mi, component\r\n * mi?\" ruhu — dropdown-agnostik kalma), sadece ham `(itemContextMenu)` olayını\r\n * yukarı veriyor.\r\n */\r\n@Component({\r\n selector: 'mf-tab-strip',\r\n exportAs: 'mfTabStrip',\r\n imports: [Icon, TabScroller],\r\n host: { class: 'block', role: 'tablist' },\r\n templateUrl: './tab-strip.html',\r\n})\r\nexport class TabStrip {\r\n readonly items = input.required<TabStripItem[]>();\r\n readonly activeKey = model.required<string>();\r\n /** Verilirse aktif sekmenin `aria-controls`'ü buna işaret eder (tek bir paylaşımlı içerik bölgesi — router-outlet). */\r\n readonly contentId = input<string | null>(null);\r\n readonly scrollStartLabel = input<string>();\r\n readonly scrollEndLabel = input<string>();\r\n /** Kapatma butonunun `aria-label`'ı — sekmenin kendi etiketiyle birleştirilir (ör. \"Close: Roles\"). */\r\n readonly closeLabel = input<string>();\r\n\r\n private readonly tabsLabels = inject(MF_TABS_LABELS);\r\n protected readonly effectiveScrollStartLabel = computed(\r\n () => this.scrollStartLabel() ?? this.tabsLabels().scrollStart,\r\n );\r\n protected readonly effectiveScrollEndLabel = computed(\r\n () => this.scrollEndLabel() ?? this.tabsLabels().scrollEnd,\r\n );\r\n protected readonly effectiveCloseLabel = computed(\r\n () => this.closeLabel() ?? this.tabsLabels().close,\r\n );\r\n\r\n // `close` adı native DOM `close` olayıyla çakışıyor (@angular-eslint/no-output-native);\r\n // mevcut public API — yeniden adlandırma kırıcı, ileri bir sürümde ele alınacak.\r\n // eslint-disable-next-line @angular-eslint/no-output-native\r\n readonly close = output<string>();\r\n readonly itemContextMenu = output<{ event: MouseEvent; item: TabStripItem }>();\r\n\r\n protected readonly focusedKey = signal<string | null>(null);\r\n\r\n protected readonly scroller = viewChild(TabScroller);\r\n protected readonly showStartArrow = computed(() => this.scroller()?.canScrollStart() ?? false);\r\n protected readonly showEndArrow = computed(() => this.scroller()?.canScrollEnd() ?? false);\r\n\r\n private readonly rowEl = viewChild<ElementRef<HTMLElement>>('row');\r\n\r\n protected tabClasses(item: TabStripItem): string {\r\n return cn(\r\n tabVariants({ variant: 'card', selected: item.key === this.activeKey(), disabled: false }),\r\n 'pe-1.5',\r\n );\r\n }\r\n\r\n protected tabIndexFor(item: TabStripItem): number {\r\n const focused = this.focusedKey() ?? this.activeKey();\r\n return item.key === focused ? 0 : -1;\r\n }\r\n\r\n protected select(key: string): void {\r\n this.focusedKey.set(key);\r\n this.activeKey.set(key);\r\n }\r\n\r\n protected onCloseClick(event: MouseEvent, key: string): void {\r\n event.stopPropagation();\r\n this.close.emit(key);\r\n }\r\n\r\n protected onContextMenu(event: MouseEvent, item: TabStripItem): void {\r\n event.preventDefault();\r\n this.itemContextMenu.emit({ event, item });\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent): void {\r\n const items = this.items();\r\n if (items.length === 0) return;\r\n const currentKey = this.focusedKey() ?? this.activeKey();\r\n const index = items.findIndex((i) => i.key === currentKey);\r\n\r\n switch (event.key) {\r\n case 'ArrowLeft':\r\n event.preventDefault();\r\n this.focusIndex(index <= 0 ? items.length - 1 : index - 1);\r\n break;\r\n case 'ArrowRight':\r\n event.preventDefault();\r\n this.focusIndex(index === -1 || index === items.length - 1 ? 0 : index + 1);\r\n break;\r\n case 'Home':\r\n event.preventDefault();\r\n this.focusIndex(0);\r\n break;\r\n case 'End':\r\n event.preventDefault();\r\n this.focusIndex(items.length - 1);\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n event.preventDefault();\r\n if (index !== -1) this.select(items[index]!.key);\r\n break;\r\n case 'Delete':\r\n if (index !== -1 && items[index]!.closable) {\r\n event.preventDefault();\r\n this.close.emit(items[index]!.key);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n private focusIndex(index: number): void {\r\n const item = this.items()[index];\r\n if (!item) return;\r\n this.focusedKey.set(item.key);\r\n queueMicrotask(() => {\r\n const btn = this.rowEl()?.nativeElement.querySelector<HTMLElement>(\r\n `[data-tab-key=\"${item.key}\"]`,\r\n );\r\n btn?.focus();\r\n if (btn) this.scroller()?.scrollIntoViewIfNeeded(btn);\r\n });\r\n }\r\n}\r\n","<div class=\"flex items-center gap-1\">\r\n @if (showStartArrow()) {\r\n <button\r\n type=\"button\"\r\n class=\"shrink-0 appearance-none border-0 bg-transparent p-1 text-fg-subtle transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n [attr.aria-label]=\"effectiveScrollStartLabel()\"\r\n (click)=\"scroller()?.scrollByDir(-1)\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rtl:-scale-x-100\">chevron_left</span>\r\n </button>\r\n }\r\n\r\n <!-- Kaydırma kapsayıcısı odaklanabilir değil — ok tuşu gezinmesi burada delege; gerçek odak roving tabindex ile alt sekmelerde. -->\r\n <!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus -->\r\n <div mfTabScroller (keydown)=\"onKeydown($event)\">\r\n <div #row class=\"flex items-center gap-1 py-1\">\r\n @for (item of items(); track item.key) {\r\n <!-- Enter/Space seçimi üstteki kapsayıcının (keydown)'ında yönetiliyor (roving tabindex deseni). -->\r\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events -->\r\n <div\r\n role=\"tab\"\r\n [attr.data-tab-key]=\"item.key\"\r\n [attr.aria-selected]=\"item.key === activeKey()\"\r\n [attr.aria-controls]=\"item.key === activeKey() ? contentId() : null\"\r\n [tabindex]=\"tabIndexFor(item)\"\r\n [class]=\"tabClasses(item)\"\r\n (click)=\"select(item.key)\"\r\n (contextmenu)=\"onContextMenu($event, item)\"\r\n >\r\n @if (item.icon) {\r\n <span mfIcon [size]=\"14\">{{ item.icon }}</span>\r\n }\r\n <span class=\"truncate\">{{ item.label }}</span>\r\n @if (item.closable) {\r\n <button\r\n type=\"button\"\r\n tabindex=\"-1\"\r\n class=\"ms-0.5 inline-flex h-4 w-4 shrink-0 appearance-none items-center justify-center rounded-xs border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:bg-surface-active hover:text-fg\"\r\n [attr.aria-label]=\"effectiveCloseLabel() + ': ' + item.label\"\r\n (click)=\"onCloseClick($event, item.key)\"\r\n >\r\n <span mfIcon [size]=\"13\">close</span>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (showEndArrow()) {\r\n <button\r\n type=\"button\"\r\n class=\"shrink-0 appearance-none border-0 bg-transparent p-1 text-fg-subtle transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n [attr.aria-label]=\"effectiveScrollEndLabel()\"\r\n (click)=\"scroller()?.scrollByDir(1)\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rtl:-scale-x-100\">chevron_right</span>\r\n </button>\r\n }\r\n</div>\r\n","import { Component } from '@angular/core';\r\nimport { Tabs as AriaTabs } from '@angular/aria/tabs';\r\n\r\n/**\r\n * `<mf-tabs><mf-tab-list>...</mf-tab-list><mf-tab-panel>...</mf-tab-panel></mf-tabs>`\r\n *\r\n * Salt bir kapsayıcı — tüm ARIA/klavye/state mantığı `@angular/aria/tabs`'ın\r\n * `Tabs` pattern'inden `hostDirectives` ile ödünç alınıyor (bkz.\r\n * projects/ui-kit/README.md \"a11y checklist\": \"mümkün olduğunca `@angular/aria`...\r\n * elle ARIA yazmak son çare\"). `hostDirectives`, ana bileşenin (`mf-tabs`)\r\n * host elemanına `Tabs`'ın DI sağlayıcısını (`TABS` token) ekliyor — alttaki\r\n * `mf-tab-list`/`mf-tab-panel` bunu `inject()` ile bulup kendini\r\n * kaydediyor, template'te `ngTabs` attribute'unu ELLE yazmaya gerek yok\r\n * (`hostDirectives`'te selector yok sayılır, bkz. Angular directive\r\n * composition API).\r\n */\r\n@Component({\r\n selector: 'mf-tabs',\r\n exportAs: 'mfTabs',\r\n hostDirectives: [AriaTabs],\r\n host: { class: 'block' },\r\n template: '<ng-content />',\r\n})\r\nexport class Tabs {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["AriaTabList","AriaTab","AriaTabPanel","AriaTabs"],"mappings":"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"}
@@ -0,0 +1,138 @@
1
+ import * as i0 from '@angular/core';
2
+ import { model, input, viewChild, forwardRef, Component } from '@angular/core';
3
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import { ValueAccessorBase } from '@mesgflow/ui-kit/core';
5
+ import { Chip } from '@mesgflow/ui-kit/chip';
6
+ import { InputGroup } from '@mesgflow/ui-kit/input';
7
+
8
+ /**
9
+ * `<mf-tag-input [(value)]="tags" placeholder="Etiket ekle..." />` — Enter
10
+ * veya virgül taslak metni bir etikete çevirir, her etiket kaldırılabilir
11
+ * bir `Chip` olarak görünür. Taslak BOŞKEN Backspace SON etiketi kaldırır
12
+ * (yaygın "tag input" klavye deseni — ayrı bir onay adımı gerekmez, geri
13
+ * alması kolay bir eylem). `InputGroup`'un `[wrap]="true"` moduyla (bkz.
14
+ * `input-group.ts`) etiketler çoğaldıkça kabuk BÜYÜR, taşırmaz.
15
+ */
16
+ class TagInput extends ValueAccessorBase {
17
+ value = model([], /* @ts-ignore */
18
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
19
+ placeholder = input('', /* @ts-ignore */
20
+ ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
21
+ disabled = input(false, /* @ts-ignore */
22
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
23
+ hasError = input(false, /* @ts-ignore */
24
+ ...(ngDevMode ? [{ debugName: "hasError" }] : /* istanbul ignore next */ []));
25
+ ariaLabel = input('', /* @ts-ignore */
26
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
27
+ fullWidth = input(false, /* @ts-ignore */
28
+ ...(ngDevMode ? [{ debugName: "fullWidth" }] : /* istanbul ignore next */ []));
29
+ /** Verilmezse alttaki `Chip`'in kendi `MF_CHIP_LABELS` düşüşü kullanılır (bkz. `chip.ts`). */
30
+ removeLabel = input(/* @ts-ignore */
31
+ ...(ngDevMode ? [undefined, { debugName: "removeLabel" }] : /* istanbul ignore next */ []));
32
+ /** Aynı etiketin (büyük/küçük harf duyarsız) İKİ KEZ eklenmesini engeller. */
33
+ unique = input(true, /* @ts-ignore */
34
+ ...(ngDevMode ? [{ debugName: "unique" }] : /* istanbul ignore next */ []));
35
+ inputEl = viewChild('inputEl', /* @ts-ignore */
36
+ ...(ngDevMode ? [{ debugName: "inputEl" }] : /* istanbul ignore next */ []));
37
+ writeValue(value) {
38
+ this.value.set(value ?? []);
39
+ }
40
+ onKeydown(event) {
41
+ const input = event.target;
42
+ if (event.key === 'Enter' || event.key === ',') {
43
+ event.preventDefault();
44
+ this.commitDraft();
45
+ }
46
+ else if (event.key === 'Backspace' && input.value === '' && this.value().length > 0) {
47
+ event.preventDefault();
48
+ this.removeTag(this.value()[this.value().length - 1]);
49
+ }
50
+ }
51
+ commitDraft() {
52
+ const input = this.inputEl()?.nativeElement;
53
+ if (!input)
54
+ return;
55
+ const raw = input.value.trim();
56
+ input.value = '';
57
+ if (!raw)
58
+ return;
59
+ if (this.unique() && this.value().some((t) => t.toLowerCase() === raw.toLowerCase()))
60
+ return;
61
+ const next = [...this.value(), raw];
62
+ this.value.set(next);
63
+ this.onChange(next);
64
+ this.onTouched();
65
+ }
66
+ removeTag(tag) {
67
+ const next = this.value().filter((t) => t !== tag);
68
+ this.value.set(next);
69
+ this.onChange(next);
70
+ this.onTouched();
71
+ }
72
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TagInput, deps: null, target: i0.ɵɵFactoryTarget.Component });
73
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: TagInput, isStandalone: true, selector: "mf-tag-input", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, hasError: { classPropertyName: "hasError", publicName: "hasError", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null }, removeLabel: { classPropertyName: "removeLabel", publicName: "removeLabel", isSignal: true, isRequired: false, transformFunction: null }, unique: { classPropertyName: "unique", publicName: "unique", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { properties: { "class.w-full": "fullWidth()" }, classAttribute: "inline-flex" }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TagInput), multi: true }], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true, isSignal: true }], exportAs: ["mfTagInput"], usesInheritance: true, ngImport: i0, template: `
74
+ <mf-input-group [wrap]="true" [hasError]="hasError()" [disabled]="disabled()">
75
+ @for (tag of value(); track tag) {
76
+ <mf-chip
77
+ size="sm"
78
+ [removable]="!disabled()"
79
+ [removeLabel]="removeLabel()"
80
+ (removed)="removeTag(tag)"
81
+ >
82
+ {{ tag }}
83
+ </mf-chip>
84
+ }
85
+ <input
86
+ #inputEl
87
+ type="text"
88
+ class="min-w-24 flex-1 border-0 bg-transparent p-0 text-sm text-fg placeholder:text-fg-subtle focus:outline-none"
89
+ [placeholder]="value().length === 0 ? placeholder() : ''"
90
+ [disabled]="disabled()"
91
+ [attr.aria-label]="ariaLabel() || null"
92
+ (keydown)="onKeydown($event)"
93
+ (blur)="commitDraft()"
94
+ />
95
+ </mf-input-group>
96
+ `, isInline: true, dependencies: [{ kind: "component", type: Chip, selector: "mf-chip", inputs: ["tone", "size", "selected", "disabled", "removable", "removeLabel"], outputs: ["removed"], exportAs: ["mfChip"] }, { kind: "component", type: InputGroup, selector: "mf-input-group", inputs: ["size", "disabled", "hasError", "padded", "wrap"], exportAs: ["mfInputGroup"] }] });
97
+ }
98
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TagInput, decorators: [{
99
+ type: Component,
100
+ args: [{
101
+ selector: 'mf-tag-input',
102
+ exportAs: 'mfTagInput',
103
+ imports: [Chip, InputGroup],
104
+ host: { class: 'inline-flex', '[class.w-full]': 'fullWidth()' },
105
+ template: `
106
+ <mf-input-group [wrap]="true" [hasError]="hasError()" [disabled]="disabled()">
107
+ @for (tag of value(); track tag) {
108
+ <mf-chip
109
+ size="sm"
110
+ [removable]="!disabled()"
111
+ [removeLabel]="removeLabel()"
112
+ (removed)="removeTag(tag)"
113
+ >
114
+ {{ tag }}
115
+ </mf-chip>
116
+ }
117
+ <input
118
+ #inputEl
119
+ type="text"
120
+ class="min-w-24 flex-1 border-0 bg-transparent p-0 text-sm text-fg placeholder:text-fg-subtle focus:outline-none"
121
+ [placeholder]="value().length === 0 ? placeholder() : ''"
122
+ [disabled]="disabled()"
123
+ [attr.aria-label]="ariaLabel() || null"
124
+ (keydown)="onKeydown($event)"
125
+ (blur)="commitDraft()"
126
+ />
127
+ </mf-input-group>
128
+ `,
129
+ providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TagInput), multi: true }],
130
+ }]
131
+ }], 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 }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], hasError: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasError", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], removeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "removeLabel", required: false }] }], unique: [{ type: i0.Input, args: [{ isSignal: true, alias: "unique", required: false }] }], inputEl: [{ type: i0.ViewChild, args: ['inputEl', { isSignal: true }] }] } });
132
+
133
+ /**
134
+ * Generated bundle index. Do not edit.
135
+ */
136
+
137
+ export { TagInput };
138
+ //# sourceMappingURL=mesgflow-ui-kit-tag-input.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesgflow-ui-kit-tag-input.mjs","sources":["../../../projects/ui-kit/tag-input/tag-input.ts","../../../projects/ui-kit/tag-input/mesgflow-ui-kit-tag-input.ts"],"sourcesContent":["import { Component, ElementRef, forwardRef, input, model, viewChild } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport { ValueAccessorBase } from '@mesgflow/ui-kit/core';\r\nimport { Chip } from '@mesgflow/ui-kit/chip';\r\nimport { InputGroup } from '@mesgflow/ui-kit/input';\r\n\r\n/**\r\n * `<mf-tag-input [(value)]=\"tags\" placeholder=\"Etiket ekle...\" />` — Enter\r\n * veya virgül taslak metni bir etikete çevirir, her etiket kaldırılabilir\r\n * bir `Chip` olarak görünür. Taslak BOŞKEN Backspace SON etiketi kaldırır\r\n * (yaygın \"tag input\" klavye deseni — ayrı bir onay adımı gerekmez, geri\r\n * alması kolay bir eylem). `InputGroup`'un `[wrap]=\"true\"` moduyla (bkz.\r\n * `input-group.ts`) etiketler çoğaldıkça kabuk BÜYÜR, taşırmaz.\r\n */\r\n@Component({\r\n selector: 'mf-tag-input',\r\n exportAs: 'mfTagInput',\r\n imports: [Chip, InputGroup],\r\n host: { class: 'inline-flex', '[class.w-full]': 'fullWidth()' },\r\n template: `\r\n <mf-input-group [wrap]=\"true\" [hasError]=\"hasError()\" [disabled]=\"disabled()\">\r\n @for (tag of value(); track tag) {\r\n <mf-chip\r\n size=\"sm\"\r\n [removable]=\"!disabled()\"\r\n [removeLabel]=\"removeLabel()\"\r\n (removed)=\"removeTag(tag)\"\r\n >\r\n {{ tag }}\r\n </mf-chip>\r\n }\r\n <input\r\n #inputEl\r\n type=\"text\"\r\n class=\"min-w-24 flex-1 border-0 bg-transparent p-0 text-sm text-fg placeholder:text-fg-subtle focus:outline-none\"\r\n [placeholder]=\"value().length === 0 ? placeholder() : ''\"\r\n [disabled]=\"disabled()\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n (keydown)=\"onKeydown($event)\"\r\n (blur)=\"commitDraft()\"\r\n />\r\n </mf-input-group>\r\n `,\r\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TagInput), multi: true }],\r\n})\r\nexport class TagInput extends ValueAccessorBase<string[]> implements ControlValueAccessor {\r\n readonly value = model<string[]>([]);\r\n readonly placeholder = input('');\r\n readonly disabled = input(false);\r\n readonly hasError = input(false);\r\n readonly ariaLabel = input('');\r\n readonly fullWidth = input(false);\r\n /** Verilmezse alttaki `Chip`'in kendi `MF_CHIP_LABELS` düşüşü kullanılır (bkz. `chip.ts`). */\r\n readonly removeLabel = input<string>();\r\n /** Aynı etiketin (büyük/küçük harf duyarsız) İKİ KEZ eklenmesini engeller. */\r\n readonly unique = input(true);\r\n\r\n private readonly inputEl = viewChild<ElementRef<HTMLInputElement>>('inputEl');\r\n\r\n writeValue(value: string[]): void {\r\n this.value.set(value ?? []);\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent): void {\r\n const input = event.target as HTMLInputElement;\r\n if (event.key === 'Enter' || event.key === ',') {\r\n event.preventDefault();\r\n this.commitDraft();\r\n } else if (event.key === 'Backspace' && input.value === '' && this.value().length > 0) {\r\n event.preventDefault();\r\n this.removeTag(this.value()[this.value().length - 1]!);\r\n }\r\n }\r\n\r\n protected commitDraft(): void {\r\n const input = this.inputEl()?.nativeElement;\r\n if (!input) return;\r\n const raw = input.value.trim();\r\n input.value = '';\r\n if (!raw) return;\r\n if (this.unique() && this.value().some((t) => t.toLowerCase() === raw.toLowerCase())) return;\r\n\r\n const next = [...this.value(), raw];\r\n this.value.set(next);\r\n this.onChange(next);\r\n this.onTouched();\r\n }\r\n\r\n protected removeTag(tag: string): void {\r\n const next = this.value().filter((t) => t !== tag);\r\n this.value.set(next);\r\n this.onChange(next);\r\n this.onTouched();\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,53 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, inject, computed, Component } from '@angular/core';
3
+ import { Button } from '@mesgflow/ui-kit/button';
4
+ import { MF_THEME_SWITCHER_LABELS } from '@mesgflow/ui-kit/core';
5
+ import { Icon } from '@mesgflow/ui-kit/icon';
6
+ import { MfColorModeService } from '@mesgflow/ui-kit/theming';
7
+ import { ToggleGroup, ToggleGroupItem } from '@mesgflow/ui-kit/toggle';
8
+ import { Tooltip } from '@mesgflow/ui-kit/tooltip';
9
+
10
+ const ICONS = {
11
+ light: 'light_mode',
12
+ dark: 'dark_mode',
13
+ system: 'contrast',
14
+ };
15
+ /**
16
+ * `<mf-theme-switcher />` — açık / koyu / sistem. Durum `MfColorModeService`'te (kalıcı, sistem
17
+ * tercihini canlı izler); bu bileşen yalnızca görünüm.
18
+ *
19
+ * - `segmented` (varsayılan): kitin `ToggleGroup`'u (tek seçim, boşaltılamaz) — üç ikonlu düğme,
20
+ * her biri adlı, seçili olan `aria-pressed`.
21
+ * - `button`: tek ikon düğmesi, light → dark → system döngüsü; adı mevcut modu söyler
22
+ * ("Color theme: Dark"), ipucu da.
23
+ */
24
+ class ThemeSwitcher {
25
+ appearance = input('segmented', /* @ts-ignore */
26
+ ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
27
+ size = input('sm', /* @ts-ignore */
28
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
29
+ colorMode = inject(MfColorModeService);
30
+ labels = inject(MF_THEME_SWITCHER_LABELS);
31
+ icons = ICONS;
32
+ modes = ['light', 'dark', 'system'];
33
+ cycleLabel = computed(() => `${this.labels().ariaLabel}: ${this.labels()[this.colorMode.mode()]}`, /* @ts-ignore */
34
+ ...(ngDevMode ? [{ debugName: "cycleLabel" }] : /* istanbul ignore next */ []));
35
+ select(values) {
36
+ const mode = values[0];
37
+ if (mode === 'light' || mode === 'dark' || mode === 'system')
38
+ this.colorMode.setMode(mode);
39
+ }
40
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ThemeSwitcher, deps: [], target: i0.ɵɵFactoryTarget.Component });
41
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: ThemeSwitcher, isStandalone: true, selector: "mf-theme-switcher", inputs: { appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "inline-flex" }, exportAs: ["mfThemeSwitcher"], ngImport: i0, template: "@if (appearance() === 'button') {\r\n <button\r\n mfButton\r\n tone=\"neutral\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"cycleLabel()\"\r\n [mfTooltip]=\"cycleLabel()\"\r\n (click)=\"colorMode.cycle()\"\r\n >\r\n <span mfIcon [size]=\"18\">{{ icons[colorMode.mode()] }}</span>\r\n </button>\r\n} @else {\r\n <mf-toggle-group\r\n type=\"single\"\r\n appearance=\"outline\"\r\n [size]=\"size()\"\r\n [allowEmpty]=\"false\"\r\n [value]=\"[colorMode.mode()]\"\r\n (valueChange)=\"select($event)\"\r\n [ariaLabel]=\"labels().ariaLabel\"\r\n >\r\n @for (mode of modes; track mode) {\r\n <button\r\n mfToggleGroupItem\r\n [value]=\"mode\"\r\n iconOnly\r\n [attr.aria-label]=\"labels()[mode]\"\r\n [mfTooltip]=\"labels()[mode]\"\r\n >\r\n <span mfIcon [size]=\"16\">{{ icons[mode] }}</span>\r\n </button>\r\n }\r\n </mf-toggle-group>\r\n}\r\n", dependencies: [{ kind: "component", type: Button, selector: "button[mfButton], a[mfButton]", inputs: ["tone", "appearance", "size", "shape", "type", "loading", "iconStart", "iconEnd"], exportAs: ["mfButton"] }, { kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "component", type: ToggleGroup, selector: "mf-toggle-group", inputs: ["type", "value", "size", "appearance", "orientation", "disabled", "allowEmpty", "ariaLabel"], outputs: ["valueChange"], exportAs: ["mfToggleGroup"] }, { kind: "directive", type: ToggleGroupItem, selector: "button[mfToggleGroupItem]", inputs: ["value", "disabled", "iconOnly"], exportAs: ["mfToggleGroupItem"] }, { kind: "directive", type: Tooltip, selector: "[mfTooltip], [mfTooltipContent]", inputs: ["mfTooltip", "mfTooltipContent", "tooltipPosition"], exportAs: ["mfTooltip"] }] });
42
+ }
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ThemeSwitcher, decorators: [{
44
+ type: Component,
45
+ args: [{ selector: 'mf-theme-switcher', exportAs: 'mfThemeSwitcher', imports: [Button, Icon, ToggleGroup, ToggleGroupItem, Tooltip], host: { class: 'inline-flex' }, template: "@if (appearance() === 'button') {\r\n <button\r\n mfButton\r\n tone=\"neutral\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"cycleLabel()\"\r\n [mfTooltip]=\"cycleLabel()\"\r\n (click)=\"colorMode.cycle()\"\r\n >\r\n <span mfIcon [size]=\"18\">{{ icons[colorMode.mode()] }}</span>\r\n </button>\r\n} @else {\r\n <mf-toggle-group\r\n type=\"single\"\r\n appearance=\"outline\"\r\n [size]=\"size()\"\r\n [allowEmpty]=\"false\"\r\n [value]=\"[colorMode.mode()]\"\r\n (valueChange)=\"select($event)\"\r\n [ariaLabel]=\"labels().ariaLabel\"\r\n >\r\n @for (mode of modes; track mode) {\r\n <button\r\n mfToggleGroupItem\r\n [value]=\"mode\"\r\n iconOnly\r\n [attr.aria-label]=\"labels()[mode]\"\r\n [mfTooltip]=\"labels()[mode]\"\r\n >\r\n <span mfIcon [size]=\"16\">{{ icons[mode] }}</span>\r\n </button>\r\n }\r\n </mf-toggle-group>\r\n}\r\n" }]
46
+ }], propDecorators: { appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
47
+
48
+ /**
49
+ * Generated bundle index. Do not edit.
50
+ */
51
+
52
+ export { ThemeSwitcher };
53
+ //# sourceMappingURL=mesgflow-ui-kit-theme-switcher.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesgflow-ui-kit-theme-switcher.mjs","sources":["../../../projects/ui-kit/theme-switcher/theme-switcher.ts","../../../projects/ui-kit/theme-switcher/theme-switcher.html","../../../projects/ui-kit/theme-switcher/mesgflow-ui-kit-theme-switcher.ts"],"sourcesContent":["import { Component, computed, inject, input } from '@angular/core';\r\nimport { Button } from '@mesgflow/ui-kit/button';\r\nimport { MF_THEME_SWITCHER_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { MfColorModeService, type MfColorMode } from '@mesgflow/ui-kit/theming';\r\nimport { ToggleGroup, ToggleGroupItem } from '@mesgflow/ui-kit/toggle';\r\nimport { Tooltip } from '@mesgflow/ui-kit/tooltip';\r\n\r\nconst ICONS: Record<MfColorMode, string> = {\r\n light: 'light_mode',\r\n dark: 'dark_mode',\r\n system: 'contrast',\r\n};\r\n\r\n/**\r\n * `<mf-theme-switcher />` — açık / koyu / sistem. Durum `MfColorModeService`'te (kalıcı, sistem\r\n * tercihini canlı izler); bu bileşen yalnızca görünüm.\r\n *\r\n * - `segmented` (varsayılan): kitin `ToggleGroup`'u (tek seçim, boşaltılamaz) — üç ikonlu düğme,\r\n * her biri adlı, seçili olan `aria-pressed`.\r\n * - `button`: tek ikon düğmesi, light → dark → system döngüsü; adı mevcut modu söyler\r\n * (\"Color theme: Dark\"), ipucu da.\r\n */\r\n@Component({\r\n selector: 'mf-theme-switcher',\r\n exportAs: 'mfThemeSwitcher',\r\n imports: [Button, Icon, ToggleGroup, ToggleGroupItem, Tooltip],\r\n host: { class: 'inline-flex' },\r\n templateUrl: './theme-switcher.html',\r\n})\r\nexport class ThemeSwitcher {\r\n readonly appearance = input<'segmented' | 'button'>('segmented');\r\n readonly size = input<'sm' | 'md'>('sm');\r\n\r\n protected readonly colorMode = inject(MfColorModeService);\r\n protected readonly labels = inject(MF_THEME_SWITCHER_LABELS);\r\n protected readonly icons = ICONS;\r\n protected readonly modes: readonly MfColorMode[] = ['light', 'dark', 'system'];\r\n\r\n protected readonly cycleLabel = computed(\r\n () => `${this.labels().ariaLabel}: ${this.labels()[this.colorMode.mode()]}`,\r\n );\r\n\r\n protected select(values: readonly string[]): void {\r\n const mode = values[0];\r\n if (mode === 'light' || mode === 'dark' || mode === 'system') this.colorMode.setMode(mode);\r\n }\r\n}\r\n","@if (appearance() === 'button') {\r\n <button\r\n mfButton\r\n tone=\"neutral\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"cycleLabel()\"\r\n [mfTooltip]=\"cycleLabel()\"\r\n (click)=\"colorMode.cycle()\"\r\n >\r\n <span mfIcon [size]=\"18\">{{ icons[colorMode.mode()] }}</span>\r\n </button>\r\n} @else {\r\n <mf-toggle-group\r\n type=\"single\"\r\n appearance=\"outline\"\r\n [size]=\"size()\"\r\n [allowEmpty]=\"false\"\r\n [value]=\"[colorMode.mode()]\"\r\n (valueChange)=\"select($event)\"\r\n [ariaLabel]=\"labels().ariaLabel\"\r\n >\r\n @for (mode of modes; track mode) {\r\n <button\r\n mfToggleGroupItem\r\n [value]=\"mode\"\r\n iconOnly\r\n [attr.aria-label]=\"labels()[mode]\"\r\n [mfTooltip]=\"labels()[mode]\"\r\n >\r\n <span mfIcon [size]=\"16\">{{ icons[mode] }}</span>\r\n </button>\r\n }\r\n </mf-toggle-group>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}