fluentui-svelte 0.2.0 → 0.3.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 (84) hide show
  1. package/dist/components/auto-suggest-box/auto-suggest-box.svelte +68 -56
  2. package/dist/components/auto-suggest-box/docs/llms.md +46 -14
  3. package/dist/components/auto-suggest-box/option.svelte +2 -1
  4. package/dist/components/avatar/docs/llms.md +20 -14
  5. package/dist/components/badge/docs/llms.md +29 -16
  6. package/dist/components/button/button.svelte +11 -5
  7. package/dist/components/button/docs/llms.md +33 -24
  8. package/dist/components/calendar-date-picker/docs/llms.md +17 -7
  9. package/dist/components/calendar-view/calendar-view-header.svelte +2 -2
  10. package/dist/components/calendar-view/calendar-view-header.svelte.d.ts +2 -17
  11. package/dist/components/calendar-view/calendar-view-months.svelte +1 -1
  12. package/dist/components/calendar-view/calendar-view-years.svelte +1 -1
  13. package/dist/components/calendar-view/calendar-view.svelte +66 -52
  14. package/dist/components/calendar-view/docs/llms.md +42 -30
  15. package/dist/components/card/docs/llms.md +54 -34
  16. package/dist/components/checkbox/docs/llms.md +18 -12
  17. package/dist/components/date-picker/docs/llms.md +25 -15
  18. package/dist/components/dialog/dialog-surface.svelte +8 -8
  19. package/dist/components/dialog/dialog.svelte +41 -39
  20. package/dist/components/dialog/docs/llms.md +59 -34
  21. package/dist/components/divider/docs/llms.md +14 -9
  22. package/dist/components/dropdown/docs/llms.md +34 -15
  23. package/dist/components/dropdown/dropdown.svelte +4 -2
  24. package/dist/components/dropdown-select/docs/llms.md +28 -14
  25. package/dist/components/expander/docs/llms.md +19 -12
  26. package/dist/components/flyout/docs/llms.md +17 -11
  27. package/dist/components/hyperlink/docs/llms.md +11 -7
  28. package/dist/components/info-bar/docs/llms.md +15 -9
  29. package/dist/components/label/docs/llms.md +15 -11
  30. package/dist/components/list-view/docs/llms.md +34 -24
  31. package/dist/components/list-view/list-view-item.svelte +10 -4
  32. package/dist/components/list-view/list-view.svelte +68 -63
  33. package/dist/components/menu/context-menu-trigger.svelte +45 -40
  34. package/dist/components/menu/docs/llms.md +63 -34
  35. package/dist/components/menu/menu-item-checkbox.svelte +3 -1
  36. package/dist/components/menu/menu-item-radio.svelte +3 -1
  37. package/dist/components/menu/menu-item-switch.svelte +3 -1
  38. package/dist/components/menu/menu-item.svelte +5 -1
  39. package/dist/components/menu/menu-popover.svelte +21 -10
  40. package/dist/components/menu/menu-trigger.svelte +22 -9
  41. package/dist/components/menu/menu.svelte +98 -87
  42. package/dist/components/number-box/docs/llms.md +10 -6
  43. package/dist/components/persona/docs/llms.md +19 -14
  44. package/dist/components/progress-bar/docs/llms.md +18 -10
  45. package/dist/components/progress-ring/docs/llms.md +19 -12
  46. package/dist/components/radio-button/docs/llms.md +13 -8
  47. package/dist/components/skeleton/docs/llms.md +13 -8
  48. package/dist/components/slider/docs/llms.md +33 -21
  49. package/dist/components/slider/slider.svelte +13 -11
  50. package/dist/components/table/docs/llms.md +531 -0
  51. package/dist/components/table/table-body.svelte +31 -0
  52. package/dist/components/table/table-body.svelte.d.ts +25 -0
  53. package/dist/components/table/table-cell-actions.svelte +48 -0
  54. package/dist/components/table/table-cell-actions.svelte.d.ts +17 -0
  55. package/dist/components/table/table-cell-layout.svelte +88 -0
  56. package/dist/components/table/table-cell-layout.svelte.d.ts +14 -0
  57. package/dist/components/table/table-cell.svelte +74 -0
  58. package/dist/components/table/table-cell.svelte.d.ts +25 -0
  59. package/dist/components/table/table-header-cell.svelte +257 -0
  60. package/dist/components/table/table-header-cell.svelte.d.ts +25 -0
  61. package/dist/components/table/table-header.svelte +28 -0
  62. package/dist/components/table/table-header.svelte.d.ts +25 -0
  63. package/dist/components/table/table-row.svelte +57 -0
  64. package/dist/components/table/table-row.svelte.d.ts +25 -0
  65. package/dist/components/table/table-selection-cell.svelte +89 -0
  66. package/dist/components/table/table-selection-cell.svelte.d.ts +25 -0
  67. package/dist/components/table/table.svelte +189 -0
  68. package/dist/components/table/table.svelte.d.ts +49 -0
  69. package/dist/components/table/table.svelte.js +138 -0
  70. package/dist/components/table/types.d.ts +287 -0
  71. package/dist/components/table/types.js +1 -0
  72. package/dist/components/text-box/docs/llms.md +23 -17
  73. package/dist/components/textarea/docs/llms.md +16 -7
  74. package/dist/components/time-picker/docs/llms.md +20 -10
  75. package/dist/components/toggle-switch/docs/llms.md +13 -9
  76. package/dist/components/tooltip/docs/llms.md +24 -10
  77. package/dist/components/tree-view/docs/llms.md +53 -35
  78. package/dist/components/tree-view/tree-view-item-content.svelte +1 -1
  79. package/dist/components/tree-view/tree-view-item.svelte +3 -3
  80. package/dist/components/tree-view/tree-view.svelte +89 -93
  81. package/dist/index.d.ts +9 -0
  82. package/dist/index.js +11 -0
  83. package/dist/providers/fluentui-svelte/fluentui-svelte.svelte +15 -15
  84. package/package.json +1 -1
