@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.
- package/LICENSE +21 -0
- package/README.md +200 -0
- package/fesm2022/mesgflow-ui-kit-accordion.mjs +75 -0
- package/fesm2022/mesgflow-ui-kit-accordion.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-alert.mjs +165 -0
- package/fesm2022/mesgflow-ui-kit-alert.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-avatar-group.mjs +88 -0
- package/fesm2022/mesgflow-ui-kit-avatar-group.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-avatar.mjs +123 -0
- package/fesm2022/mesgflow-ui-kit-avatar.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-badge.mjs +68 -0
- package/fesm2022/mesgflow-ui-kit-badge.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-banner.mjs +111 -0
- package/fesm2022/mesgflow-ui-kit-banner.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-box-input.mjs +78 -0
- package/fesm2022/mesgflow-ui-kit-box-input.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-brand.mjs +120 -0
- package/fesm2022/mesgflow-ui-kit-brand.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-breadcrumb.mjs +84 -0
- package/fesm2022/mesgflow-ui-kit-breadcrumb.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-button-group.mjs +37 -0
- package/fesm2022/mesgflow-ui-kit-button-group.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-button.mjs +359 -0
- package/fesm2022/mesgflow-ui-kit-button.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-card.mjs +128 -0
- package/fesm2022/mesgflow-ui-kit-card.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-chart.mjs +538 -0
- package/fesm2022/mesgflow-ui-kit-chart.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-checkbox.mjs +45 -0
- package/fesm2022/mesgflow-ui-kit-checkbox.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-chip.mjs +123 -0
- package/fesm2022/mesgflow-ui-kit-chip.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-code-block.mjs +71 -0
- package/fesm2022/mesgflow-ui-kit-code-block.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-collapsible.mjs +89 -0
- package/fesm2022/mesgflow-ui-kit-collapsible.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-color-picker.mjs +210 -0
- package/fesm2022/mesgflow-ui-kit-color-picker.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-combobox.mjs +181 -0
- package/fesm2022/mesgflow-ui-kit-combobox.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-command.mjs +491 -0
- package/fesm2022/mesgflow-ui-kit-command.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-context-menu.mjs +92 -0
- package/fesm2022/mesgflow-ui-kit-context-menu.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-copy-button.mjs +167 -0
- package/fesm2022/mesgflow-ui-kit-copy-button.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-core.mjs +624 -0
- package/fesm2022/mesgflow-ui-kit-core.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-date-picker.mjs +643 -0
- package/fesm2022/mesgflow-ui-kit-date-picker.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-description-list.mjs +76 -0
- package/fesm2022/mesgflow-ui-kit-description-list.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-dialog.mjs +700 -0
- package/fesm2022/mesgflow-ui-kit-dialog.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-divider.mjs +62 -0
- package/fesm2022/mesgflow-ui-kit-divider.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-dropzone.mjs +126 -0
- package/fesm2022/mesgflow-ui-kit-dropzone.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-empty-state.mjs +70 -0
- package/fesm2022/mesgflow-ui-kit-empty-state.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-field.mjs +42 -0
- package/fesm2022/mesgflow-ui-kit-field.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-hover-card.mjs +171 -0
- package/fesm2022/mesgflow-ui-kit-hover-card.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs +258 -0
- package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-icon.mjs +174 -0
- package/fesm2022/mesgflow-ui-kit-icon.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-input.mjs +448 -0
- package/fesm2022/mesgflow-ui-kit-input.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-kbd.mjs +24 -0
- package/fesm2022/mesgflow-ui-kit-kbd.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-link.mjs +48 -0
- package/fesm2022/mesgflow-ui-kit-link.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-menu.mjs +105 -0
- package/fesm2022/mesgflow-ui-kit-menu.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-number-input.mjs +153 -0
- package/fesm2022/mesgflow-ui-kit-number-input.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-otp-input.mjs +164 -0
- package/fesm2022/mesgflow-ui-kit-otp-input.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-page-header.mjs +83 -0
- package/fesm2022/mesgflow-ui-kit-page-header.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-pagination.mjs +99 -0
- package/fesm2022/mesgflow-ui-kit-pagination.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-password-input.mjs +120 -0
- package/fesm2022/mesgflow-ui-kit-password-input.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-popover.mjs +213 -0
- package/fesm2022/mesgflow-ui-kit-popover.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-progress.mjs +82 -0
- package/fesm2022/mesgflow-ui-kit-progress.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-radio.mjs +123 -0
- package/fesm2022/mesgflow-ui-kit-radio.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-rating.mjs +116 -0
- package/fesm2022/mesgflow-ui-kit-rating.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-scroll-area.mjs +84 -0
- package/fesm2022/mesgflow-ui-kit-scroll-area.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-search-input.mjs +154 -0
- package/fesm2022/mesgflow-ui-kit-search-input.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-segmented-control.mjs +95 -0
- package/fesm2022/mesgflow-ui-kit-segmented-control.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-select.mjs +227 -0
- package/fesm2022/mesgflow-ui-kit-select.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-sidebar.mjs +449 -0
- package/fesm2022/mesgflow-ui-kit-sidebar.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-skeleton.mjs +74 -0
- package/fesm2022/mesgflow-ui-kit-skeleton.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-slider.mjs +179 -0
- package/fesm2022/mesgflow-ui-kit-slider.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-spinner.mjs +67 -0
- package/fesm2022/mesgflow-ui-kit-spinner.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-splitter.mjs +97 -0
- package/fesm2022/mesgflow-ui-kit-splitter.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-stat-tile.mjs +98 -0
- package/fesm2022/mesgflow-ui-kit-stat-tile.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-stepper.mjs +133 -0
- package/fesm2022/mesgflow-ui-kit-stepper.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-switch.mjs +73 -0
- package/fesm2022/mesgflow-ui-kit-switch.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-table.mjs +1783 -0
- package/fesm2022/mesgflow-ui-kit-table.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-tabs.mjs +569 -0
- package/fesm2022/mesgflow-ui-kit-tabs.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-tag-input.mjs +138 -0
- package/fesm2022/mesgflow-ui-kit-tag-input.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-theme-switcher.mjs +53 -0
- package/fesm2022/mesgflow-ui-kit-theme-switcher.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-theming.mjs +1016 -0
- package/fesm2022/mesgflow-ui-kit-theming.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-time-picker.mjs +138 -0
- package/fesm2022/mesgflow-ui-kit-time-picker.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-timeline.mjs +91 -0
- package/fesm2022/mesgflow-ui-kit-timeline.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-toast.mjs +202 -0
- package/fesm2022/mesgflow-ui-kit-toast.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-toggle.mjs +243 -0
- package/fesm2022/mesgflow-ui-kit-toggle.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-toolbar.mjs +99 -0
- package/fesm2022/mesgflow-ui-kit-toolbar.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-tooltip.mjs +160 -0
- package/fesm2022/mesgflow-ui-kit-tooltip.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-tour.mjs +272 -0
- package/fesm2022/mesgflow-ui-kit-tour.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-tree-select.mjs +177 -0
- package/fesm2022/mesgflow-ui-kit-tree-select.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-tree.mjs +82 -0
- package/fesm2022/mesgflow-ui-kit-tree.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit.mjs +12851 -0
- package/fesm2022/mesgflow-ui-kit.mjs.map +1 -0
- package/package.json +374 -0
- package/preset.css +20 -0
- package/tokens/color.css +693 -0
- package/tokens/contrast.css +68 -0
- package/tokens/elevation.css +68 -0
- package/tokens/motion.css +277 -0
- package/tokens/radius.css +69 -0
- package/tokens/typography.css +127 -0
- package/tokens.css +41 -0
- package/types/mesgflow-ui-kit-accordion.d.ts +42 -0
- package/types/mesgflow-ui-kit-alert.d.ts +60 -0
- package/types/mesgflow-ui-kit-avatar-group.d.ts +28 -0
- package/types/mesgflow-ui-kit-avatar.d.ts +23 -0
- package/types/mesgflow-ui-kit-badge.d.ts +39 -0
- package/types/mesgflow-ui-kit-banner.d.ts +42 -0
- package/types/mesgflow-ui-kit-box-input.d.ts +45 -0
- package/types/mesgflow-ui-kit-brand.d.ts +48 -0
- package/types/mesgflow-ui-kit-breadcrumb.d.ts +26 -0
- package/types/mesgflow-ui-kit-button-group.d.ts +17 -0
- package/types/mesgflow-ui-kit-button.d.ts +75 -0
- package/types/mesgflow-ui-kit-card.d.ts +71 -0
- package/types/mesgflow-ui-kit-chart.d.ts +242 -0
- package/types/mesgflow-ui-kit-checkbox.d.ts +17 -0
- package/types/mesgflow-ui-kit-chip.d.ts +46 -0
- package/types/mesgflow-ui-kit-code-block.d.ts +56 -0
- package/types/mesgflow-ui-kit-collapsible.d.ts +39 -0
- package/types/mesgflow-ui-kit-color-picker.d.ts +78 -0
- package/types/mesgflow-ui-kit-combobox.d.ts +74 -0
- package/types/mesgflow-ui-kit-command.d.ts +185 -0
- package/types/mesgflow-ui-kit-context-menu.d.ts +40 -0
- package/types/mesgflow-ui-kit-copy-button.d.ts +47 -0
- package/types/mesgflow-ui-kit-core.d.ts +508 -0
- package/types/mesgflow-ui-kit-date-picker.d.ts +215 -0
- package/types/mesgflow-ui-kit-description-list.d.ts +23 -0
- package/types/mesgflow-ui-kit-dialog.d.ts +342 -0
- package/types/mesgflow-ui-kit-divider.d.ts +23 -0
- package/types/mesgflow-ui-kit-dropzone.d.ts +47 -0
- package/types/mesgflow-ui-kit-empty-state.d.ts +18 -0
- package/types/mesgflow-ui-kit-field.d.ts +26 -0
- package/types/mesgflow-ui-kit-hover-card.d.ts +52 -0
- package/types/mesgflow-ui-kit-i18n-tr.d.ts +14 -0
- package/types/mesgflow-ui-kit-icon.d.ts +76 -0
- package/types/mesgflow-ui-kit-input.d.ts +186 -0
- package/types/mesgflow-ui-kit-kbd.d.ts +9 -0
- package/types/mesgflow-ui-kit-link.d.ts +20 -0
- package/types/mesgflow-ui-kit-menu.d.ts +53 -0
- package/types/mesgflow-ui-kit-number-input.d.ts +55 -0
- package/types/mesgflow-ui-kit-otp-input.d.ts +44 -0
- package/types/mesgflow-ui-kit-page-header.d.ts +31 -0
- package/types/mesgflow-ui-kit-pagination.d.ts +50 -0
- package/types/mesgflow-ui-kit-password-input.d.ts +33 -0
- package/types/mesgflow-ui-kit-popover.d.ts +62 -0
- package/types/mesgflow-ui-kit-progress.d.ts +32 -0
- package/types/mesgflow-ui-kit-radio.d.ts +59 -0
- package/types/mesgflow-ui-kit-rating.d.ts +56 -0
- package/types/mesgflow-ui-kit-scroll-area.d.ts +27 -0
- package/types/mesgflow-ui-kit-search-input.d.ts +72 -0
- package/types/mesgflow-ui-kit-segmented-control.d.ts +54 -0
- package/types/mesgflow-ui-kit-select.d.ts +89 -0
- package/types/mesgflow-ui-kit-sidebar.d.ts +224 -0
- package/types/mesgflow-ui-kit-skeleton.d.ts +29 -0
- package/types/mesgflow-ui-kit-slider.d.ts +40 -0
- package/types/mesgflow-ui-kit-spinner.d.ts +31 -0
- package/types/mesgflow-ui-kit-splitter.d.ts +40 -0
- package/types/mesgflow-ui-kit-stat-tile.d.ts +54 -0
- package/types/mesgflow-ui-kit-stepper.d.ts +48 -0
- package/types/mesgflow-ui-kit-switch.d.ts +34 -0
- package/types/mesgflow-ui-kit-table.d.ts +805 -0
- package/types/mesgflow-ui-kit-tabs.d.ts +269 -0
- package/types/mesgflow-ui-kit-tag-input.d.ts +33 -0
- package/types/mesgflow-ui-kit-theme-switcher.d.ts +27 -0
- package/types/mesgflow-ui-kit-theming.d.ts +745 -0
- package/types/mesgflow-ui-kit-time-picker.d.ts +54 -0
- package/types/mesgflow-ui-kit-timeline.d.ts +27 -0
- package/types/mesgflow-ui-kit-toast.d.ts +94 -0
- package/types/mesgflow-ui-kit-toggle.d.ts +110 -0
- package/types/mesgflow-ui-kit-toolbar.d.ts +52 -0
- package/types/mesgflow-ui-kit-tooltip.d.ts +55 -0
- package/types/mesgflow-ui-kit-tour.d.ts +66 -0
- package/types/mesgflow-ui-kit-tree-select.d.ts +65 -0
- package/types/mesgflow-ui-kit-tree.d.ts +44 -0
- 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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"}
|