@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,123 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, computed, Component } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Sadece semantic token'lar, keyfi renk yok — `tone` (sabit) veya `colorful`
|
|
6
|
+
* (isme göre) ile seçiliyor. Badge'teki gibi tonal işaret rol token'ı
|
|
7
|
+
* (`bg-X-tint text-X-tint-fg`, `color-mix()` tabanlı) — bkz.
|
|
8
|
+
* badge.variants.ts'teki gerekçe. `neutral` — marka rengiyle (primary)
|
|
9
|
+
* İLİŞKİSİZ bir kişi/varlık için (ör. "Sistem", "Silinmiş kullanıcı") —
|
|
10
|
+
* `MfTone`'un geri kalanıyla tutarlı, kit genelinde her `tone` ekseni
|
|
11
|
+
* `neutral`den başlar.
|
|
12
|
+
*/
|
|
13
|
+
const COLOR_CLASSES = {
|
|
14
|
+
neutral: 'bg-surface-alt text-fg-muted',
|
|
15
|
+
primary: 'bg-primary-tint text-primary-tint-fg',
|
|
16
|
+
success: 'bg-success-tint text-success-tint-fg',
|
|
17
|
+
warning: 'bg-warning-tint text-warning-tint-fg',
|
|
18
|
+
danger: 'bg-danger-tint text-danger-tint-fg',
|
|
19
|
+
info: 'bg-info-tint text-info-tint-fg',
|
|
20
|
+
help: 'bg-help-tint text-help-tint-fg',
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* `colorful` hash havuzu BİLEREK `help` HARİÇ eski 6 tonda sabit kalır —
|
|
24
|
+
* help yeni bir tondur, havuza eklenirse `hash % length` kayar ve önceden
|
|
25
|
+
* `colorful` ile atanmış isimlerin rengi DEĞİŞİR (bkz. plan "Deep Emerald &
|
|
26
|
+
* Slate v2" madde B — kırılma istenmiyor).
|
|
27
|
+
*/
|
|
28
|
+
const COLOR_PALETTE = ['neutral', 'primary', 'success', 'warning', 'danger', 'info'].map((tone) => COLOR_CLASSES[tone]);
|
|
29
|
+
function hashString(value) {
|
|
30
|
+
let hash = 0;
|
|
31
|
+
for (let i = 0; i < value.length; i++)
|
|
32
|
+
hash = (Math.imul(hash, 16777619) + value.charCodeAt(i)) >>> 0;
|
|
33
|
+
return hash;
|
|
34
|
+
}
|
|
35
|
+
class Avatar {
|
|
36
|
+
name = input.required(/* @ts-ignore */
|
|
37
|
+
...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
|
|
38
|
+
src = input(null, /* @ts-ignore */
|
|
39
|
+
...(ngDevMode ? [{ debugName: "src" }] : /* istanbul ignore next */ []));
|
|
40
|
+
size = input('md', /* @ts-ignore */
|
|
41
|
+
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
42
|
+
shape = input('round', /* @ts-ignore */
|
|
43
|
+
...(ngDevMode ? [{ debugName: "shape" }] : /* istanbul ignore next */ []));
|
|
44
|
+
/** Her isim için sabit, farklı bir renk (ör. tenant switcher listesi) — `tone` verilmişse yoksayılır. */
|
|
45
|
+
colorful = input(false, /* @ts-ignore */
|
|
46
|
+
...(ngDevMode ? [{ debugName: "colorful" }] : /* istanbul ignore next */ []));
|
|
47
|
+
/** İsimden bağımsız, hep AYNI sabit renk (ör. tek bir kullanıcının kendi profili) — `colorful`'dan öncelikli. */
|
|
48
|
+
tone = input(null, /* @ts-ignore */
|
|
49
|
+
...(ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []));
|
|
50
|
+
shapeClasses = computed(() => this.shape() === 'square' ? 'rounded-md' : 'rounded-full', /* @ts-ignore */
|
|
51
|
+
...(ngDevMode ? [{ debugName: "shapeClasses" }] : /* istanbul ignore next */ []));
|
|
52
|
+
colorClasses = computed(() => {
|
|
53
|
+
const tone = this.tone();
|
|
54
|
+
if (tone)
|
|
55
|
+
return COLOR_CLASSES[tone];
|
|
56
|
+
return this.colorful()
|
|
57
|
+
? COLOR_PALETTE[hashString(this.name()) % COLOR_PALETTE.length]
|
|
58
|
+
: COLOR_CLASSES.primary;
|
|
59
|
+
}, /* @ts-ignore */
|
|
60
|
+
...(ngDevMode ? [{ debugName: "colorClasses" }] : /* istanbul ignore next */ []));
|
|
61
|
+
initials = computed(() => {
|
|
62
|
+
const parts = this.name().trim().split(/\s+/).filter(Boolean);
|
|
63
|
+
if (parts.length === 0)
|
|
64
|
+
return '';
|
|
65
|
+
if (parts.length === 1)
|
|
66
|
+
return parts[0].slice(0, 2).toUpperCase();
|
|
67
|
+
return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();
|
|
68
|
+
}, /* @ts-ignore */
|
|
69
|
+
...(ngDevMode ? [{ debugName: "initials" }] : /* istanbul ignore next */ []));
|
|
70
|
+
sizeClasses = computed(() => ({ sm: 'h-7 w-7 text-xs', md: 'h-9 w-9 text-sm', lg: 'h-12 w-12 text-base' })[this.size()], /* @ts-ignore */
|
|
71
|
+
...(ngDevMode ? [{ debugName: "sizeClasses" }] : /* istanbul ignore next */ []));
|
|
72
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Avatar, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
73
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Avatar, isStandalone: true, selector: "mf-avatar", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, src: { classPropertyName: "src", publicName: "src", 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 }, colorful: { classPropertyName: "colorful", publicName: "colorful", isSignal: true, isRequired: false, transformFunction: null }, tone: { classPropertyName: "tone", publicName: "tone", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "inline-flex" }, ngImport: i0, template: `
|
|
74
|
+
@if (src(); as url) {
|
|
75
|
+
<img [src]="url" [alt]="name()" [class]="shapeClasses() + ' object-cover ' + sizeClasses()" />
|
|
76
|
+
} @else {
|
|
77
|
+
<span
|
|
78
|
+
[class]="
|
|
79
|
+
'inline-flex items-center justify-center ' +
|
|
80
|
+
shapeClasses() +
|
|
81
|
+
' font-medium ' +
|
|
82
|
+
colorClasses() +
|
|
83
|
+
' ' +
|
|
84
|
+
sizeClasses()
|
|
85
|
+
"
|
|
86
|
+
>
|
|
87
|
+
{{ initials() }}
|
|
88
|
+
</span>
|
|
89
|
+
}
|
|
90
|
+
`, isInline: true });
|
|
91
|
+
}
|
|
92
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Avatar, decorators: [{
|
|
93
|
+
type: Component,
|
|
94
|
+
args: [{
|
|
95
|
+
selector: 'mf-avatar',
|
|
96
|
+
host: { class: 'inline-flex' },
|
|
97
|
+
template: `
|
|
98
|
+
@if (src(); as url) {
|
|
99
|
+
<img [src]="url" [alt]="name()" [class]="shapeClasses() + ' object-cover ' + sizeClasses()" />
|
|
100
|
+
} @else {
|
|
101
|
+
<span
|
|
102
|
+
[class]="
|
|
103
|
+
'inline-flex items-center justify-center ' +
|
|
104
|
+
shapeClasses() +
|
|
105
|
+
' font-medium ' +
|
|
106
|
+
colorClasses() +
|
|
107
|
+
' ' +
|
|
108
|
+
sizeClasses()
|
|
109
|
+
"
|
|
110
|
+
>
|
|
111
|
+
{{ initials() }}
|
|
112
|
+
</span>
|
|
113
|
+
}
|
|
114
|
+
`,
|
|
115
|
+
}]
|
|
116
|
+
}], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], src: [{ type: i0.Input, args: [{ isSignal: true, alias: "src", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], shape: [{ type: i0.Input, args: [{ isSignal: true, alias: "shape", required: false }] }], colorful: [{ type: i0.Input, args: [{ isSignal: true, alias: "colorful", required: false }] }], tone: [{ type: i0.Input, args: [{ isSignal: true, alias: "tone", required: false }] }] } });
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Generated bundle index. Do not edit.
|
|
120
|
+
*/
|
|
121
|
+
|
|
122
|
+
export { Avatar };
|
|
123
|
+
//# sourceMappingURL=mesgflow-ui-kit-avatar.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesgflow-ui-kit-avatar.mjs","sources":["../../../projects/ui-kit/avatar/avatar.ts","../../../projects/ui-kit/avatar/mesgflow-ui-kit-avatar.ts"],"sourcesContent":["import { Component, computed, input } from '@angular/core';\r\nimport type { MfTone } from '@mesgflow/ui-kit/core';\r\n\r\nexport type AvatarTone = MfTone;\r\n\r\n/**\r\n * Sadece semantic token'lar, keyfi renk yok — `tone` (sabit) veya `colorful`\r\n * (isme göre) ile seçiliyor. Badge'teki gibi tonal işaret rol token'ı\r\n * (`bg-X-tint text-X-tint-fg`, `color-mix()` tabanlı) — bkz.\r\n * badge.variants.ts'teki gerekçe. `neutral` — marka rengiyle (primary)\r\n * İLİŞKİSİZ bir kişi/varlık için (ör. \"Sistem\", \"Silinmiş kullanıcı\") —\r\n * `MfTone`'un geri kalanıyla tutarlı, kit genelinde her `tone` ekseni\r\n * `neutral`den başlar.\r\n */\r\nconst COLOR_CLASSES: Record<AvatarTone, string> = {\r\n neutral: 'bg-surface-alt text-fg-muted',\r\n primary: 'bg-primary-tint text-primary-tint-fg',\r\n success: 'bg-success-tint text-success-tint-fg',\r\n warning: 'bg-warning-tint text-warning-tint-fg',\r\n danger: 'bg-danger-tint text-danger-tint-fg',\r\n info: 'bg-info-tint text-info-tint-fg',\r\n help: 'bg-help-tint text-help-tint-fg',\r\n};\r\n/**\r\n * `colorful` hash havuzu BİLEREK `help` HARİÇ eski 6 tonda sabit kalır —\r\n * help yeni bir tondur, havuza eklenirse `hash % length` kayar ve önceden\r\n * `colorful` ile atanmış isimlerin rengi DEĞİŞİR (bkz. plan \"Deep Emerald &\r\n * Slate v2\" madde B — kırılma istenmiyor).\r\n */\r\nconst COLOR_PALETTE = (\r\n ['neutral', 'primary', 'success', 'warning', 'danger', 'info'] as const satisfies AvatarTone[]\r\n).map((tone) => COLOR_CLASSES[tone]);\r\n\r\nfunction hashString(value: string): number {\r\n let hash = 0;\r\n for (let i = 0; i < value.length; i++)\r\n hash = (Math.imul(hash, 16777619) + value.charCodeAt(i)) >>> 0;\r\n return hash;\r\n}\r\n\r\n@Component({\r\n selector: 'mf-avatar',\r\n host: { class: 'inline-flex' },\r\n template: `\r\n @if (src(); as url) {\r\n <img [src]=\"url\" [alt]=\"name()\" [class]=\"shapeClasses() + ' object-cover ' + sizeClasses()\" />\r\n } @else {\r\n <span\r\n [class]=\"\r\n 'inline-flex items-center justify-center ' +\r\n shapeClasses() +\r\n ' font-medium ' +\r\n colorClasses() +\r\n ' ' +\r\n sizeClasses()\r\n \"\r\n >\r\n {{ initials() }}\r\n </span>\r\n }\r\n `,\r\n})\r\nexport class Avatar {\r\n readonly name = input.required<string>();\r\n readonly src = input<string | null>(null);\r\n readonly size = input<'sm' | 'md' | 'lg'>('md');\r\n readonly shape = input<'round' | 'square'>('round');\r\n /** Her isim için sabit, farklı bir renk (ör. tenant switcher listesi) — `tone` verilmişse yoksayılır. */\r\n readonly colorful = input(false);\r\n /** İsimden bağımsız, hep AYNI sabit renk (ör. tek bir kullanıcının kendi profili) — `colorful`'dan öncelikli. */\r\n readonly tone = input<AvatarTone | null>(null);\r\n\r\n protected readonly shapeClasses = computed(() =>\r\n this.shape() === 'square' ? 'rounded-md' : 'rounded-full',\r\n );\r\n\r\n protected readonly colorClasses = computed(() => {\r\n const tone = this.tone();\r\n if (tone) return COLOR_CLASSES[tone];\r\n return this.colorful()\r\n ? COLOR_PALETTE[hashString(this.name()) % COLOR_PALETTE.length]\r\n : COLOR_CLASSES.primary;\r\n });\r\n\r\n protected readonly initials = computed(() => {\r\n const parts = this.name().trim().split(/\\s+/).filter(Boolean);\r\n if (parts.length === 0) return '';\r\n if (parts.length === 1) return parts[0]!.slice(0, 2).toUpperCase();\r\n return (parts[0]![0] + parts[parts.length - 1]![0]).toUpperCase();\r\n });\r\n\r\n protected readonly sizeClasses = computed(\r\n () =>\r\n ({ sm: 'h-7 w-7 text-xs', md: 'h-9 w-9 text-sm', lg: 'h-12 w-12 text-base' })[this.size()],\r\n );\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAKA;;;;;;;;AAQG;AACH,MAAM,aAAa,GAA+B;AAChD,IAAA,OAAO,EAAE,8BAA8B;AACvC,IAAA,OAAO,EAAE,sCAAsC;AAC/C,IAAA,OAAO,EAAE,sCAAsC;AAC/C,IAAA,OAAO,EAAE,sCAAsC;AAC/C,IAAA,MAAM,EAAE,oCAAoC;AAC5C,IAAA,IAAI,EAAE,gCAAgC;AACtC,IAAA,IAAI,EAAE,gCAAgC;CACvC;AACD;;;;;AAKG;AACH,MAAM,aAAa,GACjB,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAC9D,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI,CAAC,CAAC;AAEpC,SAAS,UAAU,CAAC,KAAa,EAAA;IAC/B,IAAI,IAAI,GAAG,CAAC;AACZ,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;QACnC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;AAChE,IAAA,OAAO,IAAI;AACb;MAwBa,MAAM,CAAA;IACR,IAAI,GAAG,KAAK,CAAC,QAAQ;6EAAU;IAC/B,GAAG,GAAG,KAAK,CAAgB,IAAI;4EAAC;IAChC,IAAI,GAAG,KAAK,CAAqB,IAAI;6EAAC;IACtC,KAAK,GAAG,KAAK,CAAqB,OAAO;8EAAC;;IAE1C,QAAQ,GAAG,KAAK,CAAC,KAAK;iFAAC;;IAEvB,IAAI,GAAG,KAAK,CAAoB,IAAI;6EAAC;AAE3B,IAAA,YAAY,GAAG,QAAQ,CAAC,MACzC,IAAI,CAAC,KAAK,EAAE,KAAK,QAAQ,GAAG,YAAY,GAAG,cAAc;qFAC1D;AAEkB,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AAC9C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,QAAA,IAAI,IAAI;AAAE,YAAA,OAAO,aAAa,CAAC,IAAI,CAAC;QACpC,OAAO,IAAI,CAAC,QAAQ;AAClB,cAAE,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM;AAC9D,cAAE,aAAa,CAAC,OAAO;IAC3B,CAAC;qFAAC;AAEiB,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAC1C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AAC7D,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;AACjC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE;QAClE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE;IACnE,CAAC;iFAAC;IAEiB,WAAW,GAAG,QAAQ,CACvC,MACE,CAAC,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,qBAAqB,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;oFAC7F;uGAhCU,MAAM,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAN,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAM,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAnBP,CAAA;;;;;;;;;;;;;;;;;AAiBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAEU,MAAM,EAAA,UAAA,EAAA,CAAA;kBAtBlB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,WAAW;AACrB,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE;AAC9B,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;;;;;;AAiBT,EAAA,CAAA;AACF,iBAAA;;;AC7DD;;AAEG;;"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, computed, Directive } from '@angular/core';
|
|
3
|
+
import { cn } from '@mesgflow/ui-kit/core';
|
|
4
|
+
import { cva } from 'class-variance-authority';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Kullanıcının beğendiği bir Artifact'teki `.pill` deseni birebir uyarlandı:
|
|
8
|
+
* mono + büyük harf + geniş harf aralığı + `currentColor` nokta göstergesi
|
|
9
|
+
* (`before:`). Bu bileşenin kendisi bu tazelemenin imza motiflerinden biri
|
|
10
|
+
* ("mono mikro-etiket") — `text-eyebrow` token'ı (tokens/typography.css)
|
|
11
|
+
* TAM OLARAK bu dili konuşmak için var (kalın ağırlık + geniş tracking bir
|
|
12
|
+
* arada); font-weight/letter-spacing'i elle tekrar YAZMAK yerine doğrudan
|
|
13
|
+
* o token kullanılıyor (bkz. plan Faz 1d — sm/md artık FONT BOYUTUNDA değil,
|
|
14
|
+
* sadece dolguda ayrışıyor, ikisi de aynı mikro-etiket ölçeğini paylaşıyor).
|
|
15
|
+
*
|
|
16
|
+
* Renkli tonlar rol token'ı `bg-X-tint text-X-tint-fg` kullanır — spec'in
|
|
17
|
+
* "Soft Tinting" tekniği: `color-mix()` ile rampanın kendi basamağının %12
|
|
18
|
+
* alfası (light çapa 600, dark çapa 400), metin rampanın 800/400 basamağı.
|
|
19
|
+
* Rozet her türlü zeminin (kart, tablo satırı, toolbar) üstüne oturabiliyor —
|
|
20
|
+
* `color-mix` her zeminde AYRI karışıp `check:contrast`'ta dört yüzeyde de
|
|
21
|
+
* doğrulanıyor (bkz. projects/ui-kit/README.md "Token mimarisi").
|
|
22
|
+
*/
|
|
23
|
+
const badgeVariants = cva('inline-flex items-center gap-1.5 rounded-full font-mono text-eyebrow uppercase ' +
|
|
24
|
+
"before:block before:h-1.5 before:w-1.5 before:shrink-0 before:rounded-full before:bg-current before:content-['']", {
|
|
25
|
+
variants: {
|
|
26
|
+
tone: {
|
|
27
|
+
neutral: 'bg-surface-alt text-fg-muted',
|
|
28
|
+
primary: 'bg-primary-tint text-primary-tint-fg',
|
|
29
|
+
success: 'bg-success-tint text-success-tint-fg',
|
|
30
|
+
warning: 'bg-warning-tint text-warning-tint-fg',
|
|
31
|
+
danger: 'bg-danger-tint text-danger-tint-fg',
|
|
32
|
+
info: 'bg-info-tint text-info-tint-fg',
|
|
33
|
+
help: 'bg-help-tint text-help-tint-fg',
|
|
34
|
+
},
|
|
35
|
+
/** `md` öncekiyle (tek boyutlu dönem) BİREBİR aynı dolgu — `sm` tablo hücresi/chip gibi sık dizilen bağlamlar için. */
|
|
36
|
+
size: {
|
|
37
|
+
sm: 'py-0.5 pe-2 ps-1.5',
|
|
38
|
+
md: 'py-1 pe-2.5 ps-2',
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
defaultVariants: { tone: 'neutral', size: 'md' },
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
/** `<span mfBadge tone="success">Aktif</span>` */
|
|
45
|
+
class Badge {
|
|
46
|
+
tone = input('neutral', /* @ts-ignore */
|
|
47
|
+
...(ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []));
|
|
48
|
+
size = input('md', /* @ts-ignore */
|
|
49
|
+
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
50
|
+
classes = computed(() => cn(badgeVariants({ tone: this.tone(), size: this.size() })), /* @ts-ignore */
|
|
51
|
+
...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
52
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Badge, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
53
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: Badge, isStandalone: true, selector: "span[mfBadge]", inputs: { tone: { classPropertyName: "tone", publicName: "tone", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0 });
|
|
54
|
+
}
|
|
55
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Badge, decorators: [{
|
|
56
|
+
type: Directive,
|
|
57
|
+
args: [{
|
|
58
|
+
selector: 'span[mfBadge]',
|
|
59
|
+
host: { '[class]': 'classes()' },
|
|
60
|
+
}]
|
|
61
|
+
}], propDecorators: { tone: [{ type: i0.Input, args: [{ isSignal: true, alias: "tone", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Generated bundle index. Do not edit.
|
|
65
|
+
*/
|
|
66
|
+
|
|
67
|
+
export { Badge, badgeVariants };
|
|
68
|
+
//# sourceMappingURL=mesgflow-ui-kit-badge.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesgflow-ui-kit-badge.mjs","sources":["../../../projects/ui-kit/badge/badge.variants.ts","../../../projects/ui-kit/badge/badge.ts","../../../projects/ui-kit/badge/mesgflow-ui-kit-badge.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\r\n\r\n/**\r\n * Kullanıcının beğendiği bir Artifact'teki `.pill` deseni birebir uyarlandı:\r\n * mono + büyük harf + geniş harf aralığı + `currentColor` nokta göstergesi\r\n * (`before:`). Bu bileşenin kendisi bu tazelemenin imza motiflerinden biri\r\n * (\"mono mikro-etiket\") — `text-eyebrow` token'ı (tokens/typography.css)\r\n * TAM OLARAK bu dili konuşmak için var (kalın ağırlık + geniş tracking bir\r\n * arada); font-weight/letter-spacing'i elle tekrar YAZMAK yerine doğrudan\r\n * o token kullanılıyor (bkz. plan Faz 1d — sm/md artık FONT BOYUTUNDA değil,\r\n * sadece dolguda ayrışıyor, ikisi de aynı mikro-etiket ölçeğini paylaşıyor).\r\n *\r\n * Renkli tonlar rol token'ı `bg-X-tint text-X-tint-fg` kullanır — spec'in\r\n * \"Soft Tinting\" tekniği: `color-mix()` ile rampanın kendi basamağının %12\r\n * alfası (light çapa 600, dark çapa 400), metin rampanın 800/400 basamağı.\r\n * Rozet her türlü zeminin (kart, tablo satırı, toolbar) üstüne oturabiliyor —\r\n * `color-mix` her zeminde AYRI karışıp `check:contrast`'ta dört yüzeyde de\r\n * doğrulanıyor (bkz. projects/ui-kit/README.md \"Token mimarisi\").\r\n */\r\nexport const badgeVariants = cva(\r\n 'inline-flex items-center gap-1.5 rounded-full font-mono text-eyebrow uppercase ' +\r\n \"before:block before:h-1.5 before:w-1.5 before:shrink-0 before:rounded-full before:bg-current before:content-['']\",\r\n {\r\n variants: {\r\n tone: {\r\n neutral: 'bg-surface-alt text-fg-muted',\r\n primary: 'bg-primary-tint text-primary-tint-fg',\r\n success: 'bg-success-tint text-success-tint-fg',\r\n warning: 'bg-warning-tint text-warning-tint-fg',\r\n danger: 'bg-danger-tint text-danger-tint-fg',\r\n info: 'bg-info-tint text-info-tint-fg',\r\n help: 'bg-help-tint text-help-tint-fg',\r\n },\r\n /** `md` öncekiyle (tek boyutlu dönem) BİREBİR aynı dolgu — `sm` tablo hücresi/chip gibi sık dizilen bağlamlar için. */\r\n size: {\r\n sm: 'py-0.5 pe-2 ps-1.5',\r\n md: 'py-1 pe-2.5 ps-2',\r\n },\r\n },\r\n defaultVariants: { tone: 'neutral', size: 'md' },\r\n },\r\n);\r\n\r\nexport type BadgeTone = VariantProps<typeof badgeVariants>['tone'];\r\nexport type BadgeSize = VariantProps<typeof badgeVariants>['size'];\r\n","import { Directive, computed, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\nimport { badgeVariants, type BadgeSize, type BadgeTone } from './badge.variants';\r\n\r\n/** `<span mfBadge tone=\"success\">Aktif</span>` */\r\n@Directive({\r\n selector: 'span[mfBadge]',\r\n host: { '[class]': 'classes()' },\r\n})\r\nexport class Badge {\r\n readonly tone = input<BadgeTone>('neutral');\r\n readonly size = input<BadgeSize>('md');\r\n protected readonly classes = computed(() =>\r\n cn(badgeVariants({ tone: this.tone(), size: this.size() })),\r\n );\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAEA;;;;;;;;;;;;;;;;AAgBG;AACI,MAAM,aAAa,GAAG,GAAG,CAC9B,iFAAiF;AAC/E,IAAA,kHAAkH,EACpH;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,OAAO,EAAE,8BAA8B;AACvC,YAAA,OAAO,EAAE,sCAAsC;AAC/C,YAAA,OAAO,EAAE,sCAAsC;AAC/C,YAAA,OAAO,EAAE,sCAAsC;AAC/C,YAAA,MAAM,EAAE,oCAAoC;AAC5C,YAAA,IAAI,EAAE,gCAAgC;AACtC,YAAA,IAAI,EAAE,gCAAgC;AACvC,SAAA;;AAED,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,oBAAoB;AACxB,YAAA,EAAE,EAAE,kBAAkB;AACvB,SAAA;AACF,KAAA;IACD,eAAe,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;AACjD,CAAA;;ACpCH;MAKa,KAAK,CAAA;IACP,IAAI,GAAG,KAAK,CAAY,SAAS;6EAAC;IAClC,IAAI,GAAG,KAAK,CAAY,IAAI;6EAAC;IACnB,OAAO,GAAG,QAAQ,CAAC,MACpC,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gFAC5D;uGALU,KAAK,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAL,KAAK,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAL,KAAK,EAAA,UAAA,EAAA,CAAA;kBAJjB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,IAAI,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE;AACjC,iBAAA;;;ACRD;;AAEG;;"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, booleanAttribute, model, output, inject, computed, afterNextRender, Component } from '@angular/core';
|
|
3
|
+
import { MF_ALERT_LABELS, cn } from '@mesgflow/ui-kit/core';
|
|
4
|
+
import { Icon } from '@mesgflow/ui-kit/icon';
|
|
5
|
+
|
|
6
|
+
const TINT = {
|
|
7
|
+
neutral: 'border-border bg-surface-alt text-fg',
|
|
8
|
+
primary: 'border-accent/30 bg-primary-tint text-primary-tint-fg',
|
|
9
|
+
success: 'border-success/30 bg-success-tint text-success-tint-fg',
|
|
10
|
+
warning: 'border-warning/30 bg-warning-tint text-warning-tint-fg',
|
|
11
|
+
danger: 'border-danger/30 bg-danger-tint text-danger-tint-fg',
|
|
12
|
+
info: 'border-info/30 bg-info-tint text-info-tint-fg',
|
|
13
|
+
help: 'border-help/30 bg-help-tint text-help-tint-fg',
|
|
14
|
+
};
|
|
15
|
+
/** Dolu zemin/ön plan çiftleri `check:contrast`'ta doğrulanır (fill + fill-fg). */
|
|
16
|
+
const FILL = {
|
|
17
|
+
neutral: 'border-transparent bg-neutral-fill text-neutral-fill-fg',
|
|
18
|
+
primary: 'border-transparent bg-accent-fill text-fg-on-accent',
|
|
19
|
+
success: 'border-transparent bg-success-fill text-success-fill-fg',
|
|
20
|
+
warning: 'border-transparent bg-warning-fill text-warning-fill-fg',
|
|
21
|
+
danger: 'border-transparent bg-danger-fill text-danger-fill-fg',
|
|
22
|
+
info: 'border-transparent bg-info-fill text-info-fill-fg',
|
|
23
|
+
help: 'border-transparent bg-help-fill text-help-fill-fg',
|
|
24
|
+
};
|
|
25
|
+
const STORAGE_PREFIX = 'mf-banner-dismissed:';
|
|
26
|
+
/**
|
|
27
|
+
* `<mf-banner tone="primary" appearance="fill" icon="campaign" dismissible dismissKey="v0.5">
|
|
28
|
+
* Yeni sürüm yayında. <a href="/changelog">Neler değişti?</a>
|
|
29
|
+
* <button mfButton size="sm" action>Güncelle</button>
|
|
30
|
+
* </mf-banner>`
|
|
31
|
+
*
|
|
32
|
+
* Sayfanın/bölümün üst kenarında tam genişlik duyuru şeridi — `Alert`'ten farkı: kart değil
|
|
33
|
+
* kenardan kenara şerit, alt kenarlık; `fill` görünümü marka/durum rengiyle dolu. İçerideki
|
|
34
|
+
* bağlantılar metin rengini devralır ve altı çizilir (dolu zeminde `mfLink`'in marka rengi
|
|
35
|
+
* kontrastı bozardı). Eylem düğmesi `[action]` slotuna.
|
|
36
|
+
*
|
|
37
|
+
* `dismissKey` verilirse kapatma bu tarayıcıda hatırlanır (`localStorage`) — duyuru bir daha
|
|
38
|
+
* gösterilmez; depolama erişilemezse (gizli pencere) sessizce yalnızca oturumluk kapanır.
|
|
39
|
+
* Varsayılan olarak `role` YOK (statik duyuru); sonradan beliren, duyurulması gereken bir
|
|
40
|
+
* şerit için `announce` → `role="status"`.
|
|
41
|
+
*/
|
|
42
|
+
class Banner {
|
|
43
|
+
tone = input('primary', /* @ts-ignore */
|
|
44
|
+
...(ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []));
|
|
45
|
+
appearance = input('tint', /* @ts-ignore */
|
|
46
|
+
...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
|
|
47
|
+
icon = input(null, /* @ts-ignore */
|
|
48
|
+
...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
|
|
49
|
+
align = input('start', /* @ts-ignore */
|
|
50
|
+
...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
|
|
51
|
+
dismissible = input(false, { ...(ngDevMode ? { debugName: "dismissible" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
52
|
+
/** Kalıcı kapatma anahtarı — değiştirmek (ör. sürüm) duyuruyu yeniden gösterir. */
|
|
53
|
+
dismissKey = input(/* @ts-ignore */
|
|
54
|
+
...(ngDevMode ? [undefined, { debugName: "dismissKey" }] : /* istanbul ignore next */ []));
|
|
55
|
+
announce = input(false, { ...(ngDevMode ? { debugName: "announce" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
56
|
+
open = model(true, /* @ts-ignore */
|
|
57
|
+
...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
|
|
58
|
+
dismissed = output();
|
|
59
|
+
labels = inject(MF_ALERT_LABELS);
|
|
60
|
+
hostClasses = computed(() => cn('block border-b text-sm [&_a]:font-medium [&_a]:text-current [&_a]:underline [&_a]:underline-offset-2', this.appearance() === 'fill' ? FILL[this.tone()] : TINT[this.tone()],
|
|
61
|
+
// [hidden] değil: `block` sınıfı UA'nın display:none'unu ezerdi.
|
|
62
|
+
!this.open() && 'hidden'), /* @ts-ignore */
|
|
63
|
+
...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
|
|
64
|
+
constructor() {
|
|
65
|
+
// Tarayıcıda, ilk çizimden sonra — SSR'de depolama yok.
|
|
66
|
+
afterNextRender(() => {
|
|
67
|
+
const key = this.dismissKey();
|
|
68
|
+
if (key && readDismissed(key))
|
|
69
|
+
this.open.set(false);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
dismiss() {
|
|
73
|
+
const key = this.dismissKey();
|
|
74
|
+
if (key)
|
|
75
|
+
writeDismissed(key);
|
|
76
|
+
this.open.set(false);
|
|
77
|
+
this.dismissed.emit();
|
|
78
|
+
}
|
|
79
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Banner, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
80
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Banner, isStandalone: true, selector: "mf-banner", inputs: { tone: { classPropertyName: "tone", publicName: "tone", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, dismissible: { classPropertyName: "dismissible", publicName: "dismissible", isSignal: true, isRequired: false, transformFunction: null }, dismissKey: { classPropertyName: "dismissKey", publicName: "dismissKey", isSignal: true, isRequired: false, transformFunction: null }, announce: { classPropertyName: "announce", publicName: "announce", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", dismissed: "dismissed" }, host: { properties: { "class": "hostClasses()", "attr.role": "announce() ? 'status' : null" } }, exportAs: ["mfBanner"], ngImport: i0, template: "<div\r\n class=\"mx-auto flex min-h-11 flex-wrap items-center gap-x-3 gap-y-2 px-4 py-2\"\r\n [class.justify-center]=\"align() === 'center'\"\r\n>\r\n @if (icon()) {\r\n <span mfIcon [size]=\"18\" class=\"shrink-0\">{{ icon() }}</span>\r\n }\r\n <div\r\n class=\"min-w-0\"\r\n [class.flex-1]=\"align() === 'start'\"\r\n [class.text-center]=\"align() === 'center'\"\r\n >\r\n <ng-content />\r\n </div>\r\n <ng-content select=\"[action]\" />\r\n @if (dismissible()) {\r\n <button\r\n type=\"button\"\r\n class=\"-me-2 inline-flex size-8 shrink-0 cursor-pointer appearance-none items-center justify-center rounded-md border-0 bg-transparent text-current transition-colors duration-fast ease-emphasis hover:bg-current/10 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-current\"\r\n [attr.aria-label]=\"labels().dismiss\"\r\n (click)=\"dismiss()\"\r\n >\r\n <span mfIcon [size]=\"18\">close</span>\r\n </button>\r\n }\r\n</div>\r\n", dependencies: [{ kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }] });
|
|
81
|
+
}
|
|
82
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Banner, decorators: [{
|
|
83
|
+
type: Component,
|
|
84
|
+
args: [{ selector: 'mf-banner', exportAs: 'mfBanner', imports: [Icon], host: {
|
|
85
|
+
'[class]': 'hostClasses()',
|
|
86
|
+
'[attr.role]': "announce() ? 'status' : null",
|
|
87
|
+
}, template: "<div\r\n class=\"mx-auto flex min-h-11 flex-wrap items-center gap-x-3 gap-y-2 px-4 py-2\"\r\n [class.justify-center]=\"align() === 'center'\"\r\n>\r\n @if (icon()) {\r\n <span mfIcon [size]=\"18\" class=\"shrink-0\">{{ icon() }}</span>\r\n }\r\n <div\r\n class=\"min-w-0\"\r\n [class.flex-1]=\"align() === 'start'\"\r\n [class.text-center]=\"align() === 'center'\"\r\n >\r\n <ng-content />\r\n </div>\r\n <ng-content select=\"[action]\" />\r\n @if (dismissible()) {\r\n <button\r\n type=\"button\"\r\n class=\"-me-2 inline-flex size-8 shrink-0 cursor-pointer appearance-none items-center justify-center rounded-md border-0 bg-transparent text-current transition-colors duration-fast ease-emphasis hover:bg-current/10 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-current\"\r\n [attr.aria-label]=\"labels().dismiss\"\r\n (click)=\"dismiss()\"\r\n >\r\n <span mfIcon [size]=\"18\">close</span>\r\n </button>\r\n }\r\n</div>\r\n" }]
|
|
88
|
+
}], ctorParameters: () => [], propDecorators: { tone: [{ type: i0.Input, args: [{ isSignal: true, alias: "tone", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], dismissible: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissible", required: false }] }], dismissKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissKey", required: false }] }], announce: [{ type: i0.Input, args: [{ isSignal: true, alias: "announce", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], dismissed: [{ type: i0.Output, args: ["dismissed"] }] } });
|
|
89
|
+
function readDismissed(key) {
|
|
90
|
+
try {
|
|
91
|
+
return localStorage.getItem(STORAGE_PREFIX + key) === '1';
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function writeDismissed(key) {
|
|
98
|
+
try {
|
|
99
|
+
localStorage.setItem(STORAGE_PREFIX + key, '1');
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// Gizli pencere / engellenmiş depolama — yalnızca bu oturumda kapanır.
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Generated bundle index. Do not edit.
|
|
108
|
+
*/
|
|
109
|
+
|
|
110
|
+
export { Banner };
|
|
111
|
+
//# sourceMappingURL=mesgflow-ui-kit-banner.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesgflow-ui-kit-banner.mjs","sources":["../../../projects/ui-kit/banner/banner.ts","../../../projects/ui-kit/banner/banner.html","../../../projects/ui-kit/banner/mesgflow-ui-kit-banner.ts"],"sourcesContent":["import {\r\n Component,\r\n afterNextRender,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n input,\r\n model,\r\n output,\r\n} from '@angular/core';\r\nimport { MF_ALERT_LABELS, cn, type MfTone } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\n\r\nexport type BannerAppearance = 'tint' | 'fill';\r\n\r\nconst TINT: Record<MfTone, string> = {\r\n neutral: 'border-border bg-surface-alt text-fg',\r\n primary: 'border-accent/30 bg-primary-tint text-primary-tint-fg',\r\n success: 'border-success/30 bg-success-tint text-success-tint-fg',\r\n warning: 'border-warning/30 bg-warning-tint text-warning-tint-fg',\r\n danger: 'border-danger/30 bg-danger-tint text-danger-tint-fg',\r\n info: 'border-info/30 bg-info-tint text-info-tint-fg',\r\n help: 'border-help/30 bg-help-tint text-help-tint-fg',\r\n};\r\n\r\n/** Dolu zemin/ön plan çiftleri `check:contrast`'ta doğrulanır (fill + fill-fg). */\r\nconst FILL: Record<MfTone, string> = {\r\n neutral: 'border-transparent bg-neutral-fill text-neutral-fill-fg',\r\n primary: 'border-transparent bg-accent-fill text-fg-on-accent',\r\n success: 'border-transparent bg-success-fill text-success-fill-fg',\r\n warning: 'border-transparent bg-warning-fill text-warning-fill-fg',\r\n danger: 'border-transparent bg-danger-fill text-danger-fill-fg',\r\n info: 'border-transparent bg-info-fill text-info-fill-fg',\r\n help: 'border-transparent bg-help-fill text-help-fill-fg',\r\n};\r\n\r\nconst STORAGE_PREFIX = 'mf-banner-dismissed:';\r\n\r\n/**\r\n * `<mf-banner tone=\"primary\" appearance=\"fill\" icon=\"campaign\" dismissible dismissKey=\"v0.5\">\r\n * Yeni sürüm yayında. <a href=\"/changelog\">Neler değişti?</a>\r\n * <button mfButton size=\"sm\" action>Güncelle</button>\r\n * </mf-banner>`\r\n *\r\n * Sayfanın/bölümün üst kenarında tam genişlik duyuru şeridi — `Alert`'ten farkı: kart değil\r\n * kenardan kenara şerit, alt kenarlık; `fill` görünümü marka/durum rengiyle dolu. İçerideki\r\n * bağlantılar metin rengini devralır ve altı çizilir (dolu zeminde `mfLink`'in marka rengi\r\n * kontrastı bozardı). Eylem düğmesi `[action]` slotuna.\r\n *\r\n * `dismissKey` verilirse kapatma bu tarayıcıda hatırlanır (`localStorage`) — duyuru bir daha\r\n * gösterilmez; depolama erişilemezse (gizli pencere) sessizce yalnızca oturumluk kapanır.\r\n * Varsayılan olarak `role` YOK (statik duyuru); sonradan beliren, duyurulması gereken bir\r\n * şerit için `announce` → `role=\"status\"`.\r\n */\r\n@Component({\r\n selector: 'mf-banner',\r\n exportAs: 'mfBanner',\r\n imports: [Icon],\r\n host: {\r\n '[class]': 'hostClasses()',\r\n '[attr.role]': \"announce() ? 'status' : null\",\r\n },\r\n templateUrl: './banner.html',\r\n})\r\nexport class Banner {\r\n readonly tone = input<MfTone>('primary');\r\n readonly appearance = input<BannerAppearance>('tint');\r\n readonly icon = input<string | null>(null);\r\n readonly align = input<'start' | 'center'>('start');\r\n readonly dismissible = input(false, { transform: booleanAttribute });\r\n /** Kalıcı kapatma anahtarı — değiştirmek (ör. sürüm) duyuruyu yeniden gösterir. */\r\n readonly dismissKey = input<string>();\r\n readonly announce = input(false, { transform: booleanAttribute });\r\n readonly open = model(true);\r\n\r\n readonly dismissed = output<void>();\r\n\r\n protected readonly labels = inject(MF_ALERT_LABELS);\r\n\r\n protected readonly hostClasses = computed(() =>\r\n cn(\r\n 'block border-b text-sm [&_a]:font-medium [&_a]:text-current [&_a]:underline [&_a]:underline-offset-2',\r\n this.appearance() === 'fill' ? FILL[this.tone()] : TINT[this.tone()],\r\n // [hidden] değil: `block` sınıfı UA'nın display:none'unu ezerdi.\r\n !this.open() && 'hidden',\r\n ),\r\n );\r\n\r\n constructor() {\r\n // Tarayıcıda, ilk çizimden sonra — SSR'de depolama yok.\r\n afterNextRender(() => {\r\n const key = this.dismissKey();\r\n if (key && readDismissed(key)) this.open.set(false);\r\n });\r\n }\r\n\r\n protected dismiss(): void {\r\n const key = this.dismissKey();\r\n if (key) writeDismissed(key);\r\n this.open.set(false);\r\n this.dismissed.emit();\r\n }\r\n}\r\n\r\nfunction readDismissed(key: string): boolean {\r\n try {\r\n return localStorage.getItem(STORAGE_PREFIX + key) === '1';\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nfunction writeDismissed(key: string): void {\r\n try {\r\n localStorage.setItem(STORAGE_PREFIX + key, '1');\r\n } catch {\r\n // Gizli pencere / engellenmiş depolama — yalnızca bu oturumda kapanır.\r\n }\r\n}\r\n","<div\r\n class=\"mx-auto flex min-h-11 flex-wrap items-center gap-x-3 gap-y-2 px-4 py-2\"\r\n [class.justify-center]=\"align() === 'center'\"\r\n>\r\n @if (icon()) {\r\n <span mfIcon [size]=\"18\" class=\"shrink-0\">{{ icon() }}</span>\r\n }\r\n <div\r\n class=\"min-w-0\"\r\n [class.flex-1]=\"align() === 'start'\"\r\n [class.text-center]=\"align() === 'center'\"\r\n >\r\n <ng-content />\r\n </div>\r\n <ng-content select=\"[action]\" />\r\n @if (dismissible()) {\r\n <button\r\n type=\"button\"\r\n class=\"-me-2 inline-flex size-8 shrink-0 cursor-pointer appearance-none items-center justify-center rounded-md border-0 bg-transparent text-current transition-colors duration-fast ease-emphasis hover:bg-current/10 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-current\"\r\n [attr.aria-label]=\"labels().dismiss\"\r\n (click)=\"dismiss()\"\r\n >\r\n <span mfIcon [size]=\"18\">close</span>\r\n </button>\r\n }\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { model, input, signal, inject, computed, forwardRef, Component } from '@angular/core';
|
|
3
|
+
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
|
+
import { ValueAccessorBase, MF_BOX_INPUT_LABELS } from '@mesgflow/ui-kit/core';
|
|
5
|
+
import { Icon } from '@mesgflow/ui-kit/icon';
|
|
6
|
+
import { NumberInput } from '@mesgflow/ui-kit/number-input';
|
|
7
|
+
|
|
8
|
+
const SIDES = ['top', 'right', 'bottom', 'left'];
|
|
9
|
+
/**
|
|
10
|
+
* `<mf-box-input [(value)]="padding" unit="px" />` — 4 kenar (padding/
|
|
11
|
+
* margin/border) kutu-model girdisi. Bağlantılı mod (varsayılan AÇIK): tek
|
|
12
|
+
* input değiştirmek dördünü BİRDEN değiştirir — zincir ikonuna tıklayınca
|
|
13
|
+
* kenarlar bağımsızlaşır (kenarı ayırırken mevcut `top` değeri dördüne
|
|
14
|
+
* BASILMAZ — sadece tekrar bağlarken senkronlanır). `NumberInput` üstüne
|
|
15
|
+
* kompoze edilmiş bir COMPONENT (gerçek iç yapı — bkz. README "Directive mi,
|
|
16
|
+
* component mi?").
|
|
17
|
+
*/
|
|
18
|
+
class BoxInput extends ValueAccessorBase {
|
|
19
|
+
value = model({ top: 0, right: 0, bottom: 0, left: 0 }, /* @ts-ignore */
|
|
20
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
21
|
+
unit = input('px', /* @ts-ignore */
|
|
22
|
+
...(ngDevMode ? [{ debugName: "unit" }] : /* istanbul ignore next */ []));
|
|
23
|
+
min = input(0, /* @ts-ignore */
|
|
24
|
+
...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
|
|
25
|
+
max = input(null, /* @ts-ignore */
|
|
26
|
+
...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
|
|
27
|
+
disabled = input(false, /* @ts-ignore */
|
|
28
|
+
...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
|
|
29
|
+
linked = signal(true, /* @ts-ignore */
|
|
30
|
+
...(ngDevMode ? [{ debugName: "linked" }] : /* istanbul ignore next */ []));
|
|
31
|
+
sides = SIDES;
|
|
32
|
+
boxInputLabels = inject(MF_BOX_INPUT_LABELS);
|
|
33
|
+
sideLabels = computed(() => {
|
|
34
|
+
const labels = this.boxInputLabels();
|
|
35
|
+
return { top: labels.top, right: labels.right, bottom: labels.bottom, left: labels.left };
|
|
36
|
+
}, /* @ts-ignore */
|
|
37
|
+
...(ngDevMode ? [{ debugName: "sideLabels" }] : /* istanbul ignore next */ []));
|
|
38
|
+
linkToggleTitle = computed(() => this.linked() ? this.boxInputLabels().unlinkSides : this.boxInputLabels().linkSides, /* @ts-ignore */
|
|
39
|
+
...(ngDevMode ? [{ debugName: "linkToggleTitle" }] : /* istanbul ignore next */ []));
|
|
40
|
+
writeValue(value) {
|
|
41
|
+
this.value.set(value);
|
|
42
|
+
}
|
|
43
|
+
sideValue(side) {
|
|
44
|
+
return this.value()[side];
|
|
45
|
+
}
|
|
46
|
+
setSide(side, next) {
|
|
47
|
+
const n = next ?? 0;
|
|
48
|
+
if (this.linked()) {
|
|
49
|
+
this.value.set({ top: n, right: n, bottom: n, left: n });
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
this.value.update((v) => ({ ...v, [side]: n }));
|
|
53
|
+
}
|
|
54
|
+
this.onChange(this.value());
|
|
55
|
+
this.onTouched();
|
|
56
|
+
}
|
|
57
|
+
toggleLinked() {
|
|
58
|
+
this.linked.update((v) => !v);
|
|
59
|
+
if (this.linked()) {
|
|
60
|
+
const t = this.value().top;
|
|
61
|
+
this.value.set({ top: t, right: t, bottom: t, left: t });
|
|
62
|
+
this.onChange(this.value());
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: BoxInput, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
66
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: BoxInput, isStandalone: true, selector: "mf-box-input", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, unit: { classPropertyName: "unit", publicName: "unit", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { classAttribute: "block" }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => BoxInput), multi: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"inline-flex items-end gap-1.5\">\r\n @for (side of sides; track side) {\r\n <div class=\"flex flex-col items-center gap-1\">\r\n <span class=\"text-xs text-fg-subtle\">{{ sideLabels()[side] }}</span>\r\n <mf-number-input\r\n class=\"w-20\"\r\n [value]=\"sideValue(side)\"\r\n (valueChange)=\"setSide(side, $event)\"\r\n [min]=\"min()\"\r\n [max]=\"max()\"\r\n [unit]=\"unit()\"\r\n [ariaLabel]=\"sideLabels()[side]\"\r\n [disabled]=\"disabled()\"\r\n />\r\n </div>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"mb-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-surface text-fg-subtle transition-colors duration-fast ease-emphasis hover:bg-surface-alt focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring disabled:pointer-events-none disabled:opacity-50\"\r\n [class.text-accent]=\"linked()\"\r\n [class.border-accent]=\"linked()\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"toggleLinked()\"\r\n [attr.aria-pressed]=\"linked()\"\r\n [attr.title]=\"linkToggleTitle()\"\r\n >\r\n <span mfIcon [size]=\"16\">{{ linked() ? 'link' : 'link_off' }}</span>\r\n </button>\r\n</div>\r\n", dependencies: [{ kind: "component", type: NumberInput, selector: "mf-number-input", inputs: ["value", "min", "max", "step", "unit", "disabled", "hasError", "ariaLabel"], outputs: ["valueChange"], exportAs: ["mfNumberInput"] }, { kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }] });
|
|
67
|
+
}
|
|
68
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: BoxInput, decorators: [{
|
|
69
|
+
type: Component,
|
|
70
|
+
args: [{ selector: 'mf-box-input', imports: [NumberInput, Icon], host: { class: 'block' }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => BoxInput), multi: true }], template: "<div class=\"inline-flex items-end gap-1.5\">\r\n @for (side of sides; track side) {\r\n <div class=\"flex flex-col items-center gap-1\">\r\n <span class=\"text-xs text-fg-subtle\">{{ sideLabels()[side] }}</span>\r\n <mf-number-input\r\n class=\"w-20\"\r\n [value]=\"sideValue(side)\"\r\n (valueChange)=\"setSide(side, $event)\"\r\n [min]=\"min()\"\r\n [max]=\"max()\"\r\n [unit]=\"unit()\"\r\n [ariaLabel]=\"sideLabels()[side]\"\r\n [disabled]=\"disabled()\"\r\n />\r\n </div>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"mb-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-surface text-fg-subtle transition-colors duration-fast ease-emphasis hover:bg-surface-alt focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring disabled:pointer-events-none disabled:opacity-50\"\r\n [class.text-accent]=\"linked()\"\r\n [class.border-accent]=\"linked()\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"toggleLinked()\"\r\n [attr.aria-pressed]=\"linked()\"\r\n [attr.title]=\"linkToggleTitle()\"\r\n >\r\n <span mfIcon [size]=\"16\">{{ linked() ? 'link' : 'link_off' }}</span>\r\n </button>\r\n</div>\r\n" }]
|
|
71
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], unit: [{ type: i0.Input, args: [{ isSignal: true, alias: "unit", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Generated bundle index. Do not edit.
|
|
75
|
+
*/
|
|
76
|
+
|
|
77
|
+
export { BoxInput };
|
|
78
|
+
//# sourceMappingURL=mesgflow-ui-kit-box-input.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesgflow-ui-kit-box-input.mjs","sources":["../../../projects/ui-kit/box-input/box-input.ts","../../../projects/ui-kit/box-input/box-input.html","../../../projects/ui-kit/box-input/mesgflow-ui-kit-box-input.ts"],"sourcesContent":["import { Component, computed, forwardRef, inject, input, model, signal } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport { MF_BOX_INPUT_LABELS, ValueAccessorBase } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { NumberInput } from '@mesgflow/ui-kit/number-input';\r\n\r\nexport interface BoxValue {\r\n top: number;\r\n right: number;\r\n bottom: number;\r\n left: number;\r\n}\r\n\r\nconst SIDES: (keyof BoxValue)[] = ['top', 'right', 'bottom', 'left'];\r\n\r\n/**\r\n * `<mf-box-input [(value)]=\"padding\" unit=\"px\" />` — 4 kenar (padding/\r\n * margin/border) kutu-model girdisi. Bağlantılı mod (varsayılan AÇIK): tek\r\n * input değiştirmek dördünü BİRDEN değiştirir — zincir ikonuna tıklayınca\r\n * kenarlar bağımsızlaşır (kenarı ayırırken mevcut `top` değeri dördüne\r\n * BASILMAZ — sadece tekrar bağlarken senkronlanır). `NumberInput` üstüne\r\n * kompoze edilmiş bir COMPONENT (gerçek iç yapı — bkz. README \"Directive mi,\r\n * component mi?\").\r\n */\r\n@Component({\r\n selector: 'mf-box-input',\r\n imports: [NumberInput, Icon],\r\n host: { class: 'block' },\r\n templateUrl: './box-input.html',\r\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => BoxInput), multi: true }],\r\n})\r\nexport class BoxInput extends ValueAccessorBase<BoxValue> implements ControlValueAccessor {\r\n readonly value = model<BoxValue>({ top: 0, right: 0, bottom: 0, left: 0 });\r\n readonly unit = input('px');\r\n readonly min = input(0);\r\n readonly max = input<number | null>(null);\r\n readonly disabled = input(false);\r\n\r\n protected readonly linked = signal(true);\r\n protected readonly sides = SIDES;\r\n\r\n private readonly boxInputLabels = inject(MF_BOX_INPUT_LABELS);\r\n protected readonly sideLabels = computed(() => {\r\n const labels = this.boxInputLabels();\r\n return { top: labels.top, right: labels.right, bottom: labels.bottom, left: labels.left };\r\n });\r\n protected readonly linkToggleTitle = computed(() =>\r\n this.linked() ? this.boxInputLabels().unlinkSides : this.boxInputLabels().linkSides,\r\n );\r\n\r\n writeValue(value: BoxValue): void {\r\n this.value.set(value);\r\n }\r\n\r\n protected sideValue(side: keyof BoxValue): number {\r\n return this.value()[side];\r\n }\r\n\r\n protected setSide(side: keyof BoxValue, next: number | null): void {\r\n const n = next ?? 0;\r\n if (this.linked()) {\r\n this.value.set({ top: n, right: n, bottom: n, left: n });\r\n } else {\r\n this.value.update((v) => ({ ...v, [side]: n }));\r\n }\r\n this.onChange(this.value());\r\n this.onTouched();\r\n }\r\n\r\n protected toggleLinked(): void {\r\n this.linked.update((v) => !v);\r\n if (this.linked()) {\r\n const t = this.value().top;\r\n this.value.set({ top: t, right: t, bottom: t, left: t });\r\n this.onChange(this.value());\r\n }\r\n }\r\n}\r\n","<div class=\"inline-flex items-end gap-1.5\">\r\n @for (side of sides; track side) {\r\n <div class=\"flex flex-col items-center gap-1\">\r\n <span class=\"text-xs text-fg-subtle\">{{ sideLabels()[side] }}</span>\r\n <mf-number-input\r\n class=\"w-20\"\r\n [value]=\"sideValue(side)\"\r\n (valueChange)=\"setSide(side, $event)\"\r\n [min]=\"min()\"\r\n [max]=\"max()\"\r\n [unit]=\"unit()\"\r\n [ariaLabel]=\"sideLabels()[side]\"\r\n [disabled]=\"disabled()\"\r\n />\r\n </div>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"mb-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-surface text-fg-subtle transition-colors duration-fast ease-emphasis hover:bg-surface-alt focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring disabled:pointer-events-none disabled:opacity-50\"\r\n [class.text-accent]=\"linked()\"\r\n [class.border-accent]=\"linked()\"\r\n [disabled]=\"disabled()\"\r\n (click)=\"toggleLinked()\"\r\n [attr.aria-pressed]=\"linked()\"\r\n [attr.title]=\"linkToggleTitle()\"\r\n >\r\n <span mfIcon [size]=\"16\">{{ linked() ? 'link' : 'link_off' }}</span>\r\n </button>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, computed, Component } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* `<mf-brand [name]="i18n().auth.layout.brandName" />`
|
|
6
|
+
*
|
|
7
|
+
* Marka işareti TEK kaynağa indirildi — daha önce üç ayrı yerde üç farklı
|
|
8
|
+
* şey vardı: auth masaüstü panelinde sabit kodlu "MF", mobil auth bloğunda
|
|
9
|
+
* ve layout sidebar'ında sabit kodlu "N", sidebar'da ayrıca `bg-teal-600`
|
|
10
|
+
* (eski marka rengi, köşeli/`rounded-*` olmayan bir kare). İşaret artık
|
|
11
|
+
* `name()`'in İLK HARFİNDEN türetiliyor — `brandName` çevirisi değişse bile
|
|
12
|
+
* bir daha asenkron/bayat kalamaz.
|
|
13
|
+
*
|
|
14
|
+
* `labelTone="auto"` (varsayılan) isim metnini moda-duyarlı `text-fg` ile
|
|
15
|
+
* boyar — ama auth-layout'un sol paneli gibi TEMADAN BAĞIMSIZ hep koyu kalan
|
|
16
|
+
* zeminlerde bu YANLIŞ: light modda `text-fg` koyu metne döner, koyu panel
|
|
17
|
+
* üstünde görünmez olur (gerçek bug, tarayıcıda yakalandı). O bağlamlarda
|
|
18
|
+
* `labelTone="light"` ver — sabit beyaz metin, moddan bağımsız. Simetrik
|
|
19
|
+
* olarak `labelTone="dark"` — sabit koyu (`primary-900`) metin, TEMADAN
|
|
20
|
+
* BAĞIMSIZ hep AÇIK kalan zeminler için (`appearance="brand-light"` sidebar
|
|
21
|
+
* gibi): `auto` orada da YANLIŞ olurdu — dark site modunda `text-fg` açık
|
|
22
|
+
* renge döner, ki zemin (primary-100) hep açık kaldığından metin kaybolurdu.
|
|
23
|
+
*
|
|
24
|
+
* İşaret zemini `bg-accent-fill` — Sidebar `appearance="brand"` içine
|
|
25
|
+
* (`[brand]` slotu ile) projelendiğinde bu artık primary-900'e (kök
|
|
26
|
+
* sidebar'la AYNI zemin) denk düşer, işaret kaybolurdu. `group-data-
|
|
27
|
+
* [appearance=brand]/sidebar:` varyantı (özgüllük 0,2,0, `bg-accent-fill`in
|
|
28
|
+
* 0,1,0'ını İKİ MODDA da yener) o bağlamda primary-400 (`#10b981`) + ink
|
|
29
|
+
* (`primary-950`, ≈6.9:1) zeminine geçer — Sidebar'ın kendi `data-appearance`
|
|
30
|
+
* attribute'una bağlı, `Brand`'e yeni bir input EKLENMEDEN.
|
|
31
|
+
*
|
|
32
|
+
* `appearance="brand-light"` (kök primary-100, İKİ modda da AYNI) için AYRI
|
|
33
|
+
* bir override GEREKİR — DARK site modunda `bg-accent-fill` primary-400'e
|
|
34
|
+
* kayıyor, primary-100 zemine karşı sadece 2.15:1 (AA altı, neredeyse
|
|
35
|
+
* kaybolur). Sabit koyu blok + beyaz metin (`primary-900`/`white`) — bu,
|
|
36
|
+
* LIGHT site modunda zaten `bg-accent-fill`in verdiği sonuçla (primary-900)
|
|
37
|
+
* ÖRTÜŞÜYOR, sadece dark site modundaki tutarsızlığı gideriyor.
|
|
38
|
+
*/
|
|
39
|
+
class Brand {
|
|
40
|
+
name = input.required(/* @ts-ignore */
|
|
41
|
+
...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
|
|
42
|
+
size = input('md', /* @ts-ignore */
|
|
43
|
+
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
44
|
+
showLabel = input(true, /* @ts-ignore */
|
|
45
|
+
...(ngDevMode ? [{ debugName: "showLabel" }] : /* istanbul ignore next */ []));
|
|
46
|
+
labelTone = input('auto', /* @ts-ignore */
|
|
47
|
+
...(ngDevMode ? [{ debugName: "labelTone" }] : /* istanbul ignore next */ []));
|
|
48
|
+
mark = computed(() => this.name().trim().slice(0, 1).toUpperCase() || '?', /* @ts-ignore */
|
|
49
|
+
...(ngDevMode ? [{ debugName: "mark" }] : /* istanbul ignore next */ []));
|
|
50
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Brand, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
51
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Brand, isStandalone: true, selector: "mf-brand", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, showLabel: { classPropertyName: "showLabel", publicName: "showLabel", isSignal: true, isRequired: false, transformFunction: null }, labelTone: { classPropertyName: "labelTone", publicName: "labelTone", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
52
|
+
<span class="inline-flex items-center gap-2">
|
|
53
|
+
<span
|
|
54
|
+
[class]="
|
|
55
|
+
'flex shrink-0 items-center justify-center rounded-md bg-accent-fill font-display font-bold text-fg-on-accent ' +
|
|
56
|
+
'group-data-[appearance=brand]/sidebar:bg-primary-400 group-data-[appearance=brand]/sidebar:text-primary-950 ' +
|
|
57
|
+
'group-data-[appearance=brand-light]/sidebar:bg-primary-900 group-data-[appearance=brand-light]/sidebar:text-white ' +
|
|
58
|
+
(size() === 'sm' ? 'h-8 w-8 text-sm' : 'h-9 w-9 text-sm')
|
|
59
|
+
"
|
|
60
|
+
aria-hidden="true"
|
|
61
|
+
>
|
|
62
|
+
{{ mark() }}
|
|
63
|
+
</span>
|
|
64
|
+
@if (showLabel()) {
|
|
65
|
+
<span
|
|
66
|
+
[class]="
|
|
67
|
+
'truncate text-title font-semibold ' +
|
|
68
|
+
(labelTone() === 'light'
|
|
69
|
+
? 'text-white'
|
|
70
|
+
: labelTone() === 'dark'
|
|
71
|
+
? 'text-primary-900'
|
|
72
|
+
: 'text-fg')
|
|
73
|
+
"
|
|
74
|
+
>{{ name() }}</span
|
|
75
|
+
>
|
|
76
|
+
}
|
|
77
|
+
</span>
|
|
78
|
+
`, isInline: true });
|
|
79
|
+
}
|
|
80
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Brand, decorators: [{
|
|
81
|
+
type: Component,
|
|
82
|
+
args: [{
|
|
83
|
+
selector: 'mf-brand',
|
|
84
|
+
template: `
|
|
85
|
+
<span class="inline-flex items-center gap-2">
|
|
86
|
+
<span
|
|
87
|
+
[class]="
|
|
88
|
+
'flex shrink-0 items-center justify-center rounded-md bg-accent-fill font-display font-bold text-fg-on-accent ' +
|
|
89
|
+
'group-data-[appearance=brand]/sidebar:bg-primary-400 group-data-[appearance=brand]/sidebar:text-primary-950 ' +
|
|
90
|
+
'group-data-[appearance=brand-light]/sidebar:bg-primary-900 group-data-[appearance=brand-light]/sidebar:text-white ' +
|
|
91
|
+
(size() === 'sm' ? 'h-8 w-8 text-sm' : 'h-9 w-9 text-sm')
|
|
92
|
+
"
|
|
93
|
+
aria-hidden="true"
|
|
94
|
+
>
|
|
95
|
+
{{ mark() }}
|
|
96
|
+
</span>
|
|
97
|
+
@if (showLabel()) {
|
|
98
|
+
<span
|
|
99
|
+
[class]="
|
|
100
|
+
'truncate text-title font-semibold ' +
|
|
101
|
+
(labelTone() === 'light'
|
|
102
|
+
? 'text-white'
|
|
103
|
+
: labelTone() === 'dark'
|
|
104
|
+
? 'text-primary-900'
|
|
105
|
+
: 'text-fg')
|
|
106
|
+
"
|
|
107
|
+
>{{ name() }}</span
|
|
108
|
+
>
|
|
109
|
+
}
|
|
110
|
+
</span>
|
|
111
|
+
`,
|
|
112
|
+
}]
|
|
113
|
+
}], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], showLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLabel", required: false }] }], labelTone: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelTone", required: false }] }] } });
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Generated bundle index. Do not edit.
|
|
117
|
+
*/
|
|
118
|
+
|
|
119
|
+
export { Brand };
|
|
120
|
+
//# sourceMappingURL=mesgflow-ui-kit-brand.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesgflow-ui-kit-brand.mjs","sources":["../../../projects/ui-kit/brand/brand.ts","../../../projects/ui-kit/brand/mesgflow-ui-kit-brand.ts"],"sourcesContent":["import { Component, computed, input } from '@angular/core';\r\n\r\n/**\r\n * `<mf-brand [name]=\"i18n().auth.layout.brandName\" />`\r\n *\r\n * Marka işareti TEK kaynağa indirildi — daha önce üç ayrı yerde üç farklı\r\n * şey vardı: auth masaüstü panelinde sabit kodlu \"MF\", mobil auth bloğunda\r\n * ve layout sidebar'ında sabit kodlu \"N\", sidebar'da ayrıca `bg-teal-600`\r\n * (eski marka rengi, köşeli/`rounded-*` olmayan bir kare). İşaret artık\r\n * `name()`'in İLK HARFİNDEN türetiliyor — `brandName` çevirisi değişse bile\r\n * bir daha asenkron/bayat kalamaz.\r\n *\r\n * `labelTone=\"auto\"` (varsayılan) isim metnini moda-duyarlı `text-fg` ile\r\n * boyar — ama auth-layout'un sol paneli gibi TEMADAN BAĞIMSIZ hep koyu kalan\r\n * zeminlerde bu YANLIŞ: light modda `text-fg` koyu metne döner, koyu panel\r\n * üstünde görünmez olur (gerçek bug, tarayıcıda yakalandı). O bağlamlarda\r\n * `labelTone=\"light\"` ver — sabit beyaz metin, moddan bağımsız. Simetrik\r\n * olarak `labelTone=\"dark\"` — sabit koyu (`primary-900`) metin, TEMADAN\r\n * BAĞIMSIZ hep AÇIK kalan zeminler için (`appearance=\"brand-light\"` sidebar\r\n * gibi): `auto` orada da YANLIŞ olurdu — dark site modunda `text-fg` açık\r\n * renge döner, ki zemin (primary-100) hep açık kaldığından metin kaybolurdu.\r\n *\r\n * İşaret zemini `bg-accent-fill` — Sidebar `appearance=\"brand\"` içine\r\n * (`[brand]` slotu ile) projelendiğinde bu artık primary-900'e (kök\r\n * sidebar'la AYNI zemin) denk düşer, işaret kaybolurdu. `group-data-\r\n * [appearance=brand]/sidebar:` varyantı (özgüllük 0,2,0, `bg-accent-fill`in\r\n * 0,1,0'ını İKİ MODDA da yener) o bağlamda primary-400 (`#10b981`) + ink\r\n * (`primary-950`, ≈6.9:1) zeminine geçer — Sidebar'ın kendi `data-appearance`\r\n * attribute'una bağlı, `Brand`'e yeni bir input EKLENMEDEN.\r\n *\r\n * `appearance=\"brand-light\"` (kök primary-100, İKİ modda da AYNI) için AYRI\r\n * bir override GEREKİR — DARK site modunda `bg-accent-fill` primary-400'e\r\n * kayıyor, primary-100 zemine karşı sadece 2.15:1 (AA altı, neredeyse\r\n * kaybolur). Sabit koyu blok + beyaz metin (`primary-900`/`white`) — bu,\r\n * LIGHT site modunda zaten `bg-accent-fill`in verdiği sonuçla (primary-900)\r\n * ÖRTÜŞÜYOR, sadece dark site modundaki tutarsızlığı gideriyor.\r\n */\r\n@Component({\r\n selector: 'mf-brand',\r\n template: `\r\n <span class=\"inline-flex items-center gap-2\">\r\n <span\r\n [class]=\"\r\n 'flex shrink-0 items-center justify-center rounded-md bg-accent-fill font-display font-bold text-fg-on-accent ' +\r\n 'group-data-[appearance=brand]/sidebar:bg-primary-400 group-data-[appearance=brand]/sidebar:text-primary-950 ' +\r\n 'group-data-[appearance=brand-light]/sidebar:bg-primary-900 group-data-[appearance=brand-light]/sidebar:text-white ' +\r\n (size() === 'sm' ? 'h-8 w-8 text-sm' : 'h-9 w-9 text-sm')\r\n \"\r\n aria-hidden=\"true\"\r\n >\r\n {{ mark() }}\r\n </span>\r\n @if (showLabel()) {\r\n <span\r\n [class]=\"\r\n 'truncate text-title font-semibold ' +\r\n (labelTone() === 'light'\r\n ? 'text-white'\r\n : labelTone() === 'dark'\r\n ? 'text-primary-900'\r\n : 'text-fg')\r\n \"\r\n >{{ name() }}</span\r\n >\r\n }\r\n </span>\r\n `,\r\n})\r\nexport class Brand {\r\n readonly name = input.required<string>();\r\n readonly size = input<'sm' | 'md'>('md');\r\n readonly showLabel = input(true);\r\n readonly labelTone = input<'auto' | 'light' | 'dark'>('auto');\r\n\r\n protected readonly mark = computed(() => this.name().trim().slice(0, 1).toUpperCase() || '?');\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCG;MAgCU,KAAK,CAAA;IACP,IAAI,GAAG,KAAK,CAAC,QAAQ;6EAAU;IAC/B,IAAI,GAAG,KAAK,CAAc,IAAI;6EAAC;IAC/B,SAAS,GAAG,KAAK,CAAC,IAAI;kFAAC;IACvB,SAAS,GAAG,KAAK,CAA4B,MAAM;kFAAC;IAE1C,IAAI,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,GAAG;6EAAC;uGANlF,KAAK,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAL,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAK,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,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,QAAA,EAAA,EAAA,EAAA,QAAA,EA7BN,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAEU,KAAK,EAAA,UAAA,EAAA,CAAA;kBA/BjB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,UAAU;AACpB,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BT,EAAA,CAAA;AACF,iBAAA;;;ACnED;;AAEG;;"}
|