@warkypublic/svelix 0.1.44 → 0.1.47

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 (109) hide show
  1. package/README.md +93 -33
  2. package/dist/components/BetterMenu/BetterMenu.svelte +21 -37
  3. package/dist/components/BetterMenu/BetterMenuAsyncButton.svelte +21 -31
  4. package/dist/components/BetterMenu/BetterMenuPreview.svelte +27 -29
  5. package/dist/components/BetterMenu/MenuRenderer.svelte +40 -51
  6. package/dist/components/Boxer/Boxer.svelte +488 -602
  7. package/dist/components/Boxer/BoxerTarget.svelte +6 -46
  8. package/dist/components/Boxer/BoxerTarget.svelte.d.ts +1 -0
  9. package/dist/components/Boxer/types.d.ts +0 -1
  10. package/dist/components/Button.svelte +19 -43
  11. package/dist/components/ButtonPreview.svelte +2 -11
  12. package/dist/components/CardGrid/CardGrid.svelte +1141 -0
  13. package/dist/components/CardGrid/CardGrid.svelte.d.ts +61 -0
  14. package/dist/components/CardGrid/CardGridFilterPanel.svelte +320 -0
  15. package/dist/components/CardGrid/CardGridFilterPanel.svelte.d.ts +11 -0
  16. package/dist/components/CardGrid/DefaultCard.svelte +287 -0
  17. package/dist/components/CardGrid/DefaultCard.svelte.d.ts +10 -0
  18. package/dist/components/CardGrid/ImageCardStory.svelte +308 -0
  19. package/dist/components/CardGrid/ImageCardStory.svelte.d.ts +18 -0
  20. package/dist/components/CardGrid/cardGrid.d.ts +33 -0
  21. package/dist/components/CardGrid/cardGrid.js +21 -0
  22. package/dist/components/CardGrid/index.d.ts +4 -0
  23. package/dist/components/CardGrid/index.js +4 -0
  24. package/dist/components/ContentEditor/CollaboraInsertTextDemo.svelte +5 -10
  25. package/dist/components/ContentEditor/ContentEditor.svelte +24 -50
  26. package/dist/components/ContentEditor/subcomponents/AudioPlayer.svelte +17 -17
  27. package/dist/components/ContentEditor/subcomponents/CollaboraEditor.svelte +244 -309
  28. package/dist/components/ContentEditor/subcomponents/EmailViewer.svelte +2 -3
  29. package/dist/components/ContentEditor/subcomponents/ImageViewer.svelte +14 -15
  30. package/dist/components/ContentEditor/subcomponents/MarkdownViewer.svelte +74 -90
  31. package/dist/components/ContentEditor/subcomponents/MonacoEditor.svelte +75 -103
  32. package/dist/components/ContentEditor/subcomponents/Office365Editor.svelte +234 -297
  33. package/dist/components/ContentEditor/subcomponents/PdfViewer.svelte +14 -20
  34. package/dist/components/ContentEditor/subcomponents/TextEditor.svelte +122 -150
  35. package/dist/components/ContentEditor/subcomponents/UnknownFile.svelte +105 -126
  36. package/dist/components/ContentEditor/subcomponents/VideoPlayer.svelte +17 -17
  37. package/dist/components/ContentEditor/subcomponents/ZipViewer.svelte +2 -3
  38. package/dist/components/ErrorBoundary/ErrorBoundary.svelte +41 -58
  39. package/dist/components/ErrorBoundary/ErrorBoundaryPreview.svelte +8 -16
  40. package/dist/components/Former/Former.svelte +306 -424
  41. package/dist/components/Former/FormerButtonArea.svelte +17 -68
  42. package/dist/components/Former/FormerDrawer.svelte +26 -78
  43. package/dist/components/Former/FormerDrawerPreview.svelte +99 -89
  44. package/dist/components/Former/FormerModal.svelte +24 -70
  45. package/dist/components/Former/FormerModalPreview.svelte +99 -89
  46. package/dist/components/Former/FormerPreview.svelte +76 -78
  47. package/dist/components/Former/FormerRestApiPreview.svelte +55 -48
  48. package/dist/components/FormerControllers/ButtonCtrl.svelte +13 -44
  49. package/dist/components/FormerControllers/DateTimeCtrl/DateTimeCtrl.svelte +280 -445
  50. package/dist/components/FormerControllers/DateTimeCtrl/DateTimeCtrlCalendar.svelte +95 -136
  51. package/dist/components/FormerControllers/DateTimeCtrl/DateTimeCtrlPickerPanel.svelte +3 -62
  52. package/dist/components/FormerControllers/DateTimeCtrl/DateTimeCtrlTimeFields.svelte +143 -217
  53. package/dist/components/FormerControllers/IconButtonCtrl.svelte +13 -42
  54. package/dist/components/FormerControllers/InlineWrapper.svelte +12 -41
  55. package/dist/components/FormerControllers/InlineWrapperPreview.svelte +4 -26
  56. package/dist/components/FormerControllers/NativeSelectCtrl.svelte +3 -29
  57. package/dist/components/FormerControllers/NumberInputCtrl.svelte +9 -35
  58. package/dist/components/FormerControllers/PasswordInputCtrl.svelte +4 -23
  59. package/dist/components/FormerControllers/SwitchCtrl.svelte +3 -20
  60. package/dist/components/FormerControllers/TextAreaCtrl.svelte +3 -24
  61. package/dist/components/FormerControllers/TextInputCtrl.svelte +3 -24
  62. package/dist/components/GlobalStateStore/GlobalStateStoreProvider.svelte +73 -120
  63. package/dist/components/Gridler/components/Gridler.svelte +338 -442
  64. package/dist/components/Gridler/components/GridlerCanvas.svelte +720 -1115
  65. package/dist/components/Gridler/components/GridlerEditor.svelte +2 -15
  66. package/dist/components/Gridler/components/GridlerFull.svelte +520 -841
  67. package/dist/components/Gridler/components/GridlerFull.svelte.d.ts +1 -1
  68. package/dist/components/Gridler/components/GridlerFullWithFormerPreview.svelte +194 -147
  69. package/dist/components/Gridler/components/GridlerSearch.svelte +7 -16
  70. package/dist/components/Gridler/components/GridlerSearchToggle.svelte +7 -19
  71. package/dist/components/Gridler/types.d.ts +1 -1
  72. package/dist/components/Icons/IconAdd.svelte +1 -3
  73. package/dist/components/Icons/IconAlertCircle.svelte +1 -3
  74. package/dist/components/Icons/IconAlertTriangle.svelte +1 -3
  75. package/dist/components/Icons/IconCamera.svelte +1 -3
  76. package/dist/components/Icons/IconClose.svelte +1 -3
  77. package/dist/components/Icons/IconEdit.svelte +1 -3
  78. package/dist/components/Icons/IconFilter.svelte +1 -3
  79. package/dist/components/Icons/IconSearch.svelte +1 -3
  80. package/dist/components/Icons/IconSort.svelte +1 -3
  81. package/dist/components/Icons/IconTrash.svelte +1 -3
  82. package/dist/components/Portal/Portal.svelte +14 -38
  83. package/dist/components/Screenshot/Screenshot.svelte +7 -13
  84. package/dist/components/Svark/Svark.svelte +680 -852
  85. package/dist/components/Svark/SvarkContextMenu.svelte +44 -63
  86. package/dist/components/Svark/SvarkInfiniteLoader.svelte +2 -6
  87. package/dist/components/Svark/SvarkPager.svelte +2 -28
  88. package/dist/components/Svark/SvarkSelectionDemo.svelte +4 -8
  89. package/dist/components/Svark/SvarkTopBar.svelte +9 -74
  90. package/dist/components/SvarkGrid/SvarkGrid.svelte +877 -1123
  91. package/dist/components/SvarkGrid/components/SvarkColumnFilterForm.svelte +45 -58
  92. package/dist/components/SvarkGrid/components/SvarkContextMenu.svelte +44 -63
  93. package/dist/components/SvarkGrid/components/SvarkHeaderFilterCell.svelte +41 -75
  94. package/dist/components/SvarkGrid/components/SvarkInfiniteLoader.svelte +2 -6
  95. package/dist/components/SvarkGrid/components/SvarkPager.svelte +2 -28
  96. package/dist/components/SvarkGrid/components/SvarkSearchPopover.svelte +8 -16
  97. package/dist/components/SvarkGrid/components/SvarkTopBar.svelte +6 -62
  98. package/dist/components/SvarkGrid/internal/SvarkGridView.svelte +345 -507
  99. package/dist/components/VTree/VTree.svelte +349 -431
  100. package/dist/components/VTree/VTreeContextMenu.svelte +21 -33
  101. package/dist/components/VTree/VTreeEventsDemo.svelte +48 -58
  102. package/dist/components/VTree/VTreeRow.svelte +13 -65
  103. package/dist/components/VTree/VTreeSearch.svelte +6 -13
  104. package/dist/components/VTree/VTreeVirtualViewport.svelte +37 -106
  105. package/dist/components/index.d.ts +1 -0
  106. package/dist/components/index.js +1 -0
  107. package/llm/COMPONENT_GUIDE.md +240 -0
  108. package/llm/plans/card_grid.plan.md +305 -0
  109. package/package.json +48 -46
