fluentui-svelte 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 (243) hide show
  1. package/dist/components/app-surface/app-surface.svelte +96 -0
  2. package/dist/components/app-surface/app-surface.svelte.d.ts +22 -0
  3. package/dist/components/app-surface/docs/llms.md +73 -0
  4. package/dist/components/app-surface/types.d.ts +19 -0
  5. package/dist/components/app-surface/types.js +1 -0
  6. package/dist/components/app-window/app-window.d.ts +3 -0
  7. package/dist/components/app-window/app-window.js +3 -0
  8. package/dist/components/app-window/app-window.svelte +193 -0
  9. package/dist/components/app-window/app-window.svelte.d.ts +25 -0
  10. package/dist/components/app-window/docs/llms.md +119 -0
  11. package/dist/components/app-window/types.d.ts +66 -0
  12. package/dist/components/app-window/types.js +1 -0
  13. package/dist/components/auto-suggest-box/auto-suggest-box.svelte +47 -31
  14. package/dist/components/auto-suggest-box/auto-suggest-box.svelte.d.ts +2 -2
  15. package/dist/components/auto-suggest-box/docs/llms.md +34 -33
  16. package/dist/components/auto-suggest-box/option.svelte +6 -4
  17. package/dist/components/auto-suggest-box/types.d.ts +13 -16
  18. package/dist/components/avatar/avatar.svelte +4 -3
  19. package/dist/components/avatar/docs/llms.md +1 -1
  20. package/dist/components/avatar/type.d.ts +1 -1
  21. package/dist/components/badge/badge-icon.svelte +2 -2
  22. package/dist/components/badge/badge.svelte +2 -2
  23. package/dist/components/badge/docs/llms.md +2 -2
  24. package/dist/components/badge/types.d.ts +2 -2
  25. package/dist/components/breadcrumb/breadcrumb-button.svelte +2 -2
  26. package/dist/components/breadcrumb/breadcrumb-divider.svelte +2 -2
  27. package/dist/components/breadcrumb/breadcrumb-item.svelte +2 -2
  28. package/dist/components/breadcrumb/breadcrumb.svelte +10 -5
  29. package/dist/components/breadcrumb/docs/llms.md +11 -11
  30. package/dist/components/breadcrumb/types.d.ts +7 -7
  31. package/dist/components/button/button.svelte +2 -2
  32. package/dist/components/button/docs/llms.md +17 -17
  33. package/dist/components/button/split-button.svelte +7 -7
  34. package/dist/components/button/types.d.ts +5 -5
  35. package/dist/components/calendar-date-picker/calendar-date-picker.svelte +98 -10
  36. package/dist/components/calendar-date-picker/calendar-date-picker.svelte.d.ts +1 -1
  37. package/dist/components/calendar-date-picker/docs/llms.md +19 -14
  38. package/dist/components/calendar-date-picker/types.d.ts +22 -8
  39. package/dist/components/calendar-view/calendar-view-days.svelte +3 -2
  40. package/dist/components/calendar-view/calendar-view-grid.js +8 -3
  41. package/dist/components/calendar-view/calendar-view-item.svelte +10 -4
  42. package/dist/components/calendar-view/calendar-view-months.svelte +3 -2
  43. package/dist/components/calendar-view/calendar-view-years.svelte +3 -2
  44. package/dist/components/calendar-view/calendar-view.svelte +11 -4
  45. package/dist/components/calendar-view/calendar-view.svelte.js +5 -0
  46. package/dist/components/calendar-view/docs/llms.md +20 -19
  47. package/dist/components/calendar-view/types.d.ts +6 -1
  48. package/dist/components/card/card-footer.svelte +2 -2
  49. package/dist/components/card/card-header.svelte +5 -4
  50. package/dist/components/card/card-preview.svelte +13 -2
  51. package/dist/components/card/card.svelte +5 -5
  52. package/dist/components/card/docs/llms.md +22 -21
  53. package/dist/components/card/types.d.ts +8 -4
  54. package/dist/components/checkbox/checkbox.svelte +47 -26
  55. package/dist/components/checkbox/checkbox.svelte.d.ts +3 -24
  56. package/dist/components/checkbox/docs/llms.md +24 -23
  57. package/dist/components/checkbox/types.d.ts +10 -23
  58. package/dist/components/date-picker/date-picker.svelte +98 -27
  59. package/dist/components/date-picker/date-picker.svelte.d.ts +1 -1
  60. package/dist/components/date-picker/docs/llms.md +23 -20
  61. package/dist/components/date-picker/types.d.ts +24 -15
  62. package/dist/components/dialog/dialog-actions.svelte +2 -2
  63. package/dist/components/dialog/dialog-content.svelte +2 -2
  64. package/dist/components/dialog/dialog-surface.svelte +102 -9
  65. package/dist/components/dialog/dialog-title.svelte +2 -2
  66. package/dist/components/dialog/dialog-trigger.svelte +2 -2
  67. package/dist/components/dialog/dialog.svelte +22 -11
  68. package/dist/components/dialog/docs/llms.md +56 -19
  69. package/dist/components/dialog/types.d.ts +25 -7
  70. package/dist/components/divider/divider.svelte +6 -4
  71. package/dist/components/divider/types.d.ts +1 -1
  72. package/dist/components/dropdown/docs/llms.md +30 -28
  73. package/dist/components/dropdown/dropdown-option.svelte +17 -5
  74. package/dist/components/dropdown/dropdown.svelte +182 -84
  75. package/dist/components/dropdown/dropdown.svelte.d.ts +1 -1
  76. package/dist/components/dropdown/types.d.ts +26 -20
  77. package/dist/components/dropdown-select/docs/llms.md +24 -22
  78. package/dist/components/dropdown-select/dropdown-select-option.svelte +2 -2
  79. package/dist/components/dropdown-select/dropdown-select.svelte +42 -7
  80. package/dist/components/dropdown-select/types.d.ts +4 -4
  81. package/dist/components/expander/docs/llms.md +3 -3
  82. package/dist/components/expander/expander.svelte +13 -8
  83. package/dist/components/expander/types.d.ts +5 -5
  84. package/dist/components/flyout/docs/llms.md +1 -1
  85. package/dist/components/flyout/flyout.svelte +17 -6
  86. package/dist/components/flyout/types.d.ts +1 -1
  87. package/dist/components/hyperlink/docs/llms.md +6 -6
  88. package/dist/components/hyperlink/hyperlink.svelte +13 -4
  89. package/dist/components/hyperlink/types.d.ts +1 -1
  90. package/dist/components/info-bar/docs/llms.md +11 -10
  91. package/dist/components/info-bar/info-bar.svelte +3 -2
  92. package/dist/components/info-bar/types.d.ts +4 -0
  93. package/dist/components/label/docs/llms.md +75 -22
  94. package/dist/components/label/label-context.d.ts +14 -0
  95. package/dist/components/label/label-context.js +10 -0
  96. package/dist/components/label/label.svelte +153 -30
  97. package/dist/components/label/label.svelte.d.ts +1 -1
  98. package/dist/components/label/types.d.ts +48 -4
  99. package/dist/components/list-view/docs/llms.md +103 -33
  100. package/dist/components/list-view/list-view-item-branch.svelte +257 -0
  101. package/dist/components/list-view/list-view-item-branch.svelte.d.ts +4 -0
  102. package/dist/components/list-view/list-view-item.svelte +164 -46
  103. package/dist/components/list-view/list-view-item.svelte.d.ts +5 -5
  104. package/dist/components/list-view/list-view.svelte +73 -25
  105. package/dist/components/list-view/types.d.ts +71 -8
  106. package/dist/components/list-view/utils.d.ts +10 -0
  107. package/dist/components/list-view/utils.js +17 -1
  108. package/dist/components/menu/docs/llms.md +98 -15
  109. package/dist/components/menu/menu-command-bar-item.svelte +61 -0
  110. package/dist/components/menu/menu-command-bar-item.svelte.d.ts +14 -0
  111. package/dist/components/menu/menu-command-bar.svelte +218 -0
  112. package/dist/components/menu/menu-command-bar.svelte.d.ts +21 -0
  113. package/dist/components/menu/menu-group.svelte +6 -3
  114. package/dist/components/menu/menu-item-checkbox.svelte +5 -4
  115. package/dist/components/menu/menu-item-radio.svelte +5 -4
  116. package/dist/components/menu/menu-item-switch.svelte +5 -4
  117. package/dist/components/menu/menu-item.svelte +5 -5
  118. package/dist/components/menu/menu-item.svelte.d.ts +2 -3
  119. package/dist/components/menu/menu-list.svelte +10 -1
  120. package/dist/components/menu/menu-popover.svelte +9 -5
  121. package/dist/components/menu/menu-trigger.svelte +2 -1
  122. package/dist/components/menu/menu.svelte.js +1 -0
  123. package/dist/components/menu/types.d.ts +62 -7
  124. package/dist/components/number-box/docs/llms.md +6 -4
  125. package/dist/components/number-box/number-box.svelte +35 -29
  126. package/dist/components/number-box/number-box.svelte.d.ts +1 -1
  127. package/dist/components/number-box/types.d.ts +1 -1
  128. package/dist/components/persona/docs/llms.md +29 -25
  129. package/dist/components/persona/persona.svelte +8 -6
  130. package/dist/components/persona/types.d.ts +4 -3
  131. package/dist/components/progress-bar/docs/llms.md +13 -13
  132. package/dist/components/progress-bar/progress-bar.svelte +6 -6
  133. package/dist/components/progress-bar/types.d.ts +4 -4
  134. package/dist/components/progress-ring/docs/llms.md +14 -14
  135. package/dist/components/progress-ring/progress-ring.svelte +5 -5
  136. package/dist/components/progress-ring/types.d.ts +3 -3
  137. package/dist/components/radio-button/docs/llms.md +11 -8
  138. package/dist/components/radio-button/radio-button.svelte +38 -12
  139. package/dist/components/radio-button/radio-button.svelte.d.ts +1 -1
  140. package/dist/components/radio-button/types.d.ts +11 -8
  141. package/dist/components/rating/docs/llms.md +15 -14
  142. package/dist/components/rating/rating.svelte +66 -29
  143. package/dist/components/rating/rating.svelte.d.ts +1 -1
  144. package/dist/components/rating/types.d.ts +8 -8
  145. package/dist/components/side-nav/docs/llms.md +110 -0
  146. package/dist/components/side-nav/side-nav-branch.svelte +43 -0
  147. package/dist/components/side-nav/side-nav-branch.svelte.d.ts +4 -0
  148. package/dist/components/side-nav/side-nav-item.svelte +75 -0
  149. package/dist/components/side-nav/side-nav-item.svelte.d.ts +25 -0
  150. package/dist/components/side-nav/side-nav-list.svelte +32 -0
  151. package/dist/components/side-nav/side-nav-list.svelte.d.ts +7 -0
  152. package/dist/components/side-nav/side-nav.d.ts +2 -0
  153. package/dist/components/side-nav/side-nav.js +2 -0
  154. package/dist/components/side-nav/side-nav.svelte +355 -0
  155. package/dist/components/side-nav/side-nav.svelte.d.ts +24 -0
  156. package/dist/components/side-nav/types.d.ts +149 -0
  157. package/dist/components/side-nav/types.js +1 -0
  158. package/dist/components/skeleton/docs/llms.md +1 -1
  159. package/dist/components/skeleton/skeleton.svelte +2 -2
  160. package/dist/components/skeleton/types.d.ts +1 -1
  161. package/dist/components/slider/docs/llms.md +31 -28
  162. package/dist/components/slider/slider.svelte +126 -61
  163. package/dist/components/slider/slider.svelte.d.ts +1 -3
  164. package/dist/components/slider/types.d.ts +21 -14
  165. package/dist/components/tab-view/docs/llms.md +7 -7
  166. package/dist/components/tab-view/tab-view-tab.svelte +16 -14
  167. package/dist/components/tab-view/tab-view.svelte +16 -9
  168. package/dist/components/tab-view/types.d.ts +6 -6
  169. package/dist/components/table/docs/llms.md +38 -33
  170. package/dist/components/table/table-body.svelte +2 -2
  171. package/dist/components/table/table-cell-actions.svelte +8 -2
  172. package/dist/components/table/table-cell-layout.svelte +2 -2
  173. package/dist/components/table/table-cell.svelte +2 -2
  174. package/dist/components/table/table-header-cell.svelte +2 -2
  175. package/dist/components/table/table-header.svelte +2 -2
  176. package/dist/components/table/table-row.svelte +2 -2
  177. package/dist/components/table/table-selection-cell.svelte +6 -6
  178. package/dist/components/table/table.svelte +2 -2
  179. package/dist/components/table/types.d.ts +11 -11
  180. package/dist/components/tag/docs/llms.md +26 -26
  181. package/dist/components/tag/tag-group.svelte +2 -2
  182. package/dist/components/tag/tag.svelte +13 -12
  183. package/dist/components/tag/types.d.ts +6 -4
  184. package/dist/components/tag-picker/docs/llms.md +61 -55
  185. package/dist/components/tag-picker/option-group.svelte +17 -4
  186. package/dist/components/tag-picker/option-group.svelte.d.ts +1 -1
  187. package/dist/components/tag-picker/option.svelte +15 -4
  188. package/dist/components/tag-picker/tag-picker.svelte +137 -65
  189. package/dist/components/tag-picker/tag-picker.svelte.d.ts +2 -2
  190. package/dist/components/tag-picker/types.d.ts +36 -16
  191. package/dist/components/text-box/docs/llms.md +31 -4
  192. package/dist/components/text-box/text-box-button.svelte +3 -3
  193. package/dist/components/text-box/text-box-button.svelte.d.ts +1 -1
  194. package/dist/components/text-box/text-box.svelte +41 -14
  195. package/dist/components/text-box/types.d.ts +5 -5
  196. package/dist/components/textarea/docs/llms.md +4 -3
  197. package/dist/components/textarea/textarea.svelte +14 -6
  198. package/dist/components/textarea/types.d.ts +2 -4
  199. package/dist/components/time-picker/docs/llms.md +18 -15
  200. package/dist/components/time-picker/time-picker.svelte +133 -33
  201. package/dist/components/time-picker/time-picker.svelte.d.ts +1 -1
  202. package/dist/components/time-picker/types.d.ts +23 -13
  203. package/dist/components/title-bar/docs/llms.md +382 -0
  204. package/dist/components/title-bar/title-bar-left-controls.svelte +215 -0
  205. package/dist/components/title-bar/title-bar-left-controls.svelte.d.ts +22 -0
  206. package/dist/components/title-bar/title-bar-right-controls.svelte +190 -0
  207. package/dist/components/title-bar/title-bar-right-controls.svelte.d.ts +27 -0
  208. package/dist/components/title-bar/title-bar.d.ts +3 -0
  209. package/dist/components/title-bar/title-bar.js +4 -0
  210. package/dist/components/title-bar/title-bar.svelte +224 -0
  211. package/dist/components/title-bar/title-bar.svelte.d.ts +26 -0
  212. package/dist/components/title-bar/types.d.ts +165 -0
  213. package/dist/components/title-bar/types.js +1 -0
  214. package/dist/components/toggle-switch/docs/llms.md +11 -9
  215. package/dist/components/toggle-switch/toggle-switch.svelte +23 -14
  216. package/dist/components/toggle-switch/toggle-switch.svelte.d.ts +1 -1
  217. package/dist/components/toggle-switch/types.d.ts +12 -10
  218. package/dist/components/tooltip/docs/llms.md +1 -1
  219. package/dist/components/tooltip/tooltip.svelte +5 -4
  220. package/dist/components/tooltip/types.d.ts +1 -1
  221. package/dist/components/top-nav/docs/llms.md +1 -1
  222. package/dist/components/top-nav/top-nav-item.svelte +2 -2
  223. package/dist/components/top-nav/top-nav.svelte +2 -2
  224. package/dist/components/top-nav/types.d.ts +2 -2
  225. package/dist/components/tree-view/docs/llms.md +11 -11
  226. package/dist/components/tree-view/tree-view-item-content.svelte +3 -3
  227. package/dist/components/tree-view/tree-view-item.svelte +13 -5
  228. package/dist/components/tree-view/tree-view.svelte +20 -5
  229. package/dist/components/tree-view/tree-view.svelte.d.ts +1 -1
  230. package/dist/components/tree-view/tree-view.svelte.js +31 -3
  231. package/dist/components/tree-view/types.d.ts +7 -3
  232. package/dist/index.d.ts +18 -0
  233. package/dist/index.js +20 -0
  234. package/dist/internal/components/dynamic-carousel/dynamic-carousel.svelte +26 -5
  235. package/dist/internal/components/dynamic-carousel/dynamic-carousel.svelte.d.ts +2 -0
  236. package/dist/internal/index.d.ts +1 -0
  237. package/dist/internal/index.js +1 -0
  238. package/dist/internal/native-field.svelte.d.ts +44 -0
  239. package/dist/internal/native-field.svelte.js +85 -0
  240. package/dist/internal/utils.d.ts +16 -2
  241. package/dist/internal/utils.js +25 -3
  242. package/dist/types/index.d.ts +3 -3
  243. package/package.json +50 -36
