@x33025/sveltely 0.1.23 → 0.1.25

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 (107) hide show
  1. package/dist/actions/LoaderOverlay.svelte +10 -3
  2. package/dist/components/Library/Accordion/Accordion.demo.svelte +21 -0
  3. package/dist/components/Library/Accordion/Accordion.demo.svelte.d.ts +9 -0
  4. package/dist/components/Library/Accordion/Accordion.svelte +78 -0
  5. package/dist/components/Library/Accordion/Accordion.svelte.d.ts +14 -0
  6. package/dist/components/Library/Accordion/Content.svelte +57 -0
  7. package/dist/components/Library/Accordion/Content.svelte.d.ts +8 -0
  8. package/dist/components/Library/Accordion/Header.svelte +98 -0
  9. package/dist/components/Library/Accordion/Header.svelte.d.ts +10 -0
  10. package/dist/components/Library/Accordion/context.d.ts +9 -0
  11. package/dist/components/Library/Accordion/context.js +6 -0
  12. package/dist/components/Library/Accordion/index.d.ts +9 -0
  13. package/dist/components/Library/Accordion/index.js +7 -0
  14. package/dist/components/Library/AnimatedNumber/AnimatedNumber.demo.svelte +3 -2
  15. package/dist/components/Library/ArticleEditor/ArticleEditor.svelte +1 -2
  16. package/dist/components/Library/ArticleEditor/Blocks/Table.svelte +133 -172
  17. package/dist/components/Library/Checkbox/Checkbox.demo.svelte +5 -4
  18. package/dist/components/Library/Checkbox/Checkbox.svelte +6 -5
  19. package/dist/components/Library/Checkbox/Checkbox.svelte.d.ts +2 -1
  20. package/dist/components/Library/ChipInput/ChipInput.demo.svelte +3 -2
  21. package/dist/components/Library/Dropdown/Dropdown.demo.svelte +20 -15
  22. package/dist/components/Library/Floating/Floating.svelte +5 -6
  23. package/dist/components/Library/Grid/Grid.demo.svelte +58 -0
  24. package/dist/components/Library/Grid/Grid.demo.svelte.d.ts +25 -0
  25. package/dist/components/Library/Grid/Grid.svelte +128 -25
  26. package/dist/components/Library/Grid/Grid.svelte.d.ts +38 -9
  27. package/dist/components/Library/Grid/GridItem.svelte +18 -14
  28. package/dist/components/Library/Grid/GridItem.svelte.d.ts +2 -1
  29. package/dist/components/Library/HStack/HStack.svelte +4 -4
  30. package/dist/components/Library/HStack/HStack.svelte.d.ts +2 -1
  31. package/dist/components/Library/Image/Image.demo.svelte +3 -1
  32. package/dist/components/Library/Image/Image.demo.svelte.d.ts +2 -0
  33. package/dist/components/Library/ImageMask/ImageMask.demo.svelte +8 -6
  34. package/dist/components/Library/Label/Label.demo.svelte +5 -5
  35. package/dist/components/Library/Label/Label.svelte +10 -26
  36. package/dist/components/Library/NavigationStack/Link.svelte +1 -4
  37. package/dist/components/Library/Notifications/Notifications.demo.svelte +63 -0
  38. package/dist/components/Library/Notifications/Notifications.demo.svelte.d.ts +9 -0
  39. package/dist/components/Library/Notifications/Notifications.svelte +155 -0
  40. package/dist/components/Library/Notifications/Notifications.svelte.d.ts +35 -0
  41. package/dist/components/Library/Notifications/index.d.ts +2 -0
  42. package/dist/components/Library/Notifications/index.js +1 -0
  43. package/dist/components/Library/Notifications/types.d.ts +8 -0
  44. package/dist/components/Library/Notifications/types.js +1 -0
  45. package/dist/components/Library/NumberField/NumberField.svelte +25 -19
  46. package/dist/components/Library/Pagination/Pagination.demo.svelte +3 -2
  47. package/dist/components/Library/Pagination/Pagination.svelte +6 -18
  48. package/dist/components/Library/Popover/PopoverDebugOverlay.svelte +3 -3
  49. package/dist/components/Library/Portal/Content.svelte +20 -0
  50. package/dist/components/Library/Portal/Content.svelte.d.ts +10 -0
  51. package/dist/components/Library/Portal/Portal.svelte +4 -0
  52. package/dist/components/Library/Portal/Portal.svelte.d.ts +1 -0
  53. package/dist/components/Library/Portal/index.d.ts +1 -0
  54. package/dist/components/Library/Portal/index.js +1 -0
  55. package/dist/components/Library/ScrollView/ScrollView.svelte +88 -9
  56. package/dist/components/Library/ScrollView/ScrollView.svelte.d.ts +9 -2
  57. package/dist/components/Library/ScrollView/index.d.ts +1 -1
  58. package/dist/components/Library/SearchField/SearchField.demo.svelte +3 -2
  59. package/dist/components/Library/SearchField/SearchField.svelte +5 -5
  60. package/dist/components/Library/SearchField/SearchField.svelte.d.ts +2 -1
  61. package/dist/components/Library/SegmentedPicker/SegmentedPicker.demo.svelte +3 -2
  62. package/dist/components/Library/Sheet/Sheet.demo.svelte +3 -2
  63. package/dist/components/Library/Sheet/Sheet.svelte +3 -3
  64. package/dist/components/Library/Slider/Slider.demo.svelte +3 -2
  65. package/dist/components/Library/Spinner/Spinner.demo.svelte +3 -2
  66. package/dist/components/Library/Switch/Switch.demo.svelte +5 -4
  67. package/dist/components/Library/Switch/Switch.svelte +6 -5
  68. package/dist/components/Library/Switch/Switch.svelte.d.ts +2 -1
  69. package/dist/components/Library/Table/Column.svelte +3 -0
  70. package/dist/components/Library/Table/Column.svelte.d.ts +1 -0
  71. package/dist/components/Library/Table/Table.demo.svelte +230 -17
  72. package/dist/components/Library/Table/Table.svelte +322 -78
  73. package/dist/components/Library/Table/Table.svelte.d.ts +5 -0
  74. package/dist/components/Library/Table/types.d.ts +1 -0
  75. package/dist/components/Library/TextField/TextField.svelte +20 -14
  76. package/dist/components/Library/TextShimmer/TextShimmer.demo.svelte +3 -2
  77. package/dist/components/Library/TimePicker/TimePicker.demo.svelte +3 -10
  78. package/dist/components/Library/TokenSearchField/TokenSearchField.demo.svelte +3 -2
  79. package/dist/components/Library/VStack/VStack.svelte +4 -4
  80. package/dist/components/Library/VStack/VStack.svelte.d.ts +2 -1
  81. package/dist/components/Local/ColorStyleControls.svelte +25 -72
  82. package/dist/components/Local/ComponentGrid.svelte +99 -27
  83. package/dist/components/Local/ComponentGrid.svelte.d.ts +2 -1
  84. package/dist/components/Local/ComponentPage.svelte +74 -0
  85. package/dist/components/Local/ComponentPage.svelte.d.ts +13 -0
  86. package/dist/components/Local/HeroCard.svelte +10 -6
  87. package/dist/components/Local/LayoutStyleControls.svelte +33 -25
  88. package/dist/components/Local/StyleControls.svelte +1 -1
  89. package/dist/index.d.ts +8 -3
  90. package/dist/index.js +4 -1
  91. package/dist/style/index.css +3 -4
  92. package/dist/style/layout.d.ts +15 -36
  93. package/dist/style/layout.js +35 -83
  94. package/dist/style/surface.d.ts +1 -0
  95. package/dist/style/surface.js +10 -0
  96. package/dist/style.css +3 -51
  97. package/dist/viewport/geometry.d.ts +8 -0
  98. package/dist/viewport/geometry.js +43 -0
  99. package/dist/viewport/index.d.ts +4 -0
  100. package/dist/viewport/index.js +4 -0
  101. package/dist/viewport/layout.d.ts +4 -0
  102. package/dist/viewport/layout.js +138 -0
  103. package/dist/viewport/placement.d.ts +4 -0
  104. package/dist/viewport/placement.js +14 -0
  105. package/dist/viewport/types.d.ts +81 -0
  106. package/dist/viewport/types.js +1 -0
  107. package/package.json +1 -1
