@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,68 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* mesgflow — erişilebilirlik modları: kullanıcının İŞLETİM SİSTEMİ düzeyinde
|
|
3
|
+
* istediği kontrast tercihleri. Tüketici hiçbir şey yapmadan otomatik devreye
|
|
4
|
+
* girer (class/JS gerektirmez).
|
|
5
|
+
*
|
|
6
|
+
* 1) `prefers-contrast: more` (macOS "Kontrastı artır", GNOME/Windows yüksek
|
|
7
|
+
* kontrast tercihi) — palet KORUNUR, sadece düşük vurgulu roller bir
|
|
8
|
+
* basamak sertleşir: hairline → border-strong, fg-muted/subtle koyulaşır
|
|
9
|
+
* (light) / açılır (dark), cam yüzey opaklaşır, durum katmanı belirginleşir.
|
|
10
|
+
*
|
|
11
|
+
* 2) `forced-colors: active` (Windows Yüksek Kontrast / Kontrast Temaları) —
|
|
12
|
+
* tarayıcı renkleri ZATEN sistem paletiyle ezer; burada sadece bu ezmenin
|
|
13
|
+
* GÖRÜNMEZ bıraktığı işaretler telafi edilir: arka plan rengiyle ifade
|
|
14
|
+
* edilen seçili/aktif durumlar (`aria-selected`/`aria-current`) bir
|
|
15
|
+
* `Highlight` çizgisi alır, cam/bulanıklık kapanır. Focus zaten `outline`
|
|
16
|
+
* tabanlı (bkz. core/recipes.ts `focusRecipe`) — forced-colors'ta korunur.
|
|
17
|
+
*
|
|
18
|
+
* Seçiciler `:root, .light` / `.dark` — color.css'teki mod bloklarıyla AYNI
|
|
19
|
+
* özgüllükte, bu dosya ondan SONRA import edildiği için kazanır.
|
|
20
|
+
*/
|
|
21
|
+
@layer base {
|
|
22
|
+
@media (prefers-contrast: more) {
|
|
23
|
+
:root,
|
|
24
|
+
.light {
|
|
25
|
+
--mf-hairline: var(--color-neutral-500);
|
|
26
|
+
--mf-border-subtle: var(--color-neutral-400);
|
|
27
|
+
--mf-border: var(--color-neutral-500);
|
|
28
|
+
--mf-border-strong: var(--color-neutral-600);
|
|
29
|
+
--mf-fg-muted: var(--color-neutral-700);
|
|
30
|
+
--mf-fg-subtle: var(--color-neutral-600);
|
|
31
|
+
--mf-glass: var(--mf-surface);
|
|
32
|
+
--mf-state-hover: rgba(10, 28, 23, 0.09);
|
|
33
|
+
--mf-state-pressed: rgba(10, 28, 23, 0.16);
|
|
34
|
+
--mf-state-selected: rgba(10, 28, 23, 0.12);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.dark {
|
|
38
|
+
--mf-hairline: var(--color-neutral-600);
|
|
39
|
+
--mf-border-subtle: var(--color-neutral-700);
|
|
40
|
+
--mf-border: var(--color-neutral-600);
|
|
41
|
+
--mf-border-strong: var(--color-neutral-500);
|
|
42
|
+
--mf-fg-muted: var(--color-neutral-400);
|
|
43
|
+
--mf-fg-subtle: var(--color-neutral-500);
|
|
44
|
+
--mf-glass: var(--mf-surface);
|
|
45
|
+
--mf-state-hover: rgba(236, 243, 240, 0.1);
|
|
46
|
+
--mf-state-pressed: rgba(236, 243, 240, 0.18);
|
|
47
|
+
--mf-state-selected: rgba(236, 243, 240, 0.14);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@media (forced-colors: active) {
|
|
52
|
+
:root,
|
|
53
|
+
.light,
|
|
54
|
+
.dark {
|
|
55
|
+
--mf-glass: Canvas;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
* {
|
|
59
|
+
backdrop-filter: none !important;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
[aria-selected='true'],
|
|
63
|
+
[aria-current]:not([aria-current='false']) {
|
|
64
|
+
outline: 2px solid Highlight;
|
|
65
|
+
outline-offset: -2px;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* mesgflow — yükselti (elevation) token'ları: gölgenin KENDİSİ moda göre
|
|
3
|
+
* takas olur (`@theme inline` + :root/.dark, renk rolleriyle aynı desen).
|
|
4
|
+
*
|
|
5
|
+
* Yükselti semantiği — BORDER-FIRST (2026-09 Deep Emerald geçişi, kullanıcı
|
|
6
|
+
* kararıyla): kapsayıcılar (card/table/toolbar) artık gölge DEĞİL,
|
|
7
|
+
* `border-hairline` (color.css) taşır — İKİ MODDA da. `shadow-1` bu yüzden
|
|
8
|
+
* anlam değiştirdi: artık sadece TEMAS gölgesi (segmented pill, slider
|
|
9
|
+
* thumb, sidebar daraltma düğmesi gibi küçük, yüzeyden hafifçe ayrılan
|
|
10
|
+
* öğeler). `shadow-2` OVERLAY (popover/menu/dropdown, hairline + gölge),
|
|
11
|
+
* `shadow-3` DIALOG/DRAWER/SHEET (hairline + gölge + cam yüzey, bkz.
|
|
12
|
+
* core/recipes.ts glassSurface). `shadow-control` KONTROLLER (input/select/
|
|
13
|
+
* button — ince, neredeyse hissedilmeyen bir ayrım). Bu dört basamak
|
|
14
|
+
* birbirine KARIŞTIRILMAZ.
|
|
15
|
+
*
|
|
16
|
+
* `shadow-filled` DOLU BUTONLAR (filled success/warning/danger/info/help):
|
|
17
|
+
* 1px koyu alt kenar + 2px temas gölgesi — "yüzeye oturmuş" malzeme hissi,
|
|
18
|
+
* iç ışık/gloss YOK (bkz. button.variants.ts "Gloss YOK — 2 kez reddedildi").
|
|
19
|
+
* Nötr filled hâlâ gölgesiz (zemin rengiyle aynı yüzey, yükselmiyor).
|
|
20
|
+
*
|
|
21
|
+
* `shadow-glow` SADECE dolu PRIMARY buton (spec'in "Glow / Işıma Efekti"):
|
|
22
|
+
* light'ta `shadow-filled` ile AYNI (parıltı sadece koyu zeminde okunur),
|
|
23
|
+
* dark'ta altına `color-mix()` ile primary-400'ün %20 alfası eklenmiş bir
|
|
24
|
+
* emerald ışıma. `color-mix` accent rampasına `var()` ile bağlı olduğu için
|
|
25
|
+
* `applyMfTheme({accent})` ile tüketici aksanı değişince glow da otomatik
|
|
26
|
+
* takip eder — ayrı bir rol satırı YAZILMASI GEREKMEZ. Bir class string'i
|
|
27
|
+
* ASLA hem `shadow-filled` hem `shadow-glow` taşımaz (twMerge bu ikisini
|
|
28
|
+
* aynı grup saymaz, bkz. core/cn.ts gotcha) — primary `shadow-glow` alır,
|
|
29
|
+
* diğer dört ton `shadow-filled` alır.
|
|
30
|
+
*/
|
|
31
|
+
@theme inline {
|
|
32
|
+
--shadow-1: var(--mf-shadow-1);
|
|
33
|
+
--shadow-2: var(--mf-shadow-2);
|
|
34
|
+
--shadow-3: var(--mf-shadow-3);
|
|
35
|
+
--shadow-control: var(--mf-shadow-control);
|
|
36
|
+
--shadow-filled: var(--mf-shadow-filled);
|
|
37
|
+
--shadow-glow: var(--mf-shadow-glow);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@layer base {
|
|
41
|
+
/* `.light` — koyu sayfa içindeki açık ada, bkz. color.css'teki `@custom-variant dark` notu. */
|
|
42
|
+
:root,
|
|
43
|
+
.light {
|
|
44
|
+
/* Marka-tonlu (rgba primary-900) ve önceki turdan çok daha hafif — derinlik artık ağırlıklı olarak border-hairline'dan geliyor, gölge sadece küçük bir ipucu. */
|
|
45
|
+
--mf-shadow-1: 0 1px 2px rgba(6, 44, 34, 0.06);
|
|
46
|
+
--mf-shadow-2: 0 4px 16px -8px rgba(6, 44, 34, 0.14);
|
|
47
|
+
/* Spec'in "Gölgeler yerine çerçeveler" tarifi — dialog/drawer/sheet zaten hairline taşıyor, gölge sadece derin bir ipucu. */
|
|
48
|
+
--mf-shadow-3: 0 10px 30px rgba(6, 44, 34, 0.15);
|
|
49
|
+
/* Kontroller için neredeyse görünmez bir ayrım — zemin kontrastıyla karışmasın diye "gölge" değil "kenar ışığı" gibi davranır. */
|
|
50
|
+
--mf-shadow-control: 0 1px 1px rgba(6, 44, 34, 0.04);
|
|
51
|
+
--mf-shadow-filled: 0 1px 0 rgba(6, 44, 34, 0.12), 0 1px 2px rgba(6, 44, 34, 0.14);
|
|
52
|
+
/* Light'ta parıltı yok — `shadow-filled` ile birebir aynı (primary-900 zaten koyu, ışıma gereksiz). */
|
|
53
|
+
--mf-shadow-glow: 0 1px 0 rgba(6, 44, 34, 0.12), 0 1px 2px rgba(6, 44, 34, 0.14);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.dark {
|
|
57
|
+
--mf-shadow-1: 0 1px 2px rgba(0, 0, 0, 0.24);
|
|
58
|
+
--mf-shadow-2: 0 4px 16px -8px rgba(0, 0, 0, 0.5);
|
|
59
|
+
--mf-shadow-3: 0 10px 30px rgba(0, 0, 0, 0.4);
|
|
60
|
+
/* Dark modda dolu gölge yerine üstte ince bir ışık çizgisi — koyu zeminde "gölge" görsel olarak okunmuyor. */
|
|
61
|
+
--mf-shadow-control: inset 0 1px 0 rgba(255, 255, 255, 0.04);
|
|
62
|
+
--mf-shadow-filled: 0 1px 0 rgba(0, 0, 0, 0.45), 0 1px 2px rgba(0, 0, 0, 0.4);
|
|
63
|
+
/* Spec: "Ana Aksiyon butonunun altına hafif bir yeşil ışıma" — 20px emerald blur, `--color-primary-400` üstünden `color-mix` ile türetilir. */
|
|
64
|
+
--mf-shadow-glow:
|
|
65
|
+
0 0 20px color-mix(in srgb, var(--color-primary-400) 20%, transparent),
|
|
66
|
+
0 1px 0 rgba(0, 0, 0, 0.45), 0 1px 2px rgba(0, 0, 0, 0.4);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* mesgflow — hareket (motion) token'ları: süre/eğri + hazır giriş-çıkış
|
|
3
|
+
* animasyonları. `prefers-reduced-motion: reduce` global bloğu (aşağıda)
|
|
4
|
+
* TÜM `animate-*`/`transition-*` kullanımlarını otomatik kısıyor — yeni bir
|
|
5
|
+
* `--animate-*` eklerken ayrıca bir reduced-motion istisnası YAZMA gerekmiyor.
|
|
6
|
+
*/
|
|
7
|
+
@theme {
|
|
8
|
+
--ease-emphasis: cubic-bezier(0.2, 0, 0, 1);
|
|
9
|
+
/*
|
|
10
|
+
* Sönümlü yay (ζ=0.9, başlangıç hızı 1.2) — `linear()` ile örneklenmiş.
|
|
11
|
+
* Hızlı başlar (ease-out gibi), hedefi ~%2.8 aşıp yerine OTURUR — zıplama
|
|
12
|
+
* yok. SADECE küçük ölçek/öteleme GİRİŞLERİNDE (dialog, overlay):
|
|
13
|
+
* `translateY(100%)` gibi tam-boy kaymalarda (sheet/drawer) aşım panelin
|
|
14
|
+
* altında boşluk açardı. Çıkışlar `ease-emphasis`te kalır. `linear()`
|
|
15
|
+
* desteklemeyen tarayıcıda animasyon bildirimi geçersiz sayılır ve panel
|
|
16
|
+
* animasyonsuz açılır (işlev kaybı yok).
|
|
17
|
+
*/
|
|
18
|
+
--ease-spring: linear(
|
|
19
|
+
0,
|
|
20
|
+
0.406 6.3%,
|
|
21
|
+
0.67 12.5%,
|
|
22
|
+
0.834 18.8%,
|
|
23
|
+
0.932 25%,
|
|
24
|
+
0.987 31.3%,
|
|
25
|
+
1.014 37.5%,
|
|
26
|
+
1.026 43.8%,
|
|
27
|
+
1.028 50%,
|
|
28
|
+
1.026 56.3%,
|
|
29
|
+
1.022 62.5%,
|
|
30
|
+
1.017 68.8%,
|
|
31
|
+
1.013 75%,
|
|
32
|
+
1.01 81.3%,
|
|
33
|
+
1.007 87.5%,
|
|
34
|
+
1.005 93.8%,
|
|
35
|
+
1
|
|
36
|
+
);
|
|
37
|
+
--duration-fast: 120ms;
|
|
38
|
+
--duration-base: 180ms;
|
|
39
|
+
--duration-slow: 260ms;
|
|
40
|
+
|
|
41
|
+
/*
|
|
42
|
+
* Table'ın "yeniden sorgulanıyor" göstergesi: satırlar YERİNDE kalır
|
|
43
|
+
* (skeleton'a dönmez), kartın tepesinde 2px'lik bir çubuk soldan sağa
|
|
44
|
+
* kayar — `animate-progress-slide` (bkz. table/table.html).
|
|
45
|
+
*/
|
|
46
|
+
--animate-progress-slide: progress-slide 1.1s var(--ease-emphasis) infinite;
|
|
47
|
+
|
|
48
|
+
@keyframes progress-slide {
|
|
49
|
+
0% {
|
|
50
|
+
transform: translateX(-100%);
|
|
51
|
+
}
|
|
52
|
+
100% {
|
|
53
|
+
transform: translateX(400%);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/*
|
|
58
|
+
* Dialog açılış/kapanış — `Dialog`'un (dialog.ts) `surface.closing()`'e
|
|
59
|
+
* göre reaktif olarak `-in`/`-out` class'ı arasında geçiş yapmasıyla
|
|
60
|
+
* tetikleniyor. Kapanış CDK'nın kendi kancası OLMADIĞI için
|
|
61
|
+
* `DialogService.open()`'daki `closePredicate` ile senkronize gecikmeli
|
|
62
|
+
* (bkz. o dosyanın doc yorumu) — `-out` süresi orada `EXIT_MS` sabitiyle
|
|
63
|
+
* BİREBİR eşleşiyor, biri değişirse diğeri de güncellenmeli.
|
|
64
|
+
*/
|
|
65
|
+
--animate-dialog-in: dialog-in var(--duration-base) var(--ease-spring);
|
|
66
|
+
--animate-dialog-out: dialog-out var(--duration-fast) var(--ease-emphasis) forwards;
|
|
67
|
+
--animate-sheet-in: sheet-in var(--duration-base) var(--ease-emphasis);
|
|
68
|
+
--animate-sheet-out: sheet-out var(--duration-fast) var(--ease-emphasis) forwards;
|
|
69
|
+
|
|
70
|
+
@keyframes dialog-in {
|
|
71
|
+
from {
|
|
72
|
+
opacity: 0;
|
|
73
|
+
transform: translateY(8px) scale(0.98);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
@keyframes dialog-out {
|
|
78
|
+
to {
|
|
79
|
+
opacity: 0;
|
|
80
|
+
transform: translateY(4px) scale(0.985);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
@keyframes sheet-in {
|
|
85
|
+
from {
|
|
86
|
+
transform: translateY(100%);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
@keyframes sheet-out {
|
|
91
|
+
to {
|
|
92
|
+
transform: translateY(100%);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/*
|
|
97
|
+
* Drawer (sağdan açılan panel) — X ekseninde kayıyor, BİLEREK modal (Y +
|
|
98
|
+
* scale) ve sheet'ten (Y) farklı: hareket ekseni metaforla eşleşiyor
|
|
99
|
+
* (modal ortadan yükselir, sheet alttan kayar, drawer kenardan kayar).
|
|
100
|
+
*/
|
|
101
|
+
--animate-drawer-in: drawer-in var(--duration-base) var(--ease-emphasis);
|
|
102
|
+
--animate-drawer-out: drawer-out var(--duration-fast) var(--ease-emphasis) forwards;
|
|
103
|
+
|
|
104
|
+
@keyframes drawer-in {
|
|
105
|
+
from {
|
|
106
|
+
transform: translateX(100%);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
@keyframes drawer-out {
|
|
111
|
+
to {
|
|
112
|
+
transform: translateX(100%);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/*
|
|
117
|
+
* Popover/Menu/Select/Combobox/ColorPicker/DatePicker/... — 12 kopya
|
|
118
|
+
* overlay panelinin BİRLEŞTİĞİ tek giriş/çıkış hareketi (bkz. plan Faz 1c,
|
|
119
|
+
* `Popover`'ın `closing` sinyali). Dialog'dan (Y 8px + duration-base) daha
|
|
120
|
+
* hafif — küçük bir panel, `-4px` + `duration-fast` yeterli, ağır
|
|
121
|
+
* hissettirmez.
|
|
122
|
+
*/
|
|
123
|
+
/* Durum ikonu değişimi (kopyalandı ✓ vb.) — küçükten yaya binerek büyür. */
|
|
124
|
+
--animate-pop: pop var(--duration-base) var(--ease-spring);
|
|
125
|
+
--animate-overlay-in: overlay-in var(--duration-fast) var(--ease-spring);
|
|
126
|
+
--animate-overlay-out: overlay-out var(--duration-fast) var(--ease-emphasis) forwards;
|
|
127
|
+
|
|
128
|
+
@keyframes pop {
|
|
129
|
+
from {
|
|
130
|
+
opacity: 0;
|
|
131
|
+
scale: 0.5;
|
|
132
|
+
}
|
|
133
|
+
to {
|
|
134
|
+
opacity: 1;
|
|
135
|
+
scale: 1;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
@keyframes overlay-in {
|
|
140
|
+
from {
|
|
141
|
+
opacity: 0;
|
|
142
|
+
transform: translateY(-4px) scale(0.98);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
@keyframes overlay-out {
|
|
147
|
+
to {
|
|
148
|
+
opacity: 0;
|
|
149
|
+
transform: translateY(-4px) scale(0.98);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/*
|
|
154
|
+
* Toast — X ekseninde kayarak girer/çıkar (bkz. `ToastHost`, sağ-alt/
|
|
155
|
+
* sağ-üst köşeden gelen bildirim metaforu; dialog/overlay'in Y ekseninden
|
|
156
|
+
* BİLEREK farklı).
|
|
157
|
+
*/
|
|
158
|
+
--animate-toast-in: toast-in var(--duration-base) var(--ease-emphasis);
|
|
159
|
+
--animate-toast-out: toast-out var(--duration-fast) var(--ease-emphasis) forwards;
|
|
160
|
+
|
|
161
|
+
@keyframes toast-in {
|
|
162
|
+
from {
|
|
163
|
+
opacity: 0;
|
|
164
|
+
transform: translateX(16px);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
@keyframes toast-out {
|
|
169
|
+
to {
|
|
170
|
+
opacity: 0;
|
|
171
|
+
transform: translateX(16px);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/*
|
|
176
|
+
* Skeleton — `animate-pulse` (opaklık titreşimi) yerine soldan sağa kayan
|
|
177
|
+
* bir parıltı (bkz. plan Faz 1c). Skeleton'un kendi arka planı bir
|
|
178
|
+
* gradient olmalı (`background-size: 200% 100%`) — token burada sadece
|
|
179
|
+
* hareketi tanımlıyor, gradient tanımı `skeleton.ts`'te.
|
|
180
|
+
*/
|
|
181
|
+
--animate-shimmer: shimmer 1.4s linear infinite;
|
|
182
|
+
|
|
183
|
+
@keyframes shimmer {
|
|
184
|
+
0% {
|
|
185
|
+
background-position: 200% 0;
|
|
186
|
+
}
|
|
187
|
+
100% {
|
|
188
|
+
background-position: -200% 0;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/** Genel amaçlı, yönsüz giriş — sadece opaklık (ör. skeleton→içerik takası). */
|
|
193
|
+
--animate-fade-in: fade-in var(--duration-base) var(--ease-emphasis);
|
|
194
|
+
|
|
195
|
+
@keyframes fade-in {
|
|
196
|
+
from {
|
|
197
|
+
opacity: 0;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/*
|
|
203
|
+
* Tailwind v4'te `--duration-*` diye bir theme namespace YOK (sadece
|
|
204
|
+
* `--ease-*`/`--animate-*` var) — `duration-fast`/`duration-base`/
|
|
205
|
+
* `duration-slow` class'ları yukarıdaki `@theme` bloğundaki tanıma rağmen
|
|
206
|
+
* HİÇBİR ZAMAN CSS üretmiyordu (kod tabanında ~60 kullanım yeri, hepsi sessizce
|
|
207
|
+
* etkisizdi, tüm geçişler tarayıcı varsayılanına düşüyordu). `@utility` ile
|
|
208
|
+
* elle tanımlamak hem class'ları çalıştırıyor hem de "kullanılmayan" gerekçesiyle
|
|
209
|
+
* derlenen CSS'ten atlanan `--duration-*` custom property'lerini emit ettiriyor
|
|
210
|
+
* (`.mf-dialog-backdrop`'ın `var(--duration-base)`'i de bu sayede düzeliyor).
|
|
211
|
+
*/
|
|
212
|
+
@utility duration-fast {
|
|
213
|
+
transition-duration: var(--duration-fast);
|
|
214
|
+
}
|
|
215
|
+
@utility duration-base {
|
|
216
|
+
transition-duration: var(--duration-base);
|
|
217
|
+
}
|
|
218
|
+
@utility duration-slow {
|
|
219
|
+
transition-duration: var(--duration-slow);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
@layer base {
|
|
223
|
+
/* `transitionMfTheme()` (theming) — tema çapraz geçişi kitin kendi süre/eğrisiyle, tarayıcı varsayılanı (250ms ease) değil. */
|
|
224
|
+
::view-transition-old(root),
|
|
225
|
+
::view-transition-new(root) {
|
|
226
|
+
animation-duration: var(--duration-slow);
|
|
227
|
+
animation-timing-function: var(--ease-emphasis);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
@media (prefers-reduced-motion: reduce) {
|
|
231
|
+
*,
|
|
232
|
+
*::before,
|
|
233
|
+
*::after {
|
|
234
|
+
animation-duration: 0.01ms !important;
|
|
235
|
+
animation-iteration-count: 1 !important;
|
|
236
|
+
transition-duration: 0.01ms !important;
|
|
237
|
+
scroll-behavior: auto !important;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/*
|
|
243
|
+
* `.mf-dialog-backdrop` (bkz. dialog/dialog.service.ts) BİLEREK `@layer`
|
|
244
|
+
* DIŞINDA (unlayered) — CDK'nın kendi `overlay-prebuilt.css`'i
|
|
245
|
+
* `.cdk-overlay-backdrop` kuralını KENDİ `@layer cdk-overlay`'inde taşıyor,
|
|
246
|
+
* ve unlayered CSS her zaman HERHANGİ bir layer'ı (specificity'den bağımsız)
|
|
247
|
+
* yener (CSS cascade layers spec) — bu yüzden burada `@layer` kullanmak bu
|
|
248
|
+
* override'ı tamamen etkisiz bırakırdı. `.is-closing`, `DialogService.open()`'ın
|
|
249
|
+
* `closePredicate`'i tarafından panelin kendi `animate-dialog-out`/
|
|
250
|
+
* `animate-sheet-out`'uyla AYNI anda eklenir (backdrop ham DOM elemanı — CDK
|
|
251
|
+
* yönetiyor, Angular template'ine bağlanamıyor, bu yüzden imperatif class
|
|
252
|
+
* toggle kaçınılmaz).
|
|
253
|
+
*
|
|
254
|
+
* Karartma + blur miktarı 2026-09 Deep Emerald geçişinde eklendi (eskiden
|
|
255
|
+
* backdrop hiç karartmıyordu, sadece 2px blur veriyordu) — mikro
|
|
256
|
+
* glassmorphism'in bir parçası: panel `glassSurface` ile yarı saydamken
|
|
257
|
+
* arkadaki içerik hem karartılıp hem bulanıklaştırılmazsa panel içeriğiyle
|
|
258
|
+
* karışır. `color-mix()` (Tailwind'in `/40` opaklık modifier'ı unlayered
|
|
259
|
+
* kuralda çalışmıyor, bu yüzden elle) `--color-neutral-975`'i kullanıyor —
|
|
260
|
+
* moda göre otomatik doğru koyulukta.
|
|
261
|
+
*/
|
|
262
|
+
.mf-dialog-backdrop {
|
|
263
|
+
transition-duration: var(--duration-base);
|
|
264
|
+
background-color: color-mix(in srgb, var(--color-neutral-975) 40%, transparent);
|
|
265
|
+
backdrop-filter: blur(4px);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
@media (prefers-reduced-transparency: reduce) {
|
|
269
|
+
.mf-dialog-backdrop {
|
|
270
|
+
background-color: color-mix(in srgb, var(--color-neutral-975) 55%, transparent);
|
|
271
|
+
backdrop-filter: none;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
.mf-dialog-backdrop.is-closing {
|
|
276
|
+
opacity: 0;
|
|
277
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* mesgflow — radius + kontrol geometrisi token'ları.
|
|
3
|
+
*
|
|
4
|
+
* Radius iç içe (nested) bir ölçek: Tailwind'in stok skalasını (xs 2px …
|
|
5
|
+
* xl 12px) bir basamak yukarı kaydırır (xs→4px … xl→16px): KAPSAYICILAR
|
|
6
|
+
* (kart/panel/tablo/dropdown) `rounded-lg`, KONTROLLER (buton/input/select)
|
|
7
|
+
* `rounded-md` kullanır — kart 12px, içindeki buton 8px, gerçek "nested
|
|
8
|
+
* radius".
|
|
9
|
+
*/
|
|
10
|
+
@theme {
|
|
11
|
+
--radius-xs: 4px;
|
|
12
|
+
--radius-sm: 6px;
|
|
13
|
+
--radius-md: 8px;
|
|
14
|
+
--radius-lg: 12px;
|
|
15
|
+
--radius-xl: 16px;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/*
|
|
19
|
+
* Kontrol yüksekliği — TEK kaynak (bkz. plan Faz 1a/1b). Öncesinde her
|
|
20
|
+
* kontrol kendi `h-8`/`h-9`/`h-10` sabitini elle taşıyordu (9 farklı yer,
|
|
21
|
+
* aralarında 1-2px'lik kasıtsız sapmalar vardı) — `core/recipes.ts`'teki
|
|
22
|
+
* `controlSize` bu üçünü tüketir, tek tek bileşenler artık `h-*` YAZMAZ.
|
|
23
|
+
* `Button`'ın kendi `size` ekseni (`button.variants.ts`) BİLEREK bunlara
|
|
24
|
+
* eşit: `md` 36px (Button'ın sıkılaştırılmış yoğunluğu, bkz. o dosyanın
|
|
25
|
+
* notu) — Input/Select/Checkbox gibi yanına dizilen kontroller Button'la
|
|
26
|
+
* AYNI hizada dursun diye.
|
|
27
|
+
*/
|
|
28
|
+
@theme {
|
|
29
|
+
--control-h-sm: 2rem; /* 32px */
|
|
30
|
+
--control-h-md: 2.25rem; /* 36px */
|
|
31
|
+
--control-h-lg: 2.5rem; /* 40px */
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
@utility h-control-sm {
|
|
35
|
+
height: var(--control-h-sm);
|
|
36
|
+
}
|
|
37
|
+
@utility h-control-md {
|
|
38
|
+
height: var(--control-h-md);
|
|
39
|
+
}
|
|
40
|
+
@utility h-control-lg {
|
|
41
|
+
height: var(--control-h-lg);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/*
|
|
45
|
+
* Yoğunluk — bir alt ağacı (ör. yoğun bir veri paneli) sıkılaştırmak veya
|
|
46
|
+
* gevşetmek için `data-density="compact|comfortable"`. Kit genelinde
|
|
47
|
+
* `applyMfTheme({ density })` AYNI değerleri kök elemana yazar (bkz.
|
|
48
|
+
* theming/apply.ts `CONTROL_H_PX` — iki tablo senkron tutulmalı). İkon
|
|
49
|
+
* butonları `aspect-square` taşıdığı için yükseklikle birlikte kare kalır.
|
|
50
|
+
*/
|
|
51
|
+
@layer base {
|
|
52
|
+
[data-density='compact'] {
|
|
53
|
+
--control-h-sm: 1.75rem; /* 28px */
|
|
54
|
+
--control-h-md: 2rem; /* 32px */
|
|
55
|
+
--control-h-lg: 2.25rem; /* 36px */
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
[data-density='default'] {
|
|
59
|
+
--control-h-sm: 2rem;
|
|
60
|
+
--control-h-md: 2.25rem;
|
|
61
|
+
--control-h-lg: 2.5rem;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
[data-density='comfortable'] {
|
|
65
|
+
--control-h-sm: 2.25rem; /* 36px */
|
|
66
|
+
--control-h-md: 2.5rem; /* 40px */
|
|
67
|
+
--control-h-lg: 2.75rem; /* 44px */
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* mesgflow — tipografi token'ları: font aileleri + stok text-xs/sm/base
|
|
3
|
+
* ÜSTÜNE eklenen ölçek + `html`/`body` taban render ayarları.
|
|
4
|
+
*/
|
|
5
|
+
@theme {
|
|
6
|
+
/*
|
|
7
|
+
* Tipografi: başlık/display = Space Grotesk, gövde/UI = Inter, veri/tablo
|
|
8
|
+
* = JetBrains Mono (tabular figures). Bu fontların KENDİSİ pakete dahil
|
|
9
|
+
* DEĞİL — tüketici proje kendi seçtiği fontu yükler (self-hosted/CDN),
|
|
10
|
+
* burada sadece isim/fallback zinciri tanımlı.
|
|
11
|
+
*/
|
|
12
|
+
--font-sans: 'Inter Variable', 'Inter', ui-sans-serif, system-ui, sans-serif;
|
|
13
|
+
--font-display: 'Space Grotesk Variable', 'Space Grotesk', ui-sans-serif, system-ui, sans-serif;
|
|
14
|
+
--font-mono:
|
|
15
|
+
'JetBrains Mono Variable', 'JetBrains Mono', ui-monospace, 'Cascadia Code', monospace;
|
|
16
|
+
|
|
17
|
+
/*
|
|
18
|
+
* ─────────────────────────────────────────────────────────────────────
|
|
19
|
+
* TİPOGRAFİ ÖLÇEĞİ — stok text-xs/sm/base ÜSTÜNE ekleniyor. `eyebrow`
|
|
20
|
+
* bu tazelemenin imza öğelerinden biri: mono + büyük harf + geniş
|
|
21
|
+
* tracking, tablo başlıkları ve bölüm etiketlerinde kullanılır.
|
|
22
|
+
*
|
|
23
|
+
* `label`/`caption` — kontrol etiketleri (Field label, form yardımcı
|
|
24
|
+
* metni) için stok `text-xs`/`text-sm`'in arasında kalan, biraz daha
|
|
25
|
+
* sıkı satır yüksekliğine sahip bir çift (bkz. plan Faz 1a). `label`
|
|
26
|
+
* `text-sm`'e (0.875rem) çok yakın ama `font-weight`ı sabit taşıyor —
|
|
27
|
+
* tüketici `font-medium` eklemeden Field etiketleriyle birebir eşleşir.
|
|
28
|
+
*/
|
|
29
|
+
--text-label: 0.8125rem;
|
|
30
|
+
--text-label--line-height: 1.3;
|
|
31
|
+
--text-label--font-weight: 500;
|
|
32
|
+
/* Spec: "küçük başlık/buton harf aralığını %1-2 açmak daha okunur/lüks gösterir" — Field label'a hafif tracking. */
|
|
33
|
+
--text-label--letter-spacing: 0.01em;
|
|
34
|
+
|
|
35
|
+
--text-caption: 0.6875rem;
|
|
36
|
+
--text-caption--line-height: 1.3;
|
|
37
|
+
|
|
38
|
+
--text-eyebrow: 0.6875rem;
|
|
39
|
+
--text-eyebrow--line-height: 1.2;
|
|
40
|
+
--text-eyebrow--letter-spacing: 0.12em;
|
|
41
|
+
--text-eyebrow--font-weight: 600;
|
|
42
|
+
|
|
43
|
+
/*
|
|
44
|
+
* Buton/küçük-başlık tracking'i (spec "Tipografi ve Mikrokontrast") —
|
|
45
|
+
* `text-eyebrow`in kendi (mono+uppercase) tracking'inden AYRI, daha
|
|
46
|
+
* hafif bir açılma: Button base class'ı `tracking-label` kullanır.
|
|
47
|
+
*/
|
|
48
|
+
--tracking-label: 0.015em;
|
|
49
|
+
|
|
50
|
+
--text-title-sm: 0.9375rem;
|
|
51
|
+
--text-title-sm--line-height: 1.4;
|
|
52
|
+
--text-title-sm--letter-spacing: -0.006em;
|
|
53
|
+
|
|
54
|
+
--text-title: 1.125rem;
|
|
55
|
+
--text-title--line-height: 1.35;
|
|
56
|
+
--text-title--letter-spacing: -0.012em;
|
|
57
|
+
|
|
58
|
+
--text-title-lg: 1.375rem;
|
|
59
|
+
--text-title-lg--line-height: 1.25;
|
|
60
|
+
--text-title-lg--letter-spacing: -0.018em;
|
|
61
|
+
|
|
62
|
+
/*
|
|
63
|
+
* Display basamakları AKIŞKAN — dar ekranda bir basamak küçülür, geniş
|
|
64
|
+
* ekranda eski sabit değerine (30px / 40px) oturur. `rem` tabanı içerdiği
|
|
65
|
+
* için tarayıcı yakınlaştırması ölçeği hâlâ büyütür (WCAG 1.4.4).
|
|
66
|
+
*/
|
|
67
|
+
--text-display: clamp(1.5rem, 1.25rem + 1.1vw, 1.875rem);
|
|
68
|
+
--text-display--line-height: 1.15;
|
|
69
|
+
--text-display--letter-spacing: -0.026em;
|
|
70
|
+
|
|
71
|
+
--text-display-lg: clamp(1.875rem, 1.4rem + 2vw, 2.5rem);
|
|
72
|
+
--text-display-lg--line-height: 1.08;
|
|
73
|
+
--text-display-lg--letter-spacing: -0.03em;
|
|
74
|
+
|
|
75
|
+
--text-metric: 1.75rem;
|
|
76
|
+
--text-metric--line-height: 1;
|
|
77
|
+
--text-metric--letter-spacing: -0.02em;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/*
|
|
81
|
+
* Tüketici uygulama `--font-sans`'ı kendi seçtiği şekilde yükler (self-hosted/
|
|
82
|
+
* CDN) — burada sadece `body`'ye uygulanması garanti ediliyor. Preflight
|
|
83
|
+
* (Tailwind) sadece jenerik bir sistem-fontu yığını verir.
|
|
84
|
+
*
|
|
85
|
+
* `body`'nin zemin/metin rengi de burada varsayılan olarak `--mf-canvas`/
|
|
86
|
+
* `--mf-fg`'ye bağlanıyor (`@theme inline`'daki `--color-canvas`/`--color-fg`
|
|
87
|
+
* DEĞİL, doğrudan `--mf-*` — inline theme değişkenleri "kullanılmıyor"
|
|
88
|
+
* gerekçesiyle CSS'e emit edilmeyebiliyor) — tüketici `bg-canvas`/`text-fg`
|
|
89
|
+
* class'ını hiç yazmasa bile sayfa ilk boyamada doğru zeminde açılır, beyaz
|
|
90
|
+
* flaş olmaz. Font rendering ayarları Inter/Space Grotesk/JetBrains Mono'nun
|
|
91
|
+
* varsayılan ligature/contextual-alternate/tek-katlı-"a" (cv11) davranışını
|
|
92
|
+
* AÇIKÇA sabitliyor — tarayıcıdan tarayıcıya sessizce değişen bir varsayılana
|
|
93
|
+
* bırakmak yerine.
|
|
94
|
+
*/
|
|
95
|
+
@layer base {
|
|
96
|
+
html {
|
|
97
|
+
-webkit-font-smoothing: antialiased;
|
|
98
|
+
-moz-osx-font-smoothing: grayscale;
|
|
99
|
+
text-rendering: optimizeLegibility;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
body {
|
|
103
|
+
font-family: var(--font-sans);
|
|
104
|
+
background-color: var(--mf-canvas);
|
|
105
|
+
color: var(--mf-fg);
|
|
106
|
+
/* Inter 4 değişken fontunun `opsz` ekseni — büyük başlıklarda sıkı "display" kesimi, küçük metinde açık kesim, otomatik. */
|
|
107
|
+
font-optical-sizing: auto;
|
|
108
|
+
font-feature-settings:
|
|
109
|
+
'liga' 1,
|
|
110
|
+
'calt' 1,
|
|
111
|
+
'cv11' 1;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/*
|
|
115
|
+
* Satır kırılımı — başlıklarda satırları dengeler (tek kelimelik yetim son
|
|
116
|
+
* satır olmaz), gövdede son satırdaki yetimi önler. `:where()` ile SIFIR
|
|
117
|
+
* özgüllük: tüketicinin herhangi bir `text-wrap`/`text-balance` class'ı
|
|
118
|
+
* bunu ezer. Desteklemeyen tarayıcıda normal kırılıma düşer.
|
|
119
|
+
*/
|
|
120
|
+
:where(h1, h2, h3, h4, h5, h6, [role='heading'], legend, figcaption) {
|
|
121
|
+
text-wrap: balance;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
:where(p, li, dd, blockquote) {
|
|
125
|
+
text-wrap: pretty;
|
|
126
|
+
}
|
|
127
|
+
}
|
package/tokens.css
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* mesgflow — tasarım token'ları.
|
|
3
|
+
*
|
|
4
|
+
* Bu dosya kütüphanenin TÜM görsel kararlarının (renk/radius/tipografi/hareket/
|
|
5
|
+
* gölge) kaynağı — bileşenlerin cva şemaları `bg-surface`/`text-fg`/`shadow-1`
|
|
6
|
+
* gibi Tailwind utility'lerine derleniyor, bu utility'ler ise `tokens/*.css`
|
|
7
|
+
* altında tanımlı `@theme` token'larına bağlı. Tüketici proje bu dosyayı
|
|
8
|
+
* KENDİ Tailwind v4 giriş noktasından (`@import "tailwindcss";` satırlarından
|
|
9
|
+
* SONRA) import etmeden bileşenler stilsiz kalır — bkz. kütüphane README'sindeki
|
|
10
|
+
* kurulum listesi.
|
|
11
|
+
*
|
|
12
|
+
* Beş dosyaya bölünmüş (bkz. plan Faz 1a — tek bir 550+ satırlık dosya yerine
|
|
13
|
+
* her ilgi alanı kendi dosyasında): `color` (ramplar + rol katmanı + dark
|
|
14
|
+
* mode), `typography` (font aileleri + ölçek + `html`/`body` taban),
|
|
15
|
+
* `radius` (köşe + kontrol yüksekliği), `elevation` (gölge rolleri),
|
|
16
|
+
* `motion` (süre/eğri + hazır animasyonlar). Sıra ÖNEMLİ değil — her dosya
|
|
17
|
+
* kendi `@theme`/`@layer base` bloklarını taşıyor, aralarında çapraz bağımlılık
|
|
18
|
+
* yok (`color.css`'teki `@custom-variant dark` hariç, o da yalnızca dosyanın
|
|
19
|
+
* KENDİ `.dark` seçicisi için gerekli, diğer dosyalar onu kullanmadan önce
|
|
20
|
+
* bu dosyanın import sırası zaten garanti).
|
|
21
|
+
*
|
|
22
|
+
* Dark mode class tabanlı çalışır (sistem tercihine değil, tüketici uygulamanın
|
|
23
|
+
* `<html>` (veya başka bir kök) elemanına kendi eklediği `.dark` class'ına göre).
|
|
24
|
+
*
|
|
25
|
+
* **Tüketici projede bu tek import YETMEZ** — Tailwind v4'ün otomatik kaynak
|
|
26
|
+
* taraması `node_modules`'ı ATLAR, bu paketin cva/şablon class'ları
|
|
27
|
+
* (`hover:bg-primary-700`, `disabled:opacity-50`, `sr-only`, `w-64`,
|
|
28
|
+
* `peer-checked:*`, `animate-*`, vb.) `node_modules/@mesgflow/ui-kit/fesm2022/*.mjs`
|
|
29
|
+
* içinde yaşıyor ve bu satır TEK BAŞINA onları derletmez. Tüketici kendi
|
|
30
|
+
* Tailwind giriş dosyasına ayrıca `@source "../node_modules/@mesgflow/ui-kit/
|
|
31
|
+
* fesm2022/*.mjs";` eklemeli — bkz. README.md "Stil kurulumu". Bu olmadan
|
|
32
|
+
* bileşenler "yarım stilli" görünür (hover/disabled/focus'suz düz butonlar,
|
|
33
|
+
* kayması olmayan switch, genişliği olmayan sidebar).
|
|
34
|
+
*/
|
|
35
|
+
@import './tokens/color.css';
|
|
36
|
+
@import './tokens/typography.css';
|
|
37
|
+
@import './tokens/radius.css';
|
|
38
|
+
@import './tokens/elevation.css';
|
|
39
|
+
@import './tokens/motion.css';
|
|
40
|
+
/* Erişilebilirlik modları (prefers-contrast / forced-colors) — color.css'in rol bloklarını ezer, bu yüzden SONDA kalmalı. */
|
|
41
|
+
@import './tokens/contrast.css';
|