@mesgflow/ui-kit 0.6.0 → 0.8.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/README.md +56 -5
- package/fesm2022/mesgflow-ui-kit-accordion.mjs +9 -8
- package/fesm2022/mesgflow-ui-kit-accordion.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-agenda.mjs +208 -0
- package/fesm2022/mesgflow-ui-kit-agenda.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-alert.mjs +3 -3
- package/fesm2022/mesgflow-ui-kit-aspect-ratio.mjs +37 -0
- package/fesm2022/mesgflow-ui-kit-aspect-ratio.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-avatar-group.mjs +3 -3
- package/fesm2022/mesgflow-ui-kit-avatar.mjs +3 -3
- package/fesm2022/mesgflow-ui-kit-badge.mjs +3 -3
- package/fesm2022/mesgflow-ui-kit-banner.mjs +3 -3
- package/fesm2022/mesgflow-ui-kit-blocks.mjs +207 -0
- package/fesm2022/mesgflow-ui-kit-blocks.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-box-input.mjs +4 -4
- package/fesm2022/mesgflow-ui-kit-box-input.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-brand.mjs +3 -3
- package/fesm2022/mesgflow-ui-kit-breadcrumb.mjs +3 -3
- package/fesm2022/mesgflow-ui-kit-button-group.mjs +3 -3
- package/fesm2022/mesgflow-ui-kit-button.mjs +190 -244
- package/fesm2022/mesgflow-ui-kit-button.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-card.mjs +48 -27
- package/fesm2022/mesgflow-ui-kit-card.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-carousel.mjs +308 -0
- package/fesm2022/mesgflow-ui-kit-carousel.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-chart.mjs +12 -12
- package/fesm2022/mesgflow-ui-kit-checkbox.mjs +18 -23
- package/fesm2022/mesgflow-ui-kit-checkbox.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-chip.mjs +5 -5
- package/fesm2022/mesgflow-ui-kit-chip.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-code-block.mjs +11 -7
- package/fesm2022/mesgflow-ui-kit-code-block.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-collapsible.mjs +9 -9
- package/fesm2022/mesgflow-ui-kit-color-picker.mjs +9 -7
- package/fesm2022/mesgflow-ui-kit-color-picker.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-combobox.mjs +147 -67
- package/fesm2022/mesgflow-ui-kit-combobox.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-command.mjs +15 -16
- package/fesm2022/mesgflow-ui-kit-command.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-context-menu.mjs +7 -9
- package/fesm2022/mesgflow-ui-kit-context-menu.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-copy-button.mjs +6 -6
- package/fesm2022/mesgflow-ui-kit-core.mjs +446 -128
- package/fesm2022/mesgflow-ui-kit-core.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-countdown.mjs +149 -0
- package/fesm2022/mesgflow-ui-kit-countdown.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-date-picker.mjs +140 -19
- package/fesm2022/mesgflow-ui-kit-date-picker.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-description-list.mjs +3 -3
- package/fesm2022/mesgflow-ui-kit-dialog.mjs +310 -64
- package/fesm2022/mesgflow-ui-kit-dialog.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-divider.mjs +3 -3
- package/fesm2022/mesgflow-ui-kit-drawer.mjs +109 -0
- package/fesm2022/mesgflow-ui-kit-drawer.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-dropzone.mjs +6 -6
- package/fesm2022/mesgflow-ui-kit-dropzone.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-empty-state.mjs +3 -3
- package/fesm2022/mesgflow-ui-kit-field.mjs +55 -14
- package/fesm2022/mesgflow-ui-kit-field.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-file-upload.mjs +356 -0
- package/fesm2022/mesgflow-ui-kit-file-upload.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-hover-card.mjs +6 -6
- package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs +135 -0
- package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-icon.mjs +8 -3
- package/fesm2022/mesgflow-ui-kit-icon.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-icons-lucide.mjs +371 -0
- package/fesm2022/mesgflow-ui-kit-icons-lucide.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-inline-edit.mjs +279 -0
- package/fesm2022/mesgflow-ui-kit-inline-edit.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-input.mjs +162 -19
- package/fesm2022/mesgflow-ui-kit-input.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-kbd.mjs +3 -3
- package/fesm2022/mesgflow-ui-kit-lightbox.mjs +299 -0
- package/fesm2022/mesgflow-ui-kit-lightbox.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-link.mjs +5 -5
- package/fesm2022/mesgflow-ui-kit-link.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-listbox.mjs +151 -0
- package/fesm2022/mesgflow-ui-kit-listbox.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-mention.mjs +283 -0
- package/fesm2022/mesgflow-ui-kit-mention.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-menu.mjs +178 -14
- package/fesm2022/mesgflow-ui-kit-menu.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-nav-menu.mjs +276 -0
- package/fesm2022/mesgflow-ui-kit-nav-menu.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-notification-center.mjs +281 -0
- package/fesm2022/mesgflow-ui-kit-notification-center.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-number-input.mjs +9 -6
- package/fesm2022/mesgflow-ui-kit-number-input.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-otp-input.mjs +3 -3
- package/fesm2022/mesgflow-ui-kit-page-header.mjs +6 -6
- package/fesm2022/mesgflow-ui-kit-pagination.mjs +7 -6
- package/fesm2022/mesgflow-ui-kit-pagination.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-password-input.mjs +38 -68
- package/fesm2022/mesgflow-ui-kit-password-input.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-popover.mjs +12 -52
- package/fesm2022/mesgflow-ui-kit-popover.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-progress.mjs +164 -23
- package/fesm2022/mesgflow-ui-kit-progress.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-qr-code.mjs +766 -0
- package/fesm2022/mesgflow-ui-kit-qr-code.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-radio.mjs +10 -12
- package/fesm2022/mesgflow-ui-kit-radio.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-rating.mjs +4 -4
- package/fesm2022/mesgflow-ui-kit-rating.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-scroll-area.mjs +3 -3
- package/fesm2022/mesgflow-ui-kit-search-input.mjs +11 -7
- package/fesm2022/mesgflow-ui-kit-search-input.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-segmented-control.mjs +15 -11
- package/fesm2022/mesgflow-ui-kit-segmented-control.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-select.mjs +6 -5
- package/fesm2022/mesgflow-ui-kit-select.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-sidebar.mjs +24 -21
- package/fesm2022/mesgflow-ui-kit-sidebar.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-skeleton.mjs +6 -5
- package/fesm2022/mesgflow-ui-kit-skeleton.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-slider.mjs +253 -6
- package/fesm2022/mesgflow-ui-kit-slider.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-sortable.mjs +526 -0
- package/fesm2022/mesgflow-ui-kit-sortable.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-spinner.mjs +44 -15
- package/fesm2022/mesgflow-ui-kit-spinner.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-split-button.mjs +205 -0
- package/fesm2022/mesgflow-ui-kit-split-button.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-splitter.mjs +213 -6
- package/fesm2022/mesgflow-ui-kit-splitter.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-stat-tile.mjs +13 -6
- package/fesm2022/mesgflow-ui-kit-stat-tile.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-stepper.mjs +171 -64
- package/fesm2022/mesgflow-ui-kit-stepper.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-switch.mjs +4 -4
- package/fesm2022/mesgflow-ui-kit-switch.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-table.mjs +34 -28
- package/fesm2022/mesgflow-ui-kit-table.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-tabs.mjs +421 -180
- package/fesm2022/mesgflow-ui-kit-tabs.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-tag-input.mjs +9 -4
- package/fesm2022/mesgflow-ui-kit-tag-input.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-theme-switcher.mjs +3 -3
- package/fesm2022/mesgflow-ui-kit-theming.mjs +7 -7
- package/fesm2022/mesgflow-ui-kit-theming.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-time-picker.mjs +6 -6
- package/fesm2022/mesgflow-ui-kit-time-picker.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-timeline.mjs +3 -3
- package/fesm2022/mesgflow-ui-kit-toast.mjs +118 -35
- package/fesm2022/mesgflow-ui-kit-toast.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-toggle.mjs +12 -11
- package/fesm2022/mesgflow-ui-kit-toggle.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-toolbar.mjs +13 -11
- package/fesm2022/mesgflow-ui-kit-toolbar.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-tooltip.mjs +76 -53
- package/fesm2022/mesgflow-ui-kit-tooltip.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-tour.mjs +17 -29
- package/fesm2022/mesgflow-ui-kit-tour.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-transfer-list.mjs +288 -0
- package/fesm2022/mesgflow-ui-kit-transfer-list.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit-tree-select.mjs +3 -3
- package/fesm2022/mesgflow-ui-kit-tree.mjs +4 -4
- package/fesm2022/mesgflow-ui-kit-tree.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-virtual-list.mjs +109 -0
- package/fesm2022/mesgflow-ui-kit-virtual-list.mjs.map +1 -0
- package/fesm2022/mesgflow-ui-kit.mjs +93 -12836
- package/fesm2022/mesgflow-ui-kit.mjs.map +1 -1
- package/package.json +91 -3
- package/schematics/collection.json +10 -0
- package/schematics/migration.json +10 -0
- package/schematics/migrations/v0-7.cjs +70 -0
- package/schematics/ng-add/index.cjs +234 -0
- package/schematics/ng-add/schema.json +43 -0
- package/tokens/color.css +96 -0
- package/tokens/controls.css +145 -0
- package/tokens/elevation.css +62 -6
- package/tokens/motion.css +304 -66
- package/tokens/radius.css +14 -0
- package/tokens.css +1 -0
- package/tokens.json +1583 -0
- package/types/mesgflow-ui-kit-agenda.d.ts +49 -0
- package/types/mesgflow-ui-kit-aspect-ratio.d.ts +18 -0
- package/types/mesgflow-ui-kit-blocks.d.ts +128 -0
- package/types/mesgflow-ui-kit-button.d.ts +23 -38
- package/types/mesgflow-ui-kit-card.d.ts +26 -16
- package/types/mesgflow-ui-kit-carousel.d.ts +51 -0
- package/types/mesgflow-ui-kit-checkbox.d.ts +8 -5
- package/types/mesgflow-ui-kit-code-block.d.ts +4 -1
- package/types/mesgflow-ui-kit-combobox.d.ts +47 -22
- package/types/mesgflow-ui-kit-command.d.ts +2 -2
- package/types/mesgflow-ui-kit-core.d.ts +279 -21
- package/types/mesgflow-ui-kit-countdown.d.ts +47 -0
- package/types/mesgflow-ui-kit-date-picker.d.ts +31 -1
- package/types/mesgflow-ui-kit-dialog.d.ts +122 -14
- package/types/mesgflow-ui-kit-drawer.d.ts +45 -0
- package/types/mesgflow-ui-kit-field.d.ts +17 -8
- package/types/mesgflow-ui-kit-file-upload.d.ts +64 -0
- package/types/mesgflow-ui-kit-hover-card.d.ts +2 -2
- package/types/mesgflow-ui-kit-icons-lucide.d.ts +27 -0
- package/types/mesgflow-ui-kit-inline-edit.d.ts +42 -0
- package/types/mesgflow-ui-kit-input.d.ts +64 -2
- package/types/mesgflow-ui-kit-lightbox.d.ts +54 -0
- package/types/mesgflow-ui-kit-listbox.d.ts +30 -0
- package/types/mesgflow-ui-kit-mention.d.ts +59 -0
- package/types/mesgflow-ui-kit-menu.d.ts +41 -2
- package/types/mesgflow-ui-kit-nav-menu.d.ts +58 -0
- package/types/mesgflow-ui-kit-notification-center.d.ts +41 -0
- package/types/mesgflow-ui-kit-number-input.d.ts +3 -1
- package/types/mesgflow-ui-kit-password-input.d.ts +35 -5
- package/types/mesgflow-ui-kit-popover.d.ts +13 -5
- package/types/mesgflow-ui-kit-progress.d.ts +33 -12
- package/types/mesgflow-ui-kit-qr-code.d.ts +160 -0
- package/types/mesgflow-ui-kit-radio.d.ts +2 -2
- package/types/mesgflow-ui-kit-search-input.d.ts +3 -1
- package/types/mesgflow-ui-kit-segmented-control.d.ts +4 -0
- package/types/mesgflow-ui-kit-sidebar.d.ts +1 -1
- package/types/mesgflow-ui-kit-slider.d.ts +60 -1
- package/types/mesgflow-ui-kit-sortable.d.ts +103 -0
- package/types/mesgflow-ui-kit-spinner.d.ts +5 -8
- package/types/mesgflow-ui-kit-split-button.d.ts +47 -0
- package/types/mesgflow-ui-kit-splitter.d.ts +64 -1
- package/types/mesgflow-ui-kit-stat-tile.d.ts +3 -0
- package/types/mesgflow-ui-kit-stepper.d.ts +54 -32
- package/types/mesgflow-ui-kit-table.d.ts +2 -0
- package/types/mesgflow-ui-kit-tabs.d.ts +193 -93
- package/types/mesgflow-ui-kit-tag-input.d.ts +3 -1
- package/types/mesgflow-ui-kit-toast.d.ts +48 -22
- package/types/mesgflow-ui-kit-tooltip.d.ts +15 -12
- package/types/mesgflow-ui-kit-transfer-list.d.ts +34 -0
- package/types/mesgflow-ui-kit-virtual-list.d.ts +35 -0
- package/types/mesgflow-ui-kit.d.ts +88 -5444
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mesgflow-ui-kit-theming.mjs","sources":["../../../projects/ui-kit/theming/color-math.ts","../../../projects/ui-kit/theming/ramp.ts","../../../projects/ui-kit/theming/theme-json.ts","../../../projects/ui-kit/theming/apply.ts","../../../projects/ui-kit/theming/validate.ts","../../../projects/ui-kit/theming/schema.ts","../../../projects/ui-kit/theming/transition.ts","../../../projects/ui-kit/theming/color-mode.ts","../../../projects/ui-kit/theming/index.ts","../../../projects/ui-kit/theming/mesgflow-ui-kit-theming.ts"],"sourcesContent":["/**\r\n * mesgflow — OKLCH renk matematigi (Bjorn Ottosson formulleri,\r\n * https://bottosson.github.io/posts/oklab/). BAGIMSIZ (culori vb. bir\r\n * kutuphane YOK, bkz. plan Faz 2) — yalnizca `theming/ramp.ts`'in ihtiyaci\r\n * kadar: hex <-> OKLCH donusumu + basit gamut-kirpma. Bu dosya PUBLIC API\r\n * DEGIL, `theming/index.ts` bunu re-export ETMEZ.\r\n */\r\n\r\nexport interface Oklch {\r\n l: number;\r\n c: number;\r\n /** Derece (0-360). */\r\n h: number;\r\n}\r\n\r\nfunction srgbToLinear(c8: number): number {\r\n const v = c8 / 255;\r\n return v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\r\n}\r\n\r\nfunction linearToSrgb8(v: number): number {\r\n const clamped = Math.min(1, Math.max(0, v));\r\n const c = clamped <= 0.0031308 ? clamped * 12.92 : 1.055 * Math.pow(clamped, 1 / 2.4) - 0.055;\r\n return Math.round(c * 255);\r\n}\r\n\r\nfunction linearRgbToOklab(r: number, g: number, b: number): [number, number, number] {\r\n const l = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b;\r\n const m = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b;\r\n const s = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b;\r\n const l_ = Math.cbrt(l);\r\n const m_ = Math.cbrt(m);\r\n const s_ = Math.cbrt(s);\r\n return [\r\n 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_,\r\n 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_,\r\n 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_,\r\n ];\r\n}\r\n\r\nfunction oklabToLinearRgb(L: number, a: number, b: number): [number, number, number] {\r\n const l_ = L + 0.3963377774 * a + 0.2158037573 * b;\r\n const m_ = L - 0.1055613458 * a - 0.0638541728 * b;\r\n const s_ = L - 0.0894841775 * a - 1.291485548 * b;\r\n const l = l_ * l_ * l_;\r\n const m = m_ * m_ * m_;\r\n const s = s_ * s_ * s_;\r\n return [\r\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\r\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\r\n -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,\r\n ];\r\n}\r\n\r\n/** `#rgb`/`#rrggbb` -> `[r,g,b]` (0-255). Gecersiz girdi icin `[0,0,0]` (cagiran `parseHex` ile once dogrular). */\r\nexport function hexToRgb(hex: string): [number, number, number] {\r\n const clean = hex.trim().replace('#', '');\r\n const full =\r\n clean.length === 3\r\n ? clean\r\n .split('')\r\n .map((c) => c + c)\r\n .join('')\r\n : clean;\r\n const num = parseInt(full, 16);\r\n if (Number.isNaN(num)) return [0, 0, 0];\r\n return [(num >> 16) & 255, (num >> 8) & 255, num & 255];\r\n}\r\n\r\nexport function rgbToHex(r: number, g: number, b: number): string {\r\n const toHex = (n: number) =>\r\n Math.round(Math.min(255, Math.max(0, n)))\r\n .toString(16)\r\n .padStart(2, '0');\r\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\r\n}\r\n\r\n/** `/^#([0-9a-f]{3}|[0-9a-f]{6})$/i` — `createAccentRamp`/`applyMfTheme`'in girdi dogrulamasi icin. */\r\nexport function isValidHex(hex: string): boolean {\r\n return /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.test(hex.trim());\r\n}\r\n\r\nexport function hexToOklch(hex: string): Oklch {\r\n const [r8, g8, b8] = hexToRgb(hex);\r\n const r = srgbToLinear(r8);\r\n const g = srgbToLinear(g8);\r\n const b = srgbToLinear(b8);\r\n const [L, a, bLab] = linearRgbToOklab(r, g, b);\r\n const c = Math.sqrt(a * a + bLab * bLab);\r\n let h = (Math.atan2(bLab, a) * 180) / Math.PI;\r\n if (h < 0) h += 360;\r\n return { l: L, c, h };\r\n}\r\n\r\n/**\r\n * OKLCH -> hex, basit gamut-kirpma ile: sRGB disina tasan L/C/H kombinasyonlari\r\n * icin kroma kademeli olarak (%92 adimlarla) azaltilir ta ki her kanal [0,1]\r\n * araligina girene kadar (en fazla 24 deneme — pratikte 5-6 yeter). Tam bir\r\n * gamut-mapping algoritmasi DEGIL (ör. CSS Color 4'un \"CSS Gamut Mapping\"i)\r\n * ama bir tema uretici icin yeterli: sonuc HER ZAMAN gecerli bir sRGB hex,\r\n * ton hafifce kayabilir (asiri doygun girdilerde) ama asla clamp-artefact'i\r\n * (yanlis renk) uretmez.\r\n */\r\nexport function oklchToHex(l: number, c: number, h: number): string {\r\n const hRad = (h * Math.PI) / 180;\r\n let chroma = c;\r\n for (let i = 0; i < 24; i++) {\r\n const a = chroma * Math.cos(hRad);\r\n const b = chroma * Math.sin(hRad);\r\n const [r, g, bl] = oklabToLinearRgb(l, a, b);\r\n const inGamut = [r, g, bl].every((v) => v >= -0.001 && v <= 1.001);\r\n if (inGamut || chroma <= 0.0001) {\r\n return rgbToHex(linearToSrgb8(r), linearToSrgb8(g), linearToSrgb8(bl));\r\n }\r\n chroma *= 0.92;\r\n }\r\n const [r, g, bl] = oklabToLinearRgb(l, 0, 0);\r\n return rgbToHex(linearToSrgb8(r), linearToSrgb8(g), linearToSrgb8(bl));\r\n}\r\n\r\n/** WCAG göreli parlaklık (0-1) — `pickForeground`'ın kontrast oranı hesabının temeli. (`npm run check:contrast`, `scripts/check-contrast.mjs`, kitten BAĞIMSIZ kendi kopyasını taşır — aynı formül, farklı dosya.) */\r\nexport function relativeLuminance(hex: string): number {\r\n const [r8, g8, b8] = hexToRgb(hex);\r\n const lin = (c8: number) => {\r\n const v = c8 / 255;\r\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\r\n };\r\n return 0.2126 * lin(r8) + 0.7152 * lin(g8) + 0.0722 * lin(b8);\r\n}\r\n\r\n/** İki hex arası WCAG kontrast oranı (1-21). */\r\nexport function contrastRatio(hexA: string, hexB: string): number {\r\n const lA = relativeLuminance(hexA);\r\n const lB = relativeLuminance(hexB);\r\n const lighter = Math.max(lA, lB);\r\n const darker = Math.min(lA, lB);\r\n return (lighter + 0.05) / (darker + 0.05);\r\n}\r\n\r\n/** `background` üstünde `light`/`dark` metninden HANGİSİ daha kontrastlıysa onu döner — `fgOnAccent` bunu kullanır. */\r\nexport function pickForeground(background: string, light: string, dark: string): string {\r\n return contrastRatio(background, light) >= contrastRatio(background, dark) ? light : dark;\r\n}\r\n\r\n/** `a`/`b` hex'lerini `t` (0-1) oranında karıştırır — `neutralTint`'in ince renk katması için (OKLCH DEĞİL, düz sRGB lerp: küçük `t` değerlerinde (≤0.08) fark edilmez, 13 basamaklı nötr rampayı yeniden OKLCH'de üretmekten çok daha basit ve güvenli). */\r\nexport function mixHex(a: string, b: string, t: number): string {\r\n const [ar, ag, ab] = hexToRgb(a);\r\n const [br, bg, bb] = hexToRgb(b);\r\n const mix = (x: number, y: number) => x + (y - x) * t;\r\n return rgbToHex(mix(ar, br), mix(ag, bg), mix(ab, bb));\r\n}\r\n","import { contrastRatio, hexToOklch, isValidHex, oklchToHex, pickForeground } from './color-math';\r\n\r\nexport type RampStep =\r\n '50' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | '950';\r\n\r\nexport type AccentRamp = Record<RampStep, string>;\r\n\r\n/**\r\n * Basamak bağımsız SABİT bir eğri — herhangi bir girdi hue'sunda \"aynı ağırlık\r\n * hissini\" garanti eder (bkz. plan Faz 2: tüketici hangi accent'i seçerse\r\n * seçsin ramp'in 600 basamağı HER ZAMAN \"metin/kenarlık\" ağırlığında olmalı,\r\n * 950 basamağı HER ZAMAN \"neredeyse siyah\" olmalı). `color.css`'teki\r\n * varsayılan \"Deep Emerald\" rampasıyla (primary-600 = #004d40, L≈0.38)\r\n * TAM ÖRTÜŞMEZ — bu eğride 600 = L 0.50, kasıtlı: elle taşınan varsayılan\r\n * rampa marka için özel olarak koyulaştırıldı. Ayrıca DOLU BLOK (`accent-fill`)\r\n * artık `accent`/`accent-strong` (600/700 tabanlı) metin/kenarlık rolünden\r\n * TAMAMEN AYRI bir basamak çifti kullanıyor — kitin varsayılan rampasında\r\n * LIGHT 900 / DARK 400 (spec'in \"Forest Emerald\" CTA'sı + canlı zümrüt CTA'sı,\r\n * kullanıcı kararı); tüketici aksanlarında ise (bkz. `theming/apply.ts`\r\n * `accentRoleLines()`) bu eğrinin kendi 600/400 basamakları kullanılır —\r\n * varsayılandan farklı bir \"ağırlık\" üretir, bu FARK belgelidir, hata değildir.\r\n */\r\nconst LIGHTNESS_BY_STEP: Record<RampStep, number> = {\r\n '50': 0.97,\r\n '100': 0.94,\r\n '200': 0.88,\r\n '300': 0.79,\r\n '400': 0.7,\r\n '500': 0.6,\r\n '600': 0.5,\r\n '700': 0.42,\r\n '800': 0.34,\r\n '900': 0.27,\r\n '950': 0.2,\r\n};\r\n\r\n/**\r\n * Girdinin KENDİ kroması, uç basamaklarda (çok açık/çok koyu) doğal olarak\r\n * azalır — aksi halde `950` basamağı \"doygun ama neredeyse siyah\" (gamut\r\n * dışı, kirpma sonrası tonu kayan) bir renge dönüşür. `600` = girdinin TAM\r\n * kroması (referans basamak).\r\n */\r\nconst CHROMA_MULTIPLIER_BY_STEP: Record<RampStep, number> = {\r\n '50': 0.05,\r\n '100': 0.12,\r\n '200': 0.25,\r\n '300': 0.45,\r\n '400': 0.7,\r\n '500': 0.9,\r\n '600': 1,\r\n '700': 0.95,\r\n '800': 0.85,\r\n '900': 0.7,\r\n '950': 0.55,\r\n};\r\n\r\nexport const RAMP_STEPS: readonly RampStep[] = [\r\n '50',\r\n '100',\r\n '200',\r\n '300',\r\n '400',\r\n '500',\r\n '600',\r\n '700',\r\n '800',\r\n '900',\r\n '950',\r\n];\r\n\r\n/**\r\n * `hex` bir accent'in \"600 basamağı\" gibi ele alınır (kitin kendi kuralı,\r\n * bkz. `color.css` \"Her rampada basamak 600 = LIGHT modda dolu/etkileşimli\r\n * kullanım\" notu) — girdinin hue'su + kroma karakteri korunur, tüm 11\r\n * basamak `LIGHTNESS_BY_STEP`/`CHROMA_MULTIPLIER_BY_STEP` sabit eğrisiyle\r\n * YENİDEN üretilir (girdinin TAM OLARAK 600'e denk gelen bir L'de olması\r\n * ŞART DEĞİL — ör. çok açık bir hex verilse bile 950 basamağı yine\r\n * \"neredeyse siyah\" çıkar, ramp her zaman tutarlı).\r\n *\r\n * @throws girdi `#rgb`/`#rrggbb` değilse.\r\n */\r\nexport function createAccentRamp(hex: string): AccentRamp {\r\n if (!isValidHex(hex)) {\r\n throw new Error(`createAccentRamp: geçersiz hex \"${hex}\" — #rgb veya #rrggbb bekleniyor.`);\r\n }\r\n const { c, h } = hexToOklch(hex);\r\n const ramp = {} as AccentRamp;\r\n for (const step of RAMP_STEPS) {\r\n ramp[step] = oklchToHex(LIGHTNESS_BY_STEP[step], c * CHROMA_MULTIPLIER_BY_STEP[step], h);\r\n }\r\n return ramp;\r\n}\r\n\r\n/**\r\n * Bir rampa basamağının üstüne binecek metin rengi — `#ffffff` veya kitin\r\n * `--mf-surface-inverse`'i (`#04110d`, `color.css`) arasından HANGİSİ WCAG\r\n * kontrastı daha yüksekse. `theming/apply.ts`'teki `accentRoleLines()` bunu\r\n * `ramp['600']` (LIGHT yarı) VE `ramp['400']` (DARK yarı) için AYRI AYRI\r\n * çağırır — accent-fill artık İKİ basamak kullanıyor (kitin varsayılanında\r\n * 900/400, tüketici aksanlarında 600/400), genelde çok farklı parlaklıkta,\r\n * her biri kendi doğru metin rengini WCAG hesabıyla (sabit varsayım DEĞİL)\r\n * bulur.\r\n */\r\nexport function fgOnAccent(accentHex: string): string {\r\n return pickForeground(accentHex, '#ffffff', '#04110d');\r\n}\r\n\r\n/** `ramp`'in `600` basamağının kontrast oranını (beyaz metne karşı) döner — `ramp.spec.ts`/tüketici sağlık kontrolü için. */\r\nexport function accentContrastWithWhite(ramp: AccentRamp): number {\r\n return contrastRatio(ramp['600'], '#ffffff');\r\n}\r\n","import type { RampStep } from './ramp';\r\n\r\nexport type RadiusScale = 'sharp' | 'default' | 'soft';\r\n/** Kontrol yüksekliği merdiveni (sm/md/lg): `compact` 28/32/36px, `default` 32/36/40px, `comfortable` 36/40/44px — bkz. `radius.css` `--control-h-*`. */\r\nexport type MfDensity = 'compact' | 'default' | 'comfortable';\r\nexport type NeutralTint = 'cool' | 'neutral' | 'warm';\r\n\r\n/**\r\n * Nötr rampa 13 basamaklı (`850`/`975` DAHİL) — diğer altı rampanın (primary/\r\n * success/warning/danger/info/help) 11 basamaklık `RampStep`'inden AYRI bir\r\n * tip (bkz. `color.css` \"RENK — HAM RAMPALAR\" notu, `NEUTRAL_STEPS` — `apply.ts`).\r\n */\r\nexport const MF_NEUTRAL_RAMP_STEPS = [\r\n '50',\r\n '100',\r\n '200',\r\n '300',\r\n '400',\r\n '500',\r\n '600',\r\n '700',\r\n '800',\r\n '850',\r\n '900',\r\n '950',\r\n '975',\r\n] as const;\r\nexport type MfNeutralRampStep = (typeof MF_NEUTRAL_RAMP_STEPS)[number];\r\n\r\n/** `ramps.<tone>` altında elle geçilebilen altı 11-basamaklı rampa — `neutral` (13 basamak) AYRI ele alınır. */\r\nexport const MF_RAMP_TONES = ['primary', 'success', 'warning', 'danger', 'info', 'help'] as const;\r\nexport type MfRampTone = (typeof MF_RAMP_TONES)[number];\r\n\r\n/**\r\n * `color.css`'in rol katmanındaki, bir RAMPA basamağına `var()` İLE\r\n * BAĞLI OLMAYAN (yani `ramps.*` override'ıyla OTOMATİK takip ETMEYEN) TEK\r\n * TEK yazılmış literal token'lar — `accent`/`ramps.*` DIŞINDA kalan, marka\r\n * beyaz etiketlemesi için hâlâ ayarlanabilir olması gereken son katman.\r\n * (`--mf-accent`, `--mf-success-fill`, `--mf-success-tint` vb. BURADA YOK —\r\n * hepsi zaten `ramps.primary`/`ramps.success` override'ıyla otomatik\r\n * güncellenir, bkz. `color.css`'teki `var(--color-X-NNN)` referansları.)\r\n */\r\nexport const MF_ROLE_TOKENS = [\r\n 'surface',\r\n 'chrome',\r\n 'overlay',\r\n 'surface-inverse',\r\n 'glass',\r\n 'fg',\r\n 'fg-muted',\r\n 'fg-on-accent',\r\n 'fg-inverse',\r\n 'hairline',\r\n 'neutral-fill',\r\n 'neutral-fill-hover',\r\n 'neutral-fill-fg',\r\n 'success-fill-fg',\r\n 'warning-fill-fg',\r\n 'danger-fill-fg',\r\n 'info-fill-fg',\r\n 'help-fill-fg',\r\n 'chart-1',\r\n 'chart-2',\r\n 'chart-3',\r\n 'chart-4',\r\n 'chart-5',\r\n 'chart-6',\r\n 'chart-7',\r\n 'chart-8',\r\n 'chart-other',\r\n] as const;\r\nexport type MfRoleToken = (typeof MF_ROLE_TOKENS)[number];\r\n\r\n/**\r\n * Tam beyaz etiket tema tanımı — `applyMfTheme()`/`exportMfThemeCss()`'e\r\n * verilir. HER alan OPSİYONEL; hiçbiri verilmezse kit kendi \"Deep Emerald &\r\n * Slate\" varsayılanında kalır (bkz. `applyMfTheme` doc'u). Sadece VERİLEN\r\n * alanlar `applyMfTheme`'de INLINE STYLE olarak YAZILIR — bir \"tüm token\r\n * dökümü\" ÜRETİLMEZ/GEREKMEZ, bu yüzden kitin CSS kaynağıyla asla senkron\r\n * DIŞI kalamaz (delta-only, bkz. dosya üstündeki mimari not).\r\n *\r\n * - `accent`/`radiusScale`/`neutralTint` — mevcut kısayollar (bkz. `apply.ts`).\r\n * - `density` — kit genelinde kontrol yüksekliği (Button/Input/Select/...).\r\n * Bir alt ağaç için `data-density=\"compact\"` özniteliği de aynı işi yapar.\r\n * - `ramps` — bir tonun TÜM basamaklarını (ya da bir kısmını) ELLE verir.\r\n * `ramps.primary` verilirse `accent` kısayolunu (aynı çağrıda) EZER — TAM\r\n * kontrol isteyen tüketiciler için. Bir tonun rampasını değiştirmek O\r\n * tonun TÜM türetilmiş rol token'larını (`--mf-X`, `--mf-X-fill`,\r\n * `--mf-X-tint` vb.) OTOMATİK günceller — `color.css`'in rol katmanı\r\n * zaten `var(--color-X-NNN)` ile bu rampaya BAĞLI (bkz. dosya üstündeki\r\n * `MfRoleToken` notu). Bu, TEK bir alanla (\"ramps.danger\") beş türetilmiş\r\n * token'ı BİRDEN doğru şekilde güncelleyen ASIL güç kaynağı.\r\n * - `roles` — rampaya BAĞLI OLMAYAN literal token'lar (bkz. `MfRoleToken`).\r\n * `light`/`dark` AYRI verilir; SADECE biri verilirse İKİ modda da AYNI\r\n * değer kullanılır (basit/öngörülebilir davranış — hangi modda olduğunu\r\n * PROBE etmek yerine).\r\n * - `fonts`/`radius` — moddan BAĞIMSIZ, düz değer.\r\n */\r\nexport interface MfThemeJson {\r\n /** Doküman/editör amaçlı — JSON Schema referansı (bkz. `schema.ts`). Kit tarafından OKUNMAZ. */\r\n $schema?: string;\r\n /** İnsan-okur isim (ör. \"Acme Kurumsal\") — kit tarafından OKUNMAZ, sadece bir tema seçici/listesi için. */\r\n name?: string;\r\n accent?: string | null;\r\n radiusScale?: RadiusScale;\r\n density?: MfDensity;\r\n neutralTint?: NeutralTint;\r\n ramps?: Partial<Record<MfRampTone, Partial<Record<RampStep, string>>>> & {\r\n neutral?: Partial<Record<MfNeutralRampStep, string>>;\r\n };\r\n roles?: {\r\n light?: Partial<Record<MfRoleToken, string>>;\r\n dark?: Partial<Record<MfRoleToken, string>>;\r\n };\r\n fonts?: { sans?: string; display?: string; mono?: string };\r\n radius?: Partial<Record<'xs' | 'sm' | 'md' | 'lg' | 'xl', string>>;\r\n}\r\n\r\n/** `MfThemeJson`'ın eski adı — `applyMfTheme({accent, radiusScale, neutralTint})` şeklindeki MEVCUT çağrılar (kısayol alt kümesi) hâlâ geçerli, bu takma ad SADECE geriye dönük TİP uyumluluğu için. */\r\nexport type MfThemeConfig = MfThemeJson;\r\n","import { mixHex } from './color-math';\r\nimport { createAccentRamp, fgOnAccent, RAMP_STEPS, type RampStep } from './ramp';\r\nimport {\r\n MF_NEUTRAL_RAMP_STEPS,\r\n MF_RAMP_TONES,\r\n MF_ROLE_TOKENS,\r\n type MfDensity,\r\n type MfRampTone,\r\n type MfThemeJson,\r\n type NeutralTint,\r\n type RadiusScale,\r\n} from './theme-json';\r\n\r\nconst RADIUS_PX: Record<RadiusScale, Record<'xs' | 'sm' | 'md' | 'lg' | 'xl', number>> = {\r\n sharp: { xs: 2, sm: 3, md: 4, lg: 6, xl: 8 },\r\n default: { xs: 4, sm: 6, md: 8, lg: 12, xl: 16 },\r\n soft: { xs: 6, sm: 10, md: 14, lg: 20, xl: 28 },\r\n};\r\n\r\n/** `radius.css`'teki `--control-h-*` ile AYNI değerler — `[data-density]` seçicileri de bunları kullanır. */\r\nconst CONTROL_H_PX: Record<MfDensity, Record<'sm' | 'md' | 'lg', number>> = {\r\n compact: { sm: 28, md: 32, lg: 36 },\r\n default: { sm: 32, md: 36, lg: 40 },\r\n comfortable: { sm: 36, md: 40, lg: 44 },\r\n};\r\n\r\nconst CONTROL_H_KEYS = ['sm', 'md', 'lg'] as const;\r\n\r\nfunction densityLines(density: MfDensity): [string, string][] {\r\n return CONTROL_H_KEYS.map((key) => [\r\n `--control-h-${key}`,\r\n `${CONTROL_H_PX[density][key] / 16}rem`,\r\n ]);\r\n}\r\n\r\n/** `color.css`'teki 13 basamaklı nötr merdiven — tint karışımı bunların HEPSİNİ, moddan bağımsız (raw ramp) günceller. */\r\nconst NEUTRAL_STEPS = MF_NEUTRAL_RAMP_STEPS;\r\n\r\n/** `ramps.<tone>` genel-amaçlı döngüsü için — `primary` kendi özel `accentRoleLines()` türetmesi yüzünden AYRI ele alınır (bkz. altta). */\r\nconst OTHER_RAMP_TONES = MF_RAMP_TONES.filter(\r\n (tone): tone is Exclude<MfRampTone, 'primary'> => tone !== 'primary',\r\n);\r\n\r\n/** Sabit, hue'ya dayalı iki tint ucu — accent'ten BAĞIMSIZ (bkz. plan Faz 2 \"neutralTint\"). `mixHex` küçük `t` ile çağrıldığı için nötrün kendi algısal parlaklığı korunur. */\r\nconst TINT_HEX: Record<Exclude<NeutralTint, 'neutral'>, string> = {\r\n cool: '#3b82f6',\r\n warm: '#f59e0b',\r\n};\r\n\r\nconst TINT_AMOUNT = 0.06;\r\n\r\n/**\r\n * `--mf-fg-on-accent`/`--mf-accent-fill`/`--mf-accent-fill-hover` rol\r\n * token'ları rampa basamağı gibi `--color-primary-*` ADI ALTINDA değil,\r\n * kendi `--mf-*` isimleriyle yazılır (bkz. color.css rol katmanı) — bu\r\n * yüzden `RAMP_STEPS` döngüsüne dahil DEĞİLLER, `accent: null` temizliğinin\r\n * de bunları AYRICA silmesi gerekiyor.\r\n */\r\nconst ACCENT_ROLE_PROPS = [\r\n '--mf-fg-on-accent',\r\n '--mf-accent-fill',\r\n '--mf-accent-fill-hover',\r\n] as const;\r\n\r\n/**\r\n * Bir accent ramp'inden üç rol token satırını üretir — `applyMfTheme` (runtime\r\n * `setProperty`) ve `exportMfThemeCss` (statik string) İKİSİ de bunu kullanır,\r\n * tek kaynak. Kitin KENDİ varsayılan rampasıyla AYNI desen (color.css): dolu\r\n * blok LIGHT'ta 600, DARK'ta 400 (hover 700/500) — `light-dark()`'ın İKİ\r\n * yarısı da AYRI hesaplanır, tek bir sabit değer DEĞİL. `fgOnAccent` her\r\n * yarı için AYRI çağrılır çünkü 600 ile 400 basamağı genelde çok farklı\r\n * parlaklıkta (600 koyu → genelde beyaz metin ister, 400 açık → genelde\r\n * mürekkep ister) — tüketicinin verdiği HERHANGİ bir aksan renginde bu iki\r\n * yarı FARKLI metin rengine ihtiyaç duyabilir (bkz. kitin varsayılan primary\r\n * rampası: light `#062c22` + beyaz, dark `#10b981` + mürekkep — aynı asimetri).\r\n * `ramp` EKSİK basamak taşıyorsa (ör. `ramps.primary` kısmi verildiyse,\r\n * `resolvedPrimaryRamp`'in okunmuş/birleştirilmiş sonucu DEĞİLSE) `null`\r\n * döner — çağıran bu durumda satırları YAZMAZ (bkz. `exportMfThemeCss`).\r\n */\r\nfunction accentRoleLines(\r\n ramp: Partial<Record<RampStep, string>>,\r\n): Array<[(typeof ACCENT_ROLE_PROPS)[number], string]> | null {\r\n const c400 = ramp['400'];\r\n const c500 = ramp['500'];\r\n const c600 = ramp['600'];\r\n const c700 = ramp['700'];\r\n if (!c400 || !c500 || !c600 || !c700) return null;\r\n const fgLight = fgOnAccent(c600);\r\n const fgDark = fgOnAccent(c400);\r\n return [\r\n ['--mf-fg-on-accent', `light-dark(${fgLight}, ${fgDark})`],\r\n ['--mf-accent-fill', `light-dark(${c600}, ${c400})`],\r\n ['--mf-accent-fill-hover', `light-dark(${c700}, ${c500})`],\r\n ];\r\n}\r\n\r\nfunction isBrowser(): boolean {\r\n return typeof document !== 'undefined';\r\n}\r\n\r\n/**\r\n * `config.ramps.primary` (kısmi olabilir) ile `el`'in O ANKİ hesaplanmış\r\n * `--color-primary-*` değerlerini BİRLEŞTİRİR — `accentRoleLines()`'ın TAM\r\n * bir ramp'e (400/500/600/700) ihtiyacı var, tüketici SADECE birkaç basamağı\r\n * override etse bile (ör. sadece `600`) doğru `--mf-accent-fill` vb.\r\n * türetilsin diye (bkz. `neutralTint`'in AYNI \"önce oku, sonra karıştır\"\r\n * ilkesi, altta).\r\n */\r\nfunction resolvedPrimaryRamp(\r\n el: HTMLElement,\r\n override: Partial<Record<RampStep, string>>,\r\n): Record<RampStep, string> {\r\n const computed = getComputedStyle(el);\r\n const ramp = {} as Record<RampStep, string>;\r\n for (const step of RAMP_STEPS) {\r\n ramp[step] = override[step] ?? computed.getPropertyValue(`--color-primary-${step}`).trim();\r\n }\r\n return ramp;\r\n}\r\n\r\n/**\r\n * `config.roles.light[key]`/`config.roles.dark[key]`'i TEK bir `light-dark()`\r\n * CSS değerine çevirir — sadece BİRİ verilirse İKİ modda da AYNI değer\r\n * kullanılır (bkz. `theme-json.ts`'teki `MfThemeJson.roles` doc'u — hangi\r\n * modda olunduğunu PROBE etmek yerine BİLEREK basit/öngörülebilir).\r\n */\r\nfunction roleLightDarkValue(light: string | undefined, dark: string | undefined): string | null {\r\n const resolvedLight = light ?? dark;\r\n const resolvedDark = dark ?? light;\r\n if (resolvedLight === undefined || resolvedDark === undefined) return null;\r\n return `light-dark(${resolvedLight}, ${resolvedDark})`;\r\n}\r\n\r\n/**\r\n * `MfThemeJson`'ı CSS custom property'leri olarak `target`'a (varsayılan\r\n * `document.documentElement`) YAZAR — sayfa YENİDEN YÜKLENMEDEN, hiçbir\r\n * bileşen dosyasına dokunmadan tüm kit anında yeni temaya geçer. Bunun\r\n * mümkün olmasının nedeni: Tailwind v4'ün ürettiği utility'ler (`bg-primary-600`,\r\n * `rounded-md`, ...) derleme zamanında SABİT bir değere değil, doğrudan\r\n * `var(--color-primary-600)`/`var(--radius-md)` REFERANSINA derleniyor (bkz.\r\n * `docs/tr/mimari.md` \"Token mimarisi\") — CSS cascade'de bu satırlar\r\n * `@theme`'in KENDİ tanımından SONRA (inline stil her zaman kazanır)\r\n * çalıştığı için token'lar üzerinden TÜM bileşenler güncellenir. SADECE\r\n * `config`'te VERİLEN alanlar yazılır (\"delta-only\") — bu fonksiyon kitin\r\n * TÜM varsayılan token setini bilmek/üretmek ZORUNDA DEĞİL, bu yüzden\r\n * kitin CSS kaynağıyla asla senkron dışı kalamaz.\r\n *\r\n * - `accent` verilirse: `createAccentRamp()` ile 11 basamaklı `--color-primary-*`\r\n * YENİDEN üretilir + `accentRoleLines()` (`--mf-fg-on-accent`/`-accent-fill`/\r\n * `-accent-fill-hover`, `light-dark()` literal değerleri — bkz. altta).\r\n * `:root`/`.dark` bunları zaten `var()` ile referans aldığı için (bkz.\r\n * `color.css` rol katmanı) `--mf-accent`/`--mf-accent-strong`/`--mf-focus-ring`/\r\n * `--mf-primary-tint(-fg)` AYRICA yazılmaz — otomatik takip eder.\r\n * - `accent: null` verilirse: yukarıdaki override'ların HEPSİ temizlenir, kit\r\n * `color.css`'teki varsayılan \"Deep Emerald\" rampasına döner.\r\n * - `ramps.primary` verilirse (`accent`'i EZER — aynı çağrıda ikisi de\r\n * verilirse `ramps.primary` kazanır): basamak başına TAM kontrol, kısmi\r\n * olabilir (`resolvedPrimaryRamp` ile O ANKİ değerlerle birleştirilir).\r\n * - `ramps.success`/`warning`/`danger`/`info`/`help`/`neutral` verilirse:\r\n * verilen basamaklar DOĞRUDAN yazılır — bu tonların TÜM türetilmiş rol\r\n * token'ları (`--mf-X`, `--mf-X-fill`, `--mf-X-tint` vb.) `color.css`'te\r\n * zaten `var(--color-X-NNN)` ile bu rampaya bağlı, OTOMATİK güncellenir.\r\n * - `roles.light`/`roles.dark` verilirse: rampaya BAĞLI OLMAYAN literal\r\n * token'lar (bkz. `MfRoleToken`) `light-dark()` ile yazılır.\r\n * - `fonts`/`radius` verilirse: moddan bağımsız düz değerler yazılır —\r\n * `radius` `radiusScale`'İN ÜSTÜNE (aynı çağrıda ikisi de verilirse SONRA\r\n * uygulanır) basamak-bazlı ince ayar sağlar.\r\n * - `radiusScale` verilirse: `--radius-{xs,sm,md,lg,xl}` nested ölçeği\r\n * KORUYARAK (bkz. `radius.css` doktrini) birlikte küçülür/büyür.\r\n * - `density` verilirse: `--control-h-{sm,md,lg}` merdiveni yazılır — tüm\r\n * kontroller (Button/Input/Select/...) aynı hizada birlikte büyür/küçülür.\r\n * - `neutralTint` verilirse: 13 basamaklı `--color-neutral-*` rampası ÇOK\r\n * düşük oranda (bkz. `color-math.ts` `mixHex`) soğuk/sıcak bir tona kayar\r\n * — `ramps.neutral` AYNI ÇAĞRIDA verildiyse ONUN ÜSTÜNE uygulanır (bu\r\n * fonksiyondaki sıra: ramps → neutralTint).\r\n *\r\n * SSR güvenli — `document` yoksa no-op.\r\n */\r\nexport function applyMfTheme(config: MfThemeJson, target?: HTMLElement): void {\r\n if (!isBrowser()) return;\r\n const el = target ?? document.documentElement;\r\n\r\n if (config.accent === null && !config.ramps?.primary) {\r\n for (const step of RAMP_STEPS) {\r\n el.style.removeProperty(`--color-primary-${step}`);\r\n }\r\n for (const prop of ACCENT_ROLE_PROPS) {\r\n el.style.removeProperty(prop);\r\n }\r\n } else if (config.ramps?.primary) {\r\n const ramp = resolvedPrimaryRamp(el, config.ramps.primary);\r\n for (const step of RAMP_STEPS) {\r\n el.style.setProperty(`--color-primary-${step}`, ramp[step]);\r\n }\r\n const lines = accentRoleLines(ramp);\r\n if (lines) {\r\n for (const [prop, value] of lines) el.style.setProperty(prop, value);\r\n }\r\n } else if (config.accent) {\r\n const ramp = createAccentRamp(config.accent);\r\n for (const step of RAMP_STEPS) {\r\n el.style.setProperty(`--color-primary-${step}`, ramp[step]);\r\n }\r\n const lines = accentRoleLines(ramp);\r\n if (lines) {\r\n for (const [prop, value] of lines) el.style.setProperty(prop, value);\r\n }\r\n }\r\n\r\n for (const tone of OTHER_RAMP_TONES) {\r\n const override = config.ramps?.[tone];\r\n if (!override) continue;\r\n for (const step of RAMP_STEPS) {\r\n const hex = override[step];\r\n if (hex) el.style.setProperty(`--color-${tone}-${step}`, hex);\r\n }\r\n }\r\n\r\n if (config.ramps?.neutral) {\r\n for (const step of NEUTRAL_STEPS) {\r\n const hex = config.ramps.neutral[step];\r\n if (hex) el.style.setProperty(`--color-neutral-${step}`, hex);\r\n }\r\n }\r\n\r\n if (config.roles) {\r\n for (const key of MF_ROLE_TOKENS) {\r\n const value = roleLightDarkValue(config.roles.light?.[key], config.roles.dark?.[key]);\r\n if (value) el.style.setProperty(`--mf-${key}`, value);\r\n }\r\n }\r\n\r\n if (config.fonts?.sans) el.style.setProperty('--font-sans', config.fonts.sans);\r\n if (config.fonts?.display) el.style.setProperty('--font-display', config.fonts.display);\r\n if (config.fonts?.mono) el.style.setProperty('--font-mono', config.fonts.mono);\r\n\r\n if (config.radiusScale) {\r\n const px = RADIUS_PX[config.radiusScale];\r\n for (const [key, value] of Object.entries(px)) {\r\n el.style.setProperty(`--radius-${key}`, `${value}px`);\r\n }\r\n }\r\n if (config.radius) {\r\n for (const [key, value] of Object.entries(config.radius)) {\r\n if (value) el.style.setProperty(`--radius-${key}`, value);\r\n }\r\n }\r\n\r\n if (config.density) {\r\n for (const [prop, value] of densityLines(config.density)) el.style.setProperty(prop, value);\r\n }\r\n\r\n if (config.neutralTint !== undefined) {\r\n // ÖNCE inline override'ı TEMİZLE (`removeProperty`), SONRA (tint !=\r\n // 'neutral' ise) `getComputedStyle`'ı yeniden oku — aksi halde art arda\r\n // iki `applyMfTheme({ neutralTint: 'cool' })` çağrısı (ör. tema\r\n // özelleştiricide kullanıcı aynı seçimi tekrar tetiklerse) İKİNCİ\r\n // çağrıda ZATEN tint'lenmiş değerin üstüne BİR TINT DAHA karıştırırdı\r\n // (`getComputedStyle` kendi az önce yazdığı inline değeri geri okur) —\r\n // gerçek bulgu, kümülatif/katlanan bir renk kayması üretiyordu.\r\n for (const step of NEUTRAL_STEPS) {\r\n el.style.removeProperty(`--color-neutral-${step}`);\r\n }\r\n if (config.neutralTint !== 'neutral') {\r\n const tint = TINT_HEX[config.neutralTint];\r\n const computed = getComputedStyle(el);\r\n for (const step of NEUTRAL_STEPS) {\r\n const current = computed.getPropertyValue(`--color-neutral-${step}`).trim();\r\n if (!current) continue;\r\n el.style.setProperty(`--color-neutral-${step}`, mixHex(current, tint, TINT_AMOUNT));\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * `applyMfTheme()`'in YAZABİLECEĞİ HER inline override'ı temizler — bir\r\n * tema özelleştiricideki \"Varsayılana sıfırla\" düğmesi için `accent: null`'ın\r\n * genişletilmiş hali (o SADECE accent'i temizlerdi). Kit `color.css`'teki\r\n * varsayılanlara TAMAMEN geri döner.\r\n */\r\nexport function resetMfTheme(target?: HTMLElement): void {\r\n if (!isBrowser()) return;\r\n const el = target ?? document.documentElement;\r\n\r\n for (const step of RAMP_STEPS) el.style.removeProperty(`--color-primary-${step}`);\r\n for (const prop of ACCENT_ROLE_PROPS) el.style.removeProperty(prop);\r\n for (const tone of OTHER_RAMP_TONES) {\r\n for (const step of RAMP_STEPS) el.style.removeProperty(`--color-${tone}-${step}`);\r\n }\r\n for (const step of NEUTRAL_STEPS) el.style.removeProperty(`--color-neutral-${step}`);\r\n for (const key of MF_ROLE_TOKENS) el.style.removeProperty(`--mf-${key}`);\r\n el.style.removeProperty('--font-sans');\r\n el.style.removeProperty('--font-display');\r\n el.style.removeProperty('--font-mono');\r\n for (const key of ['xs', 'sm', 'md', 'lg', 'xl']) el.style.removeProperty(`--radius-${key}`);\r\n for (const key of CONTROL_H_KEYS) el.style.removeProperty(`--control-h-${key}`);\r\n}\r\n\r\n/**\r\n * `applyMfTheme` ile AYNI hesaplamayı yapar ama runtime'da uygulamak yerine\r\n * yapıştırılabilir bir `{ selector } { ... }` bloğu (varsayılan `:root`)\r\n * döner — tüketici build-time'da kendi `styles.css`'ine ekleyebilir (docs\r\n * sitesindeki tema özelleştiricinin \"CSS'i kopyala\" düğmesi bunu kullanır).\r\n * `roles.*` İÇİN de (runtime'daki AYNI `light-dark()` deseni) tek blokla\r\n * hem açık hem koyu mod kapsanır, AYRI bir `.dark` bloğu GEREKMEZ. `ramps.\r\n * primary` KISMİ verilip 400/500/600/700'ün TAMAMI yoksa `--mf-accent-fill`\r\n * vb. satırlar (canlı DOM'dan O ANKİ değeri okuyamadığı için) ATLANIR — bu\r\n * durumda `applyMfTheme`'i (runtime, `resolvedPrimaryRamp` ile tamamlar)\r\n * tercih edin. `neutralTint` BURADA desteklenmez — mevcut nötr değerleri\r\n * okumak için canlı bir DOM/`getComputedStyle` gerekir, statik bir string\r\n * üretici bunu bilemez (tüketici tint'i kendi `applyMfTheme()` çağrısıyla\r\n * runtime'da uygulamalı).\r\n */\r\nexport function exportMfThemeCss(\r\n config: Omit<MfThemeJson, 'neutralTint'>,\r\n options?: { selector?: string },\r\n): string {\r\n const selector = options?.selector ?? ':root';\r\n const lines: string[] = [`${selector} {`];\r\n\r\n if (config.ramps?.primary) {\r\n const ramp = config.ramps.primary;\r\n for (const step of RAMP_STEPS) {\r\n const hex = ramp[step];\r\n if (hex) lines.push(` --color-primary-${step}: ${hex};`);\r\n }\r\n const roleLines = accentRoleLines(ramp);\r\n if (roleLines) {\r\n for (const [prop, value] of roleLines) lines.push(` ${prop}: ${value};`);\r\n }\r\n } else if (config.accent) {\r\n const ramp = createAccentRamp(config.accent);\r\n for (const step of RAMP_STEPS) {\r\n lines.push(` --color-primary-${step}: ${ramp[step]};`);\r\n }\r\n const roleLines = accentRoleLines(ramp);\r\n if (roleLines) {\r\n for (const [prop, value] of roleLines) lines.push(` ${prop}: ${value};`);\r\n }\r\n }\r\n\r\n for (const tone of OTHER_RAMP_TONES) {\r\n const override = config.ramps?.[tone];\r\n if (!override) continue;\r\n for (const step of RAMP_STEPS) {\r\n const hex = override[step];\r\n if (hex) lines.push(` --color-${tone}-${step}: ${hex};`);\r\n }\r\n }\r\n\r\n if (config.ramps?.neutral) {\r\n for (const step of NEUTRAL_STEPS) {\r\n const hex = config.ramps.neutral[step];\r\n if (hex) lines.push(` --color-neutral-${step}: ${hex};`);\r\n }\r\n }\r\n\r\n if (config.roles) {\r\n for (const key of MF_ROLE_TOKENS) {\r\n const value = roleLightDarkValue(config.roles.light?.[key], config.roles.dark?.[key]);\r\n if (value) lines.push(` --mf-${key}: ${value};`);\r\n }\r\n }\r\n\r\n if (config.fonts?.sans) lines.push(` --font-sans: ${config.fonts.sans};`);\r\n if (config.fonts?.display) lines.push(` --font-display: ${config.fonts.display};`);\r\n if (config.fonts?.mono) lines.push(` --font-mono: ${config.fonts.mono};`);\r\n\r\n if (config.radiusScale) {\r\n const px = RADIUS_PX[config.radiusScale];\r\n for (const [key, value] of Object.entries(px)) {\r\n lines.push(` --radius-${key}: ${value}px;`);\r\n }\r\n }\r\n if (config.radius) {\r\n for (const [key, value] of Object.entries(config.radius)) {\r\n if (value) lines.push(` --radius-${key}: ${value};`);\r\n }\r\n }\r\n\r\n if (config.density) {\r\n for (const [prop, value] of densityLines(config.density)) lines.push(` ${prop}: ${value};`);\r\n }\r\n\r\n lines.push('}');\r\n return lines.join('\\n');\r\n}\r\n","import { contrastRatio, isValidHex } from './color-math';\r\nimport { RAMP_STEPS } from './ramp';\r\nimport { MF_RAMP_TONES, type MfThemeJson } from './theme-json';\r\n\r\nexport type MfThemeIssueSeverity = 'error' | 'warning';\r\n\r\nexport interface MfThemeIssue {\r\n /** Hangi alanı işaret ediyor — ör. `\"ramps.danger.600\"`, `\"accent\"`. */\r\n path: string;\r\n message: string;\r\n severity: MfThemeIssueSeverity;\r\n}\r\n\r\n/** `color.css`'in `--mf-surface-inverse`/`-fill-fg` literallerinde tekrarlanan \"mürekkep\" tonu — `X-fill-fg` HER ZAMAN bunun ya da beyazın arasından seçilir (bkz. rol katmanı). */\r\nconst INK = '#04110d';\r\nconst AA_NORMAL_TEXT = 4.5;\r\n\r\nfunction checkHex(path: string, value: string | undefined, issues: MfThemeIssue[]): void {\r\n if (value === undefined) return;\r\n if (!isValidHex(value)) {\r\n issues.push({\r\n path,\r\n message: `\"${value}\" geçerli bir #rgb/#rrggbb hex değeri değil.`,\r\n severity: 'error',\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * `MfThemeJson`'ı iki açıdan denetler:\r\n *\r\n * 1. Her hex alanının GEÇERLİ bir `#rgb`/`#rrggbb` olup olmadığı.\r\n * 2. `ramps.<tone>['600']` (kitin \"dolu blok\" LIGHT çapası, bkz. `color.css`\r\n * rol katmanı doktrini — `X-fill-fg` her zaman `#ffffff` ya da mürekkep\r\n * `#04110d`'den seçilir) verilen bir ton için NE beyaz NE mürekkep\r\n * üstünde WCAG AA (4.5:1) sağlayan okunaklı bir metin rengi bulunup\r\n * bulunamadığı — ikisi de başarısızsa bu basamak \"çok orta tonlu\", dolu\r\n * blok üstünde okunaklı metin GARANTİSİ yok demektir. `accent` (`ramps.\r\n * primary`/`createAccentRamp` + `fgOnAccent`) BU KONTROLE İHTİYAÇ\r\n * DUYMAZ — `pickForeground` HER ZAMAN iki adaydan daha iyisini seçtiği\r\n * için kontrast garantisi İNŞA GEREĞİ var (bkz. `apply.ts`\r\n * `accentRoleLines`).\r\n *\r\n * Şema/yapı hatalarını (bilinmeyen alan vb.) DENETLEMEZ — TypeScript\r\n * derleme zamanında zaten yakalar; `MfThemeJson` harici bir kaynaktan (ör.\r\n * `JSON.parse`, bir tema dosyası yükleme formu) geliyorsa bu fonksiyon\r\n * SADECE değer-düzeyi sorunları (geçersiz hex, düşük kontrast) yakalar.\r\n */\r\nexport function validateMfTheme(theme: MfThemeJson): MfThemeIssue[] {\r\n const issues: MfThemeIssue[] = [];\r\n\r\n checkHex('accent', theme.accent ?? undefined, issues);\r\n\r\n for (const tone of MF_RAMP_TONES) {\r\n const ramp = theme.ramps?.[tone];\r\n if (!ramp) continue;\r\n for (const step of RAMP_STEPS) {\r\n checkHex(`ramps.${tone}.${step}`, ramp[step], issues);\r\n }\r\n if (tone === 'primary') continue;\r\n const fill = ramp['600'];\r\n if (!fill || !isValidHex(fill)) continue;\r\n const onWhite = contrastRatio(fill, '#ffffff');\r\n const onInk = contrastRatio(fill, INK);\r\n if (onWhite < AA_NORMAL_TEXT && onInk < AA_NORMAL_TEXT) {\r\n issues.push({\r\n path: `ramps.${tone}.600`,\r\n message: `\"${fill}\" dolu blok üstünde ne beyaz (${onWhite.toFixed(2)}:1) ne mürekkep (${onInk.toFixed(2)}:1) WCAG AA (4.5:1) sağlıyor — daha koyu/açık bir basamak seçin.`,\r\n severity: 'warning',\r\n });\r\n }\r\n }\r\n\r\n if (theme.ramps?.neutral) {\r\n for (const [step, value] of Object.entries(theme.ramps.neutral)) {\r\n checkHex(`ramps.neutral.${step}`, value, issues);\r\n }\r\n }\r\n\r\n if (theme.roles) {\r\n for (const [mode, values] of Object.entries(theme.roles) as [\r\n 'light' | 'dark',\r\n Record<string, string> | undefined,\r\n ][]) {\r\n if (!values) continue;\r\n for (const [key, value] of Object.entries(values)) {\r\n checkHex(`roles.${mode}.${key}`, value, issues);\r\n }\r\n }\r\n }\r\n\r\n return issues;\r\n}\r\n","/**\r\n * `MfThemeJson`'ın JSON Schema (2020-12) tanımı — IDE otomatik tamamlama\r\n * (`\"$schema\"` alanı) ve harici doğrulayıcılar (ajv vb.) için. Düz bir JS\r\n * nesnesi olarak dışa açılıyor — kitin sıfır çalışma zamanı bağımlılığı\r\n * ilkesi gereği (bkz. `projects/ui-kit/README.md` \"Bağımlılık politikası\")\r\n * hiçbir şema doğrulama KÜTÜPHANESİ KULLANILMIYOR/GEREKTİRİLMİYOR; asıl\r\n * DEĞER-düzeyi doğrulama (geçerli hex, WCAG kontrastı) `validateMfTheme()`\r\n * (bkz. `validate.ts`) tarafında, bu şema SADECE YAPISAL/tip doğrulaması\r\n * içindir — `@mesgflow/email-core`'un `EMAIL_DOCUMENT_JSON_SCHEMA`'sıyla\r\n * AYNI desen.\r\n */\r\n\r\nconst HEX_PATTERN = '^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$';\r\nconst HEX = { type: 'string', pattern: HEX_PATTERN } as const;\r\n\r\nconst RAMP_11 = {\r\n type: 'object',\r\n additionalProperties: false,\r\n properties: {\r\n '50': HEX,\r\n '100': HEX,\r\n '200': HEX,\r\n '300': HEX,\r\n '400': HEX,\r\n '500': HEX,\r\n '600': HEX,\r\n '700': HEX,\r\n '800': HEX,\r\n '900': HEX,\r\n '950': HEX,\r\n },\r\n} as const;\r\n\r\nconst RAMP_13 = {\r\n type: 'object',\r\n additionalProperties: false,\r\n properties: {\r\n ...RAMP_11.properties,\r\n '850': HEX,\r\n '975': HEX,\r\n },\r\n} as const;\r\n\r\nconst ROLE_TOKEN_NAMES = [\r\n 'surface',\r\n 'chrome',\r\n 'overlay',\r\n 'surface-inverse',\r\n 'glass',\r\n 'fg',\r\n 'fg-muted',\r\n 'fg-on-accent',\r\n 'fg-inverse',\r\n 'hairline',\r\n 'neutral-fill',\r\n 'neutral-fill-hover',\r\n 'neutral-fill-fg',\r\n 'success-fill-fg',\r\n 'warning-fill-fg',\r\n 'danger-fill-fg',\r\n 'info-fill-fg',\r\n 'help-fill-fg',\r\n 'chart-1',\r\n 'chart-2',\r\n 'chart-3',\r\n 'chart-4',\r\n 'chart-5',\r\n 'chart-6',\r\n 'chart-7',\r\n 'chart-8',\r\n 'chart-other',\r\n] as const;\r\n\r\nconst ROLE_MAP = {\r\n type: 'object',\r\n additionalProperties: false,\r\n properties: Object.fromEntries(ROLE_TOKEN_NAMES.map((key) => [key, { type: 'string' }])),\r\n} as const;\r\n\r\nexport const MF_THEME_JSON_SCHEMA = {\r\n $schema: 'https://json-schema.org/draft/2020-12/schema',\r\n $id: 'https://hurdenizyener.github.io/mesgflow-ui-kit/schema/theme.json',\r\n title: 'MesgFlow ui theme',\r\n description:\r\n 'Tam beyaz etiket tema tanımı — applyMfTheme()/exportMfThemeCss()e verilir. Her alan opsiyonel.',\r\n type: 'object',\r\n additionalProperties: false,\r\n properties: {\r\n $schema: { type: 'string' },\r\n name: { type: 'string' },\r\n accent: { oneOf: [HEX, { type: 'null' }] },\r\n radiusScale: { enum: ['sharp', 'default', 'soft'] },\r\n density: { enum: ['compact', 'default', 'comfortable'] },\r\n neutralTint: { enum: ['cool', 'neutral', 'warm'] },\r\n ramps: {\r\n type: 'object',\r\n additionalProperties: false,\r\n properties: {\r\n primary: RAMP_11,\r\n success: RAMP_11,\r\n warning: RAMP_11,\r\n danger: RAMP_11,\r\n info: RAMP_11,\r\n help: RAMP_11,\r\n neutral: RAMP_13,\r\n },\r\n },\r\n roles: {\r\n type: 'object',\r\n additionalProperties: false,\r\n properties: {\r\n light: ROLE_MAP,\r\n dark: ROLE_MAP,\r\n },\r\n },\r\n fonts: {\r\n type: 'object',\r\n additionalProperties: false,\r\n properties: {\r\n sans: { type: 'string' },\r\n display: { type: 'string' },\r\n mono: { type: 'string' },\r\n },\r\n },\r\n radius: {\r\n type: 'object',\r\n additionalProperties: false,\r\n properties: {\r\n xs: { type: 'string' },\r\n sm: { type: 'string' },\r\n md: { type: 'string' },\r\n lg: { type: 'string' },\r\n xl: { type: 'string' },\r\n },\r\n },\r\n },\r\n} as const;\r\n","/**\r\n * Tema değişikliğini (`.dark` toggle'ı, `applyMfTheme()` çağrısı vb.) View\r\n * Transitions API ile yumuşak bir çapraz geçişe sarar — sayfa her token'ı\r\n * tek tek `transition` etmek yerine eski/yeni ekran görüntüsü arasında TEK\r\n * bir kompozit geçiş yapar (yüzlerce `transition-colors`'ın aynı anda ve\r\n * farklı sürelerle kayması yerine).\r\n *\r\n * `update` HER ZAMAN çağrılır — sadece NASIL çağrıldığı değişir. Geçiş\r\n * atlanıp `update` doğrudan (senkron) çalıştırılır:\r\n * - SSR / `document` yok,\r\n * - tarayıcı `startViewTransition` desteklemiyor,\r\n * - kullanıcı `prefers-reduced-motion: reduce` istiyor.\r\n *\r\n * ```ts\r\n * transitionMfTheme(() => document.documentElement.classList.toggle('dark'));\r\n * ```\r\n */\r\nexport function transitionMfTheme(update: () => void): void {\r\n if (typeof document === 'undefined') {\r\n update();\r\n return;\r\n }\r\n\r\n const reducedMotion =\r\n typeof matchMedia !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n\r\n // DOM lib tipi bunu zorunlu sayar, ama Firefox < 144 ve jsdom'da YOK.\r\n if (typeof document.startViewTransition !== 'function' || reducedMotion) {\r\n update();\r\n return;\r\n }\r\n\r\n document.startViewTransition(update);\r\n}\r\n","import {\r\n DOCUMENT,\r\n DestroyRef,\r\n InjectionToken,\r\n Service,\r\n computed,\r\n effect,\r\n inject,\r\n signal,\r\n type Provider,\r\n} from '@angular/core';\r\nimport { transitionMfTheme } from './transition';\r\n\r\nexport type MfColorMode = 'light' | 'dark' | 'system';\r\n\r\nexport interface MfColorModeConfig {\r\n /** `localStorage` anahtarı — `colorModeInitScript()` ile AYNI olmalı. */\r\n storageKey: string;\r\n /** Tercih kaydı yokken. */\r\n defaultMode: MfColorMode;\r\n}\r\n\r\nexport const MF_COLOR_MODE_CONFIG = new InjectionToken<MfColorModeConfig>(\r\n 'mesgflow.color-mode-config',\r\n { factory: () => ({ storageKey: 'mf-color-mode', defaultMode: 'system' }) },\r\n);\r\n\r\n/** `providers: [provideMfColorMode({ storageKey: 'app-theme' })]` */\r\nexport function provideMfColorMode(config: Partial<MfColorModeConfig>): Provider {\r\n return {\r\n provide: MF_COLOR_MODE_CONFIG,\r\n useValue: { storageKey: 'mf-color-mode', defaultMode: 'system', ...config },\r\n };\r\n}\r\n\r\nconst DARK_QUERY = '(prefers-color-scheme: dark)';\r\n\r\n/**\r\n * Açık / koyu / sistem modu — kitin TEK kaynağı (`<mf-theme-switcher>` bunu kullanır; kendi\r\n * anahtarınızla da doğrudan enjekte edebilirsiniz).\r\n *\r\n * - `mode`: kullanıcının seçimi (kalıcı, `localStorage`); `resolved`: gerçekte uygulanan\r\n * `light`/`dark` — `system`'de işletim sistemi tercihini CANLI izler.\r\n * - Uygulama: kökte `.dark` sınıfı + `color-scheme` (yerel kaydırma çubukları ve form\r\n * kontrolleri de temaya uyar); değişim `transitionMfTheme` ile yumuşak (azaltılmış harekette\r\n * anında). Sınıf zaten doğruysa (ilk boyamada `colorModeInitScript` uyguladı) dokunulmaz.\r\n * - Depolama/`matchMedia` yoksa (gizli pencere, SSR, test) sessizce varsayılana düşer.\r\n */\r\n@Service()\r\nexport class MfColorModeService {\r\n private readonly config = inject(MF_COLOR_MODE_CONFIG);\r\n private readonly document = inject(DOCUMENT);\r\n private readonly media = this.document.defaultView?.matchMedia?.(DARK_QUERY) ?? null;\r\n private readonly systemDark = signal(this.media?.matches ?? false);\r\n\r\n readonly mode = signal<MfColorMode>(this.readStored());\r\n readonly resolved = computed<'light' | 'dark'>(() => {\r\n const mode = this.mode();\r\n return mode === 'system' ? (this.systemDark() ? 'dark' : 'light') : mode;\r\n });\r\n\r\n constructor() {\r\n const onChange = (event: MediaQueryListEvent) => this.systemDark.set(event.matches);\r\n this.media?.addEventListener?.('change', onChange);\r\n inject(DestroyRef).onDestroy(() => this.media?.removeEventListener?.('change', onChange));\r\n\r\n effect(() => {\r\n const mode = this.mode();\r\n try {\r\n this.document.defaultView?.localStorage.setItem(this.config.storageKey, mode);\r\n } catch {\r\n // Gizli pencere / engelli depolama — yalnızca bu oturumda.\r\n }\r\n });\r\n\r\n effect(() => {\r\n const dark = this.resolved() === 'dark';\r\n const root = this.document.documentElement;\r\n root.style.colorScheme = dark ? 'dark' : 'light';\r\n if (root.classList.contains('dark') === dark) return;\r\n transitionMfTheme(() => root.classList.toggle('dark', dark));\r\n });\r\n }\r\n\r\n setMode(mode: MfColorMode): void {\r\n this.mode.set(mode);\r\n }\r\n\r\n /** light → dark → system → light (tek düğmeli değiştirici için). */\r\n cycle(): void {\r\n const order: MfColorMode[] = ['light', 'dark', 'system'];\r\n this.mode.set(order[(order.indexOf(this.mode()) + 1) % order.length]!);\r\n }\r\n\r\n private readStored(): MfColorMode {\r\n try {\r\n const stored = this.document.defaultView?.localStorage.getItem(this.config.storageKey);\r\n if (stored === 'light' || stored === 'dark' || stored === 'system') return stored;\r\n } catch {\r\n // Depolama erişilemez.\r\n }\r\n return this.config.defaultMode;\r\n }\r\n}\r\n\r\n/**\r\n * `index.html` `<head>`'ine satır içi konacak betik — Angular yüklenmeden ÖNCE `.dark`'ı uygular,\r\n * koyu modda beyaz flaşı önler. Anahtar ve varsayılan servisle AYNI olmalı.\r\n *\r\n * ```html\r\n * <script>/* colorModeInitScript('app-theme') çıktısı *\\/</script>\r\n * ```\r\n */\r\nexport function colorModeInitScript(\r\n storageKey = 'mf-color-mode',\r\n defaultMode: MfColorMode = 'system',\r\n): string {\r\n return (\r\n `(function(){try{var m=localStorage.getItem(${JSON.stringify(storageKey)})||${JSON.stringify(defaultMode)};` +\r\n `var d=m==='dark'||(m==='system'&&matchMedia('${DARK_QUERY}').matches);` +\r\n `var r=document.documentElement;r.classList.toggle('dark',d);r.style.colorScheme=d?'dark':'light';}catch(e){}})();`\r\n );\r\n}\r\n","/*\r\n * `@mesgflow/ui-kit/theming` — ikincil giriş noktası. `i18n/tr` gibi BİLEREK\r\n * birincil barrel'dan (`projects/ui-kit/index.ts`) re-export EDİLMEZ: tema\r\n * özelleştirme her tüketicinin ihtiyacı değil, opt-in kalmalı (bkz.\r\n * `docs/tr/mimari.md` \"i18n mimarisi\"nin aynı gerekçesi).\r\n *\r\n * `color-math.ts` BİLEREK burada export EDİLMEZ — iç uygulama detayı\r\n * (hex<->OKLCH), public API `ramp.ts`/`apply.ts`'in üstünde.\r\n */\r\nexport * from './ramp';\r\nexport * from './theme-json';\r\nexport * from './apply';\r\nexport * from './validate';\r\nexport * from './schema';\r\nexport * from './transition';\r\nexport * from './color-mode';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mesgflow-ui-kit-theming.mjs","sources":["../../../projects/ui-kit/theming/color-math.ts","../../../projects/ui-kit/theming/ramp.ts","../../../projects/ui-kit/theming/theme-json.ts","../../../projects/ui-kit/theming/apply.ts","../../../projects/ui-kit/theming/validate.ts","../../../projects/ui-kit/theming/schema.ts","../../../projects/ui-kit/theming/transition.ts","../../../projects/ui-kit/theming/color-mode.ts","../../../projects/ui-kit/theming/index.ts","../../../projects/ui-kit/theming/mesgflow-ui-kit-theming.ts"],"sourcesContent":["/**\r\n * mesgflow — OKLCH renk matematigi (Bjorn Ottosson formulleri,\r\n * https://bottosson.github.io/posts/oklab/). BAGIMSIZ (culori vb. bir\r\n * kutuphane YOK, bkz. plan Faz 2) — yalnizca `theming/ramp.ts`'in ihtiyaci\r\n * kadar: hex <-> OKLCH donusumu + basit gamut-kirpma. Bu dosya PUBLIC API\r\n * DEGIL, `theming/index.ts` bunu re-export ETMEZ.\r\n */\r\n\r\nexport interface Oklch {\r\n l: number;\r\n c: number;\r\n /** Derece (0-360). */\r\n h: number;\r\n}\r\n\r\nfunction srgbToLinear(c8: number): number {\r\n const v = c8 / 255;\r\n return v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\r\n}\r\n\r\nfunction linearToSrgb8(v: number): number {\r\n const clamped = Math.min(1, Math.max(0, v));\r\n const c = clamped <= 0.0031308 ? clamped * 12.92 : 1.055 * Math.pow(clamped, 1 / 2.4) - 0.055;\r\n return Math.round(c * 255);\r\n}\r\n\r\nfunction linearRgbToOklab(r: number, g: number, b: number): [number, number, number] {\r\n const l = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b;\r\n const m = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b;\r\n const s = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b;\r\n const l_ = Math.cbrt(l);\r\n const m_ = Math.cbrt(m);\r\n const s_ = Math.cbrt(s);\r\n return [\r\n 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_,\r\n 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_,\r\n 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_,\r\n ];\r\n}\r\n\r\nfunction oklabToLinearRgb(L: number, a: number, b: number): [number, number, number] {\r\n const l_ = L + 0.3963377774 * a + 0.2158037573 * b;\r\n const m_ = L - 0.1055613458 * a - 0.0638541728 * b;\r\n const s_ = L - 0.0894841775 * a - 1.291485548 * b;\r\n const l = l_ * l_ * l_;\r\n const m = m_ * m_ * m_;\r\n const s = s_ * s_ * s_;\r\n return [\r\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\r\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\r\n -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,\r\n ];\r\n}\r\n\r\n/** `#rgb`/`#rrggbb` -> `[r,g,b]` (0-255). Gecersiz girdi icin `[0,0,0]` (cagiran `parseHex` ile once dogrular). */\r\nexport function hexToRgb(hex: string): [number, number, number] {\r\n const clean = hex.trim().replace('#', '');\r\n const full =\r\n clean.length === 3\r\n ? clean\r\n .split('')\r\n .map((c) => c + c)\r\n .join('')\r\n : clean;\r\n const num = parseInt(full, 16);\r\n if (Number.isNaN(num)) return [0, 0, 0];\r\n return [(num >> 16) & 255, (num >> 8) & 255, num & 255];\r\n}\r\n\r\nexport function rgbToHex(r: number, g: number, b: number): string {\r\n const toHex = (n: number) =>\r\n Math.round(Math.min(255, Math.max(0, n)))\r\n .toString(16)\r\n .padStart(2, '0');\r\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\r\n}\r\n\r\n/** `/^#([0-9a-f]{3}|[0-9a-f]{6})$/i` — `createAccentRamp`/`applyMfTheme`'in girdi dogrulamasi icin. */\r\nexport function isValidHex(hex: string): boolean {\r\n return /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.test(hex.trim());\r\n}\r\n\r\nexport function hexToOklch(hex: string): Oklch {\r\n const [r8, g8, b8] = hexToRgb(hex);\r\n const r = srgbToLinear(r8);\r\n const g = srgbToLinear(g8);\r\n const b = srgbToLinear(b8);\r\n const [L, a, bLab] = linearRgbToOklab(r, g, b);\r\n const c = Math.sqrt(a * a + bLab * bLab);\r\n let h = (Math.atan2(bLab, a) * 180) / Math.PI;\r\n if (h < 0) h += 360;\r\n return { l: L, c, h };\r\n}\r\n\r\n/**\r\n * OKLCH -> hex, basit gamut-kirpma ile: sRGB disina tasan L/C/H kombinasyonlari\r\n * icin kroma kademeli olarak (%92 adimlarla) azaltilir ta ki her kanal [0,1]\r\n * araligina girene kadar (en fazla 24 deneme — pratikte 5-6 yeter). Tam bir\r\n * gamut-mapping algoritmasi DEGIL (ör. CSS Color 4'un \"CSS Gamut Mapping\"i)\r\n * ama bir tema uretici icin yeterli: sonuc HER ZAMAN gecerli bir sRGB hex,\r\n * ton hafifce kayabilir (asiri doygun girdilerde) ama asla clamp-artefact'i\r\n * (yanlis renk) uretmez.\r\n */\r\nexport function oklchToHex(l: number, c: number, h: number): string {\r\n const hRad = (h * Math.PI) / 180;\r\n let chroma = c;\r\n for (let i = 0; i < 24; i++) {\r\n const a = chroma * Math.cos(hRad);\r\n const b = chroma * Math.sin(hRad);\r\n const [r, g, bl] = oklabToLinearRgb(l, a, b);\r\n const inGamut = [r, g, bl].every((v) => v >= -0.001 && v <= 1.001);\r\n if (inGamut || chroma <= 0.0001) {\r\n return rgbToHex(linearToSrgb8(r), linearToSrgb8(g), linearToSrgb8(bl));\r\n }\r\n chroma *= 0.92;\r\n }\r\n const [r, g, bl] = oklabToLinearRgb(l, 0, 0);\r\n return rgbToHex(linearToSrgb8(r), linearToSrgb8(g), linearToSrgb8(bl));\r\n}\r\n\r\n/** WCAG göreli parlaklık (0-1) — `pickForeground`'ın kontrast oranı hesabının temeli. (`npm run check:contrast`, `scripts/check-contrast.mjs`, kitten BAĞIMSIZ kendi kopyasını taşır — aynı formül, farklı dosya.) */\r\nexport function relativeLuminance(hex: string): number {\r\n const [r8, g8, b8] = hexToRgb(hex);\r\n const lin = (c8: number) => {\r\n const v = c8 / 255;\r\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\r\n };\r\n return 0.2126 * lin(r8) + 0.7152 * lin(g8) + 0.0722 * lin(b8);\r\n}\r\n\r\n/** İki hex arası WCAG kontrast oranı (1-21). */\r\nexport function contrastRatio(hexA: string, hexB: string): number {\r\n const lA = relativeLuminance(hexA);\r\n const lB = relativeLuminance(hexB);\r\n const lighter = Math.max(lA, lB);\r\n const darker = Math.min(lA, lB);\r\n return (lighter + 0.05) / (darker + 0.05);\r\n}\r\n\r\n/** `background` üstünde `light`/`dark` metninden HANGİSİ daha kontrastlıysa onu döner — `fgOnAccent` bunu kullanır. */\r\nexport function pickForeground(background: string, light: string, dark: string): string {\r\n return contrastRatio(background, light) >= contrastRatio(background, dark) ? light : dark;\r\n}\r\n\r\n/** `a`/`b` hex'lerini `t` (0-1) oranında karıştırır — `neutralTint`'in ince renk katması için (OKLCH DEĞİL, düz sRGB lerp: küçük `t` değerlerinde (≤0.08) fark edilmez, 13 basamaklı nötr rampayı yeniden OKLCH'de üretmekten çok daha basit ve güvenli). */\r\nexport function mixHex(a: string, b: string, t: number): string {\r\n const [ar, ag, ab] = hexToRgb(a);\r\n const [br, bg, bb] = hexToRgb(b);\r\n const mix = (x: number, y: number) => x + (y - x) * t;\r\n return rgbToHex(mix(ar, br), mix(ag, bg), mix(ab, bb));\r\n}\r\n","import { contrastRatio, hexToOklch, isValidHex, oklchToHex, pickForeground } from './color-math';\r\n\r\nexport type RampStep =\r\n '50' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | '950';\r\n\r\nexport type AccentRamp = Record<RampStep, string>;\r\n\r\n/**\r\n * Basamak bağımsız SABİT bir eğri — herhangi bir girdi hue'sunda \"aynı ağırlık\r\n * hissini\" garanti eder (bkz. plan Faz 2: tüketici hangi accent'i seçerse\r\n * seçsin ramp'in 600 basamağı HER ZAMAN \"metin/kenarlık\" ağırlığında olmalı,\r\n * 950 basamağı HER ZAMAN \"neredeyse siyah\" olmalı). `color.css`'teki\r\n * varsayılan \"Deep Emerald\" rampasıyla (primary-600 = #004d40, L≈0.38)\r\n * TAM ÖRTÜŞMEZ — bu eğride 600 = L 0.50, kasıtlı: elle taşınan varsayılan\r\n * rampa marka için özel olarak koyulaştırıldı. Ayrıca DOLU BLOK (`accent-fill`)\r\n * artık `accent`/`accent-strong` (600/700 tabanlı) metin/kenarlık rolünden\r\n * TAMAMEN AYRI bir basamak çifti kullanıyor — kitin varsayılan rampasında\r\n * LIGHT 900 / DARK 400 (spec'in \"Forest Emerald\" CTA'sı + canlı zümrüt CTA'sı,\r\n * kullanıcı kararı); tüketici aksanlarında ise (bkz. `theming/apply.ts`\r\n * `accentRoleLines()`) bu eğrinin kendi 600/400 basamakları kullanılır —\r\n * varsayılandan farklı bir \"ağırlık\" üretir, bu FARK belgelidir, hata değildir.\r\n */\r\nconst LIGHTNESS_BY_STEP: Record<RampStep, number> = {\r\n '50': 0.97,\r\n '100': 0.94,\r\n '200': 0.88,\r\n '300': 0.79,\r\n '400': 0.7,\r\n '500': 0.6,\r\n '600': 0.5,\r\n '700': 0.42,\r\n '800': 0.34,\r\n '900': 0.27,\r\n '950': 0.2,\r\n};\r\n\r\n/**\r\n * Girdinin KENDİ kroması, uç basamaklarda (çok açık/çok koyu) doğal olarak\r\n * azalır — aksi halde `950` basamağı \"doygun ama neredeyse siyah\" (gamut\r\n * dışı, kirpma sonrası tonu kayan) bir renge dönüşür. `600` = girdinin TAM\r\n * kroması (referans basamak).\r\n */\r\nconst CHROMA_MULTIPLIER_BY_STEP: Record<RampStep, number> = {\r\n '50': 0.05,\r\n '100': 0.12,\r\n '200': 0.25,\r\n '300': 0.45,\r\n '400': 0.7,\r\n '500': 0.9,\r\n '600': 1,\r\n '700': 0.95,\r\n '800': 0.85,\r\n '900': 0.7,\r\n '950': 0.55,\r\n};\r\n\r\nexport const RAMP_STEPS: readonly RampStep[] = [\r\n '50',\r\n '100',\r\n '200',\r\n '300',\r\n '400',\r\n '500',\r\n '600',\r\n '700',\r\n '800',\r\n '900',\r\n '950',\r\n];\r\n\r\n/**\r\n * `hex` bir accent'in \"600 basamağı\" gibi ele alınır (kitin kendi kuralı,\r\n * bkz. `color.css` \"Her rampada basamak 600 = LIGHT modda dolu/etkileşimli\r\n * kullanım\" notu) — girdinin hue'su + kroma karakteri korunur, tüm 11\r\n * basamak `LIGHTNESS_BY_STEP`/`CHROMA_MULTIPLIER_BY_STEP` sabit eğrisiyle\r\n * YENİDEN üretilir (girdinin TAM OLARAK 600'e denk gelen bir L'de olması\r\n * ŞART DEĞİL — ör. çok açık bir hex verilse bile 950 basamağı yine\r\n * \"neredeyse siyah\" çıkar, ramp her zaman tutarlı).\r\n *\r\n * @throws girdi `#rgb`/`#rrggbb` değilse.\r\n */\r\nexport function createAccentRamp(hex: string): AccentRamp {\r\n if (!isValidHex(hex)) {\r\n throw new Error(`createAccentRamp: geçersiz hex \"${hex}\" — #rgb veya #rrggbb bekleniyor.`);\r\n }\r\n const { c, h } = hexToOklch(hex);\r\n const ramp = {} as AccentRamp;\r\n for (const step of RAMP_STEPS) {\r\n ramp[step] = oklchToHex(LIGHTNESS_BY_STEP[step], c * CHROMA_MULTIPLIER_BY_STEP[step], h);\r\n }\r\n return ramp;\r\n}\r\n\r\n/**\r\n * Bir rampa basamağının üstüne binecek metin rengi — `#ffffff` veya kitin\r\n * `--mf-surface-inverse`'i (`#04110d`, `color.css`) arasından HANGİSİ WCAG\r\n * kontrastı daha yüksekse. `theming/apply.ts`'teki `accentRoleLines()` bunu\r\n * `ramp['600']` (LIGHT yarı) VE `ramp['400']` (DARK yarı) için AYRI AYRI\r\n * çağırır — accent-fill artık İKİ basamak kullanıyor (kitin varsayılanında\r\n * 900/400, tüketici aksanlarında 600/400), genelde çok farklı parlaklıkta,\r\n * her biri kendi doğru metin rengini WCAG hesabıyla (sabit varsayım DEĞİL)\r\n * bulur.\r\n */\r\nexport function fgOnAccent(accentHex: string): string {\r\n return pickForeground(accentHex, '#ffffff', '#04110d');\r\n}\r\n\r\n/** `ramp`'in `600` basamağının kontrast oranını (beyaz metne karşı) döner — `ramp.spec.ts`/tüketici sağlık kontrolü için. */\r\nexport function accentContrastWithWhite(ramp: AccentRamp): number {\r\n return contrastRatio(ramp['600'], '#ffffff');\r\n}\r\n","import type { RampStep } from './ramp';\r\n\r\nexport type RadiusScale = 'sharp' | 'default' | 'soft';\r\n/** Kontrol yüksekliği merdiveni (sm/md/lg): `compact` 28/32/36px, `default` 32/36/40px, `comfortable` 36/40/44px — bkz. `radius.css` `--control-h-*`. */\r\nexport type MfDensity = 'compact' | 'default' | 'comfortable';\r\nexport type NeutralTint = 'cool' | 'neutral' | 'warm';\r\n\r\n/**\r\n * Nötr rampa 13 basamaklı (`850`/`975` DAHİL) — diğer altı rampanın (primary/\r\n * success/warning/danger/info/help) 11 basamaklık `RampStep`'inden AYRI bir\r\n * tip (bkz. `color.css` \"RENK — HAM RAMPALAR\" notu, `NEUTRAL_STEPS` — `apply.ts`).\r\n */\r\nexport const MF_NEUTRAL_RAMP_STEPS = [\r\n '50',\r\n '100',\r\n '200',\r\n '300',\r\n '400',\r\n '500',\r\n '600',\r\n '700',\r\n '800',\r\n '850',\r\n '900',\r\n '950',\r\n '975',\r\n] as const;\r\nexport type MfNeutralRampStep = (typeof MF_NEUTRAL_RAMP_STEPS)[number];\r\n\r\n/** `ramps.<tone>` altında elle geçilebilen altı 11-basamaklı rampa — `neutral` (13 basamak) AYRI ele alınır. */\r\nexport const MF_RAMP_TONES = ['primary', 'success', 'warning', 'danger', 'info', 'help'] as const;\r\nexport type MfRampTone = (typeof MF_RAMP_TONES)[number];\r\n\r\n/**\r\n * `color.css`'in rol katmanındaki, bir RAMPA basamağına `var()` İLE\r\n * BAĞLI OLMAYAN (yani `ramps.*` override'ıyla OTOMATİK takip ETMEYEN) TEK\r\n * TEK yazılmış literal token'lar — `accent`/`ramps.*` DIŞINDA kalan, marka\r\n * beyaz etiketlemesi için hâlâ ayarlanabilir olması gereken son katman.\r\n * (`--mf-accent`, `--mf-success-fill`, `--mf-success-tint` vb. BURADA YOK —\r\n * hepsi zaten `ramps.primary`/`ramps.success` override'ıyla otomatik\r\n * güncellenir, bkz. `color.css`'teki `var(--color-X-NNN)` referansları.)\r\n */\r\nexport const MF_ROLE_TOKENS = [\r\n 'surface',\r\n 'chrome',\r\n 'overlay',\r\n 'surface-inverse',\r\n 'glass',\r\n 'fg',\r\n 'fg-muted',\r\n 'fg-on-accent',\r\n 'fg-inverse',\r\n 'hairline',\r\n 'neutral-fill',\r\n 'neutral-fill-hover',\r\n 'neutral-fill-fg',\r\n 'success-fill-fg',\r\n 'warning-fill-fg',\r\n 'danger-fill-fg',\r\n 'info-fill-fg',\r\n 'help-fill-fg',\r\n 'chart-1',\r\n 'chart-2',\r\n 'chart-3',\r\n 'chart-4',\r\n 'chart-5',\r\n 'chart-6',\r\n 'chart-7',\r\n 'chart-8',\r\n 'chart-other',\r\n] as const;\r\nexport type MfRoleToken = (typeof MF_ROLE_TOKENS)[number];\r\n\r\n/**\r\n * Tam beyaz etiket tema tanımı — `applyMfTheme()`/`exportMfThemeCss()`'e\r\n * verilir. HER alan OPSİYONEL; hiçbiri verilmezse kit kendi \"Deep Emerald &\r\n * Slate\" varsayılanında kalır (bkz. `applyMfTheme` doc'u). Sadece VERİLEN\r\n * alanlar `applyMfTheme`'de INLINE STYLE olarak YAZILIR — bir \"tüm token\r\n * dökümü\" ÜRETİLMEZ/GEREKMEZ, bu yüzden kitin CSS kaynağıyla asla senkron\r\n * DIŞI kalamaz (delta-only, bkz. dosya üstündeki mimari not).\r\n *\r\n * - `accent`/`radiusScale`/`neutralTint` — mevcut kısayollar (bkz. `apply.ts`).\r\n * - `density` — kit genelinde kontrol yüksekliği (Button/Input/Select/...).\r\n * Bir alt ağaç için `data-density=\"compact\"` özniteliği de aynı işi yapar.\r\n * - `ramps` — bir tonun TÜM basamaklarını (ya da bir kısmını) ELLE verir.\r\n * `ramps.primary` verilirse `accent` kısayolunu (aynı çağrıda) EZER — TAM\r\n * kontrol isteyen tüketiciler için. Bir tonun rampasını değiştirmek O\r\n * tonun TÜM türetilmiş rol token'larını (`--mf-X`, `--mf-X-fill`,\r\n * `--mf-X-tint` vb.) OTOMATİK günceller — `color.css`'in rol katmanı\r\n * zaten `var(--color-X-NNN)` ile bu rampaya BAĞLI (bkz. dosya üstündeki\r\n * `MfRoleToken` notu). Bu, TEK bir alanla (\"ramps.danger\") beş türetilmiş\r\n * token'ı BİRDEN doğru şekilde güncelleyen ASIL güç kaynağı.\r\n * - `roles` — rampaya BAĞLI OLMAYAN literal token'lar (bkz. `MfRoleToken`).\r\n * `light`/`dark` AYRI verilir; SADECE biri verilirse İKİ modda da AYNI\r\n * değer kullanılır (basit/öngörülebilir davranış — hangi modda olduğunu\r\n * PROBE etmek yerine).\r\n * - `fonts`/`radius` — moddan BAĞIMSIZ, düz değer.\r\n */\r\nexport interface MfThemeJson {\r\n /** Doküman/editör amaçlı — JSON Schema referansı (bkz. `schema.ts`). Kit tarafından OKUNMAZ. */\r\n $schema?: string;\r\n /** İnsan-okur isim (ör. \"Acme Kurumsal\") — kit tarafından OKUNMAZ, sadece bir tema seçici/listesi için. */\r\n name?: string;\r\n accent?: string | null;\r\n radiusScale?: RadiusScale;\r\n density?: MfDensity;\r\n neutralTint?: NeutralTint;\r\n ramps?: Partial<Record<MfRampTone, Partial<Record<RampStep, string>>>> & {\r\n neutral?: Partial<Record<MfNeutralRampStep, string>>;\r\n };\r\n roles?: {\r\n light?: Partial<Record<MfRoleToken, string>>;\r\n dark?: Partial<Record<MfRoleToken, string>>;\r\n };\r\n fonts?: { sans?: string; display?: string; mono?: string };\r\n radius?: Partial<Record<'xs' | 'sm' | 'md' | 'lg' | 'xl', string>>;\r\n}\r\n\r\n/** `MfThemeJson`'ın eski adı — `applyMfTheme({accent, radiusScale, neutralTint})` şeklindeki MEVCUT çağrılar (kısayol alt kümesi) hâlâ geçerli, bu takma ad SADECE geriye dönük TİP uyumluluğu için. */\r\nexport type MfThemeConfig = MfThemeJson;\r\n","import { mixHex } from './color-math';\r\nimport { createAccentRamp, fgOnAccent, RAMP_STEPS, type RampStep } from './ramp';\r\nimport {\r\n MF_NEUTRAL_RAMP_STEPS,\r\n MF_RAMP_TONES,\r\n MF_ROLE_TOKENS,\r\n type MfDensity,\r\n type MfRampTone,\r\n type MfThemeJson,\r\n type NeutralTint,\r\n type RadiusScale,\r\n} from './theme-json';\r\n\r\nconst RADIUS_PX: Record<RadiusScale, Record<'xs' | 'sm' | 'md' | 'lg' | 'xl', number>> = {\r\n sharp: { xs: 2, sm: 3, md: 4, lg: 6, xl: 8 },\r\n default: { xs: 4, sm: 6, md: 8, lg: 12, xl: 16 },\r\n soft: { xs: 6, sm: 10, md: 14, lg: 20, xl: 28 },\r\n};\r\n\r\n/** `radius.css`'teki `--control-h-*` ile AYNI değerler — `[data-density]` seçicileri de bunları kullanır. */\r\nconst CONTROL_H_KEYS = ['xs', 'sm', 'md', 'lg', 'xl'] as const;\r\n\r\nconst CONTROL_H_PX: Record<MfDensity, Record<(typeof CONTROL_H_KEYS)[number], number>> = {\r\n compact: { xs: 24, sm: 28, md: 32, lg: 36, xl: 44 },\r\n default: { xs: 28, sm: 32, md: 36, lg: 40, xl: 48 },\r\n comfortable: { xs: 32, sm: 36, md: 40, lg: 44, xl: 52 },\r\n};\r\n\r\nfunction densityLines(density: MfDensity): [string, string][] {\r\n return CONTROL_H_KEYS.map((key) => [\r\n `--control-h-${key}`,\r\n `${CONTROL_H_PX[density][key] / 16}rem`,\r\n ]);\r\n}\r\n\r\n/** `color.css`'teki 13 basamaklı nötr merdiven — tint karışımı bunların HEPSİNİ, moddan bağımsız (raw ramp) günceller. */\r\nconst NEUTRAL_STEPS = MF_NEUTRAL_RAMP_STEPS;\r\n\r\n/** `ramps.<tone>` genel-amaçlı döngüsü için — `primary` kendi özel `accentRoleLines()` türetmesi yüzünden AYRI ele alınır (bkz. altta). */\r\nconst OTHER_RAMP_TONES = MF_RAMP_TONES.filter(\r\n (tone): tone is Exclude<MfRampTone, 'primary'> => tone !== 'primary',\r\n);\r\n\r\n/** Sabit, hue'ya dayalı iki tint ucu — accent'ten BAĞIMSIZ (bkz. plan Faz 2 \"neutralTint\"). `mixHex` küçük `t` ile çağrıldığı için nötrün kendi algısal parlaklığı korunur. */\r\nconst TINT_HEX: Record<Exclude<NeutralTint, 'neutral'>, string> = {\r\n cool: '#3b82f6',\r\n warm: '#f59e0b',\r\n};\r\n\r\nconst TINT_AMOUNT = 0.06;\r\n\r\n/**\r\n * `--mf-fg-on-accent`/`--mf-accent-fill`/`--mf-accent-fill-hover` rol\r\n * token'ları rampa basamağı gibi `--color-primary-*` ADI ALTINDA değil,\r\n * kendi `--mf-*` isimleriyle yazılır (bkz. color.css rol katmanı) — bu\r\n * yüzden `RAMP_STEPS` döngüsüne dahil DEĞİLLER, `accent: null` temizliğinin\r\n * de bunları AYRICA silmesi gerekiyor.\r\n */\r\nconst ACCENT_ROLE_PROPS = [\r\n '--mf-fg-on-accent',\r\n '--mf-accent-fill',\r\n '--mf-accent-fill-hover',\r\n] as const;\r\n\r\n/**\r\n * Bir accent ramp'inden üç rol token satırını üretir — `applyMfTheme` (runtime\r\n * `setProperty`) ve `exportMfThemeCss` (statik string) İKİSİ de bunu kullanır,\r\n * tek kaynak. Kitin KENDİ varsayılan rampasıyla AYNI desen (color.css): dolu\r\n * blok LIGHT'ta 600, DARK'ta 400 (hover 700/500) — `light-dark()`'ın İKİ\r\n * yarısı da AYRI hesaplanır, tek bir sabit değer DEĞİL. `fgOnAccent` her\r\n * yarı için AYRI çağrılır çünkü 600 ile 400 basamağı genelde çok farklı\r\n * parlaklıkta (600 koyu → genelde beyaz metin ister, 400 açık → genelde\r\n * mürekkep ister) — tüketicinin verdiği HERHANGİ bir aksan renginde bu iki\r\n * yarı FARKLI metin rengine ihtiyaç duyabilir (bkz. kitin varsayılan primary\r\n * rampası: light `#062c22` + beyaz, dark `#10b981` + mürekkep — aynı asimetri).\r\n * `ramp` EKSİK basamak taşıyorsa (ör. `ramps.primary` kısmi verildiyse,\r\n * `resolvedPrimaryRamp`'in okunmuş/birleştirilmiş sonucu DEĞİLSE) `null`\r\n * döner — çağıran bu durumda satırları YAZMAZ (bkz. `exportMfThemeCss`).\r\n */\r\nfunction accentRoleLines(\r\n ramp: Partial<Record<RampStep, string>>,\r\n): Array<[(typeof ACCENT_ROLE_PROPS)[number], string]> | null {\r\n const c400 = ramp['400'];\r\n const c500 = ramp['500'];\r\n const c600 = ramp['600'];\r\n const c700 = ramp['700'];\r\n if (!c400 || !c500 || !c600 || !c700) return null;\r\n const fgLight = fgOnAccent(c600);\r\n const fgDark = fgOnAccent(c400);\r\n return [\r\n ['--mf-fg-on-accent', `light-dark(${fgLight}, ${fgDark})`],\r\n ['--mf-accent-fill', `light-dark(${c600}, ${c400})`],\r\n ['--mf-accent-fill-hover', `light-dark(${c700}, ${c500})`],\r\n ];\r\n}\r\n\r\nfunction isBrowser(): boolean {\r\n return typeof document !== 'undefined';\r\n}\r\n\r\n/**\r\n * `config.ramps.primary` (kısmi olabilir) ile `el`'in O ANKİ hesaplanmış\r\n * `--color-primary-*` değerlerini BİRLEŞTİRİR — `accentRoleLines()`'ın TAM\r\n * bir ramp'e (400/500/600/700) ihtiyacı var, tüketici SADECE birkaç basamağı\r\n * override etse bile (ör. sadece `600`) doğru `--mf-accent-fill` vb.\r\n * türetilsin diye (bkz. `neutralTint`'in AYNI \"önce oku, sonra karıştır\"\r\n * ilkesi, altta).\r\n */\r\nfunction resolvedPrimaryRamp(\r\n el: HTMLElement,\r\n override: Partial<Record<RampStep, string>>,\r\n): Record<RampStep, string> {\r\n const computed = getComputedStyle(el);\r\n const ramp = {} as Record<RampStep, string>;\r\n for (const step of RAMP_STEPS) {\r\n ramp[step] = override[step] ?? computed.getPropertyValue(`--color-primary-${step}`).trim();\r\n }\r\n return ramp;\r\n}\r\n\r\n/**\r\n * `config.roles.light[key]`/`config.roles.dark[key]`'i TEK bir `light-dark()`\r\n * CSS değerine çevirir — sadece BİRİ verilirse İKİ modda da AYNI değer\r\n * kullanılır (bkz. `theme-json.ts`'teki `MfThemeJson.roles` doc'u — hangi\r\n * modda olunduğunu PROBE etmek yerine BİLEREK basit/öngörülebilir).\r\n */\r\nfunction roleLightDarkValue(light: string | undefined, dark: string | undefined): string | null {\r\n const resolvedLight = light ?? dark;\r\n const resolvedDark = dark ?? light;\r\n if (resolvedLight === undefined || resolvedDark === undefined) return null;\r\n return `light-dark(${resolvedLight}, ${resolvedDark})`;\r\n}\r\n\r\n/**\r\n * `MfThemeJson`'ı CSS custom property'leri olarak `target`'a (varsayılan\r\n * `document.documentElement`) YAZAR — sayfa YENİDEN YÜKLENMEDEN, hiçbir\r\n * bileşen dosyasına dokunmadan tüm kit anında yeni temaya geçer. Bunun\r\n * mümkün olmasının nedeni: Tailwind v4'ün ürettiği utility'ler (`bg-primary-600`,\r\n * `rounded-md`, ...) derleme zamanında SABİT bir değere değil, doğrudan\r\n * `var(--color-primary-600)`/`var(--radius-md)` REFERANSINA derleniyor (bkz.\r\n * `docs/tr/mimari.md` \"Token mimarisi\") — CSS cascade'de bu satırlar\r\n * `@theme`'in KENDİ tanımından SONRA (inline stil her zaman kazanır)\r\n * çalıştığı için token'lar üzerinden TÜM bileşenler güncellenir. SADECE\r\n * `config`'te VERİLEN alanlar yazılır (\"delta-only\") — bu fonksiyon kitin\r\n * TÜM varsayılan token setini bilmek/üretmek ZORUNDA DEĞİL, bu yüzden\r\n * kitin CSS kaynağıyla asla senkron dışı kalamaz.\r\n *\r\n * - `accent` verilirse: `createAccentRamp()` ile 11 basamaklı `--color-primary-*`\r\n * YENİDEN üretilir + `accentRoleLines()` (`--mf-fg-on-accent`/`-accent-fill`/\r\n * `-accent-fill-hover`, `light-dark()` literal değerleri — bkz. altta).\r\n * `:root`/`.dark` bunları zaten `var()` ile referans aldığı için (bkz.\r\n * `color.css` rol katmanı) `--mf-accent`/`--mf-accent-strong`/`--mf-focus-ring`/\r\n * `--mf-primary-tint(-fg)` AYRICA yazılmaz — otomatik takip eder.\r\n * - `accent: null` verilirse: yukarıdaki override'ların HEPSİ temizlenir, kit\r\n * `color.css`'teki varsayılan \"Deep Emerald\" rampasına döner.\r\n * - `ramps.primary` verilirse (`accent`'i EZER — aynı çağrıda ikisi de\r\n * verilirse `ramps.primary` kazanır): basamak başına TAM kontrol, kısmi\r\n * olabilir (`resolvedPrimaryRamp` ile O ANKİ değerlerle birleştirilir).\r\n * - `ramps.success`/`warning`/`danger`/`info`/`help`/`neutral` verilirse:\r\n * verilen basamaklar DOĞRUDAN yazılır — bu tonların TÜM türetilmiş rol\r\n * token'ları (`--mf-X`, `--mf-X-fill`, `--mf-X-tint` vb.) `color.css`'te\r\n * zaten `var(--color-X-NNN)` ile bu rampaya bağlı, OTOMATİK güncellenir.\r\n * - `roles.light`/`roles.dark` verilirse: rampaya BAĞLI OLMAYAN literal\r\n * token'lar (bkz. `MfRoleToken`) `light-dark()` ile yazılır.\r\n * - `fonts`/`radius` verilirse: moddan bağımsız düz değerler yazılır —\r\n * `radius` `radiusScale`'İN ÜSTÜNE (aynı çağrıda ikisi de verilirse SONRA\r\n * uygulanır) basamak-bazlı ince ayar sağlar.\r\n * - `radiusScale` verilirse: `--radius-{xs,sm,md,lg,xl}` nested ölçeği\r\n * KORUYARAK (bkz. `radius.css` doktrini) birlikte küçülür/büyür.\r\n * - `density` verilirse: `--control-h-{sm,md,lg}` merdiveni yazılır — tüm\r\n * kontroller (Button/Input/Select/...) aynı hizada birlikte büyür/küçülür.\r\n * - `neutralTint` verilirse: 13 basamaklı `--color-neutral-*` rampası ÇOK\r\n * düşük oranda (bkz. `color-math.ts` `mixHex`) soğuk/sıcak bir tona kayar\r\n * — `ramps.neutral` AYNI ÇAĞRIDA verildiyse ONUN ÜSTÜNE uygulanır (bu\r\n * fonksiyondaki sıra: ramps → neutralTint).\r\n *\r\n * SSR güvenli — `document` yoksa no-op.\r\n */\r\nexport function applyMfTheme(config: MfThemeJson, target?: HTMLElement): void {\r\n if (!isBrowser()) return;\r\n const el = target ?? document.documentElement;\r\n\r\n if (config.accent === null && !config.ramps?.primary) {\r\n for (const step of RAMP_STEPS) {\r\n el.style.removeProperty(`--color-primary-${step}`);\r\n }\r\n for (const prop of ACCENT_ROLE_PROPS) {\r\n el.style.removeProperty(prop);\r\n }\r\n } else if (config.ramps?.primary) {\r\n const ramp = resolvedPrimaryRamp(el, config.ramps.primary);\r\n for (const step of RAMP_STEPS) {\r\n el.style.setProperty(`--color-primary-${step}`, ramp[step]);\r\n }\r\n const lines = accentRoleLines(ramp);\r\n if (lines) {\r\n for (const [prop, value] of lines) el.style.setProperty(prop, value);\r\n }\r\n } else if (config.accent) {\r\n const ramp = createAccentRamp(config.accent);\r\n for (const step of RAMP_STEPS) {\r\n el.style.setProperty(`--color-primary-${step}`, ramp[step]);\r\n }\r\n const lines = accentRoleLines(ramp);\r\n if (lines) {\r\n for (const [prop, value] of lines) el.style.setProperty(prop, value);\r\n }\r\n }\r\n\r\n for (const tone of OTHER_RAMP_TONES) {\r\n const override = config.ramps?.[tone];\r\n if (!override) continue;\r\n for (const step of RAMP_STEPS) {\r\n const hex = override[step];\r\n if (hex) el.style.setProperty(`--color-${tone}-${step}`, hex);\r\n }\r\n }\r\n\r\n if (config.ramps?.neutral) {\r\n for (const step of NEUTRAL_STEPS) {\r\n const hex = config.ramps.neutral[step];\r\n if (hex) el.style.setProperty(`--color-neutral-${step}`, hex);\r\n }\r\n }\r\n\r\n if (config.roles) {\r\n for (const key of MF_ROLE_TOKENS) {\r\n const value = roleLightDarkValue(config.roles.light?.[key], config.roles.dark?.[key]);\r\n if (value) el.style.setProperty(`--mf-${key}`, value);\r\n }\r\n }\r\n\r\n if (config.fonts?.sans) el.style.setProperty('--font-sans', config.fonts.sans);\r\n if (config.fonts?.display) el.style.setProperty('--font-display', config.fonts.display);\r\n if (config.fonts?.mono) el.style.setProperty('--font-mono', config.fonts.mono);\r\n\r\n if (config.radiusScale) {\r\n const px = RADIUS_PX[config.radiusScale];\r\n for (const [key, value] of Object.entries(px)) {\r\n el.style.setProperty(`--radius-${key}`, `${value}px`);\r\n }\r\n }\r\n if (config.radius) {\r\n for (const [key, value] of Object.entries(config.radius)) {\r\n if (value) el.style.setProperty(`--radius-${key}`, value);\r\n }\r\n }\r\n\r\n if (config.density) {\r\n for (const [prop, value] of densityLines(config.density)) el.style.setProperty(prop, value);\r\n }\r\n\r\n if (config.neutralTint !== undefined) {\r\n // ÖNCE inline override'ı TEMİZLE (`removeProperty`), SONRA (tint !=\r\n // 'neutral' ise) `getComputedStyle`'ı yeniden oku — aksi halde art arda\r\n // iki `applyMfTheme({ neutralTint: 'cool' })` çağrısı (ör. tema\r\n // özelleştiricide kullanıcı aynı seçimi tekrar tetiklerse) İKİNCİ\r\n // çağrıda ZATEN tint'lenmiş değerin üstüne BİR TINT DAHA karıştırırdı\r\n // (`getComputedStyle` kendi az önce yazdığı inline değeri geri okur) —\r\n // gerçek bulgu, kümülatif/katlanan bir renk kayması üretiyordu.\r\n for (const step of NEUTRAL_STEPS) {\r\n el.style.removeProperty(`--color-neutral-${step}`);\r\n }\r\n if (config.neutralTint !== 'neutral') {\r\n const tint = TINT_HEX[config.neutralTint];\r\n const computed = getComputedStyle(el);\r\n for (const step of NEUTRAL_STEPS) {\r\n const current = computed.getPropertyValue(`--color-neutral-${step}`).trim();\r\n if (!current) continue;\r\n el.style.setProperty(`--color-neutral-${step}`, mixHex(current, tint, TINT_AMOUNT));\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * `applyMfTheme()`'in YAZABİLECEĞİ HER inline override'ı temizler — bir\r\n * tema özelleştiricideki \"Varsayılana sıfırla\" düğmesi için `accent: null`'ın\r\n * genişletilmiş hali (o SADECE accent'i temizlerdi). Kit `color.css`'teki\r\n * varsayılanlara TAMAMEN geri döner.\r\n */\r\nexport function resetMfTheme(target?: HTMLElement): void {\r\n if (!isBrowser()) return;\r\n const el = target ?? document.documentElement;\r\n\r\n for (const step of RAMP_STEPS) el.style.removeProperty(`--color-primary-${step}`);\r\n for (const prop of ACCENT_ROLE_PROPS) el.style.removeProperty(prop);\r\n for (const tone of OTHER_RAMP_TONES) {\r\n for (const step of RAMP_STEPS) el.style.removeProperty(`--color-${tone}-${step}`);\r\n }\r\n for (const step of NEUTRAL_STEPS) el.style.removeProperty(`--color-neutral-${step}`);\r\n for (const key of MF_ROLE_TOKENS) el.style.removeProperty(`--mf-${key}`);\r\n el.style.removeProperty('--font-sans');\r\n el.style.removeProperty('--font-display');\r\n el.style.removeProperty('--font-mono');\r\n for (const key of ['xs', 'sm', 'md', 'lg', 'xl']) el.style.removeProperty(`--radius-${key}`);\r\n for (const key of CONTROL_H_KEYS) el.style.removeProperty(`--control-h-${key}`);\r\n}\r\n\r\n/**\r\n * `applyMfTheme` ile AYNI hesaplamayı yapar ama runtime'da uygulamak yerine\r\n * yapıştırılabilir bir `{ selector } { ... }` bloğu (varsayılan `:root`)\r\n * döner — tüketici build-time'da kendi `styles.css`'ine ekleyebilir (docs\r\n * sitesindeki tema özelleştiricinin \"CSS'i kopyala\" düğmesi bunu kullanır).\r\n * `roles.*` İÇİN de (runtime'daki AYNI `light-dark()` deseni) tek blokla\r\n * hem açık hem koyu mod kapsanır, AYRI bir `.dark` bloğu GEREKMEZ. `ramps.\r\n * primary` KISMİ verilip 400/500/600/700'ün TAMAMI yoksa `--mf-accent-fill`\r\n * vb. satırlar (canlı DOM'dan O ANKİ değeri okuyamadığı için) ATLANIR — bu\r\n * durumda `applyMfTheme`'i (runtime, `resolvedPrimaryRamp` ile tamamlar)\r\n * tercih edin. `neutralTint` BURADA desteklenmez — mevcut nötr değerleri\r\n * okumak için canlı bir DOM/`getComputedStyle` gerekir, statik bir string\r\n * üretici bunu bilemez (tüketici tint'i kendi `applyMfTheme()` çağrısıyla\r\n * runtime'da uygulamalı).\r\n */\r\nexport function exportMfThemeCss(\r\n config: Omit<MfThemeJson, 'neutralTint'>,\r\n options?: { selector?: string },\r\n): string {\r\n const selector = options?.selector ?? ':root';\r\n const lines: string[] = [`${selector} {`];\r\n\r\n if (config.ramps?.primary) {\r\n const ramp = config.ramps.primary;\r\n for (const step of RAMP_STEPS) {\r\n const hex = ramp[step];\r\n if (hex) lines.push(` --color-primary-${step}: ${hex};`);\r\n }\r\n const roleLines = accentRoleLines(ramp);\r\n if (roleLines) {\r\n for (const [prop, value] of roleLines) lines.push(` ${prop}: ${value};`);\r\n }\r\n } else if (config.accent) {\r\n const ramp = createAccentRamp(config.accent);\r\n for (const step of RAMP_STEPS) {\r\n lines.push(` --color-primary-${step}: ${ramp[step]};`);\r\n }\r\n const roleLines = accentRoleLines(ramp);\r\n if (roleLines) {\r\n for (const [prop, value] of roleLines) lines.push(` ${prop}: ${value};`);\r\n }\r\n }\r\n\r\n for (const tone of OTHER_RAMP_TONES) {\r\n const override = config.ramps?.[tone];\r\n if (!override) continue;\r\n for (const step of RAMP_STEPS) {\r\n const hex = override[step];\r\n if (hex) lines.push(` --color-${tone}-${step}: ${hex};`);\r\n }\r\n }\r\n\r\n if (config.ramps?.neutral) {\r\n for (const step of NEUTRAL_STEPS) {\r\n const hex = config.ramps.neutral[step];\r\n if (hex) lines.push(` --color-neutral-${step}: ${hex};`);\r\n }\r\n }\r\n\r\n if (config.roles) {\r\n for (const key of MF_ROLE_TOKENS) {\r\n const value = roleLightDarkValue(config.roles.light?.[key], config.roles.dark?.[key]);\r\n if (value) lines.push(` --mf-${key}: ${value};`);\r\n }\r\n }\r\n\r\n if (config.fonts?.sans) lines.push(` --font-sans: ${config.fonts.sans};`);\r\n if (config.fonts?.display) lines.push(` --font-display: ${config.fonts.display};`);\r\n if (config.fonts?.mono) lines.push(` --font-mono: ${config.fonts.mono};`);\r\n\r\n if (config.radiusScale) {\r\n const px = RADIUS_PX[config.radiusScale];\r\n for (const [key, value] of Object.entries(px)) {\r\n lines.push(` --radius-${key}: ${value}px;`);\r\n }\r\n }\r\n if (config.radius) {\r\n for (const [key, value] of Object.entries(config.radius)) {\r\n if (value) lines.push(` --radius-${key}: ${value};`);\r\n }\r\n }\r\n\r\n if (config.density) {\r\n for (const [prop, value] of densityLines(config.density)) lines.push(` ${prop}: ${value};`);\r\n }\r\n\r\n lines.push('}');\r\n return lines.join('\\n');\r\n}\r\n","import { contrastRatio, isValidHex } from './color-math';\r\nimport { RAMP_STEPS } from './ramp';\r\nimport { MF_RAMP_TONES, type MfThemeJson } from './theme-json';\r\n\r\nexport type MfThemeIssueSeverity = 'error' | 'warning';\r\n\r\nexport interface MfThemeIssue {\r\n /** Hangi alanı işaret ediyor — ör. `\"ramps.danger.600\"`, `\"accent\"`. */\r\n path: string;\r\n message: string;\r\n severity: MfThemeIssueSeverity;\r\n}\r\n\r\n/** `color.css`'in `--mf-surface-inverse`/`-fill-fg` literallerinde tekrarlanan \"mürekkep\" tonu — `X-fill-fg` HER ZAMAN bunun ya da beyazın arasından seçilir (bkz. rol katmanı). */\r\nconst INK = '#04110d';\r\nconst AA_NORMAL_TEXT = 4.5;\r\n\r\nfunction checkHex(path: string, value: string | undefined, issues: MfThemeIssue[]): void {\r\n if (value === undefined) return;\r\n if (!isValidHex(value)) {\r\n issues.push({\r\n path,\r\n message: `\"${value}\" geçerli bir #rgb/#rrggbb hex değeri değil.`,\r\n severity: 'error',\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * `MfThemeJson`'ı iki açıdan denetler:\r\n *\r\n * 1. Her hex alanının GEÇERLİ bir `#rgb`/`#rrggbb` olup olmadığı.\r\n * 2. `ramps.<tone>['600']` (kitin \"dolu blok\" LIGHT çapası, bkz. `color.css`\r\n * rol katmanı doktrini — `X-fill-fg` her zaman `#ffffff` ya da mürekkep\r\n * `#04110d`'den seçilir) verilen bir ton için NE beyaz NE mürekkep\r\n * üstünde WCAG AA (4.5:1) sağlayan okunaklı bir metin rengi bulunup\r\n * bulunamadığı — ikisi de başarısızsa bu basamak \"çok orta tonlu\", dolu\r\n * blok üstünde okunaklı metin GARANTİSİ yok demektir. `accent` (`ramps.\r\n * primary`/`createAccentRamp` + `fgOnAccent`) BU KONTROLE İHTİYAÇ\r\n * DUYMAZ — `pickForeground` HER ZAMAN iki adaydan daha iyisini seçtiği\r\n * için kontrast garantisi İNŞA GEREĞİ var (bkz. `apply.ts`\r\n * `accentRoleLines`).\r\n *\r\n * Şema/yapı hatalarını (bilinmeyen alan vb.) DENETLEMEZ — TypeScript\r\n * derleme zamanında zaten yakalar; `MfThemeJson` harici bir kaynaktan (ör.\r\n * `JSON.parse`, bir tema dosyası yükleme formu) geliyorsa bu fonksiyon\r\n * SADECE değer-düzeyi sorunları (geçersiz hex, düşük kontrast) yakalar.\r\n */\r\nexport function validateMfTheme(theme: MfThemeJson): MfThemeIssue[] {\r\n const issues: MfThemeIssue[] = [];\r\n\r\n checkHex('accent', theme.accent ?? undefined, issues);\r\n\r\n for (const tone of MF_RAMP_TONES) {\r\n const ramp = theme.ramps?.[tone];\r\n if (!ramp) continue;\r\n for (const step of RAMP_STEPS) {\r\n checkHex(`ramps.${tone}.${step}`, ramp[step], issues);\r\n }\r\n if (tone === 'primary') continue;\r\n const fill = ramp['600'];\r\n if (!fill || !isValidHex(fill)) continue;\r\n const onWhite = contrastRatio(fill, '#ffffff');\r\n const onInk = contrastRatio(fill, INK);\r\n if (onWhite < AA_NORMAL_TEXT && onInk < AA_NORMAL_TEXT) {\r\n issues.push({\r\n path: `ramps.${tone}.600`,\r\n message: `\"${fill}\" dolu blok üstünde ne beyaz (${onWhite.toFixed(2)}:1) ne mürekkep (${onInk.toFixed(2)}:1) WCAG AA (4.5:1) sağlıyor — daha koyu/açık bir basamak seçin.`,\r\n severity: 'warning',\r\n });\r\n }\r\n }\r\n\r\n if (theme.ramps?.neutral) {\r\n for (const [step, value] of Object.entries(theme.ramps.neutral)) {\r\n checkHex(`ramps.neutral.${step}`, value, issues);\r\n }\r\n }\r\n\r\n if (theme.roles) {\r\n for (const [mode, values] of Object.entries(theme.roles) as [\r\n 'light' | 'dark',\r\n Record<string, string> | undefined,\r\n ][]) {\r\n if (!values) continue;\r\n for (const [key, value] of Object.entries(values)) {\r\n checkHex(`roles.${mode}.${key}`, value, issues);\r\n }\r\n }\r\n }\r\n\r\n return issues;\r\n}\r\n","/**\r\n * `MfThemeJson`'ın JSON Schema (2020-12) tanımı — IDE otomatik tamamlama\r\n * (`\"$schema\"` alanı) ve harici doğrulayıcılar (ajv vb.) için. Düz bir JS\r\n * nesnesi olarak dışa açılıyor — kitin sıfır çalışma zamanı bağımlılığı\r\n * ilkesi gereği (bkz. `projects/ui-kit/README.md` \"Bağımlılık politikası\")\r\n * hiçbir şema doğrulama KÜTÜPHANESİ KULLANILMIYOR/GEREKTİRİLMİYOR; asıl\r\n * DEĞER-düzeyi doğrulama (geçerli hex, WCAG kontrastı) `validateMfTheme()`\r\n * (bkz. `validate.ts`) tarafında, bu şema SADECE YAPISAL/tip doğrulaması\r\n * içindir — `@mesgflow/email-core`'un `EMAIL_DOCUMENT_JSON_SCHEMA`'sıyla\r\n * AYNI desen.\r\n */\r\n\r\nconst HEX_PATTERN = '^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$';\r\nconst HEX = { type: 'string', pattern: HEX_PATTERN } as const;\r\n\r\nconst RAMP_11 = {\r\n type: 'object',\r\n additionalProperties: false,\r\n properties: {\r\n '50': HEX,\r\n '100': HEX,\r\n '200': HEX,\r\n '300': HEX,\r\n '400': HEX,\r\n '500': HEX,\r\n '600': HEX,\r\n '700': HEX,\r\n '800': HEX,\r\n '900': HEX,\r\n '950': HEX,\r\n },\r\n} as const;\r\n\r\nconst RAMP_13 = {\r\n type: 'object',\r\n additionalProperties: false,\r\n properties: {\r\n ...RAMP_11.properties,\r\n '850': HEX,\r\n '975': HEX,\r\n },\r\n} as const;\r\n\r\nconst ROLE_TOKEN_NAMES = [\r\n 'surface',\r\n 'chrome',\r\n 'overlay',\r\n 'surface-inverse',\r\n 'glass',\r\n 'fg',\r\n 'fg-muted',\r\n 'fg-on-accent',\r\n 'fg-inverse',\r\n 'hairline',\r\n 'neutral-fill',\r\n 'neutral-fill-hover',\r\n 'neutral-fill-fg',\r\n 'success-fill-fg',\r\n 'warning-fill-fg',\r\n 'danger-fill-fg',\r\n 'info-fill-fg',\r\n 'help-fill-fg',\r\n 'chart-1',\r\n 'chart-2',\r\n 'chart-3',\r\n 'chart-4',\r\n 'chart-5',\r\n 'chart-6',\r\n 'chart-7',\r\n 'chart-8',\r\n 'chart-other',\r\n] as const;\r\n\r\nconst ROLE_MAP = {\r\n type: 'object',\r\n additionalProperties: false,\r\n properties: Object.fromEntries(ROLE_TOKEN_NAMES.map((key) => [key, { type: 'string' }])),\r\n} as const;\r\n\r\nexport const MF_THEME_JSON_SCHEMA = {\r\n $schema: 'https://json-schema.org/draft/2020-12/schema',\r\n $id: 'https://hurdenizyener.github.io/mesgflow-ui-kit/schema/theme.json',\r\n title: 'MesgFlow ui theme',\r\n description:\r\n 'Tam beyaz etiket tema tanımı — applyMfTheme()/exportMfThemeCss()e verilir. Her alan opsiyonel.',\r\n type: 'object',\r\n additionalProperties: false,\r\n properties: {\r\n $schema: { type: 'string' },\r\n name: { type: 'string' },\r\n accent: { oneOf: [HEX, { type: 'null' }] },\r\n radiusScale: { enum: ['sharp', 'default', 'soft'] },\r\n density: { enum: ['compact', 'default', 'comfortable'] },\r\n neutralTint: { enum: ['cool', 'neutral', 'warm'] },\r\n ramps: {\r\n type: 'object',\r\n additionalProperties: false,\r\n properties: {\r\n primary: RAMP_11,\r\n success: RAMP_11,\r\n warning: RAMP_11,\r\n danger: RAMP_11,\r\n info: RAMP_11,\r\n help: RAMP_11,\r\n neutral: RAMP_13,\r\n },\r\n },\r\n roles: {\r\n type: 'object',\r\n additionalProperties: false,\r\n properties: {\r\n light: ROLE_MAP,\r\n dark: ROLE_MAP,\r\n },\r\n },\r\n fonts: {\r\n type: 'object',\r\n additionalProperties: false,\r\n properties: {\r\n sans: { type: 'string' },\r\n display: { type: 'string' },\r\n mono: { type: 'string' },\r\n },\r\n },\r\n radius: {\r\n type: 'object',\r\n additionalProperties: false,\r\n properties: {\r\n xs: { type: 'string' },\r\n sm: { type: 'string' },\r\n md: { type: 'string' },\r\n lg: { type: 'string' },\r\n xl: { type: 'string' },\r\n },\r\n },\r\n },\r\n} as const;\r\n","/**\r\n * Tema değişikliğini (`.dark` toggle'ı, `applyMfTheme()` çağrısı vb.) View\r\n * Transitions API ile yumuşak bir çapraz geçişe sarar — sayfa her token'ı\r\n * tek tek `transition` etmek yerine eski/yeni ekran görüntüsü arasında TEK\r\n * bir kompozit geçiş yapar (yüzlerce `transition-colors`'ın aynı anda ve\r\n * farklı sürelerle kayması yerine).\r\n *\r\n * `update` HER ZAMAN çağrılır — sadece NASIL çağrıldığı değişir. Geçiş\r\n * atlanıp `update` doğrudan (senkron) çalıştırılır:\r\n * - SSR / `document` yok,\r\n * - tarayıcı `startViewTransition` desteklemiyor,\r\n * - kullanıcı `prefers-reduced-motion: reduce` istiyor.\r\n *\r\n * ```ts\r\n * transitionMfTheme(() => document.documentElement.classList.toggle('dark'));\r\n * ```\r\n */\r\nexport function transitionMfTheme(update: () => void): void {\r\n if (typeof document === 'undefined') {\r\n update();\r\n return;\r\n }\r\n\r\n const reducedMotion =\r\n typeof matchMedia !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n\r\n // DOM lib tipi bunu zorunlu sayar, ama Firefox < 144 ve jsdom'da YOK.\r\n if (typeof document.startViewTransition !== 'function' || reducedMotion) {\r\n update();\r\n return;\r\n }\r\n\r\n document.startViewTransition(update);\r\n}\r\n","import {\r\n DOCUMENT,\r\n DestroyRef,\r\n InjectionToken,\r\n Service,\r\n computed,\r\n effect,\r\n inject,\r\n signal,\r\n type Provider,\r\n} from '@angular/core';\r\nimport { transitionMfTheme } from './transition';\r\n\r\nexport type MfColorMode = 'light' | 'dark' | 'system';\r\n\r\nexport interface MfColorModeConfig {\r\n /** `localStorage` anahtarı — `colorModeInitScript()` ile AYNI olmalı. */\r\n storageKey: string;\r\n /** Tercih kaydı yokken. */\r\n defaultMode: MfColorMode;\r\n}\r\n\r\nexport const MF_COLOR_MODE_CONFIG = new InjectionToken<MfColorModeConfig>(\r\n 'mesgflow.color-mode-config',\r\n { factory: () => ({ storageKey: 'mf-color-mode', defaultMode: 'system' }) },\r\n);\r\n\r\n/** `providers: [provideMfColorMode({ storageKey: 'app-theme' })]` */\r\nexport function provideMfColorMode(config: Partial<MfColorModeConfig>): Provider {\r\n return {\r\n provide: MF_COLOR_MODE_CONFIG,\r\n useValue: { storageKey: 'mf-color-mode', defaultMode: 'system', ...config },\r\n };\r\n}\r\n\r\nconst DARK_QUERY = '(prefers-color-scheme: dark)';\r\n\r\n/**\r\n * Açık / koyu / sistem modu — kitin TEK kaynağı (`<mf-theme-switcher>` bunu kullanır; kendi\r\n * anahtarınızla da doğrudan enjekte edebilirsiniz).\r\n *\r\n * - `mode`: kullanıcının seçimi (kalıcı, `localStorage`); `resolved`: gerçekte uygulanan\r\n * `light`/`dark` — `system`'de işletim sistemi tercihini CANLI izler.\r\n * - Uygulama: kökte `.dark` sınıfı + `color-scheme` (yerel kaydırma çubukları ve form\r\n * kontrolleri de temaya uyar); değişim `transitionMfTheme` ile yumuşak (azaltılmış harekette\r\n * anında). Sınıf zaten doğruysa (ilk boyamada `colorModeInitScript` uyguladı) dokunulmaz.\r\n * - Depolama/`matchMedia` yoksa (gizli pencere, SSR, test) sessizce varsayılana düşer.\r\n */\r\n@Service()\r\nexport class MfColorModeService {\r\n private readonly config = inject(MF_COLOR_MODE_CONFIG);\r\n private readonly document = inject(DOCUMENT);\r\n private readonly media = this.document.defaultView?.matchMedia?.(DARK_QUERY) ?? null;\r\n private readonly systemDark = signal(this.media?.matches ?? false);\r\n\r\n readonly mode = signal<MfColorMode>(this.readStored());\r\n readonly resolved = computed<'light' | 'dark'>(() => {\r\n const mode = this.mode();\r\n return mode === 'system' ? (this.systemDark() ? 'dark' : 'light') : mode;\r\n });\r\n\r\n constructor() {\r\n const onChange = (event: MediaQueryListEvent) => this.systemDark.set(event.matches);\r\n this.media?.addEventListener?.('change', onChange);\r\n inject(DestroyRef).onDestroy(() => this.media?.removeEventListener?.('change', onChange));\r\n\r\n effect(() => {\r\n const mode = this.mode();\r\n try {\r\n this.document.defaultView?.localStorage.setItem(this.config.storageKey, mode);\r\n } catch {\r\n // Gizli pencere / engelli depolama — yalnızca bu oturumda.\r\n }\r\n });\r\n\r\n effect(() => {\r\n const dark = this.resolved() === 'dark';\r\n const root = this.document.documentElement;\r\n root.style.colorScheme = dark ? 'dark' : 'light';\r\n if (root.classList.contains('dark') === dark) return;\r\n transitionMfTheme(() => root.classList.toggle('dark', dark));\r\n });\r\n }\r\n\r\n setMode(mode: MfColorMode): void {\r\n this.mode.set(mode);\r\n }\r\n\r\n /** light → dark → system → light (tek düğmeli değiştirici için). */\r\n cycle(): void {\r\n const order: MfColorMode[] = ['light', 'dark', 'system'];\r\n this.mode.set(order[(order.indexOf(this.mode()) + 1) % order.length]!);\r\n }\r\n\r\n private readStored(): MfColorMode {\r\n try {\r\n const stored = this.document.defaultView?.localStorage.getItem(this.config.storageKey);\r\n if (stored === 'light' || stored === 'dark' || stored === 'system') return stored;\r\n } catch {\r\n // Depolama erişilemez.\r\n }\r\n return this.config.defaultMode;\r\n }\r\n}\r\n\r\n/**\r\n * `index.html` `<head>`'ine satır içi konacak betik — Angular yüklenmeden ÖNCE `.dark`'ı uygular,\r\n * koyu modda beyaz flaşı önler. Anahtar ve varsayılan servisle AYNI olmalı.\r\n *\r\n * ```html\r\n * <script>/* colorModeInitScript('app-theme') çıktısı *\\/</script>\r\n * ```\r\n */\r\nexport function colorModeInitScript(\r\n storageKey = 'mf-color-mode',\r\n defaultMode: MfColorMode = 'system',\r\n): string {\r\n return (\r\n `(function(){try{var m=localStorage.getItem(${JSON.stringify(storageKey)})||${JSON.stringify(defaultMode)};` +\r\n `var d=m==='dark'||(m==='system'&&matchMedia('${DARK_QUERY}').matches);` +\r\n `var r=document.documentElement;r.classList.toggle('dark',d);r.style.colorScheme=d?'dark':'light';}catch(e){}})();`\r\n );\r\n}\r\n","/*\r\n * `@mesgflow/ui-kit/theming` — ikincil giriş noktası. `i18n/tr` gibi BİLEREK\r\n * birincil barrel'dan (`projects/ui-kit/index.ts`) re-export EDİLMEZ: tema\r\n * özelleştirme her tüketicinin ihtiyacı değil, opt-in kalmalı (bkz.\r\n * `docs/tr/mimari.md` \"i18n mimarisi\"nin aynı gerekçesi).\r\n *\r\n * `color-math.ts` BİLEREK burada export EDİLMEZ — iç uygulama detayı\r\n * (hex<->OKLCH), public API `ramp.ts`/`apply.ts`'in üstünde.\r\n */\r\nexport * from './ramp';\r\nexport * from './theme-json';\r\nexport * from './apply';\r\nexport * from './validate';\r\nexport * from './schema';\r\nexport * from './transition';\r\nexport * from './color-mode';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -116,18 +116,18 @@ class TimePicker extends ValueAccessorBase {
|
|
|
116
116
|
this.close();
|
|
117
117
|
}
|
|
118
118
|
optionClasses(selected) {
|
|
119
|
-
return cn('rounded-sm px-3 py-1 text-start text-sm tabular-nums transition-colors duration-fast ease-emphasis hover:bg-
|
|
119
|
+
return cn('rounded-sm px-3 py-1 text-start text-sm tabular-nums transition-colors duration-fast ease-emphasis hover:bg-state-hover', selected ? 'bg-primary-tint text-primary-tint-fg' : '');
|
|
120
120
|
}
|
|
121
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
122
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.
|
|
121
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: TimePicker, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
122
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: TimePicker, isStandalone: true, selector: "mf-time-picker", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, minuteStep: { classPropertyName: "minuteStep", publicName: "minuteStep", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, hasError: { classPropertyName: "hasError", publicName: "hasError", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { classAttribute: "block" }, providers: [
|
|
123
123
|
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TimePicker), multi: true },
|
|
124
|
-
], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true, isSignal: true }], exportAs: ["mfTimePicker"], usesInheritance: true, ngImport: i0, template: "<div class=\"relative w-full\" cdkOverlayOrigin #origin=\"cdkOverlayOrigin\">\
|
|
124
|
+
], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true, isSignal: true }], exportAs: ["mfTimePicker"], usesInheritance: true, ngImport: i0, template: "<div class=\"relative w-full\" cdkOverlayOrigin #origin=\"cdkOverlayOrigin\">\n <mf-input-group [hasError]=\"hasError()\" [disabled]=\"disabled()\">\n <span mfInputPrefix><span mfIcon [size]=\"18\">schedule</span></span>\n <input\n #inputEl\n type=\"text\"\n class=\"w-full min-w-0 appearance-none border-0 bg-transparent p-0 text-sm text-fg placeholder:text-fg-subtle focus:outline-none\"\n [placeholder]=\"effectivePlaceholder()\"\n [value]=\"draft()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n (input)=\"onInput($any($event.target).value)\"\n (focus)=\"open.set(true)\"\n (keydown.enter)=\"commitDraft()\"\n (keydown.escape)=\"onEscape()\"\n />\n @if (value()) {\n <button\n mfInputSuffix\n type=\"button\"\n class=\"appearance-none border-0 bg-transparent p-0 transition-colors duration-fast ease-emphasis hover:text-fg\"\n [attr.aria-label]=\"effectiveClearLabel()\"\n (click)=\"clear()\"\n >\n <span mfIcon [size]=\"16\">close</span>\n </button>\n }\n </mf-input-group>\n\n <mf-popover\n [origin]=\"origin\"\n [open]=\"open()\"\n placement=\"bottom-start\"\n padding=\"none\"\n (closed)=\"onEscape()\"\n >\n <div class=\"flex divide-x divide-border\">\n <mf-scroll-area class=\"max-h-48\">\n <div class=\"flex flex-col gap-0.5 p-1\">\n @for (h of hours; track h) {\n <button\n type=\"button\"\n [class]=\"optionClasses(value()?.hour === h)\"\n (click)=\"pickHour(h)\"\n >\n {{ h.toString().padStart(2, '0') }}\n </button>\n }\n </div>\n </mf-scroll-area>\n <mf-scroll-area class=\"max-h-48\">\n <div class=\"flex flex-col gap-0.5 p-1\">\n @for (m of minutes(); track m) {\n <button\n type=\"button\"\n [class]=\"optionClasses(value()?.minute === m)\"\n (click)=\"pickMinute(m)\"\n >\n {{ m.toString().padStart(2, '0') }}\n </button>\n }\n </div>\n </mf-scroll-area>\n </div>\n </mf-popover>\n</div>\n", dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "component", type: InputGroup, selector: "mf-input-group", inputs: ["size", "disabled", "hasError", "padded", "wrap"], exportAs: ["mfInputGroup"] }, { kind: "directive", type: InputPrefix, selector: "[mfInputPrefix]", inputs: ["addon"] }, { kind: "directive", type: InputSuffix, selector: "[mfInputSuffix]", inputs: ["addon"] }, { kind: "component", type: Popover, selector: "mf-popover", inputs: ["origin", "open", "placement", "padding", "hasBackdrop", "matchTriggerWidth", "panelClass"], outputs: ["openChange", "closed"], exportAs: ["mfPopover"] }, { kind: "component", type: ScrollArea, selector: "mf-scroll-area", inputs: ["orientation"], exportAs: ["mfScrollArea"] }] });
|
|
125
125
|
}
|
|
126
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
126
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: TimePicker, decorators: [{
|
|
127
127
|
type: Component,
|
|
128
128
|
args: [{ selector: 'mf-time-picker', exportAs: 'mfTimePicker', imports: [OverlayModule, Icon, InputGroup, InputPrefix, InputSuffix, Popover, ScrollArea], host: { class: 'block' }, providers: [
|
|
129
129
|
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TimePicker), multi: true },
|
|
130
|
-
], template: "<div class=\"relative w-full\" cdkOverlayOrigin #origin=\"cdkOverlayOrigin\">\
|
|
130
|
+
], template: "<div class=\"relative w-full\" cdkOverlayOrigin #origin=\"cdkOverlayOrigin\">\n <mf-input-group [hasError]=\"hasError()\" [disabled]=\"disabled()\">\n <span mfInputPrefix><span mfIcon [size]=\"18\">schedule</span></span>\n <input\n #inputEl\n type=\"text\"\n class=\"w-full min-w-0 appearance-none border-0 bg-transparent p-0 text-sm text-fg placeholder:text-fg-subtle focus:outline-none\"\n [placeholder]=\"effectivePlaceholder()\"\n [value]=\"draft()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n (input)=\"onInput($any($event.target).value)\"\n (focus)=\"open.set(true)\"\n (keydown.enter)=\"commitDraft()\"\n (keydown.escape)=\"onEscape()\"\n />\n @if (value()) {\n <button\n mfInputSuffix\n type=\"button\"\n class=\"appearance-none border-0 bg-transparent p-0 transition-colors duration-fast ease-emphasis hover:text-fg\"\n [attr.aria-label]=\"effectiveClearLabel()\"\n (click)=\"clear()\"\n >\n <span mfIcon [size]=\"16\">close</span>\n </button>\n }\n </mf-input-group>\n\n <mf-popover\n [origin]=\"origin\"\n [open]=\"open()\"\n placement=\"bottom-start\"\n padding=\"none\"\n (closed)=\"onEscape()\"\n >\n <div class=\"flex divide-x divide-border\">\n <mf-scroll-area class=\"max-h-48\">\n <div class=\"flex flex-col gap-0.5 p-1\">\n @for (h of hours; track h) {\n <button\n type=\"button\"\n [class]=\"optionClasses(value()?.hour === h)\"\n (click)=\"pickHour(h)\"\n >\n {{ h.toString().padStart(2, '0') }}\n </button>\n }\n </div>\n </mf-scroll-area>\n <mf-scroll-area class=\"max-h-48\">\n <div class=\"flex flex-col gap-0.5 p-1\">\n @for (m of minutes(); track m) {\n <button\n type=\"button\"\n [class]=\"optionClasses(value()?.minute === m)\"\n (click)=\"pickMinute(m)\"\n >\n {{ m.toString().padStart(2, '0') }}\n </button>\n }\n </div>\n </mf-scroll-area>\n </div>\n </mf-popover>\n</div>\n" }]
|
|
131
131
|
}], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], minuteStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "minuteStep", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], hasError: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasError", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], inputEl: [{ type: i0.ViewChild, args: ['inputEl', { isSignal: true }] }] } });
|
|
132
132
|
|
|
133
133
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mesgflow-ui-kit-time-picker.mjs","sources":["../../../projects/ui-kit/time-picker/time-picker.model.ts","../../../projects/ui-kit/time-picker/time-picker.ts","../../../projects/ui-kit/time-picker/time-picker.html","../../../projects/ui-kit/time-picker/mesgflow-ui-kit-time-picker.ts"],"sourcesContent":["export interface TimeValue {\r\n hour: number;\r\n minute: number;\r\n}\r\n\r\nexport function formatTime(v: TimeValue): string {\r\n return `${String(v.hour).padStart(2, '0')}:${String(v.minute).padStart(2, '0')}`;\r\n}\r\n\r\n/** `\"9:5\"`/`\"09:05\"`/vb. serbest biçimli metni ayrıştırır — saat 0-23, dakika 0-59 dışındaysa `null`. */\r\nexport function parseTime(text: string): TimeValue | null {\r\n const match = text.trim().match(/^(\\d{1,2}):(\\d{1,2})$/);\r\n if (!match) return null;\r\n const hour = Number(match[1]);\r\n const minute = Number(match[2]);\r\n if (hour > 23 || minute > 59) return null;\r\n return { hour, minute };\r\n}\r\n","import { OverlayModule } from '@angular/cdk/overlay';\r\nimport {\r\n Component,\r\n ElementRef,\r\n computed,\r\n effect,\r\n forwardRef,\r\n inject,\r\n input,\r\n model,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport { cn, MF_TIME_PICKER_LABELS, ValueAccessorBase } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { InputGroup, InputPrefix, InputSuffix } from '@mesgflow/ui-kit/input';\r\nimport { Popover } from '@mesgflow/ui-kit/popover';\r\nimport { ScrollArea } from '@mesgflow/ui-kit/scroll-area';\r\nimport { formatTime, parseTime, type TimeValue } from './time-picker.model';\r\n\r\n/**\r\n * `<mf-time-picker [(value)]=\"meetingTime\" [minuteStep]=\"15\" />` — `value`\r\n * `{hour, minute} | null` (bkz. `TimeValue`). Tetikleyici `DatePicker`'ın\r\n * AYNI deseni (`InputGroup` + yazarak giriş + `mf-popover` paneli), panel\r\n * TAKVİM yerine iki kaydırılabilir SÜTUN (saat/dakika) — her biri `mf-scroll-area`\r\n * (bu fazda eklenen kenar-solma maskeli kaydırma alanı, bkz. `scroll-area.ts`).\r\n * Yazarak giriş VE sütundan tıklayarak seçim AYNI `value` model'ine yazıyor.\r\n */\r\n@Component({\r\n selector: 'mf-time-picker',\r\n exportAs: 'mfTimePicker',\r\n imports: [OverlayModule, Icon, InputGroup, InputPrefix, InputSuffix, Popover, ScrollArea],\r\n host: { class: 'block' },\r\n templateUrl: './time-picker.html',\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TimePicker), multi: true },\r\n ],\r\n})\r\nexport class TimePicker\r\n extends ValueAccessorBase<TimeValue | null>\r\n implements ControlValueAccessor\r\n{\r\n readonly value = model<TimeValue | null>(null);\r\n /** Dakika sütunundaki adım — ör. `15` → 00/15/30/45. Varsayılan 5. */\r\n readonly minuteStep = input(5);\r\n readonly placeholder = input<string>();\r\n readonly disabled = input(false);\r\n readonly hasError = input(false);\r\n readonly ariaLabel = input('');\r\n readonly clearLabel = input<string>();\r\n\r\n private readonly timePickerLabels = inject(MF_TIME_PICKER_LABELS);\r\n protected readonly effectivePlaceholder = computed(\r\n () => this.placeholder() ?? this.timePickerLabels().placeholder,\r\n );\r\n protected readonly effectiveClearLabel = computed(\r\n () => this.clearLabel() ?? this.timePickerLabels().clear,\r\n );\r\n\r\n protected readonly open = signal(false);\r\n protected readonly draft = signal('');\r\n\r\n protected readonly hours = Array.from({ length: 24 }, (_, i) => i);\r\n protected readonly minutes = computed(() => {\r\n const step = this.minuteStep();\r\n return Array.from({ length: Math.ceil(60 / step) }, (_, i) => i * step);\r\n });\r\n\r\n private readonly inputEl = viewChild<ElementRef<HTMLInputElement>>('inputEl');\r\n\r\n constructor() {\r\n super();\r\n effect(() => {\r\n const v = this.value();\r\n untracked(() => this.draft.set(v ? formatTime(v) : ''));\r\n });\r\n }\r\n\r\n writeValue(value: TimeValue | null): void {\r\n this.value.set(value);\r\n }\r\n\r\n private setValue(next: TimeValue | null): void {\r\n this.value.set(next);\r\n this.onChange(next);\r\n this.onTouched();\r\n }\r\n\r\n protected onInput(raw: string): void {\r\n this.draft.set(raw);\r\n this.onTouched();\r\n }\r\n\r\n protected commitDraft(): void {\r\n const parsed = parseTime(this.draft());\r\n if (parsed) {\r\n this.setValue(parsed);\r\n this.close();\r\n } else {\r\n const v = this.value();\r\n this.draft.set(v ? formatTime(v) : '');\r\n }\r\n }\r\n\r\n protected pickHour(hour: number): void {\r\n this.setValue({ hour, minute: this.value()?.minute ?? 0 });\r\n }\r\n\r\n protected pickMinute(minute: number): void {\r\n this.setValue({ hour: this.value()?.hour ?? 0, minute });\r\n }\r\n\r\n protected clear(): void {\r\n this.setValue(null);\r\n this.inputEl()?.nativeElement.focus();\r\n }\r\n\r\n protected close(): void {\r\n this.open.set(false);\r\n }\r\n\r\n protected onEscape(): void {\r\n if (!this.open()) return;\r\n const v = this.value();\r\n this.draft.set(v ? formatTime(v) : '');\r\n this.close();\r\n }\r\n\r\n protected optionClasses(selected: boolean): string {\r\n return cn(\r\n 'rounded-sm px-3 py-1 text-start text-sm tabular-nums transition-colors duration-fast ease-emphasis hover:bg-surface-alt',\r\n selected ? 'bg-primary-tint text-primary-tint-fg' : '',\r\n );\r\n }\r\n}\r\n","<div class=\"relative w-full\" cdkOverlayOrigin #origin=\"cdkOverlayOrigin\">\r\n <mf-input-group [hasError]=\"hasError()\" [disabled]=\"disabled()\">\r\n <span mfInputPrefix><span mfIcon [size]=\"18\">schedule</span></span>\r\n <input\r\n #inputEl\r\n type=\"text\"\r\n class=\"w-full min-w-0 appearance-none border-0 bg-transparent p-0 text-sm text-fg placeholder:text-fg-subtle focus:outline-none\"\r\n [placeholder]=\"effectivePlaceholder()\"\r\n [value]=\"draft()\"\r\n [disabled]=\"disabled()\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (focus)=\"open.set(true)\"\r\n (keydown.enter)=\"commitDraft()\"\r\n (keydown.escape)=\"onEscape()\"\r\n />\r\n @if (value()) {\r\n <button\r\n mfInputSuffix\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent p-0 transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n [attr.aria-label]=\"effectiveClearLabel()\"\r\n (click)=\"clear()\"\r\n >\r\n <span mfIcon [size]=\"16\">close</span>\r\n </button>\r\n }\r\n </mf-input-group>\r\n\r\n <mf-popover\r\n [origin]=\"origin\"\r\n [open]=\"open()\"\r\n placement=\"bottom-start\"\r\n padding=\"none\"\r\n (closed)=\"onEscape()\"\r\n >\r\n <div class=\"flex divide-x divide-border\">\r\n <mf-scroll-area class=\"max-h-48\">\r\n <div class=\"flex flex-col gap-0.5 p-1\">\r\n @for (h of hours; track h) {\r\n <button\r\n type=\"button\"\r\n [class]=\"optionClasses(value()?.hour === h)\"\r\n (click)=\"pickHour(h)\"\r\n >\r\n {{ h.toString().padStart(2, '0') }}\r\n </button>\r\n }\r\n </div>\r\n </mf-scroll-area>\r\n <mf-scroll-area class=\"max-h-48\">\r\n <div class=\"flex flex-col gap-0.5 p-1\">\r\n @for (m of minutes(); track m) {\r\n <button\r\n type=\"button\"\r\n [class]=\"optionClasses(value()?.minute === m)\"\r\n (click)=\"pickMinute(m)\"\r\n >\r\n {{ m.toString().padStart(2, '0') }}\r\n </button>\r\n }\r\n </div>\r\n </mf-scroll-area>\r\n </div>\r\n </mf-popover>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mesgflow-ui-kit-time-picker.mjs","sources":["../../../projects/ui-kit/time-picker/time-picker.model.ts","../../../projects/ui-kit/time-picker/time-picker.ts","../../../projects/ui-kit/time-picker/time-picker.html","../../../projects/ui-kit/time-picker/mesgflow-ui-kit-time-picker.ts"],"sourcesContent":["export interface TimeValue {\r\n hour: number;\r\n minute: number;\r\n}\r\n\r\nexport function formatTime(v: TimeValue): string {\r\n return `${String(v.hour).padStart(2, '0')}:${String(v.minute).padStart(2, '0')}`;\r\n}\r\n\r\n/** `\"9:5\"`/`\"09:05\"`/vb. serbest biçimli metni ayrıştırır — saat 0-23, dakika 0-59 dışındaysa `null`. */\r\nexport function parseTime(text: string): TimeValue | null {\r\n const match = text.trim().match(/^(\\d{1,2}):(\\d{1,2})$/);\r\n if (!match) return null;\r\n const hour = Number(match[1]);\r\n const minute = Number(match[2]);\r\n if (hour > 23 || minute > 59) return null;\r\n return { hour, minute };\r\n}\r\n","import { OverlayModule } from '@angular/cdk/overlay';\r\nimport {\r\n Component,\r\n ElementRef,\r\n computed,\r\n effect,\r\n forwardRef,\r\n inject,\r\n input,\r\n model,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport { cn, MF_TIME_PICKER_LABELS, ValueAccessorBase } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { InputGroup, InputPrefix, InputSuffix } from '@mesgflow/ui-kit/input';\r\nimport { Popover } from '@mesgflow/ui-kit/popover';\r\nimport { ScrollArea } from '@mesgflow/ui-kit/scroll-area';\r\nimport { formatTime, parseTime, type TimeValue } from './time-picker.model';\r\n\r\n/**\r\n * `<mf-time-picker [(value)]=\"meetingTime\" [minuteStep]=\"15\" />` — `value`\r\n * `{hour, minute} | null` (bkz. `TimeValue`). Tetikleyici `DatePicker`'ın\r\n * AYNI deseni (`InputGroup` + yazarak giriş + `mf-popover` paneli), panel\r\n * TAKVİM yerine iki kaydırılabilir SÜTUN (saat/dakika) — her biri `mf-scroll-area`\r\n * (bu fazda eklenen kenar-solma maskeli kaydırma alanı, bkz. `scroll-area.ts`).\r\n * Yazarak giriş VE sütundan tıklayarak seçim AYNI `value` model'ine yazıyor.\r\n */\r\n@Component({\r\n selector: 'mf-time-picker',\r\n exportAs: 'mfTimePicker',\r\n imports: [OverlayModule, Icon, InputGroup, InputPrefix, InputSuffix, Popover, ScrollArea],\r\n host: { class: 'block' },\r\n templateUrl: './time-picker.html',\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TimePicker), multi: true },\r\n ],\r\n})\r\nexport class TimePicker\r\n extends ValueAccessorBase<TimeValue | null>\r\n implements ControlValueAccessor\r\n{\r\n readonly value = model<TimeValue | null>(null);\r\n /** Dakika sütunundaki adım — ör. `15` → 00/15/30/45. Varsayılan 5. */\r\n readonly minuteStep = input(5);\r\n readonly placeholder = input<string>();\r\n readonly disabled = input(false);\r\n readonly hasError = input(false);\r\n readonly ariaLabel = input('');\r\n readonly clearLabel = input<string>();\r\n\r\n private readonly timePickerLabels = inject(MF_TIME_PICKER_LABELS);\r\n protected readonly effectivePlaceholder = computed(\r\n () => this.placeholder() ?? this.timePickerLabels().placeholder,\r\n );\r\n protected readonly effectiveClearLabel = computed(\r\n () => this.clearLabel() ?? this.timePickerLabels().clear,\r\n );\r\n\r\n protected readonly open = signal(false);\r\n protected readonly draft = signal('');\r\n\r\n protected readonly hours = Array.from({ length: 24 }, (_, i) => i);\r\n protected readonly minutes = computed(() => {\r\n const step = this.minuteStep();\r\n return Array.from({ length: Math.ceil(60 / step) }, (_, i) => i * step);\r\n });\r\n\r\n private readonly inputEl = viewChild<ElementRef<HTMLInputElement>>('inputEl');\r\n\r\n constructor() {\r\n super();\r\n effect(() => {\r\n const v = this.value();\r\n untracked(() => this.draft.set(v ? formatTime(v) : ''));\r\n });\r\n }\r\n\r\n writeValue(value: TimeValue | null): void {\r\n this.value.set(value);\r\n }\r\n\r\n private setValue(next: TimeValue | null): void {\r\n this.value.set(next);\r\n this.onChange(next);\r\n this.onTouched();\r\n }\r\n\r\n protected onInput(raw: string): void {\r\n this.draft.set(raw);\r\n this.onTouched();\r\n }\r\n\r\n protected commitDraft(): void {\r\n const parsed = parseTime(this.draft());\r\n if (parsed) {\r\n this.setValue(parsed);\r\n this.close();\r\n } else {\r\n const v = this.value();\r\n this.draft.set(v ? formatTime(v) : '');\r\n }\r\n }\r\n\r\n protected pickHour(hour: number): void {\r\n this.setValue({ hour, minute: this.value()?.minute ?? 0 });\r\n }\r\n\r\n protected pickMinute(minute: number): void {\r\n this.setValue({ hour: this.value()?.hour ?? 0, minute });\r\n }\r\n\r\n protected clear(): void {\r\n this.setValue(null);\r\n this.inputEl()?.nativeElement.focus();\r\n }\r\n\r\n protected close(): void {\r\n this.open.set(false);\r\n }\r\n\r\n protected onEscape(): void {\r\n if (!this.open()) return;\r\n const v = this.value();\r\n this.draft.set(v ? formatTime(v) : '');\r\n this.close();\r\n }\r\n\r\n protected optionClasses(selected: boolean): string {\r\n return cn(\r\n 'rounded-sm px-3 py-1 text-start text-sm tabular-nums transition-colors duration-fast ease-emphasis hover:bg-state-hover',\r\n selected ? 'bg-primary-tint text-primary-tint-fg' : '',\r\n );\r\n }\r\n}\r\n","<div class=\"relative w-full\" cdkOverlayOrigin #origin=\"cdkOverlayOrigin\">\n <mf-input-group [hasError]=\"hasError()\" [disabled]=\"disabled()\">\n <span mfInputPrefix><span mfIcon [size]=\"18\">schedule</span></span>\n <input\n #inputEl\n type=\"text\"\n class=\"w-full min-w-0 appearance-none border-0 bg-transparent p-0 text-sm text-fg placeholder:text-fg-subtle focus:outline-none\"\n [placeholder]=\"effectivePlaceholder()\"\n [value]=\"draft()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n (input)=\"onInput($any($event.target).value)\"\n (focus)=\"open.set(true)\"\n (keydown.enter)=\"commitDraft()\"\n (keydown.escape)=\"onEscape()\"\n />\n @if (value()) {\n <button\n mfInputSuffix\n type=\"button\"\n class=\"appearance-none border-0 bg-transparent p-0 transition-colors duration-fast ease-emphasis hover:text-fg\"\n [attr.aria-label]=\"effectiveClearLabel()\"\n (click)=\"clear()\"\n >\n <span mfIcon [size]=\"16\">close</span>\n </button>\n }\n </mf-input-group>\n\n <mf-popover\n [origin]=\"origin\"\n [open]=\"open()\"\n placement=\"bottom-start\"\n padding=\"none\"\n (closed)=\"onEscape()\"\n >\n <div class=\"flex divide-x divide-border\">\n <mf-scroll-area class=\"max-h-48\">\n <div class=\"flex flex-col gap-0.5 p-1\">\n @for (h of hours; track h) {\n <button\n type=\"button\"\n [class]=\"optionClasses(value()?.hour === h)\"\n (click)=\"pickHour(h)\"\n >\n {{ h.toString().padStart(2, '0') }}\n </button>\n }\n </div>\n </mf-scroll-area>\n <mf-scroll-area class=\"max-h-48\">\n <div class=\"flex flex-col gap-0.5 p-1\">\n @for (m of minutes(); track m) {\n <button\n type=\"button\"\n [class]=\"optionClasses(value()?.minute === m)\"\n (click)=\"pickMinute(m)\"\n >\n {{ m.toString().padStart(2, '0') }}\n </button>\n }\n </div>\n </mf-scroll-area>\n </div>\n </mf-popover>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -26,8 +26,8 @@ class Timeline {
|
|
|
26
26
|
dotClasses(tone) {
|
|
27
27
|
return cn('relative z-10 mt-1 h-2.5 w-2.5 shrink-0 rounded-full', DOT_TONE[tone ?? 'neutral']);
|
|
28
28
|
}
|
|
29
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
30
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.
|
|
29
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: Timeline, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
30
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: Timeline, isStandalone: true, selector: "mf-timeline", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null } }, host: { attributes: { "role": "list" }, classAttribute: "flex flex-col" }, exportAs: ["mfTimeline"], ngImport: i0, template: `
|
|
31
31
|
@for (item of items(); track item.title; let last = $last) {
|
|
32
32
|
<div role="listitem" class="flex gap-3">
|
|
33
33
|
<div class="flex flex-col items-center">
|
|
@@ -51,7 +51,7 @@ class Timeline {
|
|
|
51
51
|
}
|
|
52
52
|
`, isInline: true });
|
|
53
53
|
}
|
|
54
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
54
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: Timeline, decorators: [{
|
|
55
55
|
type: Component,
|
|
56
56
|
args: [{
|
|
57
57
|
selector: 'mf-timeline',
|