@@ -19,15 +19,15 @@
19
19
  disabled = false,
20
20
  placeholder = 'Search',
21
21
  ...restProps
22
- }: Props = $props();
22
+ }: Props & Record<string, unknown> = $props();
23
23
 
24
24
  const extractedStyleProps = $derived.by(() => extractStyleProps(restProps));
25
25
  const styleProps = $derived(extractedStyleProps.styleProps);
26
- const props = $derived(extractedStyleProps.restProps);
26
+ const forwardedProps = $derived(extractedStyleProps.restProps);
27
27
  const rootStyle = $derived.by(() => surfaceStyle(styleProps, 'search-field'));
28
28
  </script>
29
29
 
30
- <label
30
+ <div
31
31
  class="search-field"
32
32
  style={rootStyle}
33
33
  data-disabled={disabled ? 'true' : 'false'}
@@ -37,8 +37,8 @@
37
37
  <span class="search-field-icon" aria-hidden="true">
38
38
  <SearchIcon class="size-4" />
39
39
  </span>
40
- <input type="search" bind:value {disabled} {placeholder} class="search-field-input" {...props} />
41
- </label>
40
+ <input type="search" bind:value {disabled} {placeholder} class="search-field-input" {...forwardedProps} />
41
+ </div>
42
42
 
