@mesgflow/ui-kit 0.6.0 → 0.7.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 +3 -2
- 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-aspect-ratio.mjs +37 -0
- package/fesm2022/mesgflow-ui-kit-aspect-ratio.mjs.map +1 -0
- 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 +2 -2
- package/fesm2022/mesgflow-ui-kit-box-input.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-button.mjs +188 -242
- package/fesm2022/mesgflow-ui-kit-button.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-card.mjs +37 -16
- 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-checkbox.mjs +16 -21
- package/fesm2022/mesgflow-ui-kit-checkbox.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-chip.mjs +2 -2
- package/fesm2022/mesgflow-ui-kit-chip.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-code-block.mjs +9 -5
- package/fesm2022/mesgflow-ui-kit-code-block.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-color-picker.mjs +6 -4
- package/fesm2022/mesgflow-ui-kit-color-picker.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-combobox.mjs +145 -65
- package/fesm2022/mesgflow-ui-kit-combobox.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-context-menu.mjs +4 -6
- package/fesm2022/mesgflow-ui-kit-context-menu.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-core.mjs +441 -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 +131 -10
- package/fesm2022/mesgflow-ui-kit-date-picker.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-dialog.mjs +117 -34
- package/fesm2022/mesgflow-ui-kit-dialog.mjs.map +1 -1
- 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 +3 -3
- package/fesm2022/mesgflow-ui-kit-dropzone.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-field.mjs +53 -12
- 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-i18n-tr.mjs +131 -0
- package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-icon.mjs +6 -1
- 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 +147 -4
- package/fesm2022/mesgflow-ui-kit-input.mjs.map +1 -1
- 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 +2 -2
- 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 +169 -5
- 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 +7 -4
- package/fesm2022/mesgflow-ui-kit-number-input.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-pagination.mjs +4 -3
- package/fesm2022/mesgflow-ui-kit-pagination.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-password-input.mjs +7 -2
- package/fesm2022/mesgflow-ui-kit-password-input.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-popover.mjs +9 -49
- package/fesm2022/mesgflow-ui-kit-popover.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-progress.mjs +162 -21
- package/fesm2022/mesgflow-ui-kit-progress.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-radio.mjs +4 -6
- package/fesm2022/mesgflow-ui-kit-radio.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-rating.mjs +2 -2
- package/fesm2022/mesgflow-ui-kit-rating.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-search-input.mjs +9 -5
- package/fesm2022/mesgflow-ui-kit-search-input.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-segmented-control.mjs +12 -8
- package/fesm2022/mesgflow-ui-kit-segmented-control.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-select.mjs +3 -2
- package/fesm2022/mesgflow-ui-kit-select.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-sidebar.mjs +16 -13
- package/fesm2022/mesgflow-ui-kit-sidebar.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-skeleton.mjs +4 -3
- package/fesm2022/mesgflow-ui-kit-skeleton.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-slider.mjs +250 -3
- 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 +42 -13
- 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 +210 -3
- package/fesm2022/mesgflow-ui-kit-splitter.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-stat-tile.mjs +11 -4
- package/fesm2022/mesgflow-ui-kit-stat-tile.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-stepper.mjs +167 -60
- package/fesm2022/mesgflow-ui-kit-stepper.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-switch.mjs +2 -2
- package/fesm2022/mesgflow-ui-kit-switch.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-table.mjs +16 -10
- package/fesm2022/mesgflow-ui-kit-table.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-tabs.mjs +410 -169
- package/fesm2022/mesgflow-ui-kit-tabs.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-tag-input.mjs +7 -2
- package/fesm2022/mesgflow-ui-kit-tag-input.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-theming.mjs +4 -4
- package/fesm2022/mesgflow-ui-kit-theming.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-time-picker.mjs +3 -3
- package/fesm2022/mesgflow-ui-kit-time-picker.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-toast.mjs +113 -30
- package/fesm2022/mesgflow-ui-kit-toast.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-toggle.mjs +3 -2
- package/fesm2022/mesgflow-ui-kit-toggle.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-toolbar.mjs +4 -2
- package/fesm2022/mesgflow-ui-kit-toolbar.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-tooltip.mjs +73 -50
- package/fesm2022/mesgflow-ui-kit-tooltip.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-tour.mjs +8 -20
- 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.mjs +1 -1
- 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 +92 -12836
- package/fesm2022/mesgflow-ui-kit.mjs.map +1 -1
- package/package.json +87 -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-core.d.ts +271 -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 +29 -6
- 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 +3 -1
- 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-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 +87 -5444
package/README.md
CHANGED
|
@@ -14,10 +14,24 @@ Tailwind v4 design token system.
|
|
|
14
14
|
|
|
15
15
|
## Install
|
|
16
16
|
|
|
17
|
+
The quickest way is the schematic — it installs the peer dependencies,
|
|
18
|
+
sets up Tailwind v4 + the kit preset in your global stylesheet, adds
|
|
19
|
+
`provideMesgflowUi()` to `app.config.ts` and the flash-free dark mode
|
|
20
|
+
script to `index.html` (every step is idempotent):
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
ng add @mesgflow/ui-kit
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Or install manually and follow the sections below:
|
|
27
|
+
|
|
17
28
|
```bash
|
|
18
29
|
npm install @mesgflow/ui-kit
|
|
19
30
|
```
|
|
20
31
|
|
|
32
|
+
Later upgrades run the kit's migrations automatically:
|
|
33
|
+
`ng update @mesgflow/ui-kit`.
|
|
34
|
+
|
|
21
35
|
Every primitive also has its own secondary entry point (same pattern as
|
|
22
36
|
`@angular/cdk`), so either of these works:
|
|
23
37
|
|
|
@@ -85,11 +99,14 @@ font imports the design still works, it just falls back to the browser's
|
|
|
85
99
|
|
|
86
100
|
### Dark mode
|
|
87
101
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
102
|
+
Every token reacts to a `.dark` class on the root element. The kit ships
|
|
103
|
+
the state for it in `@mesgflow/ui-kit/theming`: `MfColorModeService`
|
|
104
|
+
(`light` / `dark` / `system`, persisted in `localStorage`, follows the OS
|
|
105
|
+
preference live, switches with a View Transition) and `colorModeInitScript()`
|
|
106
|
+
— inline its output in `index.html`'s `<head>` so dark mode is applied
|
|
107
|
+
before Angular boots (no white flash; `ng add` does this for you).
|
|
108
|
+
`provideMfColorMode({ storageKey, defaultMode })` changes the defaults, and
|
|
109
|
+
`<mf-theme-switcher>` is a ready-made toggle.
|
|
93
110
|
|
|
94
111
|
## Internationalization
|
|
95
112
|
|
|
@@ -141,6 +158,40 @@ visitor prefers reduced transparency). See the docs site's Foundations
|
|
|
141
158
|
pages (Colors/Typography/Radius/Elevation/Motion) for a live, inspectable
|
|
142
159
|
reference.
|
|
143
160
|
|
|
161
|
+
### Design tokens as JSON (DTCG)
|
|
162
|
+
|
|
163
|
+
`@mesgflow/ui-kit/tokens.json` exports the same tokens in the W3C Design
|
|
164
|
+
Tokens format — a `primitives` set (ramps, radius, control heights, fonts,
|
|
165
|
+
type scale, durations/easings) plus `light` and `dark` role sets that alias
|
|
166
|
+
the primitives. It is Tokens Studio compatible (multi-set + `$themes`) and
|
|
167
|
+
works as a Style Dictionary source. It is generated from the CSS, so the CSS
|
|
168
|
+
stays the single source of truth.
|
|
169
|
+
|
|
170
|
+
## Icons
|
|
171
|
+
|
|
172
|
+
`<span mfIcon>search</span>` uses the Material Symbols font by default. For
|
|
173
|
+
crisp stroke icons with no font download, add the optional Lucide set — it
|
|
174
|
+
maps the Material names the kit uses (and ~170 common ones) to Lucide SVGs;
|
|
175
|
+
unmapped names fall back to the font:
|
|
176
|
+
|
|
177
|
+
```ts
|
|
178
|
+
import { provideMfLucideIcons } from '@mesgflow/ui-kit/icons-lucide';
|
|
179
|
+
|
|
180
|
+
providers: [provideMfLucideIcons({ strokeWidth: 1.75 })];
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## Blocks
|
|
184
|
+
|
|
185
|
+
`@mesgflow/ui-kit/blocks` contains ready-made compositions built from the
|
|
186
|
+
primitives, with all texts in `MfLabels`:
|
|
187
|
+
|
|
188
|
+
- `<mf-auth-card>` — sign-in card with validation, social provider slot
|
|
189
|
+
(`[mfAuthProviders]`), remember me and error state; emits `signIn`.
|
|
190
|
+
- `<mf-invite-members [roles]>` — multi-email tag input + role select; emits
|
|
191
|
+
`invite` with only valid addresses.
|
|
192
|
+
- `<mf-settings-section heading>` — the two-column settings layout with an
|
|
193
|
+
`[mfSettingsActions]` footer strip.
|
|
194
|
+
|
|
144
195
|
## Theming
|
|
145
196
|
|
|
146
197
|
`@mesgflow/ui-kit/theming` (opt-in, not re-exported from the primary barrel —
|
|
@@ -2,7 +2,7 @@ import * as i1 from '@angular/aria/accordion';
|
|
|
2
2
|
import { AccordionGroup, AccordionTrigger, AccordionPanel, AccordionContent } from '@angular/aria/accordion';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
4
|
import { Component, input, computed } from '@angular/core';
|
|
5
|
-
import { cn } from '@mesgflow/ui-kit/core';
|
|
5
|
+
import { focusRecipe, cn } from '@mesgflow/ui-kit/core';
|
|
6
6
|
import { Icon } from '@mesgflow/ui-kit/icon';
|
|
7
7
|
import { cva } from 'class-variance-authority';
|
|
8
8
|
|
|
@@ -30,7 +30,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
30
30
|
}] });
|
|
31
31
|
|
|
32
32
|
const accordionTriggerVariants = cva('flex w-full items-center justify-between gap-2 px-3 py-2.5 text-start text-sm font-medium text-fg transition-colors duration-fast ease-emphasis ' +
|
|
33
|
-
'hover:bg-
|
|
33
|
+
'hover:bg-state-hover ' +
|
|
34
|
+
focusRecipe, {
|
|
34
35
|
variants: {
|
|
35
36
|
disabled: {
|
|
36
37
|
true: 'pointer-events-none opacity-50',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mesgflow-ui-kit-accordion.mjs","sources":["../../../projects/ui-kit/accordion/accordion.ts","../../../projects/ui-kit/accordion/accordion.variants.ts","../../../projects/ui-kit/accordion/accordion-item.ts","../../../projects/ui-kit/accordion/accordion-item.html","../../../projects/ui-kit/accordion/mesgflow-ui-kit-accordion.ts"],"sourcesContent":["import { AccordionGroup as AriaAccordionGroup } from '@angular/aria/accordion';\r\nimport { Component } from '@angular/core';\r\n\r\n/**\r\n * `<mf-accordion multiExpandable><mf-accordion-item summary=\"...\">...</mf-accordion-item></mf-accordion>`\r\n *\r\n * Salt bir kapsayıcı — ARIA/klavye/genişletme-modu mantığı `@angular/aria/accordion`'ın\r\n * `AccordionGroup` pattern'inden `hostDirectives` ile ödünç alınıyor (bkz.\r\n * `tabs.ts`'teki AYNI desen). `multiExpandable`/`disabled` girdileri\r\n * `hostDirectives`'in `inputs` listesiyle dışarı açıldı.\r\n */\r\n@Component({\r\n selector: 'mf-accordion',\r\n exportAs: 'mfAccordion',\r\n hostDirectives: [{ directive: AriaAccordionGroup, inputs: ['multiExpandable', 'disabled'] }],\r\n host: { class: 'block divide-y divide-border overflow-hidden rounded-lg border border-border' },\r\n template: '<ng-content />',\r\n})\r\nexport class Accordion {}\r\n","import { cva } from 'class-variance-authority';\r\n\r\nexport const accordionTriggerVariants = cva(\r\n 'flex w-full items-center justify-between gap-2 px-3 py-2.5 text-start text-sm font-medium text-fg transition-colors duration-fast ease-emphasis ' +\r\n 'hover:bg-
|
|
1
|
+
{"version":3,"file":"mesgflow-ui-kit-accordion.mjs","sources":["../../../projects/ui-kit/accordion/accordion.ts","../../../projects/ui-kit/accordion/accordion.variants.ts","../../../projects/ui-kit/accordion/accordion-item.ts","../../../projects/ui-kit/accordion/accordion-item.html","../../../projects/ui-kit/accordion/mesgflow-ui-kit-accordion.ts"],"sourcesContent":["import { AccordionGroup as AriaAccordionGroup } from '@angular/aria/accordion';\r\nimport { Component } from '@angular/core';\r\n\r\n/**\r\n * `<mf-accordion multiExpandable><mf-accordion-item summary=\"...\">...</mf-accordion-item></mf-accordion>`\r\n *\r\n * Salt bir kapsayıcı — ARIA/klavye/genişletme-modu mantığı `@angular/aria/accordion`'ın\r\n * `AccordionGroup` pattern'inden `hostDirectives` ile ödünç alınıyor (bkz.\r\n * `tabs.ts`'teki AYNI desen). `multiExpandable`/`disabled` girdileri\r\n * `hostDirectives`'in `inputs` listesiyle dışarı açıldı.\r\n */\r\n@Component({\r\n selector: 'mf-accordion',\r\n exportAs: 'mfAccordion',\r\n hostDirectives: [{ directive: AriaAccordionGroup, inputs: ['multiExpandable', 'disabled'] }],\r\n host: { class: 'block divide-y divide-border overflow-hidden rounded-lg border border-border' },\r\n template: '<ng-content />',\r\n})\r\nexport class Accordion {}\r\n","import { focusRecipe } from '@mesgflow/ui-kit/core';\r\nimport { cva } from 'class-variance-authority';\r\n\r\nexport const accordionTriggerVariants = cva(\r\n 'flex w-full items-center justify-between gap-2 px-3 py-2.5 text-start text-sm font-medium text-fg transition-colors duration-fast ease-emphasis ' +\r\n 'hover:bg-state-hover ' +\r\n focusRecipe,\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 {\r\n AccordionContent,\r\n AccordionPanel as AriaAccordionPanel,\r\n AccordionTrigger as AriaAccordionTrigger,\r\n} from '@angular/aria/accordion';\r\nimport { Component, computed, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { accordionTriggerVariants } from './accordion.variants';\r\n\r\n/**\r\n * `<mf-accordion-item summary=\"Genel\">İçerik…</mf-accordion-item>` —\r\n * `mf-accordion` içine konur. `ngAccordionTrigger`/`ngAccordionPanel`/\r\n * `ngAccordionContent` (`@angular/aria/accordion`) doğrudan bu component'in\r\n * KENDİ template'inde kullanılıyor (`hostDirectives` DEĞİL — `Tab`'ın aksine\r\n * trigger butonu ve panel div'i İKİ AYRI DOM elemanı, tek host'a sığmıyor;\r\n * bkz. `Select`'in `cdkOverlayOrigin`/`cdkConnectedOverlay`'i kendi\r\n * template'inde birleştirme deseniyle AYNI gerekçe).\r\n *\r\n * İçerik `ngAccordionContent` sayesinde LAZY — panel ilk açılana kadar hiç\r\n * oluşturulmaz.\r\n */\r\n@Component({\r\n selector: 'mf-accordion-item',\r\n imports: [AriaAccordionTrigger, AriaAccordionPanel, AccordionContent, Icon],\r\n host: { class: 'block' },\r\n templateUrl: './accordion-item.html',\r\n})\r\nexport class AccordionItem {\r\n readonly summary = input.required<string>();\r\n readonly disabled = input(false);\r\n\r\n protected readonly triggerClasses = computed(() =>\r\n cn(accordionTriggerVariants({ disabled: this.disabled() })),\r\n );\r\n}\r\n","<h3 class=\"contents\">\r\n <button\r\n type=\"button\"\r\n ngAccordionTrigger\r\n #trigger=\"ngAccordionTrigger\"\r\n [panel]=\"panel\"\r\n [disabled]=\"disabled()\"\r\n [class]=\"triggerClasses()\"\r\n >\r\n <span class=\"truncate\">{{ summary() }}</span>\r\n <span\r\n mfIcon\r\n [size]=\"18\"\r\n class=\"shrink-0 text-fg-subtle transition-transform duration-fast\"\r\n [class.rotate-180]=\"trigger.expanded()\"\r\n >expand_more</span\r\n >\r\n </button>\r\n</h3>\r\n<!--\r\n `preserveContent` — içerik ilk açılıştan SONRA DOM'da kalıcı olur (bkz.\r\n `@angular/aria`'nın `DeferredContentAware`/`DeferredContent` çifti, panel\r\n varsayılanı: her kapanışta view `destroy()` edilir). Grid-rows geçişinin\r\n (aşağıda) animasyonu bir şeyi KISALTMASI için içeriğin hâlâ orada olması\r\n gerekiyor — hiç açılmamış bir panel yine de hiç render EDİLMEZ (lazy\r\n davranış korunuyor), sadece \"en az bir kez açılmış\" panel artık kapanışta\r\n yok edilmiyor.\r\n-->\r\n<div\r\n ngAccordionPanel\r\n #panel=\"ngAccordionPanel\"\r\n [preserveContent]=\"true\"\r\n class=\"grid transition-[grid-template-rows] duration-base ease-emphasis\"\r\n [style.grid-template-rows]=\"trigger.expanded() ? '1fr' : '0fr'\"\r\n>\r\n <div class=\"min-h-0 overflow-hidden\">\r\n <ng-template ngAccordionContent>\r\n <div class=\"px-3 pb-3 text-sm text-fg-subtle\">\r\n <ng-content />\r\n </div>\r\n </ng-template>\r\n </div>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["AriaAccordionGroup","AriaAccordionTrigger","AriaAccordionPanel"],"mappings":"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"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, output, inject, computed, Component } from '@angular/core';
|
|
3
|
+
import { MF_AGENDA_LABELS, MF_DATE_LOCALE } from '@mesgflow/ui-kit/core';
|
|
4
|
+
import { Icon } from '@mesgflow/ui-kit/icon';
|
|
5
|
+
import { startOfDay, addDays, isSameDay, format } from 'date-fns';
|
|
6
|
+
|
|
7
|
+
const BAR = {
|
|
8
|
+
neutral: 'bg-fg-subtle',
|
|
9
|
+
primary: 'bg-accent',
|
|
10
|
+
success: 'bg-success',
|
|
11
|
+
warning: 'bg-warning',
|
|
12
|
+
danger: 'bg-danger',
|
|
13
|
+
info: 'bg-info',
|
|
14
|
+
help: 'bg-help',
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* `<mf-agenda [events]="events" [days]="7" (eventClick)="open($event)" />`
|
|
18
|
+
*
|
|
19
|
+
* Günlere gruplanmış etkinlik listesi (takvim "ajanda" görünümü) — yaklaşan
|
|
20
|
+
* yayınlar, toplantılar, kampanya takvimi. Gün başlıkları "Bugün/Yarın" ya da
|
|
21
|
+
* yerel ayarlı tarih (`MF_DATE_LOCALE`); saatler yerel biçimde; boş günler
|
|
22
|
+
* `showEmptyDays` ile gösterilir. Her gün bir `<section>` + başlık, etkinlikler
|
|
23
|
+
* odaklanabilir düğmeler.
|
|
24
|
+
*/
|
|
25
|
+
class Agenda {
|
|
26
|
+
events = input.required(/* @ts-ignore */
|
|
27
|
+
...(ngDevMode ? [{ debugName: "events" }] : /* istanbul ignore next */ []));
|
|
28
|
+
/** Başlangıç günü — varsayılan bugün. */
|
|
29
|
+
from = input(new Date(), /* @ts-ignore */
|
|
30
|
+
...(ngDevMode ? [{ debugName: "from" }] : /* istanbul ignore next */ []));
|
|
31
|
+
/** Kaç gün gösterilsin. */
|
|
32
|
+
days = input(7, /* @ts-ignore */
|
|
33
|
+
...(ngDevMode ? [{ debugName: "days" }] : /* istanbul ignore next */ []));
|
|
34
|
+
/** Etkinliksiz günleri de göster. */
|
|
35
|
+
showEmptyDays = input(false, /* @ts-ignore */
|
|
36
|
+
...(ngDevMode ? [{ debugName: "showEmptyDays" }] : /* istanbul ignore next */ []));
|
|
37
|
+
eventClick = output();
|
|
38
|
+
labels = inject(MF_AGENDA_LABELS);
|
|
39
|
+
locale = inject(MF_DATE_LOCALE);
|
|
40
|
+
groups = computed(() => {
|
|
41
|
+
const start = startOfDay(this.from());
|
|
42
|
+
const today = startOfDay(new Date());
|
|
43
|
+
const l = this.labels();
|
|
44
|
+
const locale = this.locale();
|
|
45
|
+
const out = [];
|
|
46
|
+
for (let i = 0; i < this.days(); i++) {
|
|
47
|
+
const date = addDays(start, i);
|
|
48
|
+
const events = this.events()
|
|
49
|
+
.filter((e) => isSameDay(e.start, date))
|
|
50
|
+
.sort((a, b) => Number(!a.allDay) - Number(!b.allDay) || a.start.getTime() - b.start.getTime());
|
|
51
|
+
if (!events.length && !this.showEmptyDays())
|
|
52
|
+
continue;
|
|
53
|
+
const rel = isSameDay(date, today)
|
|
54
|
+
? l.today
|
|
55
|
+
: isSameDay(date, addDays(today, 1))
|
|
56
|
+
? l.tomorrow
|
|
57
|
+
: null;
|
|
58
|
+
out.push({
|
|
59
|
+
key: `mf-agenda-${format(date, 'yyyy-MM-dd')}`,
|
|
60
|
+
date,
|
|
61
|
+
label: rel ?? format(date, 'EEEE', { locale }),
|
|
62
|
+
sublabel: format(date, 'd MMMM', { locale }),
|
|
63
|
+
events,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return out;
|
|
67
|
+
}, /* @ts-ignore */
|
|
68
|
+
...(ngDevMode ? [{ debugName: "groups" }] : /* istanbul ignore next */ []));
|
|
69
|
+
bar(event) {
|
|
70
|
+
return BAR[event.tone ?? 'primary'];
|
|
71
|
+
}
|
|
72
|
+
timeText(event) {
|
|
73
|
+
if (event.allDay)
|
|
74
|
+
return this.labels().allDay;
|
|
75
|
+
const locale = this.locale();
|
|
76
|
+
const start = format(event.start, 'p', { locale });
|
|
77
|
+
return event.end ? `${start} – ${format(event.end, 'p', { locale })}` : start;
|
|
78
|
+
}
|
|
79
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Agenda, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
80
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Agenda, isStandalone: true, selector: "mf-agenda", inputs: { events: { classPropertyName: "events", publicName: "events", isSignal: true, isRequired: true, transformFunction: null }, from: { classPropertyName: "from", publicName: "from", isSignal: true, isRequired: false, transformFunction: null }, days: { classPropertyName: "days", publicName: "days", isSignal: true, isRequired: false, transformFunction: null }, showEmptyDays: { classPropertyName: "showEmptyDays", publicName: "showEmptyDays", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { eventClick: "eventClick" }, host: { classAttribute: "block" }, exportAs: ["mfAgenda"], ngImport: i0, template: `
|
|
81
|
+
@if (groups().length) {
|
|
82
|
+
<div class="flex flex-col gap-5">
|
|
83
|
+
@for (day of groups(); track day.key) {
|
|
84
|
+
<section [attr.aria-labelledby]="day.key">
|
|
85
|
+
<h3 [id]="day.key" class="mb-2 flex items-baseline gap-2">
|
|
86
|
+
<span class="font-display text-title-sm text-fg">{{ day.label }}</span>
|
|
87
|
+
<span class="text-sm text-fg-subtle">{{ day.sublabel }}</span>
|
|
88
|
+
</h3>
|
|
89
|
+
@if (day.events.length) {
|
|
90
|
+
<ul class="m-0 flex list-none flex-col gap-1.5 p-0">
|
|
91
|
+
@for (event of day.events; track event.id) {
|
|
92
|
+
<li>
|
|
93
|
+
<button
|
|
94
|
+
type="button"
|
|
95
|
+
class="flex w-full items-stretch gap-3 rounded-lg border border-hairline bg-surface p-3 text-start transition-colors duration-fast ease-emphasis hover:border-border hover:bg-state-hover focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring"
|
|
96
|
+
(click)="eventClick.emit(event)"
|
|
97
|
+
>
|
|
98
|
+
<span
|
|
99
|
+
class="w-1 shrink-0 rounded-full"
|
|
100
|
+
[class]="bar(event)"
|
|
101
|
+
aria-hidden="true"
|
|
102
|
+
></span>
|
|
103
|
+
<span class="w-24 shrink-0 text-sm text-fg-muted tabular-nums">{{
|
|
104
|
+
timeText(event)
|
|
105
|
+
}}</span>
|
|
106
|
+
<span class="min-w-0 flex-1">
|
|
107
|
+
<span class="block truncate text-sm font-medium text-fg">{{
|
|
108
|
+
event.title
|
|
109
|
+
}}</span>
|
|
110
|
+
@if (event.location) {
|
|
111
|
+
<span
|
|
112
|
+
class="mt-0.5 flex items-center gap-1 truncate text-xs text-fg-subtle"
|
|
113
|
+
>
|
|
114
|
+
<span mfIcon [size]="12">pin</span>{{ event.location }}
|
|
115
|
+
</span>
|
|
116
|
+
}
|
|
117
|
+
</span>
|
|
118
|
+
</button>
|
|
119
|
+
</li>
|
|
120
|
+
}
|
|
121
|
+
</ul>
|
|
122
|
+
} @else {
|
|
123
|
+
<p
|
|
124
|
+
class="rounded-lg border border-dashed border-border px-3 py-2.5 text-sm text-fg-subtle"
|
|
125
|
+
>
|
|
126
|
+
{{ labels().empty }}
|
|
127
|
+
</p>
|
|
128
|
+
}
|
|
129
|
+
</section>
|
|
130
|
+
}
|
|
131
|
+
</div>
|
|
132
|
+
} @else {
|
|
133
|
+
<p class="py-8 text-center text-sm text-fg-subtle">{{ labels().empty }}</p>
|
|
134
|
+
}
|
|
135
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }] });
|
|
136
|
+
}
|
|
137
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Agenda, decorators: [{
|
|
138
|
+
type: Component,
|
|
139
|
+
args: [{
|
|
140
|
+
selector: 'mf-agenda',
|
|
141
|
+
exportAs: 'mfAgenda',
|
|
142
|
+
imports: [Icon],
|
|
143
|
+
host: { class: 'block' },
|
|
144
|
+
template: `
|
|
145
|
+
@if (groups().length) {
|
|
146
|
+
<div class="flex flex-col gap-5">
|
|
147
|
+
@for (day of groups(); track day.key) {
|
|
148
|
+
<section [attr.aria-labelledby]="day.key">
|
|
149
|
+
<h3 [id]="day.key" class="mb-2 flex items-baseline gap-2">
|
|
150
|
+
<span class="font-display text-title-sm text-fg">{{ day.label }}</span>
|
|
151
|
+
<span class="text-sm text-fg-subtle">{{ day.sublabel }}</span>
|
|
152
|
+
</h3>
|
|
153
|
+
@if (day.events.length) {
|
|
154
|
+
<ul class="m-0 flex list-none flex-col gap-1.5 p-0">
|
|
155
|
+
@for (event of day.events; track event.id) {
|
|
156
|
+
<li>
|
|
157
|
+
<button
|
|
158
|
+
type="button"
|
|
159
|
+
class="flex w-full items-stretch gap-3 rounded-lg border border-hairline bg-surface p-3 text-start transition-colors duration-fast ease-emphasis hover:border-border hover:bg-state-hover focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring"
|
|
160
|
+
(click)="eventClick.emit(event)"
|
|
161
|
+
>
|
|
162
|
+
<span
|
|
163
|
+
class="w-1 shrink-0 rounded-full"
|
|
164
|
+
[class]="bar(event)"
|
|
165
|
+
aria-hidden="true"
|
|
166
|
+
></span>
|
|
167
|
+
<span class="w-24 shrink-0 text-sm text-fg-muted tabular-nums">{{
|
|
168
|
+
timeText(event)
|
|
169
|
+
}}</span>
|
|
170
|
+
<span class="min-w-0 flex-1">
|
|
171
|
+
<span class="block truncate text-sm font-medium text-fg">{{
|
|
172
|
+
event.title
|
|
173
|
+
}}</span>
|
|
174
|
+
@if (event.location) {
|
|
175
|
+
<span
|
|
176
|
+
class="mt-0.5 flex items-center gap-1 truncate text-xs text-fg-subtle"
|
|
177
|
+
>
|
|
178
|
+
<span mfIcon [size]="12">pin</span>{{ event.location }}
|
|
179
|
+
</span>
|
|
180
|
+
}
|
|
181
|
+
</span>
|
|
182
|
+
</button>
|
|
183
|
+
</li>
|
|
184
|
+
}
|
|
185
|
+
</ul>
|
|
186
|
+
} @else {
|
|
187
|
+
<p
|
|
188
|
+
class="rounded-lg border border-dashed border-border px-3 py-2.5 text-sm text-fg-subtle"
|
|
189
|
+
>
|
|
190
|
+
{{ labels().empty }}
|
|
191
|
+
</p>
|
|
192
|
+
}
|
|
193
|
+
</section>
|
|
194
|
+
}
|
|
195
|
+
</div>
|
|
196
|
+
} @else {
|
|
197
|
+
<p class="py-8 text-center text-sm text-fg-subtle">{{ labels().empty }}</p>
|
|
198
|
+
}
|
|
199
|
+
`,
|
|
200
|
+
}]
|
|
201
|
+
}], propDecorators: { events: [{ type: i0.Input, args: [{ isSignal: true, alias: "events", required: true }] }], from: [{ type: i0.Input, args: [{ isSignal: true, alias: "from", required: false }] }], days: [{ type: i0.Input, args: [{ isSignal: true, alias: "days", required: false }] }], showEmptyDays: [{ type: i0.Input, args: [{ isSignal: true, alias: "showEmptyDays", required: false }] }], eventClick: [{ type: i0.Output, args: ["eventClick"] }] } });
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Generated bundle index. Do not edit.
|
|
205
|
+
*/
|
|
206
|
+
|
|
207
|
+
export { Agenda };
|
|
208
|
+
//# sourceMappingURL=mesgflow-ui-kit-agenda.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesgflow-ui-kit-agenda.mjs","sources":["../../../projects/ui-kit/agenda/agenda.ts","../../../projects/ui-kit/agenda/mesgflow-ui-kit-agenda.ts"],"sourcesContent":["import { Component, computed, inject, input, output } from '@angular/core';\r\nimport { MF_AGENDA_LABELS, MF_DATE_LOCALE, type MfTone } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { addDays, format, isSameDay, startOfDay } from 'date-fns';\r\n\r\nexport interface AgendaEvent {\r\n id: string;\r\n title: string;\r\n start: Date;\r\n end?: Date;\r\n allDay?: boolean;\r\n location?: string;\r\n tone?: MfTone;\r\n}\r\n\r\ninterface AgendaDay {\r\n key: string;\r\n date: Date;\r\n label: string;\r\n sublabel: string;\r\n events: AgendaEvent[];\r\n}\r\n\r\nconst BAR: Record<MfTone, string> = {\r\n neutral: 'bg-fg-subtle',\r\n primary: 'bg-accent',\r\n success: 'bg-success',\r\n warning: 'bg-warning',\r\n danger: 'bg-danger',\r\n info: 'bg-info',\r\n help: 'bg-help',\r\n};\r\n\r\n/**\r\n * `<mf-agenda [events]=\"events\" [days]=\"7\" (eventClick)=\"open($event)\" />`\r\n *\r\n * Günlere gruplanmış etkinlik listesi (takvim \"ajanda\" görünümü) — yaklaşan\r\n * yayınlar, toplantılar, kampanya takvimi. Gün başlıkları \"Bugün/Yarın\" ya da\r\n * yerel ayarlı tarih (`MF_DATE_LOCALE`); saatler yerel biçimde; boş günler\r\n * `showEmptyDays` ile gösterilir. Her gün bir `<section>` + başlık, etkinlikler\r\n * odaklanabilir düğmeler.\r\n */\r\n@Component({\r\n selector: 'mf-agenda',\r\n exportAs: 'mfAgenda',\r\n imports: [Icon],\r\n host: { class: 'block' },\r\n template: `\r\n @if (groups().length) {\r\n <div class=\"flex flex-col gap-5\">\r\n @for (day of groups(); track day.key) {\r\n <section [attr.aria-labelledby]=\"day.key\">\r\n <h3 [id]=\"day.key\" class=\"mb-2 flex items-baseline gap-2\">\r\n <span class=\"font-display text-title-sm text-fg\">{{ day.label }}</span>\r\n <span class=\"text-sm text-fg-subtle\">{{ day.sublabel }}</span>\r\n </h3>\r\n @if (day.events.length) {\r\n <ul class=\"m-0 flex list-none flex-col gap-1.5 p-0\">\r\n @for (event of day.events; track event.id) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n class=\"flex w-full items-stretch gap-3 rounded-lg border border-hairline bg-surface p-3 text-start transition-colors duration-fast ease-emphasis hover:border-border hover:bg-state-hover focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\"\r\n (click)=\"eventClick.emit(event)\"\r\n >\r\n <span\r\n class=\"w-1 shrink-0 rounded-full\"\r\n [class]=\"bar(event)\"\r\n aria-hidden=\"true\"\r\n ></span>\r\n <span class=\"w-24 shrink-0 text-sm text-fg-muted tabular-nums\">{{\r\n timeText(event)\r\n }}</span>\r\n <span class=\"min-w-0 flex-1\">\r\n <span class=\"block truncate text-sm font-medium text-fg\">{{\r\n event.title\r\n }}</span>\r\n @if (event.location) {\r\n <span\r\n class=\"mt-0.5 flex items-center gap-1 truncate text-xs text-fg-subtle\"\r\n >\r\n <span mfIcon [size]=\"12\">pin</span>{{ event.location }}\r\n </span>\r\n }\r\n </span>\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n } @else {\r\n <p\r\n class=\"rounded-lg border border-dashed border-border px-3 py-2.5 text-sm text-fg-subtle\"\r\n >\r\n {{ labels().empty }}\r\n </p>\r\n }\r\n </section>\r\n }\r\n </div>\r\n } @else {\r\n <p class=\"py-8 text-center text-sm text-fg-subtle\">{{ labels().empty }}</p>\r\n }\r\n `,\r\n})\r\nexport class Agenda {\r\n readonly events = input.required<AgendaEvent[]>();\r\n /** Başlangıç günü — varsayılan bugün. */\r\n readonly from = input<Date>(new Date());\r\n /** Kaç gün gösterilsin. */\r\n readonly days = input(7);\r\n /** Etkinliksiz günleri de göster. */\r\n readonly showEmptyDays = input(false);\r\n\r\n readonly eventClick = output<AgendaEvent>();\r\n\r\n protected readonly labels = inject(MF_AGENDA_LABELS);\r\n private readonly locale = inject(MF_DATE_LOCALE);\r\n\r\n protected readonly groups = computed<AgendaDay[]>(() => {\r\n const start = startOfDay(this.from());\r\n const today = startOfDay(new Date());\r\n const l = this.labels();\r\n const locale = this.locale();\r\n const out: AgendaDay[] = [];\r\n for (let i = 0; i < this.days(); i++) {\r\n const date = addDays(start, i);\r\n const events = this.events()\r\n .filter((e) => isSameDay(e.start, date))\r\n .sort(\r\n (a, b) => Number(!a.allDay) - Number(!b.allDay) || a.start.getTime() - b.start.getTime(),\r\n );\r\n if (!events.length && !this.showEmptyDays()) continue;\r\n const rel = isSameDay(date, today)\r\n ? l.today\r\n : isSameDay(date, addDays(today, 1))\r\n ? l.tomorrow\r\n : null;\r\n out.push({\r\n key: `mf-agenda-${format(date, 'yyyy-MM-dd')}`,\r\n date,\r\n label: rel ?? format(date, 'EEEE', { locale }),\r\n sublabel: format(date, 'd MMMM', { locale }),\r\n events,\r\n });\r\n }\r\n return out;\r\n });\r\n\r\n protected bar(event: AgendaEvent): string {\r\n return BAR[event.tone ?? 'primary'];\r\n }\r\n\r\n protected timeText(event: AgendaEvent): string {\r\n if (event.allDay) return this.labels().allDay;\r\n const locale = this.locale();\r\n const start = format(event.start, 'p', { locale });\r\n return event.end ? `${start} – ${format(event.end, 'p', { locale })}` : start;\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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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, computed, Directive } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* `<div [mfAspectRatio]="16 / 9"><img src="…" alt="…" /></div>`
|
|
6
|
+
*
|
|
7
|
+
* Kutuyu sabit en-boy oranında tutar (native `aspect-ratio`); içindeki
|
|
8
|
+
* görsel/video kutuyu kaplar (`object-fit: cover`). Yüklenme sırasında
|
|
9
|
+
* düzen kaymasını (CLS) önler. `rounded` ile köşe yarıçapı token'ı.
|
|
10
|
+
*/
|
|
11
|
+
class AspectRatio {
|
|
12
|
+
/** Genişlik / yükseklik — `16 / 9`, `1`, `4 / 3`. */
|
|
13
|
+
mfAspectRatio = input(1, /* @ts-ignore */
|
|
14
|
+
...(ngDevMode ? [{ debugName: "mfAspectRatio" }] : /* istanbul ignore next */ []));
|
|
15
|
+
ratio = computed(() => String(this.mfAspectRatio() || 1), /* @ts-ignore */
|
|
16
|
+
...(ngDevMode ? [{ debugName: "ratio" }] : /* istanbul ignore next */ []));
|
|
17
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AspectRatio, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
18
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: AspectRatio, isStandalone: true, selector: "[mfAspectRatio]", inputs: { mfAspectRatio: { classPropertyName: "mfAspectRatio", publicName: "mfAspectRatio", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.aspect-ratio": "ratio()" }, classAttribute: "relative block overflow-hidden bg-surface-sunken [&>img]:absolute [&>img]:inset-0 [&>img]:h-full [&>img]:w-full [&>img]:object-cover [&>video]:absolute [&>video]:inset-0 [&>video]:h-full [&>video]:w-full [&>video]:object-cover [&>iframe]:absolute [&>iframe]:inset-0 [&>iframe]:h-full [&>iframe]:w-full" }, exportAs: ["mfAspectRatio"], ngImport: i0 });
|
|
19
|
+
}
|
|
20
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AspectRatio, decorators: [{
|
|
21
|
+
type: Directive,
|
|
22
|
+
args: [{
|
|
23
|
+
selector: '[mfAspectRatio]',
|
|
24
|
+
exportAs: 'mfAspectRatio',
|
|
25
|
+
host: {
|
|
26
|
+
'[style.aspect-ratio]': 'ratio()',
|
|
27
|
+
class: 'relative block overflow-hidden bg-surface-sunken [&>img]:absolute [&>img]:inset-0 [&>img]:h-full [&>img]:w-full [&>img]:object-cover [&>video]:absolute [&>video]:inset-0 [&>video]:h-full [&>video]:w-full [&>video]:object-cover [&>iframe]:absolute [&>iframe]:inset-0 [&>iframe]:h-full [&>iframe]:w-full',
|
|
28
|
+
},
|
|
29
|
+
}]
|
|
30
|
+
}], propDecorators: { mfAspectRatio: [{ type: i0.Input, args: [{ isSignal: true, alias: "mfAspectRatio", required: false }] }] } });
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Generated bundle index. Do not edit.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
export { AspectRatio };
|
|
37
|
+
//# sourceMappingURL=mesgflow-ui-kit-aspect-ratio.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesgflow-ui-kit-aspect-ratio.mjs","sources":["../../../projects/ui-kit/aspect-ratio/aspect-ratio.ts","../../../projects/ui-kit/aspect-ratio/mesgflow-ui-kit-aspect-ratio.ts"],"sourcesContent":["import { Directive, computed, input } from '@angular/core';\r\n\r\n/**\r\n * `<div [mfAspectRatio]=\"16 / 9\"><img src=\"…\" alt=\"…\" /></div>`\r\n *\r\n * Kutuyu sabit en-boy oranında tutar (native `aspect-ratio`); içindeki\r\n * görsel/video kutuyu kaplar (`object-fit: cover`). Yüklenme sırasında\r\n * düzen kaymasını (CLS) önler. `rounded` ile köşe yarıçapı token'ı.\r\n */\r\n@Directive({\r\n selector: '[mfAspectRatio]',\r\n exportAs: 'mfAspectRatio',\r\n host: {\r\n '[style.aspect-ratio]': 'ratio()',\r\n class:\r\n 'relative block overflow-hidden bg-surface-sunken [&>img]:absolute [&>img]:inset-0 [&>img]:h-full [&>img]:w-full [&>img]:object-cover [&>video]:absolute [&>video]:inset-0 [&>video]:h-full [&>video]:w-full [&>video]:object-cover [&>iframe]:absolute [&>iframe]:inset-0 [&>iframe]:h-full [&>iframe]:w-full',\r\n },\r\n})\r\nexport class AspectRatio {\r\n /** Genişlik / yükseklik — `16 / 9`, `1`, `4 / 3`. */\r\n readonly mfAspectRatio = input<number>(1);\r\n protected readonly ratio = computed(() => String(this.mfAspectRatio() || 1));\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAEA;;;;;;AAMG;MAUU,WAAW,CAAA;;IAEb,aAAa,GAAG,KAAK,CAAS,CAAC;sFAAC;AACtB,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;8EAAC;uGAHjE,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAX,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,SAAA,EAAA,EAAA,cAAA,EAAA,+SAAA,EAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAX,WAAW,EAAA,UAAA,EAAA,CAAA;kBATvB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,IAAI,EAAE;AACJ,wBAAA,sBAAsB,EAAE,SAAS;AACjC,wBAAA,KAAK,EACH,+SAA+S;AAClT,qBAAA;AACF,iBAAA;;;ACjBD;;AAEG;;"}
|