@@ -0,0 +1,17 @@
1
+ import type { TableCellActionsProps } from './types.ts';
2
+ /**
3
+ * Actions pinned to the end of a cell, revealed while the row is hovered or holds the focus.
4
+ *
5
+ * - Usage:
6
+ * ```tsx
7
+ * <TableCell>
8
+ * <TableCellLayout>Meeting notes</TableCellLayout>
9
+ * <TableCellActions>
10
+ * <Button appearance="subtle" icon={EditRegular} aria-label="Edit" />
11
+ * </TableCellActions>
12
+ * </TableCell>
13
+ * ```
14
+ */
15
+ declare const TableCellActions: import("svelte").Component<TableCellActionsProps, {}, "ref">;
16
+ type TableCellActions = ReturnType<typeof TableCellActions>;
17
+ export default TableCellActions;
@@ -0,0 +1,88 @@
1
+ <script lang="ts">
2
+ import { RenderSoC } from '../../internal/index.js';
3
+ import type { TableCellLayoutProps } from './types.js';
4
+
5
+ let {
6
+ ref = $bindable(),
7
+ media: Media,
8
+ description,
9
+ appearance,
10
+ truncate = false,
11
+ class: classes,
12
+ children,
13
+ ...attributes
14
+ }: TableCellLayoutProps = $props();
15
+ </script>
16
+
17
+ <!--
18
+ @component
19
+ Lays a cell out as media, main content and an optional description.
20
+
21
+ - Usage:
22
+ ```tsx
23
+ <TableCell>
24
+ <TableCellLayout media={DocumentRegular} description="7h ago">Meeting notes</TableCellLayout>
25
+ </TableCell>
26
+ ```
27
+ -->
28
+ <div bind:this={ref} class={['fs-table-cell-layout', appearance, { truncate }, classes]} {...attributes}>
29
+ {#if Media}
30
+ <span class="media">
31
+ <RenderSoC SoC={Media} args={{ class: 'fs-table-cell-media' }} />
32
+ </span>
33
+ {/if}
34
+ <span class="content">
35
+ <span class="main">{@render children?.()}</span>
36
+ {#if description}
37
+ <small class="description">{description}</small>
38
+ {/if}
39
+ </span>
40
+ </div>
41
+
42
+ <style>
43
+ .fs-table-cell-layout {
44
+ display: flex;
45
+ align-items: center;
46
+ gap: 0.5rem;
47
+ min-width: 0;
48
+ & .media {
49
+ display: inline-flex;
50
+ align-items: center;
51
+ flex-shrink: 0;
52
+ color: var(--fs-text-secondary);
53
+ & :global(svg) {
54
+ width: 1.25rem;
55
+ height: 1.25rem;
56
+ fill: currentColor;
57
+ }
58
+ }
59
+ & .content {
60
+ display: flex;
61
+ flex-direction: column;
62
+ justify-content: center;
63
+ min-width: 0;
64
+ }
65
+ & .description {
66
+ font-size: var(--fs-caption2-font-size);
67
+ line-height: var(--fs-caption2-line-height);
68
+ color: var(--fs-text-secondary);
69
+ }
70
+ &.primary {
71
+ & .main {
72
+ font-weight: 600;
73
+ }
74
+ & .media :global(svg) {
75
+ width: 1.5rem;
76
+ height: 1.5rem;
77
+ }
78
+ }
79
+ &.truncate {
80
+ & .main,
81
+ & .description {
82
+ overflow: hidden;
83
+ text-overflow: ellipsis;
84
+ white-space: nowrap;
85
+ }
86
+ }
87
+ }
88
+ </style>
@@ -0,0 +1,14 @@
1
+ import type { TableCellLayoutProps } from './types.ts';
2
+ /**
3
+ * Lays a cell out as media, main content and an optional description.
4
+ *
5
+ * - Usage:
6
+ * ```tsx
7
+ * <TableCell>
8
+ * <TableCellLayout media={DocumentRegular} description="7h ago">Meeting notes</TableCellLayout>
9
+ * </TableCell>
10
+ * ```
11
+ */
12
+ declare const TableCellLayout: import("svelte").Component<TableCellLayoutProps, {}, "ref">;
13
+ type TableCellLayout = ReturnType<typeof TableCellLayout>;
14
+ export default TableCellLayout;
@@ -0,0 +1,74 @@
1
+ <script lang="ts" generics="Tag extends 'td' | 'div' = 'td'">
2
+ import { colIndex, focusGroup, getTag, requireTableContext } from './table.svelte.js';
3
+ import type { TableCellProps, TableDOM } from './types.js';
4
+
5
+ let {
6
+ as,
7
+ ref = $bindable(),
8
+ focusMode = 'cell',
9
+ class: classes,
10
+ children,
11
+ ...attributes
12
+ }: TableCellProps<Tag> = $props();
13
+
14
+ const context = requireTableContext();
15
+
16
+ const noNativeElements = $derived(context.config.noNativeElements);
17
+
18
+ const _as = $derived(getTag(as, 'td', noNativeElements));
19
+
20
+ /** A `grid` has no `cell`, only `gridcell`, so arrow navigation renames what the cell reports. */
21
+ const enableTabspot = $derived(context.config.enableTabspot);
22
+
23
+ const resizableColumns = $derived(context.config.resizableColumns);
24
+
25
+ /** Set by the attachment, because only the DOM knows which column a cell ended up in. */
26
+ let index = $state(-1);
27
+
28
+ /**
29
+ * A fixed layout takes its columns from the header row alone, so a native cell needs no width of
30
+ * its own. A flex row has no columns to speak of, so every cell there carries one.
31
+ */
32
+ const width = $derived(
33
+ !resizableColumns || _as !== 'div' || index < 0 ? undefined : context.methods.getColumnWidth(index)
34
+ );
35
+ </script>
36
+
37
+ <svelte:element
38
+ this={_as}
39
+ bind:this={ref as TableDOM[Tag]}
40
+ role={enableTabspot ? 'gridcell' : _as === 'div' ? 'cell' : undefined}
41
+ data-fs-focus-mode={enableTabspot ? focusMode : undefined}
42
+ class={['fs-table-cell', { flex: _as === 'div', sized: width !== undefined }, classes]}
43
+ style:width={width === undefined ? undefined : `${width}px`}
44
+ {@attach enableTabspot || resizableColumns ? colIndex((i) => (index = i)) : undefined}
45
+ {@attach enableTabspot && focusMode === 'group' ? focusGroup : undefined}
46
+ {...attributes}
47
+ >
48
+ {@render children?.()}
49
+ </svelte:element>
50
+
51
+ <style>
52
+ .fs-table-cell {
53
+ height: var(--fs-table-row-height);
54
+ padding: 0 var(--fs-table-cell-padding);
55
+ vertical-align: middle;
56
+ /* The anchor `TableCellActions` pins itself to. */
57
+ position: relative;
58
+ &:focus-visible {
59
+ outline: 0.125rem solid var(--fs-focus-stroke-outer);
60
+ outline-offset: -0.125rem;
61
+ }
62
+ &.flex {
63
+ display: flex;
64
+ align-items: center;
65
+ flex: 1 1 0;
66
+ min-width: 0;
67
+ }
68
+ /* A resized column states its width, so it must not also stretch to fill the row. */
69
+ &.sized {
70
+ flex: 0 0 auto;
71
+ overflow: hidden;
72
+ }
73
+ }
74
+ </style>
@@ -0,0 +1,25 @@
1
+ import type { TableCellProps } from './types.ts';
2
+ declare function $$render<Tag extends 'td' | 'div' = 'td'>(): {
3
+ props: TableCellProps<Tag>;
4
+ exports: {};
5
+ bindings: "ref";
6
+ slots: {};
7
+ events: {};
8
+ };
9
+ declare class __sveltets_Render<Tag extends 'td' | 'div' = 'td'> {
10
+ props(): ReturnType<typeof $$render<Tag>>['props'];
11
+ events(): ReturnType<typeof $$render<Tag>>['events'];
12
+ slots(): ReturnType<typeof $$render<Tag>>['slots'];
13
+ bindings(): "ref";
14
+ exports(): {};
15
+ }
16
+ interface $$IsomorphicComponent {
17
+ new <Tag extends 'td' | 'div' = 'td'>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<Tag>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<Tag>['props']>, ReturnType<__sveltets_Render<Tag>['events']>, ReturnType<__sveltets_Render<Tag>['slots']>> & {
18
+ $$bindings?: ReturnType<__sveltets_Render<Tag>['bindings']>;
19
+ } & ReturnType<__sveltets_Render<Tag>['exports']>;
20
+ <Tag extends 'td' | 'div' = 'td'>(internal: unknown, props: ReturnType<__sveltets_Render<Tag>['props']> & {}): ReturnType<__sveltets_Render<Tag>['exports']>;
21
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
22
+ }
23
+ declare const TableCell: $$IsomorphicComponent;
24
+ type TableCell<Tag extends 'td' | 'div' = 'td'> = InstanceType<typeof TableCell<Tag>>;
25
+ export default TableCell;
@@ -0,0 +1,257 @@
1
+ <script lang="ts" generics="Tag extends 'th' | 'div' = 'th'">
2
+ import ArrowUpRegular from 'fluentui-icons-svelte/ArrowUpRegular.svelte';
3
+ import { on } from 'svelte/events';
4
+ import { RenderSoC } from '../../internal/index.js';
5
+ import { colIndex, focusGroup, getTag, requireTableContext } from './table.svelte.js';
6
+ import type { TableDOM, TableHeaderCellProps } from './types.js';
7
+
8
+ let {
9
+ as,
10
+ ref = $bindable(),
11
+ sortable,
12
+ sortDirection,
13
+ sortIcon,
14
+ aside,
15
+ focusMode,
16
+ resizable,
17
+ resizeLabel = 'Resize column',
18
+ class: classes,
19
+ children,
20
+ ...attributes
21
+ }: TableHeaderCellProps<Tag> = $props();
22
+
23
+ const context = requireTableContext();
24
+
25
+ const noNativeElements = $derived(context.config.noNativeElements);
26
+
27
+ const _as = $derived(getTag(as, 'th', noNativeElements));
28
+
29
+ /** A cell opts in on its own, or inherits the choice the table made for every column. */
30
+ const _sortable = $derived(sortable ?? context.config.sortable);
31
+
32
+ const enableTabspot = $derived(context.config.enableTabspot);
33
+
34
+ /** A column opts in on its own, or inherits the choice the table made for every column. */
35
+ const _resizable = $derived(resizable ?? context.config.resizableColumns);
36
+
37
+ /**
38
+ * A resizable header holds a handle, which the arrows would otherwise skip straight past: the
39
+ * grid moves between cells, not into them. Entering the cell is what puts the handle in reach.
40
+ */
41
+ const _focusMode = $derived(focusMode ?? (_resizable && enableTabspot ? 'group' : 'cell'));
42
+
43
+ /** Set by the attachment, because only the DOM knows which column a cell ended up in. */
44
+ let index = $state(-1);
45
+
46
+ const width = $derived(index < 0 ? undefined : context.methods.getColumnWidth(index));
47
+
48
+ /** Pointer drags and arrow presses both land here, so the clamp lives in one place. */
49
+ const resizeTo = (e: Event, next: number) => context.methods.resizeColumn(e, index, next);
50
+
51
+ const startDrag = (e: PointerEvent) => {
52
+ // The handle sits inside the sort button's cell, and a drag is not a click on the column.
53
+ e.preventDefault();
54
+ e.stopPropagation();
55
+
56
+ const handle = e.currentTarget as HTMLElement;
57
+ const origin = e.clientX;
58
+ const start = width ?? handle.closest<HTMLElement>('.fs-table-header-cell')!.getBoundingClientRect().width;
59
+
60
+ handle.setPointerCapture(e.pointerId);
61
+
62
+ /** Filled right below, so ending the drag can unhook every listener it started. */
63
+ let stop: (() => void)[] = [];
64
+
65
+ const onmove = (move: PointerEvent) => resizeTo(move, start + move.clientX - origin);
66
+ const onup = () => {
67
+ for (const off of stop) off();
68
+ stop = [];
69
+ };
70
+
71
+ stop = [on(handle, 'pointermove', onmove), on(handle, 'pointerup', onup), on(handle, 'pointercancel', onup)];
72
+ };
73
+
74
+ /** One nudge per press, the way the WAI window splitter pattern describes. */
75
+ const STEP = 16;
76
+
77
+ const onHandleKeydown = (e: KeyboardEvent) => {
78
+ if (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight') return;
79
+ const handle = e.currentTarget as HTMLElement;
80
+ const current = width ?? handle.closest<HTMLElement>('.fs-table-header-cell')!.getBoundingClientRect().width;
81
+ // The arrows belong to the handle here, not to the grid underneath it.
82
+ e.preventDefault();
83
+ e.stopPropagation();
84
+ resizeTo(e, current + (e.key === 'ArrowRight' ? STEP : -STEP));
85
+ };
86
+ </script>
87
+
88
+ <svelte:element
89
+ this={_as}
90
+ bind:this={ref as TableDOM[Tag]}
91
+ role={_as === 'div' ? 'columnheader' : undefined}
92
+ scope={_as === 'th' ? 'col' : undefined}
93
+ aria-sort={sortDirection}
94
+ data-fs-focus-mode={enableTabspot ? _focusMode : undefined}
95
+ class={['fs-table-header-cell', { flex: _as === 'div', sortable: _sortable, resizable: _resizable }, classes]}
96
+ style:width={width === undefined ? undefined : `${width}px`}
97
+ {@attach enableTabspot || _resizable ? colIndex((i) => (index = i)) : undefined}
98
+ {@attach enableTabspot && _focusMode === 'group' ? focusGroup : undefined}
99
+ {...attributes}
100
+ >
101
+ <span class="inner">
102
+ {#if _sortable}
103
+ <button class="sort-button" type="button">
104
+ <span class="content">{@render children?.()}</span>
105
+ <span class={['sort-icon', sortDirection]} aria-hidden="true">
106
+ <RenderSoC SoC={sortIcon ?? ArrowUpRegular} args={{ class: 'fs-table-sort-icon' }} />
107
+ </span>
108
+ </button>
109
+ {:else}
110
+ <span class="content">{@render children?.()}</span>
111
+ {/if}
112
+ {#if aside}
113
+ <span class="aside">
114
+ <RenderSoC SoC={aside} args={{ class: 'fs-table-header-cell-aside' }} />
115
+ </span>
116
+ {/if}
117
+ </span>
118
+ {#if _resizable}
119
+ <!--
120
+ The WAI window splitter: a `separator` that takes the focus is interactive by definition,
121
+ which is what makes the arrows resize the column. The linter only knows the static role.
122
+ -->
123
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
124
+ <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
125
+ <span
126
+ class="resize-handle"
127
+ role="separator"
128
+ aria-orientation="vertical"
129
+ aria-label={resizeLabel}
130
+ aria-valuenow={width}
131
+ tabindex="0"
132
+ onpointerdown={startDrag}
133
+ onkeydown={onHandleKeydown}
134
+ ></span>
135
+ {/if}
136
+ </svelte:element>
137
+
138
+ <style>
139
+ .fs-table-header-cell {
140
+ height: var(--fs-table-row-height);
141
+ padding: 0 var(--fs-table-cell-padding);
142
+ vertical-align: middle;
143
+ text-align: left;
144
+ font-size: var(--fs-caption-font-size);
145
+ line-height: var(--fs-caption-line-height);
146
+ font-weight: 600;
147
+ color: var(--fs-text-primary);
148
+ & .inner {
149
+ display: flex;
150
+ align-items: center;
151
+ gap: 0.25rem;
152
+ min-width: 0;
153
+ }
154
+ & .content {
155
+ min-width: 0;
156
+ overflow: hidden;
157
+ text-overflow: ellipsis;
158
+ white-space: nowrap;
159
+ }
160
+ & .sort-button {
161
+ display: flex;
162
+ align-items: center;
163
+ gap: 0.25rem;
164
+ flex-grow: 1;
165
+ min-width: 0;
166
+ padding: 0;
167
+ margin: 0;
168
+ border: none;
169
+ border-radius: var(--fs-control-inner-border-radius);
170
+ background: none;
171
+ color: inherit;
172
+ font: inherit;
173
+ font-weight: inherit;
174
+ text-align: inherit;
175
+ cursor: pointer;
176
+ &:focus-visible {
177
+ outline: 0.125rem solid var(--fs-focus-stroke-outer);
178
+ outline-offset: 0.063rem;
179
+ }
180
+ }
181
+ & .sort-icon {
182
+ display: inline-flex;
183
+ /* The arrow is a hint while the column is unsorted, and the answer once it is. */
184
+ opacity: 0;
185
+ transition: opacity var(--fs-fast-duration) var(--fs-point-to-point);
186
+ @media (prefers-reduced-motion: reduce) {
187
+ transition: none;
188
+ }
189
+ & :global(svg) {
190
+ width: 0.75rem;
191
+ height: 0.75rem;
192
+ fill: currentColor;
193
+ }
194
+ &.descending {
195
+ transform: rotate(180deg);
196
+ }
197
+ &.ascending,
198
+ &.descending {
199
+ opacity: 1;
200
+ }
201
+ }
202
+ &.sortable:hover .sort-icon {
203
+ opacity: 0.5;
204
+ &.ascending,
205
+ &.descending {
206
+ opacity: 1;
207
+ }
208
+ }
209
+ & .aside {
210
+ display: inline-flex;
211
+ align-items: center;
212
+ color: var(--fs-text-secondary);
213
+ }
214
+ &.flex {
215
+ display: flex;
216
+ align-items: center;
217
+ flex: 1 1 0;
218
+ min-width: 0;
219
+ }
220
+ &.resizable {
221
+ position: relative;
222
+ overflow: hidden;
223
+ &.flex {
224
+ flex: 0 0 auto;
225
+ }
226
+ }
227
+ & .resize-handle {
228
+ position: absolute;
229
+ top: 0;
230
+ right: 0;
231
+ width: 0.5rem;
232
+ height: 100%;
233
+ cursor: col-resize;
234
+ touch-action: none;
235
+ /* The grab area is comfortable, the line it draws is hairline. */
236
+ &::after {
237
+ content: '';
238
+ position: absolute;
239
+ top: 20%;
240
+ right: 0.188rem;
241
+ width: 1px;
242
+ height: 60%;
243
+ background: var(--fs-control-stroke-default);
244
+ }
245
+ &:hover::after,
246
+ &:focus-visible::after {
247
+ top: 0;
248
+ height: 100%;
249
+ width: 2px;
250
+ background: var(--fs-accent-fill-default);
251
+ }
252
+ &:focus-visible {
253
+ outline: none;
254
+ }
255
+ }
256
+ }
257
+ </style>
@@ -0,0 +1,25 @@
1
+ import type { TableHeaderCellProps } from './types.ts';
2
+ declare function $$render<Tag extends 'th' | 'div' = 'th'>(): {
3
+ props: TableHeaderCellProps<Tag>;
4
+ exports: {};
5
+ bindings: "ref";
6
+ slots: {};
7
+ events: {};
8
+ };
9
+ declare class __sveltets_Render<Tag extends 'th' | 'div' = 'th'> {
10
+ props(): ReturnType<typeof $$render<Tag>>['props'];
11
+ events(): ReturnType<typeof $$render<Tag>>['events'];
12
+ slots(): ReturnType<typeof $$render<Tag>>['slots'];
13
+ bindings(): "ref";
14
+ exports(): {};
15
+ }
16
+ interface $$IsomorphicComponent {
17
+ new <Tag extends 'th' | 'div' = 'th'>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<Tag>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<Tag>['props']>, ReturnType<__sveltets_Render<Tag>['events']>, ReturnType<__sveltets_Render<Tag>['slots']>> & {
18
+ $$bindings?: ReturnType<__sveltets_Render<Tag>['bindings']>;
19
+ } & ReturnType<__sveltets_Render<Tag>['exports']>;
20
+ <Tag extends 'th' | 'div' = 'th'>(internal: unknown, props: ReturnType<__sveltets_Render<Tag>['props']> & {}): ReturnType<__sveltets_Render<Tag>['exports']>;
21
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
22
+ }
23
+ declare const TableHeaderCell: $$IsomorphicComponent;
24
+ type TableHeaderCell<Tag extends 'th' | 'div' = 'th'> = InstanceType<typeof TableHeaderCell<Tag>>;
25
+ export default TableHeaderCell;
@@ -0,0 +1,28 @@
1
+ <script lang="ts" generics="Tag extends 'thead' | 'div' = 'thead'">
2
+ import { getTag, requireTableContext } from './table.svelte.js';
3
+ import type { TableDOM, TableHeaderProps } from './types.js';
4
+
5
+ let { as, ref = $bindable(), class: classes, children, ...attributes }: TableHeaderProps<Tag> = $props();
6
+
7
+ const context = requireTableContext();
8
+
9
+ const noNativeElements = $derived(context.config.noNativeElements);
10
+
11
+ const _as = $derived(getTag(as, 'thead', noNativeElements));
12
+ </script>
13
+
14
+ <svelte:element
15
+ this={_as}
16
+ bind:this={ref as TableDOM[Tag]}
17
+ role={_as === 'div' ? 'rowgroup' : undefined}
18
+ class={['fs-table-header', classes]}
19
+ {...attributes}
20
+ >
21
+ {@render children?.()}
22
+ </svelte:element>
23
+
24
+ <style>
25
+ .fs-table-header {
26
+ color: var(--fs-text-primary);
27
+ }
28
+ </style>
@@ -0,0 +1,25 @@
1
+ import type { TableHeaderProps } from './types.ts';
2
+ declare function $$render<Tag extends 'thead' | 'div' = 'thead'>(): {
3
+ props: TableHeaderProps<Tag>;
4
+ exports: {};
5
+ bindings: "ref";
6
+ slots: {};
7
+ events: {};
8
+ };
9
+ declare class __sveltets_Render<Tag extends 'thead' | 'div' = 'thead'> {
10
+ props(): ReturnType<typeof $$render<Tag>>['props'];
11
+ events(): ReturnType<typeof $$render<Tag>>['events'];
12
+ slots(): ReturnType<typeof $$render<Tag>>['slots'];
13
+ bindings(): "ref";
14
+ exports(): {};
15
+ }
16
+ interface $$IsomorphicComponent {
17
+ new <Tag extends 'thead' | 'div' = 'thead'>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<Tag>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<Tag>['props']>, ReturnType<__sveltets_Render<Tag>['events']>, ReturnType<__sveltets_Render<Tag>['slots']>> & {
18
+ $$bindings?: ReturnType<__sveltets_Render<Tag>['bindings']>;
19
+ } & ReturnType<__sveltets_Render<Tag>['exports']>;
20
+ <Tag extends 'thead' | 'div' = 'thead'>(internal: unknown, props: ReturnType<__sveltets_Render<Tag>['props']> & {}): ReturnType<__sveltets_Render<Tag>['exports']>;
21
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
22
+ }
23
+ declare const TableHeader: $$IsomorphicComponent;
24
+ type TableHeader<Tag extends 'thead' | 'div' = 'thead'> = InstanceType<typeof TableHeader<Tag>>;
25
+ export default TableHeader;
@@ -0,0 +1,57 @@
1
+ <script lang="ts" generics="Tag extends 'tr' | 'div' = 'tr'">
2
+ import { getTag, requireTableContext, selectOnSpace } from './table.svelte.js';
3
+ import type { TableDOM, TableRowProps } from './types.js';
4
+
5
+ let {
6
+ as,
7
+ ref = $bindable(),
8
+ appearance = 'none',
9
+ class: classes,
10
+ onclick,
11
+ children,
12
+ ...attributes
13
+ }: TableRowProps<Tag> = $props();
14
+
15
+ const context = requireTableContext();
16
+
17
+ const noNativeElements = $derived(context.config.noNativeElements);
18
+
19
+ const _as = $derived(getTag(as, 'tr', noNativeElements));
20
+ </script>
21
+
22
+ <svelte:element
23
+ this={_as}
24
+ bind:this={ref as TableDOM[Tag]}
25
+ role={_as === 'div' ? 'row' : undefined}
26
+ class={['fs-table-row', appearance, { flex: _as === 'div' }, classes]}
27
+ {@attach onclick ? selectOnSpace : undefined}
28
+ {onclick}
29
+ {...attributes}
30
+ >
31
+ {@render children?.()}
32
+ </svelte:element>
33
+
34
+ <style>
35
+ .fs-table-row {
36
+ /* Set by the root, so `noRowBorders` reaches every row without a global selector. */
37
+ border-bottom: var(--fs-table-row-border);
38
+ /* Read by the selection cell: a subtle indicator only surfaces while the row is engaged. */
39
+ --fs-table-row-active: 0;
40
+ &:hover,
41
+ &:focus-within {
42
+ background: var(--fs-subtle-fill-secondary);
43
+ --fs-table-row-active: 1;
44
+ }
45
+ &.brand {
46
+ background: color-mix(in srgb, var(--fs-accent-fill-default), transparent 88%);
47
+ }
48
+ &.neutral {
49
+ background: var(--fs-subtle-fill-tertiary);
50
+ }
51
+ &.flex {
52
+ display: flex;
53
+ align-items: center;
54
+ width: 100%;
55
+ }
56
+ }
57
+ </style>
@@ -0,0 +1,25 @@
1
+ import type { TableRowProps } from './types.ts';
2
+ declare function $$render<Tag extends 'tr' | 'div' = 'tr'>(): {
3
+ props: TableRowProps<Tag>;
4
+ exports: {};
5
+ bindings: "ref";
6
+ slots: {};
7
+ events: {};
8
+ };
9
+ declare class __sveltets_Render<Tag extends 'tr' | 'div' = 'tr'> {
10
+ props(): ReturnType<typeof $$render<Tag>>['props'];
11
+ events(): ReturnType<typeof $$render<Tag>>['events'];
12
+ slots(): ReturnType<typeof $$render<Tag>>['slots'];
13
+ bindings(): "ref";
14
+ exports(): {};
15
+ }
16
+ interface $$IsomorphicComponent {
17
+ new <Tag extends 'tr' | 'div' = 'tr'>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<Tag>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<Tag>['props']>, ReturnType<__sveltets_Render<Tag>['events']>, ReturnType<__sveltets_Render<Tag>['slots']>> & {
18
+ $$bindings?: ReturnType<__sveltets_Render<Tag>['bindings']>;
19
+ } & ReturnType<__sveltets_Render<Tag>['exports']>;
20
+ <Tag extends 'tr' | 'div' = 'tr'>(internal: unknown, props: ReturnType<__sveltets_Render<Tag>['props']> & {}): ReturnType<__sveltets_Render<Tag>['exports']>;
21
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
22
+ }
23
+ declare const TableRow: $$IsomorphicComponent;
24
+ type TableRow<Tag extends 'tr' | 'div' = 'tr'> = InstanceType<typeof TableRow<Tag>>;
25
+ export default TableRow;