43
43
  <style>
44
44
  .search-field {
@@ -5,6 +5,7 @@ type Props = {
5
5
  value?: string;
6
6
  radiusSource?: boolean;
7
7
  } & StyleProps & TooltipProps & Omit<HTMLInputAttributes, 'children' | 'type' | 'value' | 'class' | 'style'>;
8
- declare const SearchField: import("svelte").Component<Props, {}, "value">;
8
+ type $$ComponentProps = Props & Record<string, unknown>;
9
+ declare const SearchField: import("svelte").Component<$$ComponentProps, {}, "value">;
9
10
  type SearchField = ReturnType<typeof SearchField>;
10
11
  export default SearchField;
@@ -6,6 +6,7 @@
6
6
  </script>
7
7
 
8
8
  <script lang="ts">
9
+ import VStack from '../VStack';
9
10
  import SegmentedPicker from './SegmentedPicker.svelte';
10
11
 
11
12
  const options = [
@@ -17,7 +18,7 @@
17
18
  let value = $state('day');
18
19
  </script>
19
20
 
20
- <div class="vstack center gap-2">
21
+ <VStack gap={5}>
21
22
  <SegmentedPicker {options} bind:value />
22
23
  <p class="text-xs text-[var(--sveltely-text-secondary-color)]">Selected: {value}</p>
23
- </div>
24
+ </VStack>
@@ -6,6 +6,7 @@
6
6
  </script>
7
7
 
8
8
  <script lang="ts">
9
+ import VStack from '../VStack';
9
10
  import Sheet from './Sheet.svelte';
10
11
  </script>
11
12
 
@@ -14,12 +15,12 @@
14
15
  <span>Open sheet</span>
15
16
  {/snippet}
16
17
 
17
- <div class="vstack gap-3">
18
+ <VStack gap={7.5}>
18
19
  <p class="text-sm text-[var(--sveltely-text-primary-color)]">This is a simple sheet example.</p>
19
20
  <div class="rounded border border-gray-200/70 p-3 text-sm text-gray-700">
20
21
  <div>Panel one content.</div>
21
22
  <div class="mt-2">Panel two content.</div>
22
23
  <div class="mt-2">Panel three content.</div>
23
24
  </div>
24
- </div>
25
+ </VStack>
25
26
  </Sheet>
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
- import { portalContent } from '../../../actions/portal';
3
+ import { Content as PortalContent } from '../Portal';
4
4
  import { extractStyleProps, surfaceStyle, type StyleProps } from '../../../style/surface';
5
5
  interface Props {
6
6
  trigger?: Snippet;
@@ -58,7 +58,7 @@
58
58
  {/if}
59
59
 
60
60
  {#if open}
61
- <div class="center fixed inset-0 z-50 flex" use:portalContent>
61
+ <PortalContent class="center fixed inset-0 z-50 flex">
62
62
  <button
63
63
  type="button"
64
64
  aria-label="Close dialog"
@@ -78,7 +78,7 @@
78
78
  {/if}
79
79
  </div>
80
80
  </div>
81
- </div>
81
+ </PortalContent>
82
82
  {/if}
83
83
 
84
84
  <style>
@@ -6,12 +6,13 @@
6
6
  </script>
7
7
 
8
8
  <script lang="ts">
9
+ import VStack from '../VStack';
9
10
  import Slider from './Slider.svelte';
10
11
 
11
12
  let value = $state(35);
12
13
  </script>
13
14
 
14
- <div class="vstack w-full max-w-sm gap-2">
15
+ <VStack width="24rem" gap={5}>
15
16
  <Slider bind:value min={0} max={100} />
16
17
  <p class="text-xs text-[var(--sveltely-text-secondary-color)]">Value: {value}</p>
17
- </div>
18
+ </VStack>
@@ -6,9 +6,10 @@
6
6
  </script>
7
7
 
8
8
  <script lang="ts">
9
+ import HStack from '../HStack';
9
10
  import Spinner from './Spinner.svelte';
10
11
  </script>
11
12
 
12
- <div class="text-[var(--sveltely-text-primary-color)]">
13
+ <HStack color="var(--sveltely-text-primary-color)">
13
14
  <Spinner />
14
- </div>
15
+ </HStack>
@@ -8,16 +8,17 @@
8
8
  <script lang="ts">
9
9
  import Switch from './Switch.svelte';
10
10
  import Label from '../Label';
11
+ import VStack from '../VStack';
11
12
 
12
13
  let notificationsEnabled = $state(true);
13
14
  let weeklySummaryEnabled = $state(false);
14
15
  </script>
15
16
 
16
- <div class="vstack gap-3">
17
- <Label label="Enable notifications" orientation="leading" width="fit">
17
+ <VStack gap={7.5}>
18
+ <Label label="Enable notifications" orientation="leading">
18
19
  <Switch bind:checked={notificationsEnabled} />
19
20
  </Label>
20
- <Label label="Send weekly summary" orientation="leading" width="fit">
21
+ <Label label="Send weekly summary" orientation="leading">
21
22
  <Switch bind:checked={weeklySummaryEnabled} />
22
23
  </Label>
23
- </div>
24
+ </VStack>
@@ -10,25 +10,26 @@
10
10
  TooltipProps &
11
11
  Omit<HTMLInputAttributes, 'type' | 'class' | 'style' | 'checked'>;
12
12
 
13
- let { checked = $bindable(false), tooltip, disabled = false, ...restProps }: Props = $props();
13
+ let { checked = $bindable(false), tooltip, disabled = false, ...restProps }: Props &
14
+ Record<string, unknown> = $props();
14
15
 
15
16
  const extractedStyleProps = $derived.by(() => extractStyleProps(restProps));
16
17
  const styleProps = $derived(extractedStyleProps.styleProps);
17
- const props = $derived(extractedStyleProps.restProps);
18
+ const forwardedProps = $derived(extractedStyleProps.restProps);
18
19
  const rootStyle = $derived.by(() => surfaceStyle(styleProps, 'switch'));
19
20
  </script>
20
21
 
21
- <label
22
+ <span
22
23
  class="switch"
23
24
  style={rootStyle}
24
25
  data-disabled={disabled ? 'true' : 'false'}
25
26
  use:tooltipAction={tooltip}
26
27
  >
27
- <input bind:checked type="checkbox" {disabled} {...props} />
28
+ <input bind:checked type="checkbox" {disabled} {...forwardedProps} />
28
29
  <span class="switch-track" aria-hidden="true">
29
30
  <span class="switch-thumb"></span>
30
31
  </span>
31
- </label>
32
+ </span>
32
33
 
33
34
  <style>
34
35
  .switch {
@@ -4,6 +4,7 @@ import type { TooltipProps } from '../../../style/tooltip';
4
4
  type Props = {
5
5
  checked?: boolean;
6
6
  } & StyleProps & TooltipProps & Omit<HTMLInputAttributes, 'type' | 'class' | 'style' | 'checked'>;
7
- declare const Switch: import("svelte").Component<Props, {}, "checked">;
7
+ type $$ComponentProps = Props & Record<string, unknown>;
8
+ declare const Switch: import("svelte").Component<$$ComponentProps, {}, "checked">;
8
9
  type Switch = ReturnType<typeof Switch>;
9
10
  export default Switch;
@@ -6,6 +6,7 @@
6
6
  type Props = {
7
7
  key?: string;
8
8
  label: string;
9
+ header?: TableColumn<T>['header'];
9
10
  value?: keyof T | ((row: T) => unknown);
10
11
  cell?: TableColumn<T>['cell'];
11
12
  width?: number | string;
@@ -22,6 +23,7 @@
22
23
  let {
23
24
  key,
24
25
  label,
26
+ header,
25
27
  value,
26
28
  cell,
27
29
  width,
@@ -40,6 +42,7 @@
40
42
  const snapshot = (): TableColumn<T> => ({
41
43
  key,
42
44
  label,
45
+ header,
43
46
  value,
44
47
  cell,
45
48
  width,
@@ -3,6 +3,7 @@ declare function $$render<T extends Record<string, unknown>>(): {
3
3
  props: {
4
4
  key?: string;
5
5
  label: string;
6
+ header?: TableColumn<T>["header"];
6
7
  value?: keyof T | ((row: T) => unknown);
7
8
  cell?: TableColumn<T>["cell"];
8
9
  width?: number | string;
@@ -5,6 +5,12 @@
5
5
  owner: string;
6
6
  status: 'Active' | 'Paused' | 'Review';
7
7
  budget: number;
8
+ region: string;
9
+ phase: string;
10
+ priority: string;
11
+ launch: string;
12
+ risk: string;
13
+ updated: string;
8
14
  };
9
15
 
10
16
  export const demo = {
@@ -20,22 +26,214 @@
20
26
  import type { TableSortDescriptor } from './types';
21
27
 
22
28
  const rows: Project[] = [
23
- { id: 1, name: 'Atlas', owner: 'Mika', status: 'Active', budget: 18200 },
24
- { id: 2, name: 'Beacon', owner: 'Nia', status: 'Review', budget: 9400 },
25
- { id: 3, name: 'Canopy', owner: 'Tao', status: 'Paused', budget: 12650 },
26
- { id: 4, name: 'Drift', owner: 'Ari', status: 'Active', budget: 22100 },
27
- { id: 5, name: 'Ember', owner: 'Sana', status: 'Review', budget: 15840 },
28
- { id: 6, name: 'Fjord', owner: 'Leo', status: 'Active', budget: 27600 },
29
- { id: 7, name: 'Grove', owner: 'Ilya', status: 'Paused', budget: 7300 },
30
- { id: 8, name: 'Harbor', owner: 'Noor', status: 'Active', budget: 31450 },
31
- { id: 9, name: 'Ion', owner: 'Mika', status: 'Review', budget: 11900 },
32
- { id: 10, name: 'Juno', owner: 'Tao', status: 'Active', budget: 19875 },
33
- { id: 11, name: 'Keystone', owner: 'Ari', status: 'Paused', budget: 14620 },
34
- { id: 12, name: 'Lumen', owner: 'Nia', status: 'Review', budget: 24880 },
35
- { id: 13, name: 'Meridian', owner: 'Sana', status: 'Active', budget: 33750 },
36
- { id: 14, name: 'Nimbus', owner: 'Leo', status: 'Paused', budget: 6800 },
37
- { id: 15, name: 'Orchid', owner: 'Ilya', status: 'Active', budget: 17340 },
38
- { id: 16, name: 'Pulse', owner: 'Noor', status: 'Review', budget: 20410 }
29
+ {
30
+ id: 1,
31
+ name: 'Atlas',
32
+ owner: 'Mika',
33
+ status: 'Active',
34
+ budget: 18200,
35
+ region: 'North America',
36
+ phase: 'Discovery',
37
+ priority: 'High',
38
+ launch: 'Q2 2026',
39
+ risk: 'Low',
40
+ updated: 'Today'
41
+ },
42
+ {
43
+ id: 2,
44
+ name: 'Beacon',
45
+ owner: 'Nia',
46
+ status: 'Review',
47
+ budget: 9400,
48
+ region: 'Europe',
49
+ phase: 'Design',
50
+ priority: 'Medium',
51
+ launch: 'Q3 2026',
52
+ risk: 'Medium',
53
+ updated: 'Yesterday'
54
+ },
55
+ {
56
+ id: 3,
57
+ name: 'Canopy',
58
+ owner: 'Tao',
59
+ status: 'Paused',
60
+ budget: 12650,
61
+ region: 'Asia Pacific',
62
+ phase: 'Build',
63
+ priority: 'Low',
64
+ launch: 'Q4 2026',
65
+ risk: 'High',
66
+ updated: 'May 12'
67
+ },
68
+ {
69
+ id: 4,
70
+ name: 'Drift',
71
+ owner: 'Ari',
72
+ status: 'Active',
73
+ budget: 22100,
74
+ region: 'Latin America',
75
+ phase: 'Launch',
76
+ priority: 'High',
77
+ launch: 'Q1 2027',
78
+ risk: 'Low',
79
+ updated: 'May 10'
80
+ },
81
+ {
82
+ id: 5,
83
+ name: 'Ember',
84
+ owner: 'Sana',
85
+ status: 'Review',
86
+ budget: 15840,
87
+ region: 'Middle East',
88
+ phase: 'Validation',
89
+ priority: 'Medium',
90
+ launch: 'Q2 2027',
91
+ risk: 'Medium',
92
+ updated: 'May 8'
93
+ },
94
+ {
95
+ id: 6,
96
+ name: 'Fjord',
97
+ owner: 'Leo',
98
+ status: 'Active',
99
+ budget: 27600,
100
+ region: 'Nordics',
101
+ phase: 'Build',
102
+ priority: 'High',
103
+ launch: 'Q3 2027',
104
+ risk: 'Low',
105
+ updated: 'May 7'
106
+ },
107
+ {
108
+ id: 7,
109
+ name: 'Grove',
110
+ owner: 'Ilya',
111
+ status: 'Paused',
112
+ budget: 7300,
113
+ region: 'Africa',
114
+ phase: 'Planning',
115
+ priority: 'Low',
116
+ launch: 'Q4 2027',
117
+ risk: 'High',
118
+ updated: 'May 5'
119
+ },
120
+ {
121
+ id: 8,
122
+ name: 'Harbor',
123
+ owner: 'Noor',
124
+ status: 'Active',
125
+ budget: 31450,
126
+ region: 'Oceania',
127
+ phase: 'Scale',
128
+ priority: 'High',
129
+ launch: 'Q1 2028',
130
+ risk: 'Medium',
131
+ updated: 'May 3'
132
+ },
133
+ {
134
+ id: 9,
135
+ name: 'Ion',
136
+ owner: 'Mika',
137
+ status: 'Review',
138
+ budget: 11900,
139
+ region: 'North America',
140
+ phase: 'Research',
141
+ priority: 'Medium',
142
+ launch: 'Q2 2028',
143
+ risk: 'Low',
144
+ updated: 'May 1'
145
+ },
146
+ {
147
+ id: 10,
148
+ name: 'Juno',
149
+ owner: 'Tao',
150
+ status: 'Active',
151
+ budget: 19875,
152
+ region: 'Europe',
153
+ phase: 'Delivery',
154
+ priority: 'High',
155
+ launch: 'Q3 2028',
156
+ risk: 'Medium',
157
+ updated: 'Apr 29'
158
+ },
159
+ {
160
+ id: 11,
161
+ name: 'Keystone',
162
+ owner: 'Ari',
163
+ status: 'Paused',
164
+ budget: 14620,
165
+ region: 'Asia Pacific',
166
+ phase: 'Planning',
167
+ priority: 'Low',
168
+ launch: 'Q4 2028',
169
+ risk: 'High',
170
+ updated: 'Apr 27'
171
+ },
172
+ {
173
+ id: 12,
174
+ name: 'Lumen',
175
+ owner: 'Nia',
176
+ status: 'Review',
177
+ budget: 24880,
178
+ region: 'Latin America',
179
+ phase: 'Validation',
180
+ priority: 'Medium',
181
+ launch: 'Q1 2029',
182
+ risk: 'Low',
183
+ updated: 'Apr 24'
184
+ },
185
+ {
186
+ id: 13,
187
+ name: 'Meridian',
188
+ owner: 'Sana',
189
+ status: 'Active',
190
+ budget: 33750,
191
+ region: 'Middle East',
192
+ phase: 'Scale',
193
+ priority: 'High',
194
+ launch: 'Q2 2029',
195
+ risk: 'Medium',
196
+ updated: 'Apr 22'
197
+ },
198
+ {
199
+ id: 14,
200
+ name: 'Nimbus',
201
+ owner: 'Leo',
202
+ status: 'Paused',
203
+ budget: 6800,
204
+ region: 'Nordics',
205
+ phase: 'Discovery',
206
+ priority: 'Low',
207
+ launch: 'Q3 2029',
208
+ risk: 'High',
209
+ updated: 'Apr 20'
210
+ },
211
+ {
212
+ id: 15,
213
+ name: 'Orchid',
214
+ owner: 'Ilya',
215
+ status: 'Active',
216
+ budget: 17340,
217
+ region: 'Africa',
218
+ phase: 'Launch',
219
+ priority: 'Medium',
220
+ launch: 'Q4 2029',
221
+ risk: 'Low',
222
+ updated: 'Apr 18'
223
+ },
224
+ {
225
+ id: 16,
226
+ name: 'Pulse',
227
+ owner: 'Noor',
228
+ status: 'Review',
229
+ budget: 20410,
230
+ region: 'Oceania',
231
+ phase: 'Build',
232
+ priority: 'High',
233
+ launch: 'Q1 2030',
234
+ risk: 'Medium',
235
+ updated: 'Apr 16'
236
+ }
39
237
  ];
40
238
 
41
239
  let selection = $state<Set<number>>(new Set([1, 4]));
@@ -72,7 +270,15 @@
72
270
  })}
73
271
  {/snippet}
74
272
 
75
- <Table data={rows} bind:selection bind:sortOrder selectionMode="multiple">
273
+ <Table
274
+ data={rows}
275
+ bind:selection
276
+ bind:sortOrder
277
+ selectionMode="multiple"
278
+ virtualized
279
+ rowHeight={48}
280
+ height="100%"
281
+ >
76
282
  <Table.Column label="Project" sortKey="name" sortable minWidth={160}>
77
283
  {#snippet cell(project: Project)}
78
284
  {@render projectCell(project)}
@@ -96,6 +302,13 @@
96
302
  {@render budgetCell(project)}
97
303
  {/snippet}
98
304
  </Table.Column>
305
+
306
+ <Table.Column label="Region" value="region" sortKey="region" sortable minWidth={150} />
307
+ <Table.Column label="Phase" value="phase" sortKey="phase" sortable minWidth={120} />
308
+ <Table.Column label="Priority" value="priority" sortKey="priority" sortable minWidth={112} />
309
+ <Table.Column label="Launch" value="launch" sortKey="launch" sortable minWidth={112} />
310
+ <Table.Column label="Risk" value="risk" sortKey="risk" sortable minWidth={104} />
311
+ <Table.Column label="Updated" value="updated" sortKey="updated" sortable minWidth={120} />
99
312
  </Table>
100
313
 
101
314
  <style>