@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,84 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, inject, computed, Component } from '@angular/core';
3
+ import { MF_BREADCRUMB_LABELS } from '@mesgflow/ui-kit/core';
4
+ import { Icon } from '@mesgflow/ui-kit/icon';
5
+ import { Link } from '@mesgflow/ui-kit/link';
6
+
7
+ /**
8
+ * `<mf-breadcrumb [items]="[{label: 'Ayarlar', href: '/ayarlar'}, {label: 'Ekip'}]" />`
9
+ *
10
+ * SON öğe (mevcut sayfa) `href` verilse BİLE bağlantı OLARAK render
11
+ * EDİLMEZ — WAI-ARIA breadcrumb deseninin önerdiği gibi düz metin +
12
+ * `aria-current="page"`. Host `role="navigation"` taşır (`nav` etiketi
13
+ * DEĞİL — `mf-breadcrumb` özel bir eleman, ama landmark semantiği aynı
14
+ * şekilde çalışır).
15
+ */
16
+ class Breadcrumb {
17
+ items = input.required(/* @ts-ignore */
18
+ ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
19
+ ariaLabel = input(/* @ts-ignore */
20
+ ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
21
+ injectedLabels = inject(MF_BREADCRUMB_LABELS);
22
+ effectiveAriaLabel = computed(() => this.ariaLabel() ?? this.injectedLabels().ariaLabel, /* @ts-ignore */
23
+ ...(ngDevMode ? [{ debugName: "effectiveAriaLabel" }] : /* istanbul ignore next */ []));
24
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Breadcrumb, deps: [], target: i0.ɵɵFactoryTarget.Component });
25
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Breadcrumb, isStandalone: true, selector: "mf-breadcrumb", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "navigation" }, properties: { "attr.aria-label": "effectiveAriaLabel()" } }, exportAs: ["mfBreadcrumb"], ngImport: i0, template: `
26
+ <ol class="flex flex-wrap items-center gap-1.5 text-sm text-fg-muted">
27
+ @for (item of items(); track item.label; let last = $last) {
28
+ <li class="flex items-center gap-1.5">
29
+ @if (!last && item.href) {
30
+ <a mfLink [href]="item.href" underline="hover">{{ item.label }}</a>
31
+ } @else {
32
+ <span [attr.aria-current]="last ? 'page' : null" [class.text-fg]="last">{{
33
+ item.label
34
+ }}</span>
35
+ }
36
+ @if (!last) {
37
+ <span mfIcon [size]="14" class="text-fg-subtle rtl:-scale-x-100" aria-hidden="true"
38
+ >chevron_right</span
39
+ >
40
+ }
41
+ </li>
42
+ }
43
+ </ol>
44
+ `, isInline: true, dependencies: [{ kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "directive", type: Link, selector: "a[mfLink]", inputs: ["tone", "underline"] }] });
45
+ }
46
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Breadcrumb, decorators: [{
47
+ type: Component,
48
+ args: [{
49
+ selector: 'mf-breadcrumb',
50
+ exportAs: 'mfBreadcrumb',
51
+ imports: [Icon, Link],
52
+ host: {
53
+ role: 'navigation',
54
+ '[attr.aria-label]': 'effectiveAriaLabel()',
55
+ },
56
+ template: `
57
+ <ol class="flex flex-wrap items-center gap-1.5 text-sm text-fg-muted">
58
+ @for (item of items(); track item.label; let last = $last) {
59
+ <li class="flex items-center gap-1.5">
60
+ @if (!last && item.href) {
61
+ <a mfLink [href]="item.href" underline="hover">{{ item.label }}</a>
62
+ } @else {
63
+ <span [attr.aria-current]="last ? 'page' : null" [class.text-fg]="last">{{
64
+ item.label
65
+ }}</span>
66
+ }
67
+ @if (!last) {
68
+ <span mfIcon [size]="14" class="text-fg-subtle rtl:-scale-x-100" aria-hidden="true"
69
+ >chevron_right</span
70
+ >
71
+ }
72
+ </li>
73
+ }
74
+ </ol>
75
+ `,
76
+ }]
77
+ }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: true }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
78
+
79
+ /**
80
+ * Generated bundle index. Do not edit.
81
+ */
82
+
83
+ export { Breadcrumb };
84
+ //# sourceMappingURL=mesgflow-ui-kit-breadcrumb.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesgflow-ui-kit-breadcrumb.mjs","sources":["../../../projects/ui-kit/breadcrumb/breadcrumb.ts","../../../projects/ui-kit/breadcrumb/mesgflow-ui-kit-breadcrumb.ts"],"sourcesContent":["import { Component, computed, inject, input } from '@angular/core';\r\nimport { MF_BREADCRUMB_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Link } from '@mesgflow/ui-kit/link';\r\n\r\nexport interface BreadcrumbItem {\r\n label: string;\r\n href?: string;\r\n}\r\n\r\n/**\r\n * `<mf-breadcrumb [items]=\"[{label: 'Ayarlar', href: '/ayarlar'}, {label: 'Ekip'}]\" />`\r\n *\r\n * SON öğe (mevcut sayfa) `href` verilse BİLE bağlantı OLARAK render\r\n * EDİLMEZ — WAI-ARIA breadcrumb deseninin önerdiği gibi düz metin +\r\n * `aria-current=\"page\"`. Host `role=\"navigation\"` taşır (`nav` etiketi\r\n * DEĞİL — `mf-breadcrumb` özel bir eleman, ama landmark semantiği aynı\r\n * şekilde çalışır).\r\n */\r\n@Component({\r\n selector: 'mf-breadcrumb',\r\n exportAs: 'mfBreadcrumb',\r\n imports: [Icon, Link],\r\n host: {\r\n role: 'navigation',\r\n '[attr.aria-label]': 'effectiveAriaLabel()',\r\n },\r\n template: `\r\n <ol class=\"flex flex-wrap items-center gap-1.5 text-sm text-fg-muted\">\r\n @for (item of items(); track item.label; let last = $last) {\r\n <li class=\"flex items-center gap-1.5\">\r\n @if (!last && item.href) {\r\n <a mfLink [href]=\"item.href\" underline=\"hover\">{{ item.label }}</a>\r\n } @else {\r\n <span [attr.aria-current]=\"last ? 'page' : null\" [class.text-fg]=\"last\">{{\r\n item.label\r\n }}</span>\r\n }\r\n @if (!last) {\r\n <span mfIcon [size]=\"14\" class=\"text-fg-subtle rtl:-scale-x-100\" aria-hidden=\"true\"\r\n >chevron_right</span\r\n >\r\n }\r\n </li>\r\n }\r\n </ol>\r\n `,\r\n})\r\nexport class Breadcrumb {\r\n readonly items = input.required<BreadcrumbItem[]>();\r\n readonly ariaLabel = input<string>();\r\n\r\n private readonly injectedLabels = inject(MF_BREADCRUMB_LABELS);\r\n protected readonly effectiveAriaLabel = computed(\r\n () => this.ariaLabel() ?? this.injectedLabels().ariaLabel,\r\n );\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAUA;;;;;;;;AAQG;MA8BU,UAAU,CAAA;IACZ,KAAK,GAAG,KAAK,CAAC,QAAQ;8EAAoB;AAC1C,IAAA,SAAS,GAAG,KAAK;6FAAU;AAEnB,IAAA,cAAc,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAC3C,IAAA,kBAAkB,GAAG,QAAQ,CAC9C,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,SAAS;2FAC1D;uGAPU,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,YAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EArBX,CAAA;;;;;;;;;;;;;;;;;;;GAmBT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAxBS,IAAI,qFAAE,IAAI,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FA0BT,UAAU,EAAA,UAAA,EAAA,CAAA;kBA7BtB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;AACrB,oBAAA,IAAI,EAAE;AACJ,wBAAA,IAAI,EAAE,YAAY;AAClB,wBAAA,mBAAmB,EAAE,sBAAsB;AAC5C,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;;;;;;;;AAmBT,EAAA,CAAA;AACF,iBAAA;;;AC/CD;;AAEG;;"}
@@ -0,0 +1,37 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, Component } from '@angular/core';
3
+
4
+ /**
5
+ * `<mf-button-group><button mfButton appearance="outlined">A</button>...</mf-button-group>`
6
+ * — bitişik butonları TEK bir segment şeridi gibi birleştirir: iç köşeler
7
+ * kare, kenarlıklar 1px çakışır (`-ms-px`), hover/odaklı buton `z-10` ile
8
+ * komşusunun üstüne çıkar (çakışan kenarlık kesilmesin diye). En anlamlısı
9
+ * `appearance="outlined"` butonlarla — dolu/düz-metin butonlarda zaten
10
+ * görünür kenarlık yok, sadece aralarındaki boşluk kapanır.
11
+ */
12
+ class ButtonGroup {
13
+ ariaLabel = input('', /* @ts-ignore */
14
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
15
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ButtonGroup, deps: [], target: i0.ɵɵFactoryTarget.Component });
16
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: ButtonGroup, isStandalone: true, selector: "mf-button-group", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "group" }, properties: { "attr.aria-label": "ariaLabel() || null" }, classAttribute: "inline-flex [&>*]:rounded-none [&>*:first-child]:rounded-s-md [&>*:last-child]:rounded-e-md [&>*:not(:first-child)]:-ms-px [&>*:focus-visible]:z-10 [&>*:hover]:z-10" }, exportAs: ["mfButtonGroup"], ngImport: i0, template: '<ng-content />', isInline: true });
17
+ }
18
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ButtonGroup, decorators: [{
19
+ type: Component,
20
+ args: [{
21
+ selector: 'mf-button-group',
22
+ exportAs: 'mfButtonGroup',
23
+ host: {
24
+ role: 'group',
25
+ '[attr.aria-label]': 'ariaLabel() || null',
26
+ class: 'inline-flex [&>*]:rounded-none [&>*:first-child]:rounded-s-md [&>*:last-child]:rounded-e-md [&>*:not(:first-child)]:-ms-px [&>*:focus-visible]:z-10 [&>*:hover]:z-10',
27
+ },
28
+ template: '<ng-content />',
29
+ }]
30
+ }], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
31
+
32
+ /**
33
+ * Generated bundle index. Do not edit.
34
+ */
35
+
36
+ export { ButtonGroup };
37
+ //# sourceMappingURL=mesgflow-ui-kit-button-group.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesgflow-ui-kit-button-group.mjs","sources":["../../../projects/ui-kit/button-group/button-group.ts","../../../projects/ui-kit/button-group/mesgflow-ui-kit-button-group.ts"],"sourcesContent":["import { Component, input } from '@angular/core';\r\n\r\n/**\r\n * `<mf-button-group><button mfButton appearance=\"outlined\">A</button>...</mf-button-group>`\r\n * — bitişik butonları TEK bir segment şeridi gibi birleştirir: iç köşeler\r\n * kare, kenarlıklar 1px çakışır (`-ms-px`), hover/odaklı buton `z-10` ile\r\n * komşusunun üstüne çıkar (çakışan kenarlık kesilmesin diye). En anlamlısı\r\n * `appearance=\"outlined\"` butonlarla — dolu/düz-metin butonlarda zaten\r\n * görünür kenarlık yok, sadece aralarındaki boşluk kapanır.\r\n */\r\n@Component({\r\n selector: 'mf-button-group',\r\n exportAs: 'mfButtonGroup',\r\n host: {\r\n role: 'group',\r\n '[attr.aria-label]': 'ariaLabel() || null',\r\n class:\r\n 'inline-flex [&>*]:rounded-none [&>*:first-child]:rounded-s-md [&>*:last-child]:rounded-e-md [&>*:not(:first-child)]:-ms-px [&>*:focus-visible]:z-10 [&>*:hover]:z-10',\r\n },\r\n template: '<ng-content />',\r\n})\r\nexport class ButtonGroup {\r\n readonly ariaLabel = input('');\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAEA;;;;;;;AAOG;MAYU,WAAW,CAAA;IACb,SAAS,GAAG,KAAK,CAAC,EAAE;kFAAC;uGADnB,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,qhBAFZ,gBAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAEf,WAAW,EAAA,UAAA,EAAA,CAAA;kBAXvB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,IAAI,EAAE;AACJ,wBAAA,IAAI,EAAE,OAAO;AACb,wBAAA,mBAAmB,EAAE,qBAAqB;AAC1C,wBAAA,KAAK,EACH,sKAAsK;AACzK,qBAAA;AACD,oBAAA,QAAQ,EAAE,gBAAgB;AAC3B,iBAAA;;;ACpBD;;AAEG;;"}
@@ -0,0 +1,359 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, computed, Component } from '@angular/core';
3
+ import { cn } from '@mesgflow/ui-kit/core';
4
+ import { Icon } from '@mesgflow/ui-kit/icon';
5
+ import { Spinner } from '@mesgflow/ui-kit/spinner';
6
+ import { cva } from 'class-variance-authority';
7
+
8
+ /**
9
+ * İki bağımsız eksen: `tone` (anlamsal renk, bkz. `MfTone`) × `appearance`
10
+ * (dolu/kenarlıklı/düz-metin). Her kombinasyon
11
+ * `compoundVariants`'ta açık — okunabilirlik netlik demek, kısayola kaçma.
12
+ *
13
+ * Gloss/iç-highlight YOK — 2 kez reddedildi.
14
+ * `outlined` kenarlığı bilinçli olarak jenerik gri DEĞİL, rengin kendisinin
15
+ * düşük opaklıklı hali (`border-accent/30` gibi) — düz gri çizgi "90'lar
16
+ * form elemanı" hissi veriyordu, renkli-şeffaf kenarlık modern/kasıtlı durur.
17
+ * Bu opaklık artık TEK bir class'ta iki modu birden doğru veriyor: `accent`/
18
+ * `success`/`warning`/`danger`/`info` çıplak isimleri `styles.css`'te
19
+ * moda göre takas olan rol token'ları (600 basamağı light, 400 basamağı
20
+ * dark) — `dark:` ikizi yazmaya gerek YOK.
21
+ */
22
+ const buttonVariants = cva(
23
+ /*
24
+ * `appearance-none border border-transparent`: Tailwind'in TAM `preflight.css`'i
25
+ * (bkz. styles.css) native <button>'ın tarayıcı varsayılan görünümünü zaten
26
+ * sıfırlıyor; `border-transparent` burada BİLEREK KALICI — `border` width'i
27
+ * TEK KAYNAKTAN (buradan) gelsin diye netlik amaçlı bırakıldı. Outlined
28
+ * compound variant'ları sadece border-RENGİNİ değiştiriyor (`cn()`/twMerge
29
+ * ile çakışma güvenli çözülüyor, bkz. button.ts) — ayrıca bir yerde
30
+ * `border-0`/`border` çifti YAZMA.
31
+ */
32
+ /*
33
+ * Focus: box-shadow tabanlı `ring`+`ring-offset` YERİNE native `outline`+
34
+ * `outline-offset` kullanılıyor (bkz. projects/ui-kit/README.md "Focus — tek
35
+ * mekanizma") — Windows Yüksek Kontrast modunda box-shadow tamamen
36
+ * kayboluyor ama outline korunuyor, outline `overflow:hidden` içinde
37
+ * kırpılmıyor, ve modern tarayıcılar outline'ı elementin kendi
38
+ * border-radius'una göre otomatik yuvarlıyor. Renk artık TÜM primitifler
39
+ * genelinde TEK bir kaynak: `outline-focus-ring` (styles.css'te tanımlı,
40
+ * moda göre 600/400 basamağı arasında takas olur) — eskiden her tone
41
+ * kendi `focus-visible:outline-X/50`'sini taşıyordu (input'ta `ring-4`,
42
+ * checkbox'ta `ring-2 ring-offset-2` gibi üç farklı mekanizma da vardı),
43
+ * artık tüm primitifler bu tek mekanizmaya bağlı.
44
+ */
45
+ 'inline-flex appearance-none items-center justify-center gap-2 border border-transparent font-medium tracking-label transition-colors duration-fast ease-emphasis ' +
46
+ 'active:scale-[0.99] ' +
47
+ 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring ' +
48
+ 'disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none disabled:active:scale-100', {
49
+ variants: {
50
+ tone: {
51
+ primary: '',
52
+ neutral: '',
53
+ success: '',
54
+ warning: '',
55
+ danger: '',
56
+ info: '',
57
+ help: '',
58
+ },
59
+ appearance: {
60
+ filled: '',
61
+ outlined: 'bg-transparent',
62
+ text: 'bg-transparent',
63
+ },
64
+ /*
65
+ * Yoğunluk sıkılaştırıldı: md 40px→36px (kurumsal panellerde 40px iri
66
+ * duruyordu, Linear/Vercel/GitHub yoğunluğuna çekildi). Radius
67
+ * `rounded-lg`(eski 8px) → `rounded-md`(yeni 8px) — görünüş AYNI,
68
+ * sadece isim değişti (bkz. radius.css'teki "nested radius" notu:
69
+ * kart/panel gibi KAPSAYICILAR artık `rounded-lg`de kalıp otomatik
70
+ * 12px'e büyüyor, kontroller bu satırda `rounded-md`ye taşınarak eski
71
+ * görünümü koruyor).
72
+ *
73
+ * `h-control-*` (bkz. radius.css) — TEK kontrol-yükseklik kaynağı,
74
+ * Input/Select/NumberInput/... ile PAYLAŞILAN aynı üç basamak (bkz.
75
+ * `core/recipes.ts` `controlSize`). `lg` bu geçişte 44px→40px'e indi
76
+ * (BREAKING — CHANGELOG'a bkz.): 44px sm/md'ye göre orantısız iriydi,
77
+ * yeni üçlü tutarlı bir 32/36/40 merdiveni.
78
+ */
79
+ size: {
80
+ sm: 'h-control-sm px-3 text-sm rounded-md',
81
+ md: 'h-control-md px-4 text-sm rounded-md',
82
+ lg: 'h-control-lg px-5 text-base rounded-md',
83
+ /*
84
+ * `text-xs font-semibold`: icon boyutu SADECE ikon değil metin de
85
+ * taşıyabiliyor (ör. language-switcher'ın "EN"/"TR" etiketi) — boyut
86
+ * tanımlanmadığında metin varsayılan (büyük) font'ta basılıyor,
87
+ * yanındaki 18px ikonla görsel ağırlığı uyuşmuyordu.
88
+ *
89
+ * Şekil (yuvarlak/köşeli) ve dolayısıyla focus mekanizması artık
90
+ * `shape` eksenine taşındı (aşağıda) — bu satır sadece boyut/tipografi
91
+ * taşıyor, `rounded-*` YOK. Yükseklik `md` ile aynı (36px).
92
+ */
93
+ icon: 'relative aspect-square h-control-md shrink-0 text-xs font-semibold',
94
+ },
95
+ /**
96
+ * `size="icon"` için şekil ekseni — diğer boyutlarda (sm/md/lg) etkisiz
97
+ * (boş string). Kullanıcı geri bildirimi: yuvarlak ikon-buton hover'ı
98
+ * "her yerde aynı" duruyordu, GitHub/Linear tarzı köşeli (rounded-md)
99
+ * bir hover/şekil de istendi — toolbar aksiyonları (Filtreler, satır
100
+ * düzenle/sil vb.) `square`, avatar-yanı ikonlar (tema/dil değiştirici)
101
+ * `round` (varsayılan) kullanıyor.
102
+ */
103
+ shape: {
104
+ round: '',
105
+ square: '',
106
+ },
107
+ },
108
+ compoundVariants: [
109
+ /*
110
+ * round: native `outline` `rounded-full`'u izlediği için (modern
111
+ * tarayıcılar outline'ı border-radius'a göre otomatik yuvarlıyor)
112
+ * doğrudan buton üzerinde bırakılsaydı focus göstergesi daire-içinde-
113
+ * daire ("bullseye"/ripple'ı andıran) görünürdü. Bunun yerine kendi
114
+ * `rounded-md` (köşeli) radius'una sahip bağımsız bir `::after` pseudo-
115
+ * element kare/köşeli bir çerçeve çiziyor, rengi de artık tek kaynaklı
116
+ * `outline-focus-ring` — eskiden "ink/paper" sabit zıtlığı (light:
117
+ * dark-canvas, dark: slate-100) kullanılıyordu çünkü `outline-current`
118
+ * filled+beyaz-metin butonlarda beyaz zeminde beyaza karışıyordu; yeni
119
+ * `focus-ring` token'ı zaten primary-600/400 (arkaplandan bağımsız
120
+ * yüksek kontrastlı bir marka rengi) olduğu için aynı sorunu yaşamıyor.
121
+ *
122
+ * square: buton zaten `rounded-md` olduğundan native `outline` fazladan
123
+ * bir teknik gerektirmeden doğru köşeli çerçeveyi otomatik veriyor —
124
+ * base class'taki `focus-visible:outline` mekanizması yeterli, ek bir
125
+ * şey eklemeye GEREK YOK.
126
+ */
127
+ {
128
+ size: 'icon',
129
+ shape: 'round',
130
+ class: "rounded-full focus-visible:outline-none after:pointer-events-none after:absolute after:-inset-1 after:rounded-md after:opacity-0 after:outline after:outline-2 after:outline-focus-ring after:transition-opacity after:duration-fast after:content-[''] focus-visible:after:opacity-100",
131
+ },
132
+ {
133
+ size: 'icon',
134
+ shape: 'square',
135
+ class: 'rounded-md',
136
+ },
137
+ // ---- filled ----
138
+ // NOT: primary'nin dolu bloğu `bg-accent-fill`/`hover:bg-accent-fill-hover`
139
+ // (color.css'te tanımlı rol token'ları) KULLANIR, ham basamak DEĞİL —
140
+ // LIGHT'ta primary-900 (`#062c22`, spec'in "Forest Emerald" CTA'sı),
141
+ // DARK'ta primary-400 (`#10b981`, spec'in canlı zümrüt CTA'sı) + DARK'ta
142
+ // mürekkep metin (`--mf-fg-on-accent`, beyaz `#10B981` üstünde 2.54:1
143
+ // AA altı olduğundan). Diğer dört semantik ton (success/warning/danger/
144
+ // info/help) da AYNI beşli rol desenini paylaşır: `bg-X-fill
145
+ // text-X-fill-fg shadow-filled hover:bg-X-fill-hover` — light'ta
146
+ // danger/help/info beyaz metin taşır, success/warning HER ZAMAN
147
+ // mürekkep (spec'in beş rengi de dark modda beyazla AA'yı geçmiyor,
148
+ // bu yüzden dark'ta hepsi mürekkep). `shadow-filled` (elevation.css) —
149
+ // `shadow-1` kapsayıcı gölgesidir, kontrol ödünç almaz; nötr filled
150
+ // (spec'in "Secondary"si, `neutral-fill` rol token'ı) gölgesiz kalır.
151
+ {
152
+ tone: 'primary',
153
+ appearance: 'filled',
154
+ class: 'bg-accent-fill text-fg-on-accent shadow-glow hover:bg-accent-fill-hover',
155
+ },
156
+ {
157
+ tone: 'neutral',
158
+ appearance: 'filled',
159
+ class: 'bg-neutral-fill text-neutral-fill-fg hover:bg-neutral-fill-hover',
160
+ },
161
+ {
162
+ tone: 'danger',
163
+ appearance: 'filled',
164
+ class: 'bg-danger-fill text-danger-fill-fg shadow-filled hover:bg-danger-fill-hover',
165
+ },
166
+ {
167
+ tone: 'info',
168
+ appearance: 'filled',
169
+ class: 'bg-info-fill text-info-fill-fg shadow-filled hover:bg-info-fill-hover',
170
+ },
171
+ {
172
+ tone: 'success',
173
+ appearance: 'filled',
174
+ class: 'bg-success-fill text-success-fill-fg shadow-filled hover:bg-success-fill-hover',
175
+ },
176
+ {
177
+ tone: 'warning',
178
+ appearance: 'filled',
179
+ class: 'bg-warning-fill text-warning-fill-fg shadow-filled hover:bg-warning-fill-hover',
180
+ },
181
+ {
182
+ tone: 'help',
183
+ appearance: 'filled',
184
+ class: 'bg-help-fill text-help-fill-fg shadow-filled hover:bg-help-fill-hover',
185
+ },
186
+ // ---- outlined ----
187
+ {
188
+ tone: 'primary',
189
+ appearance: 'outlined',
190
+ class: 'border-accent/30 text-accent hover:bg-accent/5',
191
+ },
192
+ {
193
+ tone: 'neutral',
194
+ appearance: 'outlined',
195
+ class: 'border-border text-fg-muted hover:bg-surface-alt',
196
+ },
197
+ {
198
+ tone: 'success',
199
+ appearance: 'outlined',
200
+ class: 'border-success/30 text-success hover:bg-success/5',
201
+ },
202
+ {
203
+ tone: 'warning',
204
+ appearance: 'outlined',
205
+ class: 'border-warning/30 text-warning hover:bg-warning/5',
206
+ },
207
+ {
208
+ tone: 'danger',
209
+ appearance: 'outlined',
210
+ class: 'border-danger/30 text-danger hover:bg-danger/5',
211
+ },
212
+ {
213
+ tone: 'info',
214
+ appearance: 'outlined',
215
+ class: 'border-info/30 text-info hover:bg-info/5',
216
+ },
217
+ {
218
+ tone: 'help',
219
+ appearance: 'outlined',
220
+ class: 'border-help/30 text-help hover:bg-help/5',
221
+ },
222
+ // ---- text ----
223
+ {
224
+ tone: 'primary',
225
+ appearance: 'text',
226
+ class: 'text-accent hover:bg-accent/5',
227
+ },
228
+ {
229
+ tone: 'neutral',
230
+ appearance: 'text',
231
+ class: 'text-fg-muted hover:bg-surface-alt',
232
+ },
233
+ {
234
+ tone: 'success',
235
+ appearance: 'text',
236
+ class: 'text-success hover:bg-success/5',
237
+ },
238
+ {
239
+ tone: 'warning',
240
+ appearance: 'text',
241
+ class: 'text-warning hover:bg-warning/5',
242
+ },
243
+ {
244
+ tone: 'danger',
245
+ appearance: 'text',
246
+ class: 'text-danger hover:bg-danger/5',
247
+ },
248
+ {
249
+ tone: 'info',
250
+ appearance: 'text',
251
+ class: 'text-info hover:bg-info/5',
252
+ },
253
+ {
254
+ tone: 'help',
255
+ appearance: 'text',
256
+ class: 'text-help hover:bg-help/5',
257
+ },
258
+ ],
259
+ defaultVariants: { tone: 'primary', appearance: 'filled', size: 'md', shape: 'round' },
260
+ });
261
+
262
+ /**
263
+ * `<button mfButton>`/`<a mfButton>` — selector native elemanın KENDİSİNİ
264
+ * hedefler (`button[mfButton], a[mfButton]`), bir SARMALAYICI etiket
265
+ * (`<mf-button>`) DEĞİL (bkz. `projects/ui-kit/README.md` "Directive mi,
266
+ * component mi?") — bu yüzden tüketicinin `class="..."` ile verdiği static
267
+ * class GENE doğrudan gerçek native elemana düşer, eskiden directive'ken
268
+ * olduğu gibi (host'ta kalıp içe düşmeme sorunu YOK). Directive'ten
269
+ * component'e yükseltilmenin TEK sebebi: `loading`'i gerçek bir
270
+ * `<mf-spinner>`'a, `iconStart`/`iconEnd`'i gerçek ikon element'lerine
271
+ * bağlayabilmek için bir ŞABLONA ihtiyaç duyulması — tüketicinin kendi
272
+ * içeriği `<ng-content />` ile AYNEN korunur.
273
+ *
274
+ * `tone` (renk) × `appearance` (dolu/kenarlıklı/düz-metin) bağımsız iki
275
+ * girdi — ör. `tone="danger" appearance="text" size="icon"` sadece ikon
276
+ * gösteren, kenarlıksız bir sil butonu için.
277
+ */
278
+ class Button {
279
+ tone = input('primary', /* @ts-ignore */
280
+ ...(ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []));
281
+ appearance = input('filled', /* @ts-ignore */
282
+ ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
283
+ size = input('md', /* @ts-ignore */
284
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
285
+ /** Sadece `size="icon"`'da etkili — bkz. button.variants.ts. */
286
+ shape = input('round', /* @ts-ignore */
287
+ ...(ngDevMode ? [{ debugName: "shape" }] : /* istanbul ignore next */ []));
288
+ /** Native <button> varsayılan type="submit" sürprizini önlemek için — <a>'da yok sayılır. */
289
+ type = input('button', /* @ts-ignore */
290
+ ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
291
+ /**
292
+ * `true` iken içeriğin (`<ng-content />`) ÖNÜNE `<mf-spinner size="xs" />`
293
+ * eklenir — `iconStart` varsa YERİNE geçer, etiket metni görünür KALIR
294
+ * (buton "Kaydet" yazıp yanında dönen bir gösterge taşır, metin
295
+ * kaybolmaz). `disabled`'ı KENDİLİĞİNDEN yönetmez — tüketici
296
+ * `[disabled]="loading() || ..."` ile kendi bağlar.
297
+ */
298
+ loading = input(false, /* @ts-ignore */
299
+ ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
300
+ /** Material Symbol adı (bkz. `Icon`) — içeriğin ÖNÜNE eklenir. `loading=true` iken spinner onun YERİNE geçer. */
301
+ iconStart = input('', /* @ts-ignore */
302
+ ...(ngDevMode ? [{ debugName: "iconStart" }] : /* istanbul ignore next */ []));
303
+ /** Material Symbol adı — içeriğin ARDINA eklenir. `loading=true` iken GİZLENİR (tek bir dönen gösterge yeterli — `iconStart` ile aynı ilke). */
304
+ iconEnd = input('', /* @ts-ignore */
305
+ ...(ngDevMode ? [{ debugName: "iconEnd" }] : /* istanbul ignore next */ []));
306
+ classes = computed(() => cn(buttonVariants({
307
+ tone: this.tone(),
308
+ appearance: this.appearance(),
309
+ size: this.size(),
310
+ shape: this.shape(),
311
+ }), this.loading() ? 'cursor-wait' : ''), /* @ts-ignore */
312
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
313
+ nativeType = computed(() => this.type(), /* @ts-ignore */
314
+ ...(ngDevMode ? [{ debugName: "nativeType" }] : /* istanbul ignore next */ []));
315
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Button, deps: [], target: i0.ɵɵFactoryTarget.Component });
316
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Button, isStandalone: true, selector: "button[mfButton], a[mfButton]", inputs: { tone: { classPropertyName: "tone", publicName: "tone", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, shape: { classPropertyName: "shape", publicName: "shape", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, iconStart: { classPropertyName: "iconStart", publicName: "iconStart", isSignal: true, isRequired: false, transformFunction: null }, iconEnd: { classPropertyName: "iconEnd", publicName: "iconEnd", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.type": "nativeType()", "attr.aria-busy": "loading() || null" } }, exportAs: ["mfButton"], ngImport: i0, template: `
317
+ @if (loading()) {
318
+ <mf-spinner size="xs" />
319
+ } @else if (iconStart()) {
320
+ <span mfIcon [size]="18">{{ iconStart() }}</span>
321
+ }
322
+ <ng-content />
323
+ @if (!loading() && iconEnd()) {
324
+ <span mfIcon [size]="18">{{ iconEnd() }}</span>
325
+ }
326
+ `, isInline: true, dependencies: [{ kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "component", type: Spinner, selector: "mf-spinner", inputs: ["size", "tone", "ariaLabel"], exportAs: ["mfSpinner"] }] });
327
+ }
328
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Button, decorators: [{
329
+ type: Component,
330
+ args: [{
331
+ // eslint-disable-next-line @angular-eslint/component-selector -- BİLEREK native eleman + attribute (bkz. yukarıdaki JSDoc)
332
+ selector: 'button[mfButton], a[mfButton]',
333
+ exportAs: 'mfButton',
334
+ imports: [Icon, Spinner],
335
+ host: {
336
+ '[class]': 'classes()',
337
+ '[attr.type]': 'nativeType()',
338
+ '[attr.aria-busy]': 'loading() || null',
339
+ },
340
+ template: `
341
+ @if (loading()) {
342
+ <mf-spinner size="xs" />
343
+ } @else if (iconStart()) {
344
+ <span mfIcon [size]="18">{{ iconStart() }}</span>
345
+ }
346
+ <ng-content />
347
+ @if (!loading() && iconEnd()) {
348
+ <span mfIcon [size]="18">{{ iconEnd() }}</span>
349
+ }
350
+ `,
351
+ }]
352
+ }], propDecorators: { tone: [{ type: i0.Input, args: [{ isSignal: true, alias: "tone", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], shape: [{ type: i0.Input, args: [{ isSignal: true, alias: "shape", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], iconStart: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconStart", required: false }] }], iconEnd: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconEnd", required: false }] }] } });
353
+
354
+ /**
355
+ * Generated bundle index. Do not edit.
356
+ */
357
+
358
+ export { Button, buttonVariants };
359
+ //# sourceMappingURL=mesgflow-ui-kit-button.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesgflow-ui-kit-button.mjs","sources":["../../../projects/ui-kit/button/button.variants.ts","../../../projects/ui-kit/button/button.ts","../../../projects/ui-kit/button/mesgflow-ui-kit-button.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\r\n\r\n/**\r\n * İki bağımsız eksen: `tone` (anlamsal renk, bkz. `MfTone`) × `appearance`\r\n * (dolu/kenarlıklı/düz-metin). Her kombinasyon\r\n * `compoundVariants`'ta açık — okunabilirlik netlik demek, kısayola kaçma.\r\n *\r\n * Gloss/iç-highlight YOK — 2 kez reddedildi.\r\n * `outlined` kenarlığı bilinçli olarak jenerik gri DEĞİL, rengin kendisinin\r\n * düşük opaklıklı hali (`border-accent/30` gibi) — düz gri çizgi \"90'lar\r\n * form elemanı\" hissi veriyordu, renkli-şeffaf kenarlık modern/kasıtlı durur.\r\n * Bu opaklık artık TEK bir class'ta iki modu birden doğru veriyor: `accent`/\r\n * `success`/`warning`/`danger`/`info` çıplak isimleri `styles.css`'te\r\n * moda göre takas olan rol token'ları (600 basamağı light, 400 basamağı\r\n * dark) — `dark:` ikizi yazmaya gerek YOK.\r\n */\r\nexport const buttonVariants = cva(\r\n /*\r\n * `appearance-none border border-transparent`: Tailwind'in TAM `preflight.css`'i\r\n * (bkz. styles.css) native <button>'ın tarayıcı varsayılan görünümünü zaten\r\n * sıfırlıyor; `border-transparent` burada BİLEREK KALICI — `border` width'i\r\n * TEK KAYNAKTAN (buradan) gelsin diye netlik amaçlı bırakıldı. Outlined\r\n * compound variant'ları sadece border-RENGİNİ değiştiriyor (`cn()`/twMerge\r\n * ile çakışma güvenli çözülüyor, bkz. button.ts) — ayrıca bir yerde\r\n * `border-0`/`border` çifti YAZMA.\r\n */\r\n /*\r\n * Focus: box-shadow tabanlı `ring`+`ring-offset` YERİNE native `outline`+\r\n * `outline-offset` kullanılıyor (bkz. projects/ui-kit/README.md \"Focus — tek\r\n * mekanizma\") — Windows Yüksek Kontrast modunda box-shadow tamamen\r\n * kayboluyor ama outline korunuyor, outline `overflow:hidden` içinde\r\n * kırpılmıyor, ve modern tarayıcılar outline'ı elementin kendi\r\n * border-radius'una göre otomatik yuvarlıyor. Renk artık TÜM primitifler\r\n * genelinde TEK bir kaynak: `outline-focus-ring` (styles.css'te tanımlı,\r\n * moda göre 600/400 basamağı arasında takas olur) — eskiden her tone\r\n * kendi `focus-visible:outline-X/50`'sini taşıyordu (input'ta `ring-4`,\r\n * checkbox'ta `ring-2 ring-offset-2` gibi üç farklı mekanizma da vardı),\r\n * artık tüm primitifler bu tek mekanizmaya bağlı.\r\n */\r\n 'inline-flex appearance-none items-center justify-center gap-2 border border-transparent font-medium tracking-label transition-colors duration-fast ease-emphasis ' +\r\n '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 'disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none disabled:active:scale-100',\r\n {\r\n variants: {\r\n tone: {\r\n primary: '',\r\n neutral: '',\r\n success: '',\r\n warning: '',\r\n danger: '',\r\n info: '',\r\n help: '',\r\n },\r\n appearance: {\r\n filled: '',\r\n outlined: 'bg-transparent',\r\n text: 'bg-transparent',\r\n },\r\n /*\r\n * Yoğunluk sıkılaştırıldı: md 40px→36px (kurumsal panellerde 40px iri\r\n * duruyordu, Linear/Vercel/GitHub yoğunluğuna çekildi). Radius\r\n * `rounded-lg`(eski 8px) → `rounded-md`(yeni 8px) — görünüş AYNI,\r\n * sadece isim değişti (bkz. radius.css'teki \"nested radius\" notu:\r\n * kart/panel gibi KAPSAYICILAR artık `rounded-lg`de kalıp otomatik\r\n * 12px'e büyüyor, kontroller bu satırda `rounded-md`ye taşınarak eski\r\n * görünümü koruyor).\r\n *\r\n * `h-control-*` (bkz. radius.css) — TEK kontrol-yükseklik kaynağı,\r\n * Input/Select/NumberInput/... ile PAYLAŞILAN aynı üç basamak (bkz.\r\n * `core/recipes.ts` `controlSize`). `lg` bu geçişte 44px→40px'e indi\r\n * (BREAKING — CHANGELOG'a bkz.): 44px sm/md'ye göre orantısız iriydi,\r\n * yeni üçlü tutarlı bir 32/36/40 merdiveni.\r\n */\r\n size: {\r\n sm: 'h-control-sm px-3 text-sm rounded-md',\r\n md: 'h-control-md px-4 text-sm rounded-md',\r\n lg: 'h-control-lg px-5 text-base rounded-md',\r\n /*\r\n * `text-xs font-semibold`: icon boyutu SADECE ikon değil metin de\r\n * taşıyabiliyor (ör. language-switcher'ın \"EN\"/\"TR\" etiketi) — boyut\r\n * tanımlanmadığında metin varsayılan (büyük) font'ta basılıyor,\r\n * yanındaki 18px ikonla görsel ağırlığı uyuşmuyordu.\r\n *\r\n * Şekil (yuvarlak/köşeli) ve dolayısıyla focus mekanizması artık\r\n * `shape` eksenine taşındı (aşağıda) — bu satır sadece boyut/tipografi\r\n * taşıyor, `rounded-*` YOK. Yükseklik `md` ile aynı (36px).\r\n */\r\n icon: 'relative aspect-square h-control-md shrink-0 text-xs font-semibold',\r\n },\r\n /**\r\n * `size=\"icon\"` için şekil ekseni — diğer boyutlarda (sm/md/lg) etkisiz\r\n * (boş string). Kullanıcı geri bildirimi: yuvarlak ikon-buton hover'ı\r\n * \"her yerde aynı\" duruyordu, GitHub/Linear tarzı köşeli (rounded-md)\r\n * bir hover/şekil de istendi — toolbar aksiyonları (Filtreler, satır\r\n * düzenle/sil vb.) `square`, avatar-yanı ikonlar (tema/dil değiştirici)\r\n * `round` (varsayılan) kullanıyor.\r\n */\r\n shape: {\r\n round: '',\r\n square: '',\r\n },\r\n },\r\n compoundVariants: [\r\n /*\r\n * round: native `outline` `rounded-full`'u izlediği için (modern\r\n * tarayıcılar outline'ı border-radius'a göre otomatik yuvarlıyor)\r\n * doğrudan buton üzerinde bırakılsaydı focus göstergesi daire-içinde-\r\n * daire (\"bullseye\"/ripple'ı andıran) görünürdü. Bunun yerine kendi\r\n * `rounded-md` (köşeli) radius'una sahip bağımsız bir `::after` pseudo-\r\n * element kare/köşeli bir çerçeve çiziyor, rengi de artık tek kaynaklı\r\n * `outline-focus-ring` — eskiden \"ink/paper\" sabit zıtlığı (light:\r\n * dark-canvas, dark: slate-100) kullanılıyordu çünkü `outline-current`\r\n * filled+beyaz-metin butonlarda beyaz zeminde beyaza karışıyordu; yeni\r\n * `focus-ring` token'ı zaten primary-600/400 (arkaplandan bağımsız\r\n * yüksek kontrastlı bir marka rengi) olduğu için aynı sorunu yaşamıyor.\r\n *\r\n * square: buton zaten `rounded-md` olduğundan native `outline` fazladan\r\n * bir teknik gerektirmeden doğru köşeli çerçeveyi otomatik veriyor —\r\n * base class'taki `focus-visible:outline` mekanizması yeterli, ek bir\r\n * şey eklemeye GEREK YOK.\r\n */\r\n {\r\n size: 'icon',\r\n shape: 'round',\r\n class:\r\n \"rounded-full focus-visible:outline-none after:pointer-events-none after:absolute after:-inset-1 after:rounded-md after:opacity-0 after:outline after:outline-2 after:outline-focus-ring after:transition-opacity after:duration-fast after:content-[''] focus-visible:after:opacity-100\",\r\n },\r\n {\r\n size: 'icon',\r\n shape: 'square',\r\n class: 'rounded-md',\r\n },\r\n // ---- filled ----\r\n // NOT: primary'nin dolu bloğu `bg-accent-fill`/`hover:bg-accent-fill-hover`\r\n // (color.css'te tanımlı rol token'ları) KULLANIR, ham basamak DEĞİL —\r\n // LIGHT'ta primary-900 (`#062c22`, spec'in \"Forest Emerald\" CTA'sı),\r\n // DARK'ta primary-400 (`#10b981`, spec'in canlı zümrüt CTA'sı) + DARK'ta\r\n // mürekkep metin (`--mf-fg-on-accent`, beyaz `#10B981` üstünde 2.54:1\r\n // AA altı olduğundan). Diğer dört semantik ton (success/warning/danger/\r\n // info/help) da AYNI beşli rol desenini paylaşır: `bg-X-fill\r\n // text-X-fill-fg shadow-filled hover:bg-X-fill-hover` — light'ta\r\n // danger/help/info beyaz metin taşır, success/warning HER ZAMAN\r\n // mürekkep (spec'in beş rengi de dark modda beyazla AA'yı geçmiyor,\r\n // bu yüzden dark'ta hepsi mürekkep). `shadow-filled` (elevation.css) —\r\n // `shadow-1` kapsayıcı gölgesidir, kontrol ödünç almaz; nötr filled\r\n // (spec'in \"Secondary\"si, `neutral-fill` rol token'ı) gölgesiz kalır.\r\n {\r\n tone: 'primary',\r\n appearance: 'filled',\r\n class: 'bg-accent-fill text-fg-on-accent shadow-glow hover:bg-accent-fill-hover',\r\n },\r\n {\r\n tone: 'neutral',\r\n appearance: 'filled',\r\n class: 'bg-neutral-fill text-neutral-fill-fg hover:bg-neutral-fill-hover',\r\n },\r\n {\r\n tone: 'danger',\r\n appearance: 'filled',\r\n class: 'bg-danger-fill text-danger-fill-fg shadow-filled hover:bg-danger-fill-hover',\r\n },\r\n {\r\n tone: 'info',\r\n appearance: 'filled',\r\n class: 'bg-info-fill text-info-fill-fg shadow-filled hover:bg-info-fill-hover',\r\n },\r\n {\r\n tone: 'success',\r\n appearance: 'filled',\r\n class: 'bg-success-fill text-success-fill-fg shadow-filled hover:bg-success-fill-hover',\r\n },\r\n {\r\n tone: 'warning',\r\n appearance: 'filled',\r\n class: 'bg-warning-fill text-warning-fill-fg shadow-filled hover:bg-warning-fill-hover',\r\n },\r\n {\r\n tone: 'help',\r\n appearance: 'filled',\r\n class: 'bg-help-fill text-help-fill-fg shadow-filled hover:bg-help-fill-hover',\r\n },\r\n\r\n // ---- outlined ----\r\n {\r\n tone: 'primary',\r\n appearance: 'outlined',\r\n class: 'border-accent/30 text-accent hover:bg-accent/5',\r\n },\r\n {\r\n tone: 'neutral',\r\n appearance: 'outlined',\r\n class: 'border-border text-fg-muted hover:bg-surface-alt',\r\n },\r\n {\r\n tone: 'success',\r\n appearance: 'outlined',\r\n class: 'border-success/30 text-success hover:bg-success/5',\r\n },\r\n {\r\n tone: 'warning',\r\n appearance: 'outlined',\r\n class: 'border-warning/30 text-warning hover:bg-warning/5',\r\n },\r\n {\r\n tone: 'danger',\r\n appearance: 'outlined',\r\n class: 'border-danger/30 text-danger hover:bg-danger/5',\r\n },\r\n {\r\n tone: 'info',\r\n appearance: 'outlined',\r\n class: 'border-info/30 text-info hover:bg-info/5',\r\n },\r\n {\r\n tone: 'help',\r\n appearance: 'outlined',\r\n class: 'border-help/30 text-help hover:bg-help/5',\r\n },\r\n // ---- text ----\r\n {\r\n tone: 'primary',\r\n appearance: 'text',\r\n class: 'text-accent hover:bg-accent/5',\r\n },\r\n {\r\n tone: 'neutral',\r\n appearance: 'text',\r\n class: 'text-fg-muted hover:bg-surface-alt',\r\n },\r\n {\r\n tone: 'success',\r\n appearance: 'text',\r\n class: 'text-success hover:bg-success/5',\r\n },\r\n {\r\n tone: 'warning',\r\n appearance: 'text',\r\n class: 'text-warning hover:bg-warning/5',\r\n },\r\n {\r\n tone: 'danger',\r\n appearance: 'text',\r\n class: 'text-danger hover:bg-danger/5',\r\n },\r\n {\r\n tone: 'info',\r\n appearance: 'text',\r\n class: 'text-info hover:bg-info/5',\r\n },\r\n {\r\n tone: 'help',\r\n appearance: 'text',\r\n class: 'text-help hover:bg-help/5',\r\n },\r\n ],\r\n defaultVariants: { tone: 'primary', appearance: 'filled', size: 'md', shape: 'round' },\r\n },\r\n);\r\n\r\nexport type ButtonTone = VariantProps<typeof buttonVariants>['tone'];\r\n/** @deprecated `ButtonTone` kullan — `severity` girdisi `tone`'a taşındı (bkz. plan Faz 1a). */\r\nexport type ButtonSeverity = ButtonTone;\r\nexport type ButtonAppearance = VariantProps<typeof buttonVariants>['appearance'];\r\nexport type ButtonSize = VariantProps<typeof buttonVariants>['size'];\r\nexport type ButtonShape = VariantProps<typeof buttonVariants>['shape'];\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Spinner } from '@mesgflow/ui-kit/spinner';\r\nimport {\r\n buttonVariants,\r\n type ButtonAppearance,\r\n type ButtonShape,\r\n type ButtonSize,\r\n type ButtonTone,\r\n} from './button.variants';\r\n\r\n/**\r\n * `<button mfButton>`/`<a mfButton>` — selector native elemanın KENDİSİNİ\r\n * hedefler (`button[mfButton], a[mfButton]`), bir SARMALAYICI etiket\r\n * (`<mf-button>`) DEĞİL (bkz. `projects/ui-kit/README.md` \"Directive mi,\r\n * component mi?\") — bu yüzden tüketicinin `class=\"...\"` ile verdiği static\r\n * class GENE doğrudan gerçek native elemana düşer, eskiden directive'ken\r\n * olduğu gibi (host'ta kalıp içe düşmeme sorunu YOK). Directive'ten\r\n * component'e yükseltilmenin TEK sebebi: `loading`'i gerçek bir\r\n * `<mf-spinner>`'a, `iconStart`/`iconEnd`'i gerçek ikon element'lerine\r\n * bağlayabilmek için bir ŞABLONA ihtiyaç duyulması — tüketicinin kendi\r\n * içeriği `<ng-content />` ile AYNEN korunur.\r\n *\r\n * `tone` (renk) × `appearance` (dolu/kenarlıklı/düz-metin) bağımsız iki\r\n * girdi — ör. `tone=\"danger\" appearance=\"text\" size=\"icon\"` sadece ikon\r\n * gösteren, kenarlıksız bir sil butonu için.\r\n */\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector -- BİLEREK native eleman + attribute (bkz. yukarıdaki JSDoc)\r\n selector: 'button[mfButton], a[mfButton]',\r\n exportAs: 'mfButton',\r\n imports: [Icon, Spinner],\r\n host: {\r\n '[class]': 'classes()',\r\n '[attr.type]': 'nativeType()',\r\n '[attr.aria-busy]': 'loading() || null',\r\n },\r\n template: `\r\n @if (loading()) {\r\n <mf-spinner size=\"xs\" />\r\n } @else if (iconStart()) {\r\n <span mfIcon [size]=\"18\">{{ iconStart() }}</span>\r\n }\r\n <ng-content />\r\n @if (!loading() && iconEnd()) {\r\n <span mfIcon [size]=\"18\">{{ iconEnd() }}</span>\r\n }\r\n `,\r\n})\r\nexport class Button {\r\n readonly tone = input<ButtonTone>('primary');\r\n readonly appearance = input<ButtonAppearance>('filled');\r\n readonly size = input<ButtonSize>('md');\r\n /** Sadece `size=\"icon\"`'da etkili — bkz. button.variants.ts. */\r\n readonly shape = input<ButtonShape>('round');\r\n /** Native <button> varsayılan type=\"submit\" sürprizini önlemek için — <a>'da yok sayılır. */\r\n readonly type = input<'button' | 'submit' | 'reset'>('button');\r\n /**\r\n * `true` iken içeriğin (`<ng-content />`) ÖNÜNE `<mf-spinner size=\"xs\" />`\r\n * eklenir — `iconStart` varsa YERİNE geçer, etiket metni görünür KALIR\r\n * (buton \"Kaydet\" yazıp yanında dönen bir gösterge taşır, metin\r\n * kaybolmaz). `disabled`'ı KENDİLİĞİNDEN yönetmez — tüketici\r\n * `[disabled]=\"loading() || ...\"` ile kendi bağlar.\r\n */\r\n readonly loading = input(false);\r\n /** Material Symbol adı (bkz. `Icon`) — içeriğin ÖNÜNE eklenir. `loading=true` iken spinner onun YERİNE geçer. */\r\n readonly iconStart = input('');\r\n /** Material Symbol adı — içeriğin ARDINA eklenir. `loading=true` iken GİZLENİR (tek bir dönen gösterge yeterli — `iconStart` ile aynı ilke). */\r\n readonly iconEnd = input('');\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n buttonVariants({\r\n tone: this.tone(),\r\n appearance: this.appearance(),\r\n size: this.size(),\r\n shape: this.shape(),\r\n }),\r\n this.loading() ? 'cursor-wait' : '',\r\n ),\r\n );\r\n protected readonly nativeType = computed(() => this.type());\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}