@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.
Files changed (199) hide show
  1. package/README.md +56 -5
  2. package/fesm2022/mesgflow-ui-kit-accordion.mjs +3 -2
  3. package/fesm2022/mesgflow-ui-kit-accordion.mjs.map +1 -1
  4. package/fesm2022/mesgflow-ui-kit-agenda.mjs +208 -0
  5. package/fesm2022/mesgflow-ui-kit-agenda.mjs.map +1 -0
  6. package/fesm2022/mesgflow-ui-kit-aspect-ratio.mjs +37 -0
  7. package/fesm2022/mesgflow-ui-kit-aspect-ratio.mjs.map +1 -0
  8. package/fesm2022/mesgflow-ui-kit-blocks.mjs +207 -0
  9. package/fesm2022/mesgflow-ui-kit-blocks.mjs.map +1 -0
  10. package/fesm2022/mesgflow-ui-kit-box-input.mjs +2 -2
  11. package/fesm2022/mesgflow-ui-kit-box-input.mjs.map +1 -1
  12. package/fesm2022/mesgflow-ui-kit-button.mjs +188 -242
  13. package/fesm2022/mesgflow-ui-kit-button.mjs.map +1 -1
  14. package/fesm2022/mesgflow-ui-kit-card.mjs +37 -16
  15. package/fesm2022/mesgflow-ui-kit-card.mjs.map +1 -1
  16. package/fesm2022/mesgflow-ui-kit-carousel.mjs +308 -0
  17. package/fesm2022/mesgflow-ui-kit-carousel.mjs.map +1 -0
  18. package/fesm2022/mesgflow-ui-kit-checkbox.mjs +16 -21
  19. package/fesm2022/mesgflow-ui-kit-checkbox.mjs.map +1 -1
  20. package/fesm2022/mesgflow-ui-kit-chip.mjs +2 -2
  21. package/fesm2022/mesgflow-ui-kit-chip.mjs.map +1 -1
  22. package/fesm2022/mesgflow-ui-kit-code-block.mjs +9 -5
  23. package/fesm2022/mesgflow-ui-kit-code-block.mjs.map +1 -1
  24. package/fesm2022/mesgflow-ui-kit-color-picker.mjs +6 -4
  25. package/fesm2022/mesgflow-ui-kit-color-picker.mjs.map +1 -1
  26. package/fesm2022/mesgflow-ui-kit-combobox.mjs +145 -65
  27. package/fesm2022/mesgflow-ui-kit-combobox.mjs.map +1 -1
  28. package/fesm2022/mesgflow-ui-kit-context-menu.mjs +4 -6
  29. package/fesm2022/mesgflow-ui-kit-context-menu.mjs.map +1 -1
  30. package/fesm2022/mesgflow-ui-kit-core.mjs +441 -128
  31. package/fesm2022/mesgflow-ui-kit-core.mjs.map +1 -1
  32. package/fesm2022/mesgflow-ui-kit-countdown.mjs +149 -0
  33. package/fesm2022/mesgflow-ui-kit-countdown.mjs.map +1 -0
  34. package/fesm2022/mesgflow-ui-kit-date-picker.mjs +131 -10
  35. package/fesm2022/mesgflow-ui-kit-date-picker.mjs.map +1 -1
  36. package/fesm2022/mesgflow-ui-kit-dialog.mjs +117 -34
  37. package/fesm2022/mesgflow-ui-kit-dialog.mjs.map +1 -1
  38. package/fesm2022/mesgflow-ui-kit-drawer.mjs +109 -0
  39. package/fesm2022/mesgflow-ui-kit-drawer.mjs.map +1 -0
  40. package/fesm2022/mesgflow-ui-kit-dropzone.mjs +3 -3
  41. package/fesm2022/mesgflow-ui-kit-dropzone.mjs.map +1 -1
  42. package/fesm2022/mesgflow-ui-kit-field.mjs +53 -12
  43. package/fesm2022/mesgflow-ui-kit-field.mjs.map +1 -1
  44. package/fesm2022/mesgflow-ui-kit-file-upload.mjs +356 -0
  45. package/fesm2022/mesgflow-ui-kit-file-upload.mjs.map +1 -0
  46. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs +131 -0
  47. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs.map +1 -1
  48. package/fesm2022/mesgflow-ui-kit-icon.mjs +6 -1
  49. package/fesm2022/mesgflow-ui-kit-icon.mjs.map +1 -1
  50. package/fesm2022/mesgflow-ui-kit-icons-lucide.mjs +371 -0
  51. package/fesm2022/mesgflow-ui-kit-icons-lucide.mjs.map +1 -0
  52. package/fesm2022/mesgflow-ui-kit-inline-edit.mjs +279 -0
  53. package/fesm2022/mesgflow-ui-kit-inline-edit.mjs.map +1 -0
  54. package/fesm2022/mesgflow-ui-kit-input.mjs +147 -4
  55. package/fesm2022/mesgflow-ui-kit-input.mjs.map +1 -1
  56. package/fesm2022/mesgflow-ui-kit-lightbox.mjs +299 -0
  57. package/fesm2022/mesgflow-ui-kit-lightbox.mjs.map +1 -0
  58. package/fesm2022/mesgflow-ui-kit-link.mjs +2 -2
  59. package/fesm2022/mesgflow-ui-kit-link.mjs.map +1 -1
  60. package/fesm2022/mesgflow-ui-kit-listbox.mjs +151 -0
  61. package/fesm2022/mesgflow-ui-kit-listbox.mjs.map +1 -0
  62. package/fesm2022/mesgflow-ui-kit-mention.mjs +283 -0
  63. package/fesm2022/mesgflow-ui-kit-mention.mjs.map +1 -0
  64. package/fesm2022/mesgflow-ui-kit-menu.mjs +169 -5
  65. package/fesm2022/mesgflow-ui-kit-menu.mjs.map +1 -1
  66. package/fesm2022/mesgflow-ui-kit-nav-menu.mjs +276 -0
  67. package/fesm2022/mesgflow-ui-kit-nav-menu.mjs.map +1 -0
  68. package/fesm2022/mesgflow-ui-kit-notification-center.mjs +281 -0
  69. package/fesm2022/mesgflow-ui-kit-notification-center.mjs.map +1 -0
  70. package/fesm2022/mesgflow-ui-kit-number-input.mjs +7 -4
  71. package/fesm2022/mesgflow-ui-kit-number-input.mjs.map +1 -1
  72. package/fesm2022/mesgflow-ui-kit-pagination.mjs +4 -3
  73. package/fesm2022/mesgflow-ui-kit-pagination.mjs.map +1 -1
  74. package/fesm2022/mesgflow-ui-kit-password-input.mjs +7 -2
  75. package/fesm2022/mesgflow-ui-kit-password-input.mjs.map +1 -1
  76. package/fesm2022/mesgflow-ui-kit-popover.mjs +9 -49
  77. package/fesm2022/mesgflow-ui-kit-popover.mjs.map +1 -1
  78. package/fesm2022/mesgflow-ui-kit-progress.mjs +162 -21
  79. package/fesm2022/mesgflow-ui-kit-progress.mjs.map +1 -1
  80. package/fesm2022/mesgflow-ui-kit-radio.mjs +4 -6
  81. package/fesm2022/mesgflow-ui-kit-radio.mjs.map +1 -1
  82. package/fesm2022/mesgflow-ui-kit-rating.mjs +2 -2
  83. package/fesm2022/mesgflow-ui-kit-rating.mjs.map +1 -1
  84. package/fesm2022/mesgflow-ui-kit-search-input.mjs +9 -5
  85. package/fesm2022/mesgflow-ui-kit-search-input.mjs.map +1 -1
  86. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs +12 -8
  87. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs.map +1 -1
  88. package/fesm2022/mesgflow-ui-kit-select.mjs +3 -2
  89. package/fesm2022/mesgflow-ui-kit-select.mjs.map +1 -1
  90. package/fesm2022/mesgflow-ui-kit-sidebar.mjs +16 -13
  91. package/fesm2022/mesgflow-ui-kit-sidebar.mjs.map +1 -1
  92. package/fesm2022/mesgflow-ui-kit-skeleton.mjs +4 -3
  93. package/fesm2022/mesgflow-ui-kit-skeleton.mjs.map +1 -1
  94. package/fesm2022/mesgflow-ui-kit-slider.mjs +250 -3
  95. package/fesm2022/mesgflow-ui-kit-slider.mjs.map +1 -1
  96. package/fesm2022/mesgflow-ui-kit-sortable.mjs +526 -0
  97. package/fesm2022/mesgflow-ui-kit-sortable.mjs.map +1 -0
  98. package/fesm2022/mesgflow-ui-kit-spinner.mjs +42 -13
  99. package/fesm2022/mesgflow-ui-kit-spinner.mjs.map +1 -1
  100. package/fesm2022/mesgflow-ui-kit-split-button.mjs +205 -0
  101. package/fesm2022/mesgflow-ui-kit-split-button.mjs.map +1 -0
  102. package/fesm2022/mesgflow-ui-kit-splitter.mjs +210 -3
  103. package/fesm2022/mesgflow-ui-kit-splitter.mjs.map +1 -1
  104. package/fesm2022/mesgflow-ui-kit-stat-tile.mjs +11 -4
  105. package/fesm2022/mesgflow-ui-kit-stat-tile.mjs.map +1 -1
  106. package/fesm2022/mesgflow-ui-kit-stepper.mjs +167 -60
  107. package/fesm2022/mesgflow-ui-kit-stepper.mjs.map +1 -1
  108. package/fesm2022/mesgflow-ui-kit-switch.mjs +2 -2
  109. package/fesm2022/mesgflow-ui-kit-switch.mjs.map +1 -1
  110. package/fesm2022/mesgflow-ui-kit-table.mjs +16 -10
  111. package/fesm2022/mesgflow-ui-kit-table.mjs.map +1 -1
  112. package/fesm2022/mesgflow-ui-kit-tabs.mjs +410 -169
  113. package/fesm2022/mesgflow-ui-kit-tabs.mjs.map +1 -1
  114. package/fesm2022/mesgflow-ui-kit-tag-input.mjs +7 -2
  115. package/fesm2022/mesgflow-ui-kit-tag-input.mjs.map +1 -1
  116. package/fesm2022/mesgflow-ui-kit-theming.mjs +4 -4
  117. package/fesm2022/mesgflow-ui-kit-theming.mjs.map +1 -1
  118. package/fesm2022/mesgflow-ui-kit-time-picker.mjs +3 -3
  119. package/fesm2022/mesgflow-ui-kit-time-picker.mjs.map +1 -1
  120. package/fesm2022/mesgflow-ui-kit-toast.mjs +113 -30
  121. package/fesm2022/mesgflow-ui-kit-toast.mjs.map +1 -1
  122. package/fesm2022/mesgflow-ui-kit-toggle.mjs +3 -2
  123. package/fesm2022/mesgflow-ui-kit-toggle.mjs.map +1 -1
  124. package/fesm2022/mesgflow-ui-kit-toolbar.mjs +4 -2
  125. package/fesm2022/mesgflow-ui-kit-toolbar.mjs.map +1 -1
  126. package/fesm2022/mesgflow-ui-kit-tooltip.mjs +73 -50
  127. package/fesm2022/mesgflow-ui-kit-tooltip.mjs.map +1 -1
  128. package/fesm2022/mesgflow-ui-kit-tour.mjs +8 -20
  129. package/fesm2022/mesgflow-ui-kit-tour.mjs.map +1 -1
  130. package/fesm2022/mesgflow-ui-kit-transfer-list.mjs +288 -0
  131. package/fesm2022/mesgflow-ui-kit-transfer-list.mjs.map +1 -0
  132. package/fesm2022/mesgflow-ui-kit-tree.mjs +1 -1
  133. package/fesm2022/mesgflow-ui-kit-tree.mjs.map +1 -1
  134. package/fesm2022/mesgflow-ui-kit-virtual-list.mjs +109 -0
  135. package/fesm2022/mesgflow-ui-kit-virtual-list.mjs.map +1 -0
  136. package/fesm2022/mesgflow-ui-kit.mjs +92 -12836
  137. package/fesm2022/mesgflow-ui-kit.mjs.map +1 -1
  138. package/package.json +87 -3
  139. package/schematics/collection.json +10 -0
  140. package/schematics/migration.json +10 -0
  141. package/schematics/migrations/v0-7.cjs +70 -0
  142. package/schematics/ng-add/index.cjs +234 -0
  143. package/schematics/ng-add/schema.json +43 -0
  144. package/tokens/color.css +96 -0
  145. package/tokens/controls.css +145 -0
  146. package/tokens/elevation.css +62 -6
  147. package/tokens/motion.css +304 -66
  148. package/tokens/radius.css +14 -0
  149. package/tokens.css +1 -0
  150. package/tokens.json +1583 -0
  151. package/types/mesgflow-ui-kit-agenda.d.ts +49 -0
  152. package/types/mesgflow-ui-kit-aspect-ratio.d.ts +18 -0
  153. package/types/mesgflow-ui-kit-blocks.d.ts +128 -0
  154. package/types/mesgflow-ui-kit-button.d.ts +23 -38
  155. package/types/mesgflow-ui-kit-card.d.ts +26 -16
  156. package/types/mesgflow-ui-kit-carousel.d.ts +51 -0
  157. package/types/mesgflow-ui-kit-checkbox.d.ts +8 -5
  158. package/types/mesgflow-ui-kit-code-block.d.ts +4 -1
  159. package/types/mesgflow-ui-kit-combobox.d.ts +47 -22
  160. package/types/mesgflow-ui-kit-core.d.ts +271 -21
  161. package/types/mesgflow-ui-kit-countdown.d.ts +47 -0
  162. package/types/mesgflow-ui-kit-date-picker.d.ts +31 -1
  163. package/types/mesgflow-ui-kit-dialog.d.ts +29 -6
  164. package/types/mesgflow-ui-kit-drawer.d.ts +45 -0
  165. package/types/mesgflow-ui-kit-field.d.ts +17 -8
  166. package/types/mesgflow-ui-kit-file-upload.d.ts +64 -0
  167. package/types/mesgflow-ui-kit-hover-card.d.ts +2 -2
  168. package/types/mesgflow-ui-kit-icons-lucide.d.ts +27 -0
  169. package/types/mesgflow-ui-kit-inline-edit.d.ts +42 -0
  170. package/types/mesgflow-ui-kit-input.d.ts +64 -2
  171. package/types/mesgflow-ui-kit-lightbox.d.ts +54 -0
  172. package/types/mesgflow-ui-kit-listbox.d.ts +30 -0
  173. package/types/mesgflow-ui-kit-mention.d.ts +59 -0
  174. package/types/mesgflow-ui-kit-menu.d.ts +41 -2
  175. package/types/mesgflow-ui-kit-nav-menu.d.ts +58 -0
  176. package/types/mesgflow-ui-kit-notification-center.d.ts +41 -0
  177. package/types/mesgflow-ui-kit-number-input.d.ts +3 -1
  178. package/types/mesgflow-ui-kit-password-input.d.ts +3 -1
  179. package/types/mesgflow-ui-kit-popover.d.ts +13 -5
  180. package/types/mesgflow-ui-kit-progress.d.ts +33 -12
  181. package/types/mesgflow-ui-kit-radio.d.ts +2 -2
  182. package/types/mesgflow-ui-kit-search-input.d.ts +3 -1
  183. package/types/mesgflow-ui-kit-segmented-control.d.ts +4 -0
  184. package/types/mesgflow-ui-kit-sidebar.d.ts +1 -1
  185. package/types/mesgflow-ui-kit-slider.d.ts +60 -1
  186. package/types/mesgflow-ui-kit-sortable.d.ts +103 -0
  187. package/types/mesgflow-ui-kit-spinner.d.ts +5 -8
  188. package/types/mesgflow-ui-kit-split-button.d.ts +47 -0
  189. package/types/mesgflow-ui-kit-splitter.d.ts +64 -1
  190. package/types/mesgflow-ui-kit-stat-tile.d.ts +3 -0
  191. package/types/mesgflow-ui-kit-stepper.d.ts +54 -32
  192. package/types/mesgflow-ui-kit-table.d.ts +2 -0
  193. package/types/mesgflow-ui-kit-tabs.d.ts +193 -93
  194. package/types/mesgflow-ui-kit-tag-input.d.ts +3 -1
  195. package/types/mesgflow-ui-kit-toast.d.ts +48 -22
  196. package/types/mesgflow-ui-kit-tooltip.d.ts +15 -12
  197. package/types/mesgflow-ui-kit-transfer-list.d.ts +34 -0
  198. package/types/mesgflow-ui-kit-virtual-list.d.ts +35 -0
  199. 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
- Toggling a `.dark` class on the root element (`<html>` or similar) is your
89
- app's responsibility — every token reacts to it, but the kit ships no theme
90
- state (localStorage, `prefers-color-scheme` detection, a toggle component,
91
- etc.). See the docs site's own shell (`shell/theme.service.ts` in this
92
- repo) for a reference implementation.
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-surface-alt focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring', {
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-surface-alt focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 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 {\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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"}
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;;"}