@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
|
@@ -9,7 +9,7 @@ import { cn } from '@mesgflow/ui-kit/core';
|
|
|
9
9
|
* kaydırılıyor. `border-strong` bant rengi HER İKİ modda da taban `surface-
|
|
10
10
|
* active`'ten AYIRT EDİLEBİLİR bir basamak.
|
|
11
11
|
*/
|
|
12
|
-
const SHIMMER = 'bg-surface-active bg-[linear-gradient(90deg,transparent,var(--
|
|
12
|
+
const SHIMMER = 'bg-surface-active bg-[linear-gradient(90deg,transparent,color-mix(in_srgb,var(--mf-fg)_8%,transparent),transparent)] bg-[length:200%_100%] animate-shimmer';
|
|
13
13
|
/**
|
|
14
14
|
* `<div mfSkeleton class="h-4 w-32"></div>` (varsayılan `variant="rect"` —
|
|
15
15
|
* boyutu tüketici `class` ile verir, ESKİ davranış BİREBİR korunur) veya
|
|
@@ -41,8 +41,8 @@ class Skeleton {
|
|
|
41
41
|
lineClasses(last) {
|
|
42
42
|
return cn('block h-4 rounded-xs', SHIMMER, last ? 'w-3/4' : 'w-full');
|
|
43
43
|
}
|
|
44
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
45
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.
|
|
44
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: Skeleton, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
45
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: Skeleton, isStandalone: true, selector: "[mfSkeleton]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, lines: { classPropertyName: "lines", publicName: "lines", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "aria-hidden": "true" }, properties: { "class": "hostClasses()" } }, ngImport: i0, template: `
|
|
46
46
|
@if (multiline()) {
|
|
47
47
|
@for (line of lineIndexes(); track line; let last = $last) {
|
|
48
48
|
<span [class]="lineClasses(last)"></span>
|
|
@@ -50,12 +50,13 @@ class Skeleton {
|
|
|
50
50
|
}
|
|
51
51
|
`, isInline: true });
|
|
52
52
|
}
|
|
53
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
53
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: Skeleton, decorators: [{
|
|
54
54
|
type: Component,
|
|
55
55
|
args: [{
|
|
56
56
|
// eslint-disable-next-line @angular-eslint/component-selector -- BİLEREK native eleman + attribute (bkz. Button'daki AYNI desen)
|
|
57
57
|
selector: '[mfSkeleton]',
|
|
58
|
-
|
|
58
|
+
// Görsel yer tutucu — ekran okuyucu için anlamsız; yükleme durumunu kapsayıcıdaki aria-busy bildirir.
|
|
59
|
+
host: { '[class]': 'hostClasses()', 'aria-hidden': 'true' },
|
|
59
60
|
template: `
|
|
60
61
|
@if (multiline()) {
|
|
61
62
|
@for (line of lineIndexes(); track line; let last = $last) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mesgflow-ui-kit-skeleton.mjs","sources":["../../../projects/ui-kit/skeleton/skeleton.ts","../../../projects/ui-kit/skeleton/mesgflow-ui-kit-skeleton.ts"],"sourcesContent":["import { Component, computed, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\n\r\nexport type SkeletonVariant = 'text' | 'circle' | 'rect';\r\n\r\n/**\r\n * `animate-pulse` (opaklık titreşimi) yerine soldan sağa kayan bir parıltı\r\n * (bkz. `tokens/motion.css` `animate-shimmer`, plan Faz 1c) — taban rengin\r\n * üstüne `background-size:200%` bir gradient bindirilip pozisyonu animasyonla\r\n * kaydırılıyor. `border-strong` bant rengi HER İKİ modda da taban `surface-\r\n * active`'ten AYIRT EDİLEBİLİR bir basamak.\r\n */\r\nconst SHIMMER =\r\n 'bg-surface-active bg-[linear-gradient(90deg,transparent,var(--
|
|
1
|
+
{"version":3,"file":"mesgflow-ui-kit-skeleton.mjs","sources":["../../../projects/ui-kit/skeleton/skeleton.ts","../../../projects/ui-kit/skeleton/mesgflow-ui-kit-skeleton.ts"],"sourcesContent":["import { Component, computed, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\n\r\nexport type SkeletonVariant = 'text' | 'circle' | 'rect';\r\n\r\n/**\r\n * `animate-pulse` (opaklık titreşimi) yerine soldan sağa kayan bir parıltı\r\n * (bkz. `tokens/motion.css` `animate-shimmer`, plan Faz 1c) — taban rengin\r\n * üstüne `background-size:200%` bir gradient bindirilip pozisyonu animasyonla\r\n * kaydırılıyor. `border-strong` bant rengi HER İKİ modda da taban `surface-\r\n * active`'ten AYIRT EDİLEBİLİR bir basamak.\r\n */\r\nconst SHIMMER =\r\n 'bg-surface-active bg-[linear-gradient(90deg,transparent,color-mix(in_srgb,var(--mf-fg)_8%,transparent),transparent)] bg-[length:200%_100%] animate-shimmer';\r\n\r\n/**\r\n * `<div mfSkeleton class=\"h-4 w-32\"></div>` (varsayılan `variant=\"rect\"` —\r\n * boyutu tüketici `class` ile verir, ESKİ davranış BİREBİR korunur) veya\r\n * `<div mfSkeleton variant=\"circle\" class=\"h-10 w-10\"></div>` (`rounded-full`\r\n * eklenir) veya `<div mfSkeleton variant=\"text\" [lines]=\"3\"></div>`\r\n * (`lines > 1` iken alt alta `lines` kadar satır render eder — SON satır\r\n * bilerek `w-3/4`, bir paragrafın düzensiz son satırını taklit eder).\r\n *\r\n * `lines > 1` YALNIZCA `variant=\"text\"`'te anlamlı — bu durumda host\r\n * kendisi bir shimmer kutusu OLMAKTAN çıkıp satırları dikey dizen bir\r\n * `flex flex-col` kabına dönüşür (directive'ten component'e yükseltilmesinin\r\n * TEK sebebi — bkz. `Button`'ın aynı yükseltme deseni, `button.ts`).\r\n */\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector -- BİLEREK native eleman + attribute (bkz. Button'daki AYNI desen)\r\n selector: '[mfSkeleton]',\r\n // Görsel yer tutucu — ekran okuyucu için anlamsız; yükleme durumunu kapsayıcıdaki aria-busy bildirir.\r\n host: { '[class]': 'hostClasses()', 'aria-hidden': 'true' },\r\n template: `\r\n @if (multiline()) {\r\n @for (line of lineIndexes(); track line; let last = $last) {\r\n <span [class]=\"lineClasses(last)\"></span>\r\n }\r\n }\r\n `,\r\n})\r\nexport class Skeleton {\r\n readonly variant = input<SkeletonVariant>('rect');\r\n readonly lines = input(1);\r\n\r\n protected readonly multiline = computed(() => this.variant() === 'text' && this.lines() > 1);\r\n protected readonly lineIndexes = computed(() =>\r\n Array.from({ length: this.lines() }, (_, i) => i),\r\n );\r\n\r\n protected readonly hostClasses = computed(() => {\r\n if (this.multiline()) return 'flex flex-col gap-2';\r\n return cn('block', SHIMMER, this.variant() === 'circle' ? 'rounded-full' : 'rounded-xs');\r\n });\r\n\r\n protected lineClasses(last: boolean): string {\r\n return cn('block h-4 rounded-xs', SHIMMER, last ? 'w-3/4' : 'w-full');\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAKA;;;;;;AAMG;AACH,MAAM,OAAO,GACX,4JAA4J;AAE9J;;;;;;;;;;;;AAYG;MAcU,QAAQ,CAAA;IACV,OAAO,GAAG,KAAK,CAAkB,MAAM;gFAAC;IACxC,KAAK,GAAG,KAAK,CAAC,CAAC;8EAAC;AAEN,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC;kFAAC;IACzE,WAAW,GAAG,QAAQ,CAAC,MACxC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;oFAClD;AAEkB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QAC7C,IAAI,IAAI,CAAC,SAAS,EAAE;AAAE,YAAA,OAAO,qBAAqB;QAClD,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,QAAQ,GAAG,cAAc,GAAG,YAAY,CAAC;IAC1F,CAAC;oFAAC;AAEQ,IAAA,WAAW,CAAC,IAAa,EAAA;AACjC,QAAA,OAAO,EAAE,CAAC,sBAAsB,EAAE,OAAO,EAAE,IAAI,GAAG,OAAO,GAAG,QAAQ,CAAC;IACvE;uGAhBW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EART,CAAA;;;;;;AAMT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAEU,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAbpB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;;AAET,oBAAA,QAAQ,EAAE,cAAc;;oBAExB,IAAI,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,EAAE;AAC3D,oBAAA,QAAQ,EAAE,CAAA;;;;;;AAMT,EAAA,CAAA;AACF,iBAAA;;;ACxCD;;AAEG;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { model, input, inject, ElementRef, computed, forwardRef, Component } from '@angular/core';
|
|
2
|
+
import { model, input, inject, ElementRef, computed, forwardRef, Component, booleanAttribute, signal } from '@angular/core';
|
|
3
3
|
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
|
-
import { ValueAccessorBase, cn, isRtl, inlineStartRatio } from '@mesgflow/ui-kit/core';
|
|
4
|
+
import { ValueAccessorBase, cn, isRtl, inlineStartRatio, MF_SLIDER_LABELS } from '@mesgflow/ui-kit/core';
|
|
5
5
|
import { cva } from 'class-variance-authority';
|
|
6
6
|
|
|
7
7
|
const sliderHostVariants = cva('relative block h-4 w-full cursor-pointer touch-none rounded-full select-none ' +
|
|
@@ -116,8 +116,8 @@ class Slider extends ValueAccessorBase {
|
|
|
116
116
|
const raw = this.min() + ratio * (this.max() - this.min());
|
|
117
117
|
this.setValue(this.clamp(raw));
|
|
118
118
|
}
|
|
119
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
120
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.
|
|
119
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: Slider, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
120
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.7", type: Slider, isStandalone: true, selector: "mf-slider", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { attributes: { "role": "slider", "tabindex": "0" }, listeners: { "keydown": "onKeydown($event)", "pointerdown": "onPointerDown($event)", "pointermove": "onPointerMove($event)", "pointerup": "onPointerUp($event)" }, properties: { "attr.aria-valuemin": "min()", "attr.aria-valuemax": "max()", "attr.aria-valuenow": "value()", "attr.aria-disabled": "disabled() || null", "attr.aria-label": "ariaLabel() || null", "class": "hostClasses()" } }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Slider), multi: true }], exportAs: ["mfSlider"], usesInheritance: true, ngImport: i0, template: `
|
|
121
121
|
<div
|
|
122
122
|
class="pointer-events-none absolute inset-x-0 top-1/2 h-1.5 -translate-y-1/2 rounded-full bg-surface-alt"
|
|
123
123
|
>
|
|
@@ -133,7 +133,7 @@ class Slider extends ValueAccessorBase {
|
|
|
133
133
|
></div>
|
|
134
134
|
`, isInline: true });
|
|
135
135
|
}
|
|
136
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
136
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: Slider, decorators: [{
|
|
137
137
|
type: Component,
|
|
138
138
|
args: [{
|
|
139
139
|
selector: 'mf-slider',
|
|
@@ -171,9 +171,256 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
171
171
|
}]
|
|
172
172
|
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
|
|
173
173
|
|
|
174
|
+
const THUMB = 'absolute top-1/2 z-[1] h-5 w-5 -translate-y-1/2 cursor-grab rounded-full border-2 border-accent bg-surface shadow-1 outline-none ' +
|
|
175
|
+
'transition-[scale,box-shadow] duration-fast ease-emphasis hover:scale-110 active:cursor-grabbing ' +
|
|
176
|
+
'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring';
|
|
177
|
+
/**
|
|
178
|
+
* `<mf-range-slider [(value)]="price" [min]="0" [max]="1000" [step]="10" ariaLabel="Fiyat" />`
|
|
179
|
+
*
|
|
180
|
+
* İki tutamaçlı aralık seçici — WAI-ARIA APG "Multi-Thumb Slider" deseni:
|
|
181
|
+
* her tutamaç KENDİ `role="slider"` öğesidir ve sınırları diğerine bağlıdır
|
|
182
|
+
* (alt tutamacın `aria-valuemax`'ı üst tutamacın değeri, tersi de öyle) —
|
|
183
|
+
* ekran okuyucu aralığı doğru anlar, tutamaçlar birbirinin üstünden geçemez.
|
|
184
|
+
*
|
|
185
|
+
* - Klavye: ok tuşları adım, PageUp/PageDown 10 adım, Home/End sınır. RTL'de
|
|
186
|
+
* yatay oklar görsel yöne göre çevrilir.
|
|
187
|
+
* - Pointer: iz üzerinde herhangi bir yere basınca EN YAKIN tutamaç oraya
|
|
188
|
+
* atlar ve sürüklenir.
|
|
189
|
+
* - `showValue`: odak/sürükleme sırasında tutamacın üstünde değer balonu
|
|
190
|
+
* (`valueFormatter` ile biçimlenir; aynı metin `aria-valuetext` olur).
|
|
191
|
+
* - `minDistance`: iki tutamaç arasındaki en küçük fark.
|
|
192
|
+
*/
|
|
193
|
+
class RangeSlider extends ValueAccessorBase {
|
|
194
|
+
value = model([25, 75], /* @ts-ignore */
|
|
195
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
196
|
+
min = input(0, /* @ts-ignore */
|
|
197
|
+
...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
|
|
198
|
+
max = input(100, /* @ts-ignore */
|
|
199
|
+
...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
|
|
200
|
+
step = input(1, /* @ts-ignore */
|
|
201
|
+
...(ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []));
|
|
202
|
+
/** İki tutamaç arasındaki en küçük fark (adım biriminde değil, değer biriminde). */
|
|
203
|
+
minDistance = input(0, /* @ts-ignore */
|
|
204
|
+
...(ngDevMode ? [{ debugName: "minDistance" }] : /* istanbul ignore next */ []));
|
|
205
|
+
disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
206
|
+
showValue = input(true, { ...(ngDevMode ? { debugName: "showValue" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
207
|
+
/** Değer balonu ve `aria-valuetext` biçimi — ör. `v => '$' + v`. */
|
|
208
|
+
valueFormatter = input((v) => String(v), /* @ts-ignore */
|
|
209
|
+
...(ngDevMode ? [{ debugName: "valueFormatter" }] : /* istanbul ignore next */ []));
|
|
210
|
+
/** Grup için erişilebilir ad; tutamaç adları `"{ad} — en az/en çok"` olarak türetilir. */
|
|
211
|
+
ariaLabel = input('', /* @ts-ignore */
|
|
212
|
+
...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
213
|
+
/** Tutamaç adlarını tamamen ezmek için (i18n). */
|
|
214
|
+
minThumbLabel = input(/* @ts-ignore */
|
|
215
|
+
...(ngDevMode ? [undefined, { debugName: "minThumbLabel" }] : /* istanbul ignore next */ []));
|
|
216
|
+
maxThumbLabel = input(/* @ts-ignore */
|
|
217
|
+
...(ngDevMode ? [undefined, { debugName: "maxThumbLabel" }] : /* istanbul ignore next */ []));
|
|
218
|
+
thumbs = [0, 1];
|
|
219
|
+
thumbClass = THUMB;
|
|
220
|
+
active = signal(null, /* @ts-ignore */
|
|
221
|
+
...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
|
|
222
|
+
focused = signal(null, /* @ts-ignore */
|
|
223
|
+
...(ngDevMode ? [{ debugName: "focused" }] : /* istanbul ignore next */ []));
|
|
224
|
+
host = inject(ElementRef);
|
|
225
|
+
percents = computed(() => {
|
|
226
|
+
const range = this.max() - this.min();
|
|
227
|
+
const [a, b] = this.value();
|
|
228
|
+
const pct = (v) => (range <= 0 ? 0 : ((v - this.min()) / range) * 100);
|
|
229
|
+
return [pct(a), pct(b)];
|
|
230
|
+
}, /* @ts-ignore */
|
|
231
|
+
...(ngDevMode ? [{ debugName: "percents" }] : /* istanbul ignore next */ []));
|
|
232
|
+
labels = inject(MF_SLIDER_LABELS);
|
|
233
|
+
thumbName = (own, fallback) => own ?? (this.ariaLabel() ? `${this.ariaLabel()} — ${fallback}` : fallback);
|
|
234
|
+
minLabel = computed(() => this.thumbName(this.minThumbLabel(), this.labels().minThumb), /* @ts-ignore */
|
|
235
|
+
...(ngDevMode ? [{ debugName: "minLabel" }] : /* istanbul ignore next */ []));
|
|
236
|
+
maxLabel = computed(() => this.thumbName(this.maxThumbLabel(), this.labels().maxThumb), /* @ts-ignore */
|
|
237
|
+
...(ngDevMode ? [{ debugName: "maxLabel" }] : /* istanbul ignore next */ []));
|
|
238
|
+
hostClasses = computed(() => cn('relative block h-8 w-full touch-none select-none', this.disabled() ? 'pointer-events-none opacity-50' : 'cursor-pointer'), /* @ts-ignore */
|
|
239
|
+
...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
|
|
240
|
+
format(value) {
|
|
241
|
+
return this.valueFormatter()(value);
|
|
242
|
+
}
|
|
243
|
+
writeValue(value) {
|
|
244
|
+
if (value)
|
|
245
|
+
this.value.set([value[0], value[1]]);
|
|
246
|
+
}
|
|
247
|
+
snap(raw) {
|
|
248
|
+
const stepped = Math.round((raw - this.min()) / this.step()) * this.step() + this.min();
|
|
249
|
+
return Math.min(this.max(), Math.max(this.min(), stepped));
|
|
250
|
+
}
|
|
251
|
+
setThumb(thumb, raw) {
|
|
252
|
+
const [a, b] = this.value();
|
|
253
|
+
const gap = this.minDistance();
|
|
254
|
+
const next = thumb === 0 ? [Math.min(this.snap(raw), b - gap), b] : [a, Math.max(this.snap(raw), a + gap)];
|
|
255
|
+
if (next[0] === a && next[1] === b)
|
|
256
|
+
return;
|
|
257
|
+
this.value.set(next);
|
|
258
|
+
this.onChange(next);
|
|
259
|
+
this.onTouched();
|
|
260
|
+
}
|
|
261
|
+
onKeydown(event, thumb) {
|
|
262
|
+
if (this.disabled())
|
|
263
|
+
return;
|
|
264
|
+
const s = this.step();
|
|
265
|
+
const current = this.value()[thumb];
|
|
266
|
+
const rtl = isRtl(this.host.nativeElement);
|
|
267
|
+
const key = rtl && (event.key === 'ArrowLeft' || event.key === 'ArrowRight')
|
|
268
|
+
? event.key === 'ArrowLeft'
|
|
269
|
+
? 'ArrowRight'
|
|
270
|
+
: 'ArrowLeft'
|
|
271
|
+
: event.key;
|
|
272
|
+
const delta = {
|
|
273
|
+
ArrowRight: s,
|
|
274
|
+
ArrowUp: s,
|
|
275
|
+
ArrowLeft: -s,
|
|
276
|
+
ArrowDown: -s,
|
|
277
|
+
PageUp: s * 10,
|
|
278
|
+
PageDown: -s * 10,
|
|
279
|
+
};
|
|
280
|
+
let target = null;
|
|
281
|
+
if (key in delta)
|
|
282
|
+
target = current + delta[key];
|
|
283
|
+
else if (key === 'Home')
|
|
284
|
+
target = thumb === 0 ? this.min() : this.value()[0];
|
|
285
|
+
else if (key === 'End')
|
|
286
|
+
target = thumb === 0 ? this.value()[1] : this.max();
|
|
287
|
+
if (target === null)
|
|
288
|
+
return;
|
|
289
|
+
event.preventDefault();
|
|
290
|
+
this.setThumb(thumb, target);
|
|
291
|
+
}
|
|
292
|
+
onPointerDown(event) {
|
|
293
|
+
if (this.disabled() || event.button !== 0)
|
|
294
|
+
return;
|
|
295
|
+
const raw = this.rawFromPointer(event);
|
|
296
|
+
const [a, b] = this.value();
|
|
297
|
+
// En yakın tutamaç; eşitse (üst üste) pointer'ın tarafına göre.
|
|
298
|
+
const thumb = Math.abs(raw - a) < Math.abs(raw - b) || (a === b && raw < a) ? 0 : 1;
|
|
299
|
+
this.active.set(thumb);
|
|
300
|
+
this.host.nativeElement.setPointerCapture?.(event.pointerId);
|
|
301
|
+
const thumbs = this.host.nativeElement.querySelectorAll('[role=slider]');
|
|
302
|
+
thumbs[thumb]?.focus();
|
|
303
|
+
this.setThumb(thumb, raw);
|
|
304
|
+
event.preventDefault();
|
|
305
|
+
}
|
|
306
|
+
onPointerMove(event) {
|
|
307
|
+
const thumb = this.active();
|
|
308
|
+
if (thumb === null || this.disabled())
|
|
309
|
+
return;
|
|
310
|
+
this.setThumb(thumb, this.rawFromPointer(event));
|
|
311
|
+
}
|
|
312
|
+
onPointerUp(event) {
|
|
313
|
+
this.active.set(null);
|
|
314
|
+
this.host.nativeElement.releasePointerCapture?.(event.pointerId);
|
|
315
|
+
}
|
|
316
|
+
rawFromPointer(event) {
|
|
317
|
+
const rect = this.host.nativeElement.getBoundingClientRect();
|
|
318
|
+
const ratio = inlineStartRatio(event.clientX, rect, isRtl(this.host.nativeElement));
|
|
319
|
+
return this.min() + ratio * (this.max() - this.min());
|
|
320
|
+
}
|
|
321
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: RangeSlider, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
322
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: RangeSlider, isStandalone: true, selector: "mf-range-slider", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, minDistance: { classPropertyName: "minDistance", publicName: "minDistance", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, showValue: { classPropertyName: "showValue", publicName: "showValue", isSignal: true, isRequired: false, transformFunction: null }, valueFormatter: { classPropertyName: "valueFormatter", publicName: "valueFormatter", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, minThumbLabel: { classPropertyName: "minThumbLabel", publicName: "minThumbLabel", isSignal: true, isRequired: false, transformFunction: null }, maxThumbLabel: { classPropertyName: "maxThumbLabel", publicName: "maxThumbLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { listeners: { "pointerdown": "onPointerDown($event)", "pointermove": "onPointerMove($event)", "pointerup": "onPointerUp($event)", "pointercancel": "onPointerUp($event)" }, properties: { "class": "hostClasses()" } }, providers: [
|
|
323
|
+
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RangeSlider), multi: true },
|
|
324
|
+
], exportAs: ["mfRangeSlider"], usesInheritance: true, ngImport: i0, template: `
|
|
325
|
+
<div
|
|
326
|
+
class="pointer-events-none absolute inset-x-0 top-1/2 h-1.5 -translate-y-1/2 rounded-full bg-surface-alt"
|
|
327
|
+
>
|
|
328
|
+
<div
|
|
329
|
+
class="absolute inset-y-0 rounded-full bg-accent-fill"
|
|
330
|
+
[style.inset-inline-start.%]="percents()[0]"
|
|
331
|
+
[style.inset-inline-end.%]="100 - percents()[1]"
|
|
332
|
+
></div>
|
|
333
|
+
</div>
|
|
334
|
+
@for (thumb of thumbs; track thumb) {
|
|
335
|
+
<div
|
|
336
|
+
role="slider"
|
|
337
|
+
[class]="thumbClass"
|
|
338
|
+
[class.scale-110]="active() === thumb"
|
|
339
|
+
[style.inset-inline-start.%]="percents()[thumb]"
|
|
340
|
+
style="margin-inline-start: -10px"
|
|
341
|
+
[attr.tabindex]="disabled() ? -1 : 0"
|
|
342
|
+
[attr.aria-label]="thumb === 0 ? minLabel() : maxLabel()"
|
|
343
|
+
[attr.aria-valuemin]="thumb === 0 ? min() : value()[0]"
|
|
344
|
+
[attr.aria-valuemax]="thumb === 0 ? value()[1] : max()"
|
|
345
|
+
[attr.aria-valuenow]="value()[thumb]"
|
|
346
|
+
[attr.aria-valuetext]="format(value()[thumb])"
|
|
347
|
+
[attr.aria-disabled]="disabled() || null"
|
|
348
|
+
[attr.aria-orientation]="'horizontal'"
|
|
349
|
+
(keydown)="onKeydown($event, thumb)"
|
|
350
|
+
(focus)="focused.set(thumb)"
|
|
351
|
+
(blur)="focused.set(null)"
|
|
352
|
+
>
|
|
353
|
+
@if (showValue() && (active() === thumb || focused() === thumb)) {
|
|
354
|
+
<span
|
|
355
|
+
class="pointer-events-none absolute inset-x-0 bottom-full mx-auto mb-2 w-max rounded-md bg-surface-inverse px-2 py-1 text-xs font-medium whitespace-nowrap text-fg-inverse tabular-nums shadow-2 animate-overlay-in"
|
|
356
|
+
aria-hidden="true"
|
|
357
|
+
>{{ format(value()[thumb]) }}</span
|
|
358
|
+
>
|
|
359
|
+
}
|
|
360
|
+
</div>
|
|
361
|
+
}
|
|
362
|
+
`, isInline: true });
|
|
363
|
+
}
|
|
364
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: RangeSlider, decorators: [{
|
|
365
|
+
type: Component,
|
|
366
|
+
args: [{
|
|
367
|
+
selector: 'mf-range-slider',
|
|
368
|
+
exportAs: 'mfRangeSlider',
|
|
369
|
+
host: {
|
|
370
|
+
'[class]': 'hostClasses()',
|
|
371
|
+
'(pointerdown)': 'onPointerDown($event)',
|
|
372
|
+
'(pointermove)': 'onPointerMove($event)',
|
|
373
|
+
'(pointerup)': 'onPointerUp($event)',
|
|
374
|
+
'(pointercancel)': 'onPointerUp($event)',
|
|
375
|
+
},
|
|
376
|
+
template: `
|
|
377
|
+
<div
|
|
378
|
+
class="pointer-events-none absolute inset-x-0 top-1/2 h-1.5 -translate-y-1/2 rounded-full bg-surface-alt"
|
|
379
|
+
>
|
|
380
|
+
<div
|
|
381
|
+
class="absolute inset-y-0 rounded-full bg-accent-fill"
|
|
382
|
+
[style.inset-inline-start.%]="percents()[0]"
|
|
383
|
+
[style.inset-inline-end.%]="100 - percents()[1]"
|
|
384
|
+
></div>
|
|
385
|
+
</div>
|
|
386
|
+
@for (thumb of thumbs; track thumb) {
|
|
387
|
+
<div
|
|
388
|
+
role="slider"
|
|
389
|
+
[class]="thumbClass"
|
|
390
|
+
[class.scale-110]="active() === thumb"
|
|
391
|
+
[style.inset-inline-start.%]="percents()[thumb]"
|
|
392
|
+
style="margin-inline-start: -10px"
|
|
393
|
+
[attr.tabindex]="disabled() ? -1 : 0"
|
|
394
|
+
[attr.aria-label]="thumb === 0 ? minLabel() : maxLabel()"
|
|
395
|
+
[attr.aria-valuemin]="thumb === 0 ? min() : value()[0]"
|
|
396
|
+
[attr.aria-valuemax]="thumb === 0 ? value()[1] : max()"
|
|
397
|
+
[attr.aria-valuenow]="value()[thumb]"
|
|
398
|
+
[attr.aria-valuetext]="format(value()[thumb])"
|
|
399
|
+
[attr.aria-disabled]="disabled() || null"
|
|
400
|
+
[attr.aria-orientation]="'horizontal'"
|
|
401
|
+
(keydown)="onKeydown($event, thumb)"
|
|
402
|
+
(focus)="focused.set(thumb)"
|
|
403
|
+
(blur)="focused.set(null)"
|
|
404
|
+
>
|
|
405
|
+
@if (showValue() && (active() === thumb || focused() === thumb)) {
|
|
406
|
+
<span
|
|
407
|
+
class="pointer-events-none absolute inset-x-0 bottom-full mx-auto mb-2 w-max rounded-md bg-surface-inverse px-2 py-1 text-xs font-medium whitespace-nowrap text-fg-inverse tabular-nums shadow-2 animate-overlay-in"
|
|
408
|
+
aria-hidden="true"
|
|
409
|
+
>{{ format(value()[thumb]) }}</span
|
|
410
|
+
>
|
|
411
|
+
}
|
|
412
|
+
</div>
|
|
413
|
+
}
|
|
414
|
+
`,
|
|
415
|
+
providers: [
|
|
416
|
+
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RangeSlider), multi: true },
|
|
417
|
+
],
|
|
418
|
+
}]
|
|
419
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], minDistance: [{ type: i0.Input, args: [{ isSignal: true, alias: "minDistance", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], showValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "showValue", required: false }] }], valueFormatter: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueFormatter", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], minThumbLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "minThumbLabel", required: false }] }], maxThumbLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxThumbLabel", required: false }] }] } });
|
|
420
|
+
|
|
174
421
|
/**
|
|
175
422
|
* Generated bundle index. Do not edit.
|
|
176
423
|
*/
|
|
177
424
|
|
|
178
|
-
export { Slider, sliderHostVariants };
|
|
425
|
+
export { RangeSlider, Slider, sliderHostVariants };
|
|
179
426
|
//# sourceMappingURL=mesgflow-ui-kit-slider.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mesgflow-ui-kit-slider.mjs","sources":["../../../projects/ui-kit/slider/slider.variants.ts","../../../projects/ui-kit/slider/slider.ts","../../../projects/ui-kit/slider/mesgflow-ui-kit-slider.ts"],"sourcesContent":["import { cva } from 'class-variance-authority';\r\n\r\nexport const sliderHostVariants = cva(\r\n 'relative block h-4 w-full cursor-pointer touch-none rounded-full select-none ' +\r\n 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-focus-ring',\r\n {\r\n variants: {\r\n disabled: {\r\n true: 'pointer-events-none opacity-50',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: { disabled: false },\r\n },\r\n);\r\n","import { Component, ElementRef, computed, forwardRef, inject, input, model } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport { ValueAccessorBase, cn, inlineStartRatio, isRtl } from '@mesgflow/ui-kit/core';\r\nimport { sliderHostVariants } from './slider.variants';\r\n\r\n/**\r\n * `<mf-slider [(value)]=\"opacity\" [min]=\"0\" [max]=\"100\" [step]=\"5\" />` —\r\n * `@angular/aria`'da hazır bir slider pattern'i YOK (sadece accordion/\r\n * combobox/grid/listbox/menu/tabs/toolbar/tree var), bu yüzden ARIA\r\n * `role=\"slider\"` ve klavye (ok tuşları/Home/End/PageUp/PageDown) + pointer\r\n * sürükleme ELLE kuruldu — kodda hand-rolled ARIA'nın ikinci örneği\r\n * (ilki `Calendar`, bkz. README \"Takvim ızgarası bilerek grid KULLANMADI\").\r\n */\r\n@Component({\r\n selector: 'mf-slider',\r\n exportAs: 'mfSlider',\r\n host: {\r\n role: 'slider',\r\n tabindex: '0',\r\n '[attr.aria-valuemin]': 'min()',\r\n '[attr.aria-valuemax]': 'max()',\r\n '[attr.aria-valuenow]': 'value()',\r\n '[attr.aria-disabled]': 'disabled() || null',\r\n '[attr.aria-label]': 'ariaLabel() || null',\r\n '[class]': 'hostClasses()',\r\n '(keydown)': 'onKeydown($event)',\r\n '(pointerdown)': 'onPointerDown($event)',\r\n '(pointermove)': 'onPointerMove($event)',\r\n '(pointerup)': 'onPointerUp($event)',\r\n },\r\n template: `\r\n <div\r\n class=\"pointer-events-none absolute inset-x-0 top-1/2 h-1.5 -translate-y-1/2 rounded-full bg-surface-alt\"\r\n >\r\n <div\r\n class=\"absolute inset-y-0 start-0 rounded-full bg-accent-fill\"\r\n [style.width.%]=\"percent()\"\r\n ></div>\r\n </div>\r\n <div\r\n class=\"pointer-events-none absolute top-1/2 h-4 w-4 -translate-y-1/2 rounded-full border-2 border-accent bg-surface shadow-1\"\r\n [style.inset-inline-start.%]=\"percent()\"\r\n style=\"margin-inline-start: -8px\"\r\n ></div>\r\n `,\r\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Slider), multi: true }],\r\n})\r\nexport class Slider extends ValueAccessorBase<number> implements ControlValueAccessor {\r\n readonly value = model(0);\r\n readonly min = input(0);\r\n readonly max = input(100);\r\n readonly step = input(1);\r\n readonly disabled = input(false);\r\n readonly ariaLabel = input('');\r\n\r\n private readonly elementRef = inject(ElementRef<HTMLElement>);\r\n\r\n protected readonly percent = computed(() => {\r\n const range = this.max() - this.min();\r\n if (range <= 0) return 0;\r\n return ((this.value() - this.min()) / range) * 100;\r\n });\r\n\r\n protected readonly hostClasses = computed(() =>\r\n cn(sliderHostVariants({ disabled: this.disabled() })),\r\n );\r\n\r\n writeValue(value: number): void {\r\n this.value.set(value);\r\n }\r\n\r\n private clamp(raw: number): number {\r\n const stepped = Math.round((raw - this.min()) / this.step()) * this.step() + this.min();\r\n return Math.min(this.max(), Math.max(this.min(), stepped));\r\n }\r\n\r\n private setValue(next: number): void {\r\n this.value.set(next);\r\n this.onChange(next);\r\n this.onTouched();\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent): void {\r\n if (this.disabled()) return;\r\n const s = this.step();\r\n // Yatay oklar GÖRSEL yöne göre: RTL'de dolgu sağdan başladığı için → azaltır.\r\n const key = isRtl(this.elementRef.nativeElement)\r\n ? (({ ArrowRight: 'ArrowLeft', ArrowLeft: 'ArrowRight' } as Record<string, string>)[\r\n event.key\r\n ] ?? event.key)\r\n : event.key;\r\n switch (key) {\r\n case 'ArrowRight':\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this.setValue(this.clamp(this.value() + s));\r\n break;\r\n case 'ArrowLeft':\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n this.setValue(this.clamp(this.value() - s));\r\n break;\r\n case 'Home':\r\n event.preventDefault();\r\n this.setValue(this.min());\r\n break;\r\n case 'End':\r\n event.preventDefault();\r\n this.setValue(this.max());\r\n break;\r\n case 'PageUp':\r\n event.preventDefault();\r\n this.setValue(this.clamp(this.value() + s * 10));\r\n break;\r\n case 'PageDown':\r\n event.preventDefault();\r\n this.setValue(this.clamp(this.value() - s * 10));\r\n break;\r\n }\r\n }\r\n\r\n protected onPointerDown(event: PointerEvent): void {\r\n if (this.disabled()) return;\r\n this.elementRef.nativeElement.setPointerCapture(event.pointerId);\r\n this.elementRef.nativeElement.focus();\r\n this.updateFromPointer(event);\r\n }\r\n\r\n protected onPointerMove(event: PointerEvent): void {\r\n if (this.disabled() || event.buttons !== 1) return;\r\n this.updateFromPointer(event);\r\n }\r\n\r\n protected onPointerUp(event: PointerEvent): void {\r\n this.elementRef.nativeElement.releasePointerCapture(event.pointerId);\r\n }\r\n\r\n private updateFromPointer(event: PointerEvent): void {\r\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\r\n const ratio = inlineStartRatio(event.clientX, rect, isRtl(this.elementRef.nativeElement));\r\n const raw = this.min() + ratio * (this.max() - this.min());\r\n this.setValue(this.clamp(raw));\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAEO,MAAM,kBAAkB,GAAG,GAAG,CACnC,+EAA+E;AAC7E,IAAA,+GAA+G,EACjH;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,QAAQ,EAAE;AACR,YAAA,IAAI,EAAE,gCAAgC;AACtC,YAAA,KAAK,EAAE,EAAE;AACV,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;AACrC,CAAA;;ACRH;;;;;;;AAOG;AAmCG,MAAO,MAAO,SAAQ,iBAAyB,CAAA;IAC1C,KAAK,GAAG,KAAK,CAAC,CAAC;8EAAC;IAChB,GAAG,GAAG,KAAK,CAAC,CAAC;4EAAC;IACd,GAAG,GAAG,KAAK,CAAC,GAAG;4EAAC;IAChB,IAAI,GAAG,KAAK,CAAC,CAAC;6EAAC;IACf,QAAQ,GAAG,KAAK,CAAC,KAAK;iFAAC;IACvB,SAAS,GAAG,KAAK,CAAC,EAAE;kFAAC;AAEb,IAAA,UAAU,GAAG,MAAM,EAAC,UAAuB,EAAC;AAE1C,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;QACrC,IAAI,KAAK,IAAI,CAAC;AAAE,YAAA,OAAO,CAAC;AACxB,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,IAAI,GAAG;IACpD,CAAC;gFAAC;AAEiB,IAAA,WAAW,GAAG,QAAQ,CAAC,MACxC,EAAE,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;oFACtD;AAED,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;IACvB;AAEQ,IAAA,KAAK,CAAC,GAAW,EAAA;AACvB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;QACvF,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;IAC5D;AAEQ,IAAA,QAAQ,CAAC,IAAY,EAAA;AAC3B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,EAAE;IAClB;AAEU,IAAA,SAAS,CAAC,KAAoB,EAAA;QACtC,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AACrB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;;QAErB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa;eACzC,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAA6B,CAC/E,KAAK,CAAC,GAAG,CACV,IAAI,KAAK,CAAC,GAAG;AAChB,cAAE,KAAK,CAAC,GAAG;QACb,QAAQ,GAAG;AACT,YAAA,KAAK,YAAY;AACjB,YAAA,KAAK,SAAS;gBACZ,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC3C;AACF,YAAA,KAAK,WAAW;AAChB,YAAA,KAAK,WAAW;gBACd,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC3C;AACF,YAAA,KAAK,MAAM;gBACT,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACzB;AACF,YAAA,KAAK,KAAK;gBACR,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACzB;AACF,YAAA,KAAK,QAAQ;gBACX,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;gBAChD;AACF,YAAA,KAAK,UAAU;gBACb,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;gBAChD;;IAEN;AAEU,IAAA,aAAa,CAAC,KAAmB,EAAA;QACzC,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;QACrB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC;AAChE,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,EAAE;AACrC,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;IAC/B;AAEU,IAAA,aAAa,CAAC,KAAmB,EAAA;QACzC,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC;YAAE;AAC5C,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;IAC/B;AAEU,IAAA,WAAW,CAAC,KAAmB,EAAA;QACvC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,qBAAqB,CAAC,KAAK,CAAC,SAAS,CAAC;IACtE;AAEQ,IAAA,iBAAiB,CAAC,KAAmB,EAAA;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,qBAAqB,EAAE;AAClE,QAAA,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QACzF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC1D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC;uGA/FW,MAAM,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAN,MAAM,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,GAAA,EAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,OAAA,EAAA,oBAAA,EAAA,OAAA,EAAA,oBAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,EAAA,SAAA,EAFN,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAfrF,CAAA;;;;;;;;;;;;;;AAcT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAGU,MAAM,EAAA,UAAA,EAAA,CAAA;kBAlClB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,WAAW;AACrB,oBAAA,QAAQ,EAAE,UAAU;AACpB,oBAAA,IAAI,EAAE;AACJ,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,QAAQ,EAAE,GAAG;AACb,wBAAA,sBAAsB,EAAE,OAAO;AAC/B,wBAAA,sBAAsB,EAAE,OAAO;AAC/B,wBAAA,sBAAsB,EAAE,SAAS;AACjC,wBAAA,sBAAsB,EAAE,oBAAoB;AAC5C,wBAAA,mBAAmB,EAAE,qBAAqB;AAC1C,wBAAA,SAAS,EAAE,eAAe;AAC1B,wBAAA,WAAW,EAAE,mBAAmB;AAChC,wBAAA,eAAe,EAAE,uBAAuB;AACxC,wBAAA,eAAe,EAAE,uBAAuB;AACxC,wBAAA,aAAa,EAAE,qBAAqB;AACrC,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;;;AAcT,EAAA,CAAA;oBACD,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAChG,iBAAA;;;AC9CD;;AAEG;;"}
|
|
1
|
+
{"version":3,"file":"mesgflow-ui-kit-slider.mjs","sources":["../../../projects/ui-kit/slider/slider.variants.ts","../../../projects/ui-kit/slider/slider.ts","../../../projects/ui-kit/slider/range-slider.ts","../../../projects/ui-kit/slider/mesgflow-ui-kit-slider.ts"],"sourcesContent":["import { cva } from 'class-variance-authority';\r\n\r\nexport const sliderHostVariants = cva(\r\n 'relative block h-4 w-full cursor-pointer touch-none rounded-full select-none ' +\r\n 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-focus-ring',\r\n {\r\n variants: {\r\n disabled: {\r\n true: 'pointer-events-none opacity-50',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: { disabled: false },\r\n },\r\n);\r\n","import { Component, ElementRef, computed, forwardRef, inject, input, model } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport { ValueAccessorBase, cn, inlineStartRatio, isRtl } from '@mesgflow/ui-kit/core';\r\nimport { sliderHostVariants } from './slider.variants';\r\n\r\n/**\r\n * `<mf-slider [(value)]=\"opacity\" [min]=\"0\" [max]=\"100\" [step]=\"5\" />` —\r\n * `@angular/aria`'da hazır bir slider pattern'i YOK (sadece accordion/\r\n * combobox/grid/listbox/menu/tabs/toolbar/tree var), bu yüzden ARIA\r\n * `role=\"slider\"` ve klavye (ok tuşları/Home/End/PageUp/PageDown) + pointer\r\n * sürükleme ELLE kuruldu — kodda hand-rolled ARIA'nın ikinci örneği\r\n * (ilki `Calendar`, bkz. README \"Takvim ızgarası bilerek grid KULLANMADI\").\r\n */\r\n@Component({\r\n selector: 'mf-slider',\r\n exportAs: 'mfSlider',\r\n host: {\r\n role: 'slider',\r\n tabindex: '0',\r\n '[attr.aria-valuemin]': 'min()',\r\n '[attr.aria-valuemax]': 'max()',\r\n '[attr.aria-valuenow]': 'value()',\r\n '[attr.aria-disabled]': 'disabled() || null',\r\n '[attr.aria-label]': 'ariaLabel() || null',\r\n '[class]': 'hostClasses()',\r\n '(keydown)': 'onKeydown($event)',\r\n '(pointerdown)': 'onPointerDown($event)',\r\n '(pointermove)': 'onPointerMove($event)',\r\n '(pointerup)': 'onPointerUp($event)',\r\n },\r\n template: `\r\n <div\r\n class=\"pointer-events-none absolute inset-x-0 top-1/2 h-1.5 -translate-y-1/2 rounded-full bg-surface-alt\"\r\n >\r\n <div\r\n class=\"absolute inset-y-0 start-0 rounded-full bg-accent-fill\"\r\n [style.width.%]=\"percent()\"\r\n ></div>\r\n </div>\r\n <div\r\n class=\"pointer-events-none absolute top-1/2 h-4 w-4 -translate-y-1/2 rounded-full border-2 border-accent bg-surface shadow-1\"\r\n [style.inset-inline-start.%]=\"percent()\"\r\n style=\"margin-inline-start: -8px\"\r\n ></div>\r\n `,\r\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Slider), multi: true }],\r\n})\r\nexport class Slider extends ValueAccessorBase<number> implements ControlValueAccessor {\r\n readonly value = model(0);\r\n readonly min = input(0);\r\n readonly max = input(100);\r\n readonly step = input(1);\r\n readonly disabled = input(false);\r\n readonly ariaLabel = input('');\r\n\r\n private readonly elementRef = inject(ElementRef<HTMLElement>);\r\n\r\n protected readonly percent = computed(() => {\r\n const range = this.max() - this.min();\r\n if (range <= 0) return 0;\r\n return ((this.value() - this.min()) / range) * 100;\r\n });\r\n\r\n protected readonly hostClasses = computed(() =>\r\n cn(sliderHostVariants({ disabled: this.disabled() })),\r\n );\r\n\r\n writeValue(value: number): void {\r\n this.value.set(value);\r\n }\r\n\r\n private clamp(raw: number): number {\r\n const stepped = Math.round((raw - this.min()) / this.step()) * this.step() + this.min();\r\n return Math.min(this.max(), Math.max(this.min(), stepped));\r\n }\r\n\r\n private setValue(next: number): void {\r\n this.value.set(next);\r\n this.onChange(next);\r\n this.onTouched();\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent): void {\r\n if (this.disabled()) return;\r\n const s = this.step();\r\n // Yatay oklar GÖRSEL yöne göre: RTL'de dolgu sağdan başladığı için → azaltır.\r\n const key = isRtl(this.elementRef.nativeElement)\r\n ? (({ ArrowRight: 'ArrowLeft', ArrowLeft: 'ArrowRight' } as Record<string, string>)[\r\n event.key\r\n ] ?? event.key)\r\n : event.key;\r\n switch (key) {\r\n case 'ArrowRight':\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this.setValue(this.clamp(this.value() + s));\r\n break;\r\n case 'ArrowLeft':\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n this.setValue(this.clamp(this.value() - s));\r\n break;\r\n case 'Home':\r\n event.preventDefault();\r\n this.setValue(this.min());\r\n break;\r\n case 'End':\r\n event.preventDefault();\r\n this.setValue(this.max());\r\n break;\r\n case 'PageUp':\r\n event.preventDefault();\r\n this.setValue(this.clamp(this.value() + s * 10));\r\n break;\r\n case 'PageDown':\r\n event.preventDefault();\r\n this.setValue(this.clamp(this.value() - s * 10));\r\n break;\r\n }\r\n }\r\n\r\n protected onPointerDown(event: PointerEvent): void {\r\n if (this.disabled()) return;\r\n this.elementRef.nativeElement.setPointerCapture(event.pointerId);\r\n this.elementRef.nativeElement.focus();\r\n this.updateFromPointer(event);\r\n }\r\n\r\n protected onPointerMove(event: PointerEvent): void {\r\n if (this.disabled() || event.buttons !== 1) return;\r\n this.updateFromPointer(event);\r\n }\r\n\r\n protected onPointerUp(event: PointerEvent): void {\r\n this.elementRef.nativeElement.releasePointerCapture(event.pointerId);\r\n }\r\n\r\n private updateFromPointer(event: PointerEvent): void {\r\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\r\n const ratio = inlineStartRatio(event.clientX, rect, isRtl(this.elementRef.nativeElement));\r\n const raw = this.min() + ratio * (this.max() - this.min());\r\n this.setValue(this.clamp(raw));\r\n }\r\n}\r\n","import {\r\n Component,\r\n ElementRef,\r\n booleanAttribute,\r\n computed,\r\n forwardRef,\r\n inject,\r\n input,\r\n model,\r\n signal,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport {\r\n MF_SLIDER_LABELS,\r\n ValueAccessorBase,\r\n cn,\r\n inlineStartRatio,\r\n isRtl,\r\n} from '@mesgflow/ui-kit/core';\r\n\r\nexport type RangeValue = readonly [number, number];\r\ntype Thumb = 0 | 1;\r\n\r\nconst THUMB =\r\n 'absolute top-1/2 z-[1] h-5 w-5 -translate-y-1/2 cursor-grab rounded-full border-2 border-accent bg-surface shadow-1 outline-none ' +\r\n 'transition-[scale,box-shadow] duration-fast ease-emphasis hover:scale-110 active:cursor-grabbing ' +\r\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring';\r\n\r\n/**\r\n * `<mf-range-slider [(value)]=\"price\" [min]=\"0\" [max]=\"1000\" [step]=\"10\" ariaLabel=\"Fiyat\" />`\r\n *\r\n * İki tutamaçlı aralık seçici — WAI-ARIA APG \"Multi-Thumb Slider\" deseni:\r\n * her tutamaç KENDİ `role=\"slider\"` öğesidir ve sınırları diğerine bağlıdır\r\n * (alt tutamacın `aria-valuemax`'ı üst tutamacın değeri, tersi de öyle) —\r\n * ekran okuyucu aralığı doğru anlar, tutamaçlar birbirinin üstünden geçemez.\r\n *\r\n * - Klavye: ok tuşları adım, PageUp/PageDown 10 adım, Home/End sınır. RTL'de\r\n * yatay oklar görsel yöne göre çevrilir.\r\n * - Pointer: iz üzerinde herhangi bir yere basınca EN YAKIN tutamaç oraya\r\n * atlar ve sürüklenir.\r\n * - `showValue`: odak/sürükleme sırasında tutamacın üstünde değer balonu\r\n * (`valueFormatter` ile biçimlenir; aynı metin `aria-valuetext` olur).\r\n * - `minDistance`: iki tutamaç arasındaki en küçük fark.\r\n */\r\n@Component({\r\n selector: 'mf-range-slider',\r\n exportAs: 'mfRangeSlider',\r\n host: {\r\n '[class]': 'hostClasses()',\r\n '(pointerdown)': 'onPointerDown($event)',\r\n '(pointermove)': 'onPointerMove($event)',\r\n '(pointerup)': 'onPointerUp($event)',\r\n '(pointercancel)': 'onPointerUp($event)',\r\n },\r\n template: `\r\n <div\r\n class=\"pointer-events-none absolute inset-x-0 top-1/2 h-1.5 -translate-y-1/2 rounded-full bg-surface-alt\"\r\n >\r\n <div\r\n class=\"absolute inset-y-0 rounded-full bg-accent-fill\"\r\n [style.inset-inline-start.%]=\"percents()[0]\"\r\n [style.inset-inline-end.%]=\"100 - percents()[1]\"\r\n ></div>\r\n </div>\r\n @for (thumb of thumbs; track thumb) {\r\n <div\r\n role=\"slider\"\r\n [class]=\"thumbClass\"\r\n [class.scale-110]=\"active() === thumb\"\r\n [style.inset-inline-start.%]=\"percents()[thumb]\"\r\n style=\"margin-inline-start: -10px\"\r\n [attr.tabindex]=\"disabled() ? -1 : 0\"\r\n [attr.aria-label]=\"thumb === 0 ? minLabel() : maxLabel()\"\r\n [attr.aria-valuemin]=\"thumb === 0 ? min() : value()[0]\"\r\n [attr.aria-valuemax]=\"thumb === 0 ? value()[1] : max()\"\r\n [attr.aria-valuenow]=\"value()[thumb]\"\r\n [attr.aria-valuetext]=\"format(value()[thumb])\"\r\n [attr.aria-disabled]=\"disabled() || null\"\r\n [attr.aria-orientation]=\"'horizontal'\"\r\n (keydown)=\"onKeydown($event, thumb)\"\r\n (focus)=\"focused.set(thumb)\"\r\n (blur)=\"focused.set(null)\"\r\n >\r\n @if (showValue() && (active() === thumb || focused() === thumb)) {\r\n <span\r\n class=\"pointer-events-none absolute inset-x-0 bottom-full mx-auto mb-2 w-max rounded-md bg-surface-inverse px-2 py-1 text-xs font-medium whitespace-nowrap text-fg-inverse tabular-nums shadow-2 animate-overlay-in\"\r\n aria-hidden=\"true\"\r\n >{{ format(value()[thumb]) }}</span\r\n >\r\n }\r\n </div>\r\n }\r\n `,\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RangeSlider), multi: true },\r\n ],\r\n})\r\nexport class RangeSlider extends ValueAccessorBase<RangeValue> implements ControlValueAccessor {\r\n readonly value = model<RangeValue>([25, 75]);\r\n readonly min = input(0);\r\n readonly max = input(100);\r\n readonly step = input(1);\r\n /** İki tutamaç arasındaki en küçük fark (adım biriminde değil, değer biriminde). */\r\n readonly minDistance = input(0);\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n readonly showValue = input(true, { transform: booleanAttribute });\r\n /** Değer balonu ve `aria-valuetext` biçimi — ör. `v => '$' + v`. */\r\n readonly valueFormatter = input<(value: number) => string>((v) => String(v));\r\n /** Grup için erişilebilir ad; tutamaç adları `\"{ad} — en az/en çok\"` olarak türetilir. */\r\n readonly ariaLabel = input('');\r\n /** Tutamaç adlarını tamamen ezmek için (i18n). */\r\n readonly minThumbLabel = input<string>();\r\n readonly maxThumbLabel = input<string>();\r\n\r\n protected readonly thumbs: Thumb[] = [0, 1];\r\n protected readonly thumbClass = THUMB;\r\n protected readonly active = signal<Thumb | null>(null);\r\n protected readonly focused = signal<Thumb | null>(null);\r\n\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n protected readonly percents = computed(() => {\r\n const range = this.max() - this.min();\r\n const [a, b] = this.value();\r\n const pct = (v: number) => (range <= 0 ? 0 : ((v - this.min()) / range) * 100);\r\n return [pct(a), pct(b)] as const;\r\n });\r\n\r\n private readonly labels = inject(MF_SLIDER_LABELS);\r\n private readonly thumbName = (own: string | undefined, fallback: string) =>\r\n own ?? (this.ariaLabel() ? `${this.ariaLabel()} — ${fallback}` : fallback);\r\n protected readonly minLabel = computed(() =>\r\n this.thumbName(this.minThumbLabel(), this.labels().minThumb),\r\n );\r\n protected readonly maxLabel = computed(() =>\r\n this.thumbName(this.maxThumbLabel(), this.labels().maxThumb),\r\n );\r\n\r\n protected readonly hostClasses = computed(() =>\r\n cn(\r\n 'relative block h-8 w-full touch-none select-none',\r\n this.disabled() ? 'pointer-events-none opacity-50' : 'cursor-pointer',\r\n ),\r\n );\r\n\r\n protected format(value: number): string {\r\n return this.valueFormatter()(value);\r\n }\r\n\r\n writeValue(value: RangeValue | null): void {\r\n if (value) this.value.set([value[0], value[1]]);\r\n }\r\n\r\n private snap(raw: number): number {\r\n const stepped = Math.round((raw - this.min()) / this.step()) * this.step() + this.min();\r\n return Math.min(this.max(), Math.max(this.min(), stepped));\r\n }\r\n\r\n private setThumb(thumb: Thumb, raw: number): void {\r\n const [a, b] = this.value();\r\n const gap = this.minDistance();\r\n const next: [number, number] =\r\n thumb === 0 ? [Math.min(this.snap(raw), b - gap), b] : [a, Math.max(this.snap(raw), a + gap)];\r\n if (next[0] === a && next[1] === b) return;\r\n this.value.set(next);\r\n this.onChange(next);\r\n this.onTouched();\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent, thumb: Thumb): void {\r\n if (this.disabled()) return;\r\n const s = this.step();\r\n const current = this.value()[thumb];\r\n const rtl = isRtl(this.host.nativeElement);\r\n const key =\r\n rtl && (event.key === 'ArrowLeft' || event.key === 'ArrowRight')\r\n ? event.key === 'ArrowLeft'\r\n ? 'ArrowRight'\r\n : 'ArrowLeft'\r\n : event.key;\r\n const delta: Record<string, number> = {\r\n ArrowRight: s,\r\n ArrowUp: s,\r\n ArrowLeft: -s,\r\n ArrowDown: -s,\r\n PageUp: s * 10,\r\n PageDown: -s * 10,\r\n };\r\n let target: number | null = null;\r\n if (key in delta) target = current + delta[key]!;\r\n else if (key === 'Home') target = thumb === 0 ? this.min() : this.value()[0];\r\n else if (key === 'End') target = thumb === 0 ? this.value()[1] : this.max();\r\n if (target === null) return;\r\n event.preventDefault();\r\n this.setThumb(thumb, target);\r\n }\r\n\r\n protected onPointerDown(event: PointerEvent): void {\r\n if (this.disabled() || event.button !== 0) return;\r\n const raw = this.rawFromPointer(event);\r\n const [a, b] = this.value();\r\n // En yakın tutamaç; eşitse (üst üste) pointer'ın tarafına göre.\r\n const thumb: Thumb = Math.abs(raw - a) < Math.abs(raw - b) || (a === b && raw < a) ? 0 : 1;\r\n this.active.set(thumb);\r\n this.host.nativeElement.setPointerCapture?.(event.pointerId);\r\n const thumbs = this.host.nativeElement.querySelectorAll<HTMLElement>('[role=slider]');\r\n thumbs[thumb]?.focus();\r\n this.setThumb(thumb, raw);\r\n event.preventDefault();\r\n }\r\n\r\n protected onPointerMove(event: PointerEvent): void {\r\n const thumb = this.active();\r\n if (thumb === null || this.disabled()) return;\r\n this.setThumb(thumb, this.rawFromPointer(event));\r\n }\r\n\r\n protected onPointerUp(event: PointerEvent): void {\r\n this.active.set(null);\r\n this.host.nativeElement.releasePointerCapture?.(event.pointerId);\r\n }\r\n\r\n private rawFromPointer(event: PointerEvent): number {\r\n const rect = this.host.nativeElement.getBoundingClientRect();\r\n const ratio = inlineStartRatio(event.clientX, rect, isRtl(this.host.nativeElement));\r\n return this.min() + ratio * (this.max() - this.min());\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|