@@ -1,6 +1,6 @@
1
1
  import type { Snippet } from "svelte";
2
2
  import type { GridlerCell, GridlerColumn, GridlerContextMenuItem, GridlerProps, Item } from "../types";
3
- export interface Props extends Omit<Partial<GridlerProps>, "columns" | "rows" | "getCellContent" | "searchValue" | "onSearchValueChange" | "onVisibleRangeChange" | "onCellDblClick" | "onRowClick" | "onRowContextMenu"> {
3
+ export interface Props extends Omit<Partial<GridlerProps>, "columns" | "rows" | "getCellContent" | "searchValue" | "onSearchValueChange" | "onVisibleRangeChange" | "onCellDblClick" | "onRowClick" | "onRowContextMenu" | "onColumnsChange"> {
4
4
  columns: GridlerColumn[];
5
5
  /**
6
6
  * Optional row data. When provided (and `getCellContent` is omitted), the default
@@ -1,150 +1,197 @@
1
- <script lang="ts">
2
- import GridlerFull from './GridlerFull.svelte';
3
- import FormerDrawer from '../../Former/FormerDrawer.svelte';
4
- import TextInputCtrl from '../../FormerControllers/TextInputCtrl.svelte';
5
- import NumberInputCtrl from '../../FormerControllers/NumberInputCtrl.svelte';
6
- import NativeSelectCtrl from '../../FormerControllers/NativeSelectCtrl.svelte';
7
- import type { FormRequestType } from '../../Former/types';
8
- import type { GridlerContextMenuItem } from '../types';
9
- import IconEdit from '../../Icons/IconEdit.svelte';
10
- import IconTrash from '../../Icons/IconTrash.svelte';
11
- import { iconAddSvg, iconEditSvg, iconTrashSvg } from '../../Icons/strings';
12
-
13
- interface EmployeeRow {
14
- id: number;
15
- name: string;
16
- email: string;
17
- department: string;
18
- salary: number;
19
- status: string;
20
- }
21
-
22
- const DEPARTMENTS = ['Engineering', 'Marketing', 'Sales', 'HR', 'Finance', 'Operations'];
23
- const STATUSES = ['Active', 'Pending', 'Inactive'];
24
- const FIRST = ['Alice', 'Bob', 'Carol', 'David', 'Eve', 'Frank', 'Grace', 'Henry'];
25
- const LAST = ['Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia'];
26
-
27
- function makeRow(i: number): EmployeeRow {
28
- const first = FIRST[i % FIRST.length];
29
- const last = LAST[Math.floor(i / FIRST.length) % LAST.length];
30
- return {
31
- id: i + 1,
32
- name: `${first} ${last}`,
33
- email: `${first.toLowerCase()}.${last.toLowerCase()}@example.com`,
34
- department: DEPARTMENTS[i % DEPARTMENTS.length],
35
- salary: 40000 + (i % 60) * 1000,
36
- status: STATUSES[i % STATUSES.length],
37
- };
38
- }
39
-
40
- const columns = [
41
- { id: 'id', title: 'ID', width: 70 },
42
- { id: 'name', title: 'Name', width: 180 },
43
- { id: 'email', title: 'Email', width: 220 },
44
- { id: 'department', title: 'Department', width: 150 },
45
- { id: 'salary', title: 'Salary', width: 110 },
46
- { id: 'status', title: 'Status', width: 110 },
47
- ];
48
-
49
- const departmentOptions = DEPARTMENTS.map((d) => ({ label: d, value: d }));
50
- const statusOptions = STATUSES.map((s) => ({ label: s, value: s }));
51
-
52
- let nextId = 51;
53
- let rows = $state<Record<string, unknown>[]>(
54
- Array.from({ length: 50 }, (_, i) => makeRow(i) as unknown as Record<string, unknown>),
55
- );
56
-
57
- // ── Drawer state ─────────────────────────────────────────────────────────────
58
-
59
- let drawerOpen = $state(false);
60
- let formMode = $state<FormRequestType>('update');
61
- let formValues = $state<EmployeeRow | undefined>(undefined);
62
- let lastSaved = $state<EmployeeRow | undefined>(undefined);
63
-
64
- function openForm(mode: FormRequestType, row?: EmployeeRow) {
65
- formMode = mode;
66
- formValues = row ? { ...row } : { id: 0, name: '', email: '', department: '', salary: 50000, status: 'Active' };
67
- drawerOpen = true;
68
- }
69
-
70
- const drawerTitle = $derived(
71
- formMode === 'insert' ? 'Add Employee' : formMode === 'delete' ? 'Delete Employee' : 'Edit Employee',
72
- );
73
-
74
- // ── Selection tracking ────────────────────────────────────────────────────────
75
-
76
- let selectedItems = $state<Record<string, unknown>[]>([]);
77
-
78
- function firstSelected(): EmployeeRow | undefined {
79
- const item = selectedItems[0];
80
- return item ? (item as unknown as EmployeeRow) : undefined;
81
- }
82
-
83
- // ── Burger menu items ─────────────────────────────────────────────────────────
84
-
85
- const menuItems: GridlerContextMenuItem[] = [
86
- { id: 'add', label: 'Add', icon: iconAddSvg, kind: 'item', onselect: () => openForm('insert') },
87
- { id: 'sep1', label: '', kind: 'separator' },
88
- {
89
- id: 'edit',
90
- label: 'Edit Selected',
91
- icon: iconEditSvg,
92
- kind: 'item',
93
- onselect: () => {
94
- const row = firstSelected();
95
- if (row) openForm('update', row);
96
- },
97
- },
98
- {
99
- id: 'delete',
100
- label: 'Delete Selected',
101
- icon: iconTrashSvg,
102
- kind: 'item',
103
- onselect: () => {
104
- const row = firstSelected();
105
- if (row) openForm('delete', row);
106
- },
107
- },
108
- ];
109
-
110
- // ── Context menu (right-click on row) ─────────────────────────────────────────
111
-
112
- let ctxVisible = $state(false);
113
- let ctxX = $state(0);
114
- let ctxY = $state(0);
115
- let ctxRow = $state<EmployeeRow | undefined>(undefined);
116
- let wrapperEl = $state<HTMLElement | null>(null);
117
- let lastMousePos = { x: 0, y: 0 };
118
-
119
- // Capture phase fires before the canvas handler, so lastMousePos is fresh when
120
- // onRowContextMenu calls showContextMenu.
121
- $effect(() => {
122
- if (!wrapperEl) return;
123
- const handler = (e: MouseEvent) => { lastMousePos = { x: e.clientX, y: e.clientY }; };
124
- wrapperEl.addEventListener('contextmenu', handler, true);
125
- return () => wrapperEl?.removeEventListener('contextmenu', handler, true);
126
- });
127
-
128
- function showContextMenu(rowData: Record<string, unknown> | undefined) {
129
- if (!rowData) return;
130
- ctxRow = rowData as unknown as EmployeeRow;
131
- ctxX = lastMousePos.x;
132
- ctxY = lastMousePos.y;
133
- ctxVisible = true;
134
-
135
- const close = () => {
136
- ctxVisible = false;
137
- document.removeEventListener('click', close, true);
138
- document.removeEventListener('keydown', closeOnEsc, true);
139
- };
140
- const closeOnEsc = (e: KeyboardEvent) => {
141
- if (e.key === 'Escape') close();
142
- };
143
- setTimeout(() => {
144
- document.addEventListener('click', close, true);
145
- document.addEventListener('keydown', closeOnEsc, true);
146
- }, 0);
147
- }
1
+ <script lang="ts">import GridlerFull from "./GridlerFull.svelte";
2
+ import FormerDrawer from "../../Former/FormerDrawer.svelte";
3
+ import TextInputCtrl from "../../FormerControllers/TextInputCtrl.svelte";
4
+ import NumberInputCtrl from "../../FormerControllers/NumberInputCtrl.svelte";
5
+ import NativeSelectCtrl from "../../FormerControllers/NativeSelectCtrl.svelte";
6
+ import IconEdit from "../../Icons/IconEdit.svelte";
7
+ import IconTrash from "../../Icons/IconTrash.svelte";
8
+ import { iconAddSvg, iconEditSvg, iconTrashSvg } from "../../Icons/strings";
9
+ const DEPARTMENTS = [
10
+ "Engineering",
11
+ "Marketing",
12
+ "Sales",
13
+ "HR",
14
+ "Finance",
15
+ "Operations"
16
+ ];
17
+ const STATUSES = [
18
+ "Active",
19
+ "Pending",
20
+ "Inactive"
21
+ ];
22
+ const FIRST = [
23
+ "Alice",
24
+ "Bob",
25
+ "Carol",
26
+ "David",
27
+ "Eve",
28
+ "Frank",
29
+ "Grace",
30
+ "Henry"
31
+ ];
32
+ const LAST = [
33
+ "Smith",
34
+ "Johnson",
35
+ "Williams",
36
+ "Brown",
37
+ "Jones",
38
+ "Garcia"
39
+ ];
40
+ function makeRow(i) {
41
+ const first = FIRST[i % FIRST.length];
42
+ const last = LAST[Math.floor(i / FIRST.length) % LAST.length];
43
+ return {
44
+ id: i + 1,
45
+ name: `${first} ${last}`,
46
+ email: `${first.toLowerCase()}.${last.toLowerCase()}@example.com`,
47
+ department: DEPARTMENTS[i % DEPARTMENTS.length],
48
+ salary: 4e4 + i % 60 * 1e3,
49
+ status: STATUSES[i % STATUSES.length]
50
+ };
51
+ }
52
+ const columns = [
53
+ {
54
+ id: "id",
55
+ title: "ID",
56
+ width: 70
57
+ },
58
+ {
59
+ id: "name",
60
+ title: "Name",
61
+ width: 180
62
+ },
63
+ {
64
+ id: "email",
65
+ title: "Email",
66
+ width: 220
67
+ },
68
+ {
69
+ id: "department",
70
+ title: "Department",
71
+ width: 150
72
+ },
73
+ {
74
+ id: "salary",
75
+ title: "Salary",
76
+ width: 110
77
+ },
78
+ {
79
+ id: "status",
80
+ title: "Status",
81
+ width: 110
82
+ }
83
+ ];
84
+ const departmentOptions = DEPARTMENTS.map((d) => ({
85
+ label: d,
86
+ value: d
87
+ }));
88
+ const statusOptions = STATUSES.map((s) => ({
89
+ label: s,
90
+ value: s
91
+ }));
92
+ let nextId = 51;
93
+ let rows = $state(Array.from({ length: 50 }, (_, i) => makeRow(i)));
94
+ // ── Drawer state ─────────────────────────────────────────────────────────────
95
+ let drawerOpen = $state(false);
96
+ let formMode = $state("update");
97
+ let formValues = $state(undefined);
98
+ let lastSaved = $state(undefined);
99
+ function openForm(mode, row) {
100
+ formMode = mode;
101
+ formValues = row ? { ...row } : {
102
+ id: 0,
103
+ name: "",
104
+ email: "",
105
+ department: "",
106
+ salary: 5e4,
107
+ status: "Active"
108
+ };
109
+ drawerOpen = true;
110
+ }
111
+ const drawerTitle = $derived(formMode === "insert" ? "Add Employee" : formMode === "delete" ? "Delete Employee" : "Edit Employee");
112
+ // ── Selection tracking ────────────────────────────────────────────────────────
113
+ let selectedItems = $state([]);
114
+ function firstSelected() {
115
+ const item = selectedItems[0];
116
+ return item ? item : undefined;
117
+ }
118
+ // ── Burger menu items ─────────────────────────────────────────────────────────
119
+ const menuItems = [
120
+ {
121
+ id: "add",
122
+ label: "Add",
123
+ icon: iconAddSvg,
124
+ kind: "item",
125
+ onselect: () => openForm("insert")
126
+ },
127
+ {
128
+ id: "sep1",
129
+ label: "",
130
+ kind: "separator"
131
+ },
132
+ {
133
+ id: "edit",
134
+ label: "Edit Selected",
135
+ icon: iconEditSvg,
136
+ kind: "item",
137
+ onselect: () => {
138
+ const row = firstSelected();
139
+ if (row) openForm("update", row);
140
+ }
141
+ },
142
+ {
143
+ id: "delete",
144
+ label: "Delete Selected",
145
+ icon: iconTrashSvg,
146
+ kind: "item",
147
+ onselect: () => {
148
+ const row = firstSelected();
149
+ if (row) openForm("delete", row);
150
+ }
151
+ }
152
+ ];
153
+ // ── Context menu (right-click on row) ─────────────────────────────────────────
154
+ let ctxVisible = $state(false);
155
+ let ctxX = $state(0);
156
+ let ctxY = $state(0);
157
+ let ctxRow = $state(undefined);
158
+ let wrapperEl = $state(null);
159
+ let lastMousePos = {
160
+ x: 0,
161
+ y: 0
162
+ };
163
+ // Capture phase fires before the canvas handler, so lastMousePos is fresh when
164
+ // onRowContextMenu calls showContextMenu.
165
+ $effect(() => {
166
+ if (!wrapperEl) return;
167
+ const handler = (e) => {
168
+ lastMousePos = {
169
+ x: e.clientX,
170
+ y: e.clientY
171
+ };
172
+ };
173
+ wrapperEl.addEventListener("contextmenu", handler, true);
174
+ return () => wrapperEl?.removeEventListener("contextmenu", handler, true);
175
+ });
176
+ function showContextMenu(rowData) {
177
+ if (!rowData) return;
178
+ ctxRow = rowData;
179
+ ctxX = lastMousePos.x;
180
+ ctxY = lastMousePos.y;
181
+ ctxVisible = true;
182
+ const close = () => {
183
+ ctxVisible = false;
184
+ document.removeEventListener("click", close, true);
185
+ document.removeEventListener("keydown", closeOnEsc, true);
186
+ };
187
+ const closeOnEsc = (e) => {
188
+ if (e.key === "Escape") close();
189
+ };
190
+ setTimeout(() => {
191
+ document.addEventListener("click", close, true);
192
+ document.addEventListener("keydown", closeOnEsc, true);
193
+ }, 0);
194
+ }
148
195
  </script>
149
196
 
150
197
  <div class="p-4 space-y-2" bind:this={wrapperEl}>
@@ -1,19 +1,10 @@
1
- <script lang="ts">
2
- // @ts-nocheck
3
- import IconClose from '../../Icons/IconClose.svelte';
4
- interface Props {
5
- value: string;
6
- onValueChange: (v: string) => void;
7
- onClose?: () => void;
8
- }
9
-
10
- const { value, onValueChange, onClose }: Props = $props();
11
-
12
- let inputRef: HTMLInputElement | undefined;
13
-
14
- export function focus() {
15
- inputRef?.focus();
16
- }
1
+ <script lang="ts">// @ts-nocheck
2
+ import IconClose from "../../Icons/IconClose.svelte";
3
+ const { value, onValueChange, onClose } = $props();
4
+ let inputRef;
5
+ export function focus() {
6
+ inputRef?.focus();
7
+ }
17
8
  </script>
18
9
 
19
10
  <div class="gridler-search" role="search">
@@ -1,22 +1,10 @@
1
- <script lang="ts">
2
- import GridlerSearch from './GridlerSearch.svelte';
3
- import IconSearch from '../../Icons/IconSearch.svelte';
4
-
5
- interface Props {
6
- show: boolean;
7
- value: string;
8
- onToggle: () => void;
9
- onValueChange: (v: string) => void;
10
- onClose: () => void;
11
- }
12
-
13
- const { show, value, onToggle, onValueChange, onClose }: Props = $props();
14
-
15
- let search: GridlerSearch | undefined = $state();
16
-
17
- $effect(() => {
18
- if (show) search?.focus();
19
- });
1
+ <script lang="ts">import GridlerSearch from "./GridlerSearch.svelte";
2
+ import IconSearch from "../../Icons/IconSearch.svelte";
3
+ const { show, value, onToggle, onValueChange, onClose } = $props();
4
+ let search = $state();
5
+ $effect(() => {
6
+ if (show) search?.focus();
7
+ });
20
8
  </script>
21
9
 
22
10
  <button
@@ -124,7 +124,7 @@ export interface ScrollState {
124
124
  * selectedItems, onSelectedItemsChange,
125
125
  * dataSource, dataSourceOptions, data, onDataChange, settings
126
126
  */
127
- export interface GridlerProps extends GridCommonProps<Record<string, unknown>> {
127
+ export interface GridlerProps extends Omit<GridCommonProps<Record<string, unknown>>, 'onCellDblClick' | 'onColumnsChange'> {
128
128
  /** Override with the more specific GridlerColumn type. */
129
129
  columns: GridlerColumn[];
130
130
  /** Total number of data rows. */
@@ -1,6 +1,4 @@
1
- <script lang="ts">
2
- interface Props { size?: number; class?: string; }
3
- const { size = 16, class: cls = '' }: Props = $props();
1
+ <script lang="ts">const { size = 16, class: cls = "" } = $props();
4
2
  </script>
5
3
  <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class={cls} aria-hidden="true">
6
4
  <circle cx="12" cy="12" r="9"/>
@@ -1,6 +1,4 @@
1
- <script lang="ts">
2
- interface Props { size?: number; class?: string; }
3
- const { size = 16, class: cls = '' }: Props = $props();
1
+ <script lang="ts">const { size = 16, class: cls = "" } = $props();
4
2
  </script>
5
3
  <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class={cls} aria-hidden="true">
6
4
  <circle cx="12" cy="12" r="10"/>
@@ -1,6 +1,4 @@
1
- <script lang="ts">
2
- interface Props { size?: number; class?: string; }
3
- const { size = 16, class: cls = '' }: Props = $props();
1
+ <script lang="ts">const { size = 16, class: cls = "" } = $props();
4
2
  </script>
5
3
  <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class={cls} aria-hidden="true">
6
4
  <path d="m10.29 3.86-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.71-3.14l-8-14a2 2 0 0 0-3.42 0z"/>
@@ -1,6 +1,4 @@
1
- <script lang="ts">
2
- interface Props { size?: number; class?: string; }
3
- const { size = 16, class: cls = '' }: Props = $props();
1
+ <script lang="ts">const { size = 16, class: cls = "" } = $props();
4
2
  </script>
5
3
  <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class={cls} aria-hidden="true">
6
4
  <path d="M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z"/>
@@ -1,6 +1,4 @@
1
- <script lang="ts">
2
- interface Props { size?: number; class?: string; }
3
- const { size = 16, class: cls = '' }: Props = $props();
1
+ <script lang="ts">const { size = 16, class: cls = "" } = $props();
4
2
  </script>
5
3
  <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class={cls} aria-hidden="true">
6
4
  <path d="M18 6 6 18M6 6l12 12"/>
@@ -1,6 +1,4 @@
1
- <script lang="ts">
2
- interface Props { size?: number; class?: string; }
3
- const { size = 16, class: cls = '' }: Props = $props();
1
+ <script lang="ts">const { size = 16, class: cls = "" } = $props();
4
2
  </script>
5
3
  <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class={cls} aria-hidden="true">
6
4
  <path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/>
@@ -1,6 +1,4 @@
1
- <script lang="ts">
2
- interface Props { size?: number; class?: string; }
3
- const { size = 16, class: cls = '' }: Props = $props();
1
+ <script lang="ts">const { size = 16, class: cls = "" } = $props();
4
2
  </script>
5
3
  <svg width={size} height={size} viewBox="0 0 24 24" fill="currentColor" class={cls} aria-hidden="true">
6
4
  <path d="M3 5a1 1 0 0 1 1-1h16a1 1 0 0 1 .8 1.6L14 13.5V19a1 1 0 0 1-1.45.9l-3-1.5A1 1 0 0 1 9 17.5v-4L3.2 5.6A1 1 0 0 1 3 5Z"/>
@@ -1,6 +1,4 @@
1
- <script lang="ts">
2
- interface Props { size?: number; class?: string; }
3
- const { size = 16, class: cls = '' }: Props = $props();
1
+ <script lang="ts">const { size = 16, class: cls = "" } = $props();
4
2
  </script>
5
3
  <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class={cls} aria-hidden="true">
6
4
  <circle cx="11" cy="11" r="7"/>
@@ -1,6 +1,4 @@
1
- <script lang="ts">
2
- interface Props { direction: 'asc' | 'desc'; size?: number; class?: string; }
3
- const { direction, size = 16, class: cls = '' }: Props = $props();
1
+ <script lang="ts">const { direction, size = 16, class: cls = "" } = $props();
4
2
  </script>
5
3
  <svg width={size} height={size} viewBox="0 0 24 24" fill="currentColor" class={cls} aria-hidden="true">
6
4
  {#if direction === 'asc'}
@@ -1,6 +1,4 @@
1
- <script lang="ts">
2
- interface Props { size?: number; class?: string; }
3
- const { size = 16, class: cls = '' }: Props = $props();
1
+ <script lang="ts">const { size = 16, class: cls = "" } = $props();
4
2
  </script>
5
3
  <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class={cls} aria-hidden="true">
6
4
  <path d="M3 6h18"/>
@@ -1,43 +1,19 @@
1
- <script lang="ts" module>
2
- import type { PropsWithChildren } from "../../utils/PropsWithChildren";
3
-
4
- export interface PortalRootProps extends Required<PropsWithChildren> {
5
- /**
6
- * If true, the portal functionality is disabled and children are rendered in place.
7
- *
8
- * @default false
9
- */
10
- disabled?: boolean;
11
- /**
12
- * The HTML element to which the portal content will be appended.
13
- *
14
- * @default document.body
15
- */
16
- target?: HTMLElement;
17
- }
1
+ <script lang="ts" module>export {};
18
2
  </script>
19
3
 
20
- <script lang="ts">
21
- import { getAllContexts, mount, unmount } from "svelte";
22
-
23
- const context = getAllContexts();
24
-
25
- const {
26
- children,
27
- disabled = false,
28
- target = typeof window === "undefined" ? undefined : document.body,
29
- }: PortalRootProps = $props();
30
-
31
- $effect(() => {
32
- if (disabled || !target) {
33
- return;
34
- }
35
- const instance = mount(children, {
36
- target: target,
37
- context: context,
38
- });
39
- return () => unmount(instance);
40
- });
4
+ <script lang="ts">import { getAllContexts, mount, unmount } from "svelte";
5
+ const context = getAllContexts();
6
+ const { children, disabled = false, target = typeof window === "undefined" ? undefined : document.body } = $props();
7
+ $effect(() => {
8
+ if (disabled || !target) {
9
+ return;
10
+ }
11
+ const instance = mount(children, {
12
+ target,
13
+ context
14
+ });
15
+ return () => unmount(instance);
16
+ });
41
17
  </script>
42
18
 
43
19
  {#if disabled || !target}
@@ -1,16 +1,10 @@
1
- <script lang="ts">
2
- import { CaptureScreen } from "./Screenshot.util";
3
- import IconCamera from '../Icons/IconCamera.svelte';
4
-
5
- let screenshot = $state("");
6
-
7
- const capture = async () => {
8
- screenshot = await CaptureScreen();
9
- };
10
-
11
- const truncatedScreenshot = $derived(
12
- screenshot ? `${screenshot.substring(0, 100)}...` : "",
13
- );
1
+ <script lang="ts">import { CaptureScreen } from "./Screenshot.util";
2
+ import IconCamera from "../Icons/IconCamera.svelte";
3
+ let screenshot = $state("");
4
+ const capture = async () => {
5
+ screenshot = await CaptureScreen();
6
+ };
7
+ const truncatedScreenshot = $derived(screenshot ? `${screenshot.substring(0, 100)}...` : "");
14
8
  </script>
15
9
 
16
10
  <div class="p-4">