@@ -1,6 +1,6 @@
1
1
  import { tick } from 'svelte';
2
2
  import { SvelteDate } from 'svelte/reactivity';
3
- import { compareDates } from './calendar-view.svelte.js';
3
+ import { compareDates, dateKey } from './calendar-view.svelte.js';
4
4
  export const CALENDAR_GRID_CONFIG = {
5
5
  root: { manageSpecialKeys: { Home: true, End: true } },
6
6
  mover: {
@@ -53,7 +53,10 @@ function amountFor(direction, columns) {
53
53
  /** The date a rendered cell stands for. */
54
54
  export function cellDate(element) {
55
55
  const value = element?.getAttribute?.('data-date');
56
- return value ? new SvelteDate(Number(value)) : null;
56
+ if (!value)
57
+ return null;
58
+ const [year, month, day] = value.split('-').map(Number);
59
+ return new SvelteDate(year, month - 1, day);
57
60
  }
58
61
  /** Precision at which a date names exactly one cell of a view. */
59
62
  export const VIEW_PRECISION = {
@@ -115,7 +118,9 @@ export function createCalendarNavigation({ grid, body, page, disabled, blackout,
115
118
  updatePage(Math.sign(amount), 'neutral');
116
119
  await tick();
117
120
  }
118
- body()?.querySelector(`button[data-date="${target.getTime()}"]`)?.focus();
121
+ body()
122
+ ?.querySelector(`button[data-date="${dateKey(target)}"]`)
123
+ ?.focus();
119
124
  }
120
125
  return (event) => {
121
126
  const amount = amountFor(event.direction, grid.columns);
@@ -17,21 +17,27 @@
17
17
  </script>
18
18
 
19
19
  <div
20
+ {...attributes}
20
21
  class={[
21
22
  'fs-calendar-view-item',
22
23
  `variant-${variant === 'day' ? 'day' : 'month-year'}`,
23
- rangePosition && `in-range range-${rangePosition}`
24
+ rangePosition && `in-range range-${rangePosition}`,
25
+ attributes?.class
24
26
  ]}
25
27
  role="gridcell"
26
28
  aria-selected={!!selected || rangePosition !== undefined}
27
- {...attributes}
28
29
  >
29
30
  <button
31
+ {...buttonAttributes}
30
32
  type="button"
31
- class={['calendar-item-button', { selected, disabled, current, blackout }, outOfRange && 'out-of-range']}
33
+ class={[
34
+ 'calendar-item-button',
35
+ { selected, disabled, current, blackout },
36
+ outOfRange && 'out-of-range',
37
+ buttonAttributes?.class
38
+ ]}
32
39
  aria-disabled={disabled}
33
40
  {disabled}
34
- {...buttonAttributes}
35
41
  >
36
42
  {#if header}
37
43
  <small>{header}</small>
@@ -4,6 +4,7 @@
4
4
  import CalendarViewItem from './calendar-view-item.svelte';
5
5
  import {
6
6
  compareDates,
7
+ dateKey,
7
8
  getCalendarMonths,
8
9
  getCalendarViewContext,
9
10
  getMonthLocale,
@@ -124,11 +125,11 @@
124
125
  {selected}
125
126
  variant="monthYear"
126
127
  outOfRange={!inYear}
127
- current={compareDates(month, new Date(), 'month')}
128
+ current={compareDates(month, CalendarContext.config.today, 'month')}
128
129
  buttonAttributes={{
129
130
  tabindex: firstFocusableMonth && compareDates(firstFocusableMonth, month, 'month') ? 0 : -1,
130
131
  'aria-label': monthLabel(month),
131
- 'data-date': month.getTime(),
132
+ 'data-date': dateKey(month),
132
133
  onclick: (e: MouseEvent) => {
133
134
  selectMonth(e, month);
134
135
  }
@@ -4,6 +4,7 @@
4
4
  import CalendarViewItem from './calendar-view-item.svelte';
5
5
  import {
6
6
  compareDates,
7
+ dateKey,
7
8
  getCalendarViewContext,
8
9
  getCalendarYears,
9
10
  indexOfDate,
@@ -123,11 +124,11 @@
123
124
  {selected}
124
125
  variant="monthYear"
125
126
  outOfRange={!inDecade}
126
- current={compareDates(year, new Date(), 'year')}
127
+ current={compareDates(year, CalendarContext.config.today, 'year')}
127
128
  buttonAttributes={{
128
129
  tabindex: firstFocusableYear && compareDates(firstFocusableYear, year, 'year') ? 0 : -1,
129
130
  'aria-label': yearLabel(year),
130
- 'data-date': year.getTime(),
131
+ 'data-date': dateKey(year),
131
132
  onclick: (e: MouseEvent) => {
132
133
  selectYear(e, year);
133
134
  }
@@ -38,7 +38,7 @@
38
38
  } from './types.js';
39
39
 
40
40
  let {
41
- ref = $bindable(),
41
+ ref = $bindable(null),
42
42
  value = $bindable(null),
43
43
  range = $bindable({ start: null, end: null }),
44
44
  view = 'days',
@@ -46,6 +46,7 @@
46
46
  blackoutBreaksRange,
47
47
  minDate,
48
48
  maxDate,
49
+ today,
49
50
  locale = 'en-US',
50
51
  weekStart = 1,
51
52
  blackoutDates,
@@ -65,7 +66,9 @@
65
66
 
66
67
  let pageAnimationDuration = $state(333);
67
68
 
68
- let firstValue = $derived(Array.isArray(value) ? value[0] : (value ?? new Date()));
69
+ const _today = $derived(today ?? new Date());
70
+
71
+ let firstValue = $derived((Array.isArray(value) ? value[0] : value) ?? _today);
69
72
 
70
73
  // svelte-ignore state_referenced_locally
71
74
  let page = $state(
@@ -205,6 +208,9 @@
205
208
  get maxDate() {
206
209
  return maxDate;
207
210
  },
211
+ get today() {
212
+ return _today;
213
+ },
208
214
  get locale() {
209
215
  return locale;
210
216
  },
@@ -340,7 +346,8 @@ A calendar view lets a user view and interact with a calendar that they can navi
340
346
  This implementation is originally made by Tropix126 in his FluentSvelte library, I have changed several things but thanks to him for the original work.
341
347
  -->
342
348
  <div
343
- class={['fs-calendar-view', { floating }]}
349
+ {...attributes}
350
+ class={['fs-calendar-view', { floating }, attributes?.class]}
344
351
  bind:this={ref}
345
352
  in:flyToOffset={floating && floating.ref
346
353
  ? {
@@ -356,7 +363,6 @@ This implementation is originally made by Tropix126 in his FluentSvelte library,
356
363
  }
357
364
  : undefined}
358
365
  {@attach floating?.ref ? _floating(floating.ref, floating.positionConfig) : undefined}
359
- {...attributes}
360
366
  >
361
367
  <Flyout>
362
368
  <CalendarViewControls />
@@ -418,6 +424,7 @@ This implementation is originally made by Tropix126 in his FluentSvelte library,
418
424
  position: absolute;
419
425
  top: 0;
420
426
  left: 0;
427
+ z-index: 110;
421
428
  }
422
429
  & .calendar-wrapper {
423
430
  overflow: hidden;
@@ -10,6 +10,11 @@ const DAY_MS = 86_400_000;
10
10
  * `range` or a `value` carrying a time, and a range must not change meaning because
11
11
  * one of its ends happens to be half past two.
12
12
  */
13
+ /** The local calendar date of a cell as `yyyy-mm-dd`: unlike a timestamp, the server and the browser agree on it. */
14
+ export function dateKey(date) {
15
+ const pad = (n) => String(n).padStart(2, '0');
16
+ return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
17
+ }
13
18
  export function startOfDay(date) {
14
19
  return new SvelteDate(date.getFullYear(), date.getMonth(), date.getDate());
15
20
  }
@@ -85,25 +85,26 @@ changing it from the header button leaves focus on the button.
85
85
  <!-- DO NOT EDIT THIS SECTION (propsmith generated) -->
86
86
  <!-- props:CalendarViewProps -->
87
87
 
88
- | Name | Type | Default | Description |
89
- | -------------------------- | ------------------------------------------------------------------- | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
90
- | `ref` _bindable_ | `HTMLDivElement` | | The DOM reference of the calendar element. |
91
- | `value` _bindable_ | `Date` &#124; `Date[]` &#124; `null` | `null` | The selected date, or an array of dates when `selectionMode` is `'multiple'`. Unused by `'range'`. |
92
- | `selectionMode` | `'single'` &#124; `'multiple'` &#124; `'range'` | `'single'` | How many dates the grid hands out, and in what shape. |
93
- | `range` _bindable_ | `{ start: Date` &#124; `null; end: Date` &#124; `null; }` | `{ start: null, end: null }` | The picked range. Only read and written when `selectionMode` is `'range'`, and `end` stays `null` until the range is closed. |
94
- | `blackoutBreaksRange` | `boolean` | `false` | Stop a range from spanning a blacked-out date. |
95
- | `blackoutDates` | `Date[]` | | Dates that are rendered but cannot be selected. |
96
- | `headers` | `boolean` | | Labels the first cell of a month or a year with its name. |
97
- | `minDate` | `Date` | | The earliest selectable date. |
98
- | `maxDate` | `Date` | | The latest selectable date. |
99
- | `view` | `'days'` &#124; `'months'` &#124; `'years'` | `'days'` | The calendar page the view opens on. |
100
- | `locale` | `string` | `'en-US'` | The locale used to format weekday and month names. |
101
- | `weekStart` | `number` | `1` | The first day of the week, where 0 is Sunday. |
102
- | `floating` | `CalendarViewFloating` | | Renders the calendar as a popup anchored to a reference element instead of inline. |
103
- | `onChange` | `(event: Event, value: Date` &#124; `Date[]` &#124; `null) => void` | | Called whenever the selection changes. Not called in `'range'` mode. |
104
- | `onRangeChange` | `(event: Event, range: CalendarDateRange) => void` | | Fired on every step of a range, including the one that leaves `end` null. |
105
- | `onViewChange` | `(event: Event, view: View) => void` | | Called whenever the active calendar page changes. |
106
- | Element Attributes (`div`) | | | |
88
+ | Name | Type | Default | Description |
89
+ | -------------------------- | ------------------------------------------------------------------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
90
+ | `ref` _bindable_ | `HTMLDivElement` &#124; `null` | | The DOM reference of the calendar element. |
91
+ | `value` _bindable_ | `Date` &#124; `Date[]` &#124; `null` | `null` | The selected date, or an array of dates when `selectionMode` is `'multiple'`. Unused by `'range'`. |
92
+ | `selectionMode` | `'single'` &#124; `'multiple'` &#124; `'range'` | `'single'` | How many dates the grid hands out, and in what shape. |
93
+ | `range` _bindable_ | `{ start: Date` &#124; `null; end: Date` &#124; `null; }` | `{ start: null, end: null }` | The picked range. Only read and written when `selectionMode` is `'range'`, and `end` stays `null` until the range is closed. |
94
+ | `blackoutBreaksRange` | `boolean` | `false` | Stop a range from spanning a blacked-out date. |
95
+ | `blackoutDates` | `Date[]` | | Dates that are rendered but cannot be selected. |
96
+ | `headers` | `boolean` | | Labels the first cell of a month or a year with its name. |
97
+ | `minDate` | `Date` | | The earliest selectable date. |
98
+ | `maxDate` | `Date` | | The latest selectable date. |
99
+ | `today` | `Date` | `new Date()` | The date the view treats as today: it is highlighted, and the view opens on its month when there is no `value`. Pass it when rendering on the server, built from a year, month and day on both sides, as in `new Date(2024, 2, 5)`: the same instant falls on different days in different time zones. |
100
+ | `view` | `'days'` &#124; `'months'` &#124; `'years'` | `'days'` | The calendar page the view opens on. |
101
+ | `locale` | `string` | `'en-US'` | The locale used to format weekday and month names. |
102
+ | `weekStart` | `number` | `1` | The first day of the week, where 0 is Sunday. |
103
+ | `floating` | `CalendarViewFloating` | | Renders the calendar as a popup anchored to a reference element instead of inline. |
104
+ | `onChange` | `(event: Event, value: Date` &#124; `Date[]` &#124; `null) => void` | | Called whenever the selection changes. Not called in `'range'` mode. |
105
+ | `onRangeChange` | `(event: Event, range: CalendarDateRange) => void` | | Fired on every step of a range, including the one that leaves `end` null. |
106
+ | `onViewChange` | `(event: Event, view: View) => void` | | Called whenever the active calendar page changes. |
107
+ | Element Attributes (`div`) | | | |
107
108
 
108
109
  <!-- /props:CalendarViewProps -->
109
110
 
@@ -63,7 +63,7 @@ export type CalendarViewProps = {
63
63
  /** The DOM reference of the calendar element.
64
64
  * @bindable
65
65
  */
66
- ref?: HTMLDivElement;
66
+ ref?: HTMLDivElement | null;
67
67
  /** The selected date, or an array of dates when `selectionMode` is `'multiple'`. Unused by `'range'`.
68
68
  * @default null
69
69
  * @bindable
@@ -90,6 +90,10 @@ export type CalendarViewProps = {
90
90
  minDate?: Date;
91
91
  /** The latest selectable date. */
92
92
  maxDate?: Date;
93
+ /** The date the view treats as today: it is highlighted, and the view opens on its month when there is no `value`. Pass it when rendering on the server, built from a year, month and day on both sides, as in `new Date(2024, 2, 5)`: the same instant falls on different days in different time zones.
94
+ * @default new Date()
95
+ */
96
+ today?: Date;
93
97
  /** The calendar page the view opens on.
94
98
  * @default 'days'
95
99
  */
@@ -118,6 +122,7 @@ export type CalendarViewContext = FSContext<{
118
122
  weekStart: number;
119
123
  minDate?: Date;
120
124
  maxDate?: Date;
125
+ today: Date;
121
126
  headers?: boolean;
122
127
  blackoutDates?: Date[];
123
128
  selectionMode: CalendarSelectionMode;
@@ -3,7 +3,7 @@
3
3
  import { RenderSoC } from '../../internal/index.js';
4
4
  import { getCardContext } from './card-context.svelte.js';
5
5
 
6
- let { ref = $bindable(), class: classes, action, ...attributes }: CardFooterProps = $props();
6
+ let { ref = $bindable(null), class: classes, action, ...attributes }: CardFooterProps = $props();
7
7
 
8
8
  const context = getCardContext();
9
9
 
@@ -21,7 +21,7 @@
21
21
  });
22
22
  </script>
23
23
 
24
- <div bind:this={ref} class={['fs-card-footer', showFloatingAction && 'with-action', classes]} {...attributes}>
24
+ <div {...attributes} bind:this={ref} class={['fs-card-footer', showFloatingAction && 'with-action', classes]}>
25
25
  {#if _action}
26
26
  <RenderSoC SoC={_action} />
27
27
  {/if}
@@ -4,9 +4,10 @@
4
4
  import { getCardContext } from './card-context.svelte.js';
5
5
 
6
6
  let {
7
- ref = $bindable(),
7
+ ref = $bindable(null),
8
8
  class: classes,
9
9
  title,
10
+ headingLevel = 4,
10
11
  image,
11
12
  imageAlt = '',
12
13
  description,
@@ -31,7 +32,7 @@
31
32
  });
32
33
  </script>
33
34
 
34
- <div bind:this={ref} class={['fs-card-header', showFloatingAction && 'with-action', classes]} {...attributes}>
35
+ <div {...attributes} bind:this={ref} class={['fs-card-header', showFloatingAction && 'with-action', classes]}>
35
36
  {#if typeof image === 'string'}
36
37
  <img src={image} alt={imageAlt} />
37
38
  {:else if image}
@@ -40,7 +41,7 @@
40
41
  {#if description}
41
42
  <div class="fs-card-header-content">
42
43
  {#if typeof title === 'string'}
43
- <h4 class="body" id={`${id}-title`}>{title}</h4>
44
+ <svelte:element this={`h${headingLevel}`} class="body" id={`${id}-title`}>{title}</svelte:element>
44
45
  {:else if title}
45
46
  <RenderSoC SoC={title} args={{ id: `${id}-title` }} />
46
47
  {/if}
@@ -51,7 +52,7 @@
51
52
  {/if}
52
53
  </div>
53
54
  {:else if typeof title === 'string'}
54
- <h4 class="body" id={`${id}-title`}>{title}</h4>
55
+ <svelte:element this={`h${headingLevel}`} class="body" id={`${id}-title`}>{title}</svelte:element>
55
56
  {:else if title}
56
57
  <RenderSoC SoC={title} args={{ id: `${id}-title` }} />
57
58
  {/if}
@@ -2,7 +2,14 @@
2
2
  import type { CardPreviewProps } from './types.js';
3
3
  import { getCardContext } from './card-context.svelte.js';
4
4
 
5
- let { ref = $bindable(), logoSrc, logoAlt = '', class: classes, children, ...attrs }: CardPreviewProps = $props();
5
+ let {
6
+ ref = $bindable(null),
7
+ logoSrc,
8
+ logoAlt = '',
9
+ class: classes,
10
+ children,
11
+ ...attributes
12
+ }: CardPreviewProps = $props();
6
13
 
7
14
  const context = getCardContext();
8
15
 
@@ -15,7 +22,11 @@
15
22
  const orientation = $derived(_state.orientation);
16
23
  </script>
17
24
 
18
- <div class={['fs-card-preview', showFloatingAction && 'with-action', orientation, classes]} bind:this={ref} {...attrs}>
25
+ <div
26
+ {...attributes}
27
+ class={['fs-card-preview', showFloatingAction && 'with-action', orientation, classes]}
28
+ bind:this={ref}
29
+ >
19
30
  {@render children?.()}
20
31
  <img src={logoSrc} alt={logoAlt} class="fs-card-preview-logo" />
21
32
  </div>
@@ -11,7 +11,7 @@
11
11
 
12
12
  let {
13
13
  as = 'div' as Tag,
14
- ref = $bindable(),
14
+ ref = $bindable(null),
15
15
  orientation = 'horizontal',
16
16
  id = FALLBACK_ID,
17
17
  selectable = false,
@@ -22,6 +22,7 @@
22
22
  class: classes,
23
23
  children,
24
24
  onclick,
25
+ onkeydown,
25
26
  onSelectionChange,
26
27
  ...attributes
27
28
  }: CardProps<Tag> = $props();
@@ -102,7 +103,7 @@
102
103
  * consumer named the card itself.
103
104
  */
104
105
  let rootLabelledBy = $derived(
105
- isRootControl && !attributes['aria-label'] && !attributes['aria-labelledby'] ? `${id}-title` : undefined
106
+ attributes['aria-labelledby'] ?? (isRootControl && !attributes['aria-label'] ? `${id}-title` : undefined)
106
107
  );
107
108
 
108
109
  /** Enter and Space toggle the selection, the same way a pointer click does. */
@@ -130,6 +131,7 @@
130
131
  -->
131
132
  <svelte:element
132
133
  this={_card.as}
134
+ {...attributes}
133
135
  class={['fs-card', { actionable, disabled, selected: _card.selected }, orientation, appearance, classes]}
134
136
  bind:this={ref}
135
137
  {id}
@@ -139,12 +141,10 @@
139
141
  aria-disabled={disabled || undefined}
140
142
  tabindex={isRootControl && !disabled ? 0 : undefined}
141
143
  onclick={(e: MouseEvent) => invokeHandlers(e, [disabled], [context.methods.handleAction])}
142
- onkeydown={isRootControl ? handleKeydown : undefined}
143
- {...attributes}
144
+ onkeydown={(event: KeyboardEvent) => invokeHandlers(event, disabled, [isRootControl && handleKeydown, onkeydown])}
144
145
  >
145
146
  {#if selectable && _card.showFloatingAction && as !== 'a'}
146
147
  <Checkbox
147
- wrapperAs="div"
148
148
  aria-labelledby={`${id}-title`}
149
149
  bind:checked={selected}
150
150
  {disabled}
@@ -177,13 +177,13 @@ The media shown at one edge of the card, with an optional logo overlaid on it.
177
177
  <!-- DO NOT EDIT THIS SECTION (propsmith generated) -->
178
178
  <!-- props:CardPreviewProps -->
179
179
 
180
- | Name | Type | Default | Description |
181
- | --------------------------------------------------- | ---------------- | ------- | --------------------------------------------------------------------------------------- |
182
- | `ref` _bindable_ | `HTMLDivElement` | | The DOM reference of the preview element. |
183
- | `logoSrc` | `string` | | The URL of the logo overlaid on the bottom left corner of the preview. |
184
- | `logoAlt` | `string` | `''` | The alternative text of the logo. Empty by default, which marks the logo as decorative. |
185
- | `children` | `Snippet` | | The media to preview, usually an image. |
186
- | `HTMLAttributes<HTMLDivElement>` without `children` | | | |
180
+ | Name | Type | Default | Description |
181
+ | --------------------------------------------------- | ------------------------------ | ------- | --------------------------------------------------------------------------------------- |
182
+ | `ref` _bindable_ | `HTMLDivElement` &#124; `null` | | The DOM reference of the preview element. |
183
+ | `logoSrc` | `string` | | The URL of the logo overlaid on the bottom left corner of the preview. |
184
+ | `logoAlt` | `string` | `''` | The alternative text of the logo. Empty by default, which marks the logo as decorative. |
185
+ | `children` | `Snippet` | | The media to preview, usually an image. |
186
+ | `HTMLAttributes<HTMLDivElement>` without `children` | | | |
187
187
 
188
188
  <!-- /props:CardPreviewProps -->
189
189
 
@@ -196,15 +196,16 @@ The title of the card, with an optional image, description and action.
196
196
  <!-- DO NOT EDIT THIS SECTION (propsmith generated) -->
197
197
  <!-- props:CardHeaderProps -->
198
198
 
199
- | Name | Type | Default | Description |
200
- | ------------------------------------------------------------ | -------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------- |
201
- | `ref` _bindable_ | `HTMLDivElement` | | The DOM reference of the header element. |
202
- | `title` | `Snippet` &#124; `Component` &#124; `string` | | The title of the card. A snippet or a component receives the id the floating checkbox is labelled by. |
203
- | `image` | `Snippet` &#124; `Component` &#124; `string` | | The image rendered before the title. A string is used as the `src` of an `<img>`. |
204
- | `imageAlt` | `string` | `''` | The alternative text of a string image. Empty by default, which marks the image as decorative. |
205
- | `description` | `Snippet` &#124; `Component` &#124; `string` | | A second line of text below the title. |
206
- | `action` | `Snippet` &#124; `Component` | | The action rendered at the end of the header. Not available on selectable cards. |
207
- | `HTMLAttributes<HTMLDivElement>` without `children`, `title` | | | |
199
+ | Name | Type | Default | Description |
200
+ | ------------------------------------------------------------ | ---------------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------- |
201
+ | `ref` _bindable_ | `HTMLDivElement` &#124; `null` | | The DOM reference of the header element. |
202
+ | `title` | `Snippet` &#124; `Component` &#124; `string` | | The title of the card. A snippet or a component receives the id the floating checkbox is labelled by. |
203
+ | `headingLevel` | `1` &#124; `2` &#124; `3` &#124; `4` &#124; `5` &#124; `6` | `4` | The level of the heading that holds a string title, to fit the headings of the page around it. |
204
+ | `image` | `Snippet` &#124; `Component` &#124; `string` | | The image rendered before the title. A string is used as the `src` of an `<img>`. |
205
+ | `imageAlt` | `string` | `''` | The alternative text of a string image. Empty by default, which marks the image as decorative. |
206
+ | `description` | `Snippet` &#124; `Component` &#124; `string` | | A second line of text below the title. |
207
+ | `action` | `Snippet` &#124; `Component` | | The action rendered at the end of the header. Not available on selectable cards. |
208
+ | `HTMLAttributes<HTMLDivElement>` without `children`, `title` | | | |
208
209
 
209
210
  <!-- /props:CardHeaderProps -->
210
211
 
@@ -217,10 +218,10 @@ The actions shown at the bottom of the card.
217
218
  <!-- DO NOT EDIT THIS SECTION (propsmith generated) -->
218
219
  <!-- props:CardFooterProps -->
219
220
 
220
- | Name | Type | Default | Description |
221
- | --------------------------------------------------- | ---------------------------- | ------- | -------------------------------------------------------------------------- |
222
- | `ref` _bindable_ | `HTMLDivElement` | | The DOM reference of the footer element. |
223
- | `action` | `Snippet` &#124; `Component` | | The actions rendered inside the footer. Not available on selectable cards. |
224
- | `HTMLAttributes<HTMLDivElement>` without `children` | | | |
221
+ | Name | Type | Default | Description |
222
+ | --------------------------------------------------- | ------------------------------ | ------- | -------------------------------------------------------------------------- |
223
+ | `ref` _bindable_ | `HTMLDivElement` &#124; `null` | | The DOM reference of the footer element. |
224
+ | `action` | `Snippet` &#124; `Component` | | The actions rendered inside the footer. Not available on selectable cards. |
225
+ | `HTMLAttributes<HTMLDivElement>` without `children` | | | |
225
226
 
226
227
  <!-- /props:CardFooterProps -->
@@ -9,7 +9,7 @@ export type CardProps<Tag extends CardTagTypes = 'div'> = {
9
9
  * @type CardElementDOMType[Tag]
10
10
  * @bindable
11
11
  */
12
- ref?: CardElementDOMType[Tag];
12
+ ref?: CardElementDOMType[Tag] | null;
13
13
  /** The DOM element to render.
14
14
  * @type 'div' | 'article' | 'section' | 'a'
15
15
  * @default 'div'
@@ -75,7 +75,7 @@ export type CardPreviewProps = {
75
75
  /** The DOM reference of the preview element.
76
76
  * @bindable
77
77
  */
78
- ref?: HTMLDivElement;
78
+ ref?: HTMLDivElement | null;
79
79
  /** The URL of the logo overlaid on the bottom left corner of the preview. */
80
80
  logoSrc: string;
81
81
  /** The alternative text of the logo. Empty by default, which marks the logo as decorative.
@@ -90,7 +90,7 @@ export type CardHeaderProps = {
90
90
  /** The DOM reference of the header element.
91
91
  * @bindable
92
92
  */
93
- ref?: HTMLDivElement;
93
+ ref?: HTMLDivElement | null;
94
94
  /** The title of the card. A snippet or a component receives the id the floating checkbox is labelled by.
95
95
  * @type Snippet | Component | string
96
96
  */
@@ -99,6 +99,10 @@ export type CardHeaderProps = {
99
99
  }]> | Component<{
100
100
  id: string;
101
101
  }> | string;
102
+ /** The level of the heading that holds a string title, to fit the headings of the page around it.
103
+ * @default 4
104
+ */
105
+ headingLevel?: 1 | 2 | 3 | 4 | 5 | 6;
102
106
  /** The image rendered before the title. A string is used as the `src` of an `<img>`.
103
107
  * @type Snippet | Component | string
104
108
  */
@@ -121,7 +125,7 @@ export type CardFooterProps = {
121
125
  /** The DOM reference of the footer element.
122
126
  * @bindable
123
127
  */
124
- ref?: HTMLDivElement;
128
+ ref?: HTMLDivElement | null;
125
129
  /** The actions rendered inside the footer. Not available on selectable cards.
126
130
  * @type Snippet | Component
127
131
  */