@lavalogic/scoria 0.40.32 → 0.40.33

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 (135) hide show
  1. package/README.md +58 -58
  2. package/dist/Components/AccordionGroup.svelte +28 -28
  3. package/dist/Components/AccordionGroupButton.svelte +60 -60
  4. package/dist/Components/Action.svelte +48 -48
  5. package/dist/Components/AlertModal.svelte +102 -102
  6. package/dist/Components/Base/ContextWrapper.svelte +45 -45
  7. package/dist/Components/Base/Pagination.svelte +135 -135
  8. package/dist/Components/Base/Snippets.svelte +25 -25
  9. package/dist/Components/BigRadioSet.svelte +34 -34
  10. package/dist/Components/Bubble.svelte +38 -38
  11. package/dist/Components/Button.svelte +83 -83
  12. package/dist/Components/Checkbox.svelte +71 -71
  13. package/dist/Components/CollapsibleCard.svelte +59 -59
  14. package/dist/Components/CollapsibleMenuGroup.svelte +43 -43
  15. package/dist/Components/ConditionBuilder/ConditionBuilder.svelte +101 -101
  16. package/dist/Components/Contexts/ContextMenu.svelte +76 -76
  17. package/dist/Components/Contexts/ContextMenuDivider.svelte +15 -15
  18. package/dist/Components/Contexts/ContextMenuOption.svelte +38 -38
  19. package/dist/Components/Contexts/Toast.svelte +71 -71
  20. package/dist/Components/Contexts/ToastContainer.svelte +34 -34
  21. package/dist/Components/Contexts/Tooltip.svelte +32 -32
  22. package/dist/Components/DataMatrixIcon.svelte +37 -37
  23. package/dist/Components/DateInput.svelte +80 -80
  24. package/dist/Components/DatePicker.svelte +86 -86
  25. package/dist/Components/DesktopModal.svelte +65 -65
  26. package/dist/Components/Dial.svelte +35 -35
  27. package/dist/Components/DimensionInput.svelte +95 -95
  28. package/dist/Components/DragMenu/DragMenuHolder.svelte +53 -53
  29. package/dist/Components/DragMenu/DraggableCard.svelte +49 -49
  30. package/dist/Components/FileCard.svelte +18 -18
  31. package/dist/Components/FileUpload.svelte +115 -115
  32. package/dist/Components/GridInput.svelte +123 -123
  33. package/dist/Components/GridInputSet.svelte +21 -21
  34. package/dist/Components/HorizontalTabGroup.svelte +54 -54
  35. package/dist/Components/HorizontalTabGroupButton.svelte +32 -32
  36. package/dist/Components/Icon.svelte +68 -68
  37. package/dist/Components/InfoAlert.svelte +32 -32
  38. package/dist/Components/LoadingAnimation.svelte +228 -227
  39. package/dist/Components/LoadingModal.svelte +19 -19
  40. package/dist/Components/LoadingOverlay.svelte +20 -20
  41. package/dist/Components/Modal.svelte +127 -127
  42. package/dist/Components/MultiSelect.svelte +126 -126
  43. package/dist/Components/Nav/Nav.svelte +71 -71
  44. package/dist/Components/Nav/NavServiceMenuList.svelte +37 -37
  45. package/dist/Components/Nav/NavTab.svelte +46 -46
  46. package/dist/Components/Nav/ServiceMenuItem.svelte +62 -62
  47. package/dist/Components/Nav/ServicesNav.svelte +50 -50
  48. package/dist/Components/NumberInput.svelte +98 -98
  49. package/dist/Components/OptionCards.svelte +58 -58
  50. package/dist/Components/PageHeading.svelte +21 -21
  51. package/dist/Components/PasswordInput.svelte +61 -61
  52. package/dist/Components/PopoverButton.svelte +53 -53
  53. package/dist/Components/Portal.svelte +7 -7
  54. package/dist/Components/ProgressBubble.svelte +42 -42
  55. package/dist/Components/QuerySelect.svelte +102 -102
  56. package/dist/Components/ResourceCalendar/ResourceCalendar.svelte +241 -241
  57. package/dist/Components/SidebarPanel.svelte +32 -32
  58. package/dist/Components/SingleSelect.svelte +122 -122
  59. package/dist/Components/StepButton.svelte +48 -48
  60. package/dist/Components/StepForm.svelte +58 -58
  61. package/dist/Components/Switch.svelte +43 -43
  62. package/dist/Components/Table/ARCHITECTURE.md +298 -298
  63. package/dist/Components/Table/Body/Rows/ColumnHighlight.svelte +30 -30
  64. package/dist/Components/Table/Body/Rows/ColumnList.svelte +24 -24
  65. package/dist/Components/Table/Body/Rows/ColumnListRow.svelte +165 -165
  66. package/dist/Components/Table/Body/Rows/Columns/AccessorComponent.svelte +13 -13
  67. package/dist/Components/Table/Body/Rows/Columns/ActionsCell.svelte +120 -120
  68. package/dist/Components/Table/Body/Rows/Columns/BubbleCell.svelte +81 -81
  69. package/dist/Components/Table/Body/Rows/Columns/ExpandCell.svelte +92 -92
  70. package/dist/Components/Table/Body/Rows/Columns/FocusableImmutableCell.svelte +110 -110
  71. package/dist/Components/Table/Body/Rows/Columns/ProgressCell.svelte +54 -54
  72. package/dist/Components/Table/Body/Rows/Columns/TableAction.svelte +35 -35
  73. package/dist/Components/Table/Body/Rows/Columns/TableCheckbox.svelte +64 -64
  74. package/dist/Components/Table/Body/Rows/Columns/TableColumn.svelte +82 -82
  75. package/dist/Components/Table/Body/Rows/Columns/TableDatePicker.svelte +88 -88
  76. package/dist/Components/Table/Body/Rows/Columns/TableNumberInput.svelte +90 -90
  77. package/dist/Components/Table/Body/Rows/Columns/TableQuerySelect.svelte +96 -96
  78. package/dist/Components/Table/Body/Rows/Columns/TableRowSelectionCheckbox.svelte +71 -71
  79. package/dist/Components/Table/Body/Rows/Columns/TableSelect.svelte +124 -124
  80. package/dist/Components/Table/Body/Rows/Columns/TableTextInput.svelte +91 -91
  81. package/dist/Components/Table/Body/Rows/Columns/ValidityCell.svelte +88 -88
  82. package/dist/Components/Table/Body/Rows/TableRow.svelte +127 -127
  83. package/dist/Components/Table/Body/TableBody.svelte +92 -92
  84. package/dist/Components/Table/Headers/HighlightAllHeader.svelte +25 -25
  85. package/dist/Components/Table/Headers/SelectAllHeader.svelte +20 -20
  86. package/dist/Components/Table/Headers/TableHead.svelte +175 -175
  87. package/dist/Components/Table/Misc/ColumnPanel.svelte +32 -32
  88. package/dist/Components/Table/Misc/ColumnPanelModal.svelte +29 -29
  89. package/dist/Components/Table/Misc/FilterInput.svelte +326 -326
  90. package/dist/Components/Table/Misc/FilterPanel.svelte +79 -79
  91. package/dist/Components/Table/Misc/FilterPanelModal.svelte +21 -21
  92. package/dist/Components/Table/Misc/ShareViewModal.svelte +118 -118
  93. package/dist/Components/Table/Misc/SidePanel.svelte +24 -24
  94. package/dist/Components/Table/Misc/TableConfigurationModal.svelte +318 -318
  95. package/dist/Components/Table/Misc/TableFooter.svelte +201 -201
  96. package/dist/Components/Table/Misc/TableHorizontalBar.svelte +112 -112
  97. package/dist/Components/Table/Misc/TableSidebar.svelte +116 -116
  98. package/dist/Components/Table/Misc/TableViewDropdown.svelte +25 -25
  99. package/dist/Components/Table/Misc/ToolboxPanel.svelte +60 -60
  100. package/dist/Components/Table/Misc/ToolboxPanelModal.svelte +63 -63
  101. package/dist/Components/Table/Misc/UpdateViewOptionsModal.svelte +101 -101
  102. package/dist/Components/Table/NestedTable.svelte +29 -29
  103. package/dist/Components/Table/Table.svelte +140 -140
  104. package/dist/Components/Test/TestContextConsumer.svelte +8 -8
  105. package/dist/Components/TextArea.svelte +92 -90
  106. package/dist/Components/TextInput.svelte +128 -117
  107. package/dist/Components/ThreeStateRadio.svelte +101 -101
  108. package/dist/Components/Touch/BoolCard.svelte +27 -27
  109. package/dist/Components/Touch/DateModal.svelte +98 -98
  110. package/dist/Components/Touch/EditCard.svelte +44 -44
  111. package/dist/Components/Touch/InfoCard.svelte +25 -25
  112. package/dist/Components/Touch/InfoTextCard.svelte +22 -22
  113. package/dist/Components/Touch/ModalExplanation.svelte +13 -13
  114. package/dist/Components/Touch/NumberKeyboard.svelte +81 -81
  115. package/dist/Components/Touch/NumberModal.svelte +49 -49
  116. package/dist/Components/Touch/PlusMinusCard.svelte +40 -40
  117. package/dist/Components/Touch/SelectModal.svelte +86 -86
  118. package/dist/Components/Touch/SummaryCard.svelte +74 -74
  119. package/dist/Components/Touch/TextAreaModal.svelte +53 -53
  120. package/dist/Components/Touch/TextModal.svelte +56 -56
  121. package/dist/Components/Touch/TouchCard.svelte +28 -28
  122. package/dist/Components/Touch/TouchModal.svelte +141 -141
  123. package/dist/Components/Touch/UtilityButton.svelte +63 -63
  124. package/dist/Components/VerticalTabGroup.svelte +38 -38
  125. package/dist/Components/VerticalTabGroupButton.svelte +46 -46
  126. package/dist/Helpers/Datamatrix.d.ts +19 -19
  127. package/dist/Helpers/Datamatrix.js +291 -291
  128. package/dist/Types/Examples/ExampleModal.svelte +27 -27
  129. package/dist/paraglide/README.md +1 -1
  130. package/dist/scss/_basics.scss +12 -12
  131. package/dist/scss/_colours.scss +140 -140
  132. package/dist/scss/_motion.scss +57 -57
  133. package/dist/scss/_sizing.scss +85 -85
  134. package/dist/scss/_transitions.scss +8 -8
  135. package/package.json +1 -1
@@ -1,8 +1,8 @@
1
- <svelte:options runes />
2
-
3
- <script
4
- lang="ts"
5
- generics="T extends object, IdType extends Primitive"
1
+ <svelte:options runes />
2
+
3
+ <script
4
+ lang="ts"
5
+ generics="T extends object, IdType extends Primitive"
6
6
  >import DesktopModal from "../../DesktopModal.svelte";
7
7
  import Icon from "../../Icon.svelte";
8
8
  import InfoAlert from "../../InfoAlert.svelte";
@@ -76,101 +76,101 @@ async function save() {
76
76
  saving = false;
77
77
  }
78
78
  }
79
- </script>
80
-
81
- <DesktopModal
82
- headerLabel={i18n['scoria.label.update_options_header']({ name: view.name })}
83
- headerSubtitle={view.kind === 'filter'
84
- ? i18n['scoria.text.update_filter_subtitle']()
85
- : i18n['scoria.text.update_layout_subtitle']()}
86
- onclose={() => {
87
- if (!saving) {
88
- onclose();
89
- }
90
- }}
91
- width={cssLength('40vw')}
92
- minWidth={cssLength('32rem')}
93
- buttons={[
94
- {
95
- label: i18n['scoria.action.cancel'](),
96
- callback: () => {
97
- if (!saving) {
98
- onclose();
99
- }
100
- },
101
- disabled: saving,
102
- },
103
- {
104
- label: saving ? i18n['scoria.action.saving']() : i18n['scoria.action.save'](),
105
- callback: () => {
106
- void save();
107
- },
108
- colourSet: ColourSet.Primary,
109
- disabled: saving || !dirty || !isValidName,
110
- },
111
- ]}
112
- >
113
- <div class="options-body">
114
- {#if errorMessage}
115
- <div
116
- class="error-banner"
117
- role="alert"
118
- >
119
- <Icon
120
- name="circle-exclamation"
121
- size={Size.Small}
122
- />
123
- <span>{errorMessage}</span>
124
- </div>
125
- {/if}
126
-
127
- <InfoAlert>
128
- {view.kind === 'filter'
129
- ? i18n['scoria.text.changes_apply_filter']()
130
- : i18n['scoria.text.changes_apply_layout']()}
131
- </InfoAlert>
132
-
133
- <div class="field">
134
- <label
135
- class="field-label"
136
- for="update-view-name">{i18n['scoria.label.name']()}</label
137
- >
138
- <TextInput
139
- id="update-view-name"
140
- bind:value={name}
141
- placeholder={view.kind === 'filter'
142
- ? i18n['scoria.label.filter_name_placeholder']()
143
- : i18n['scoria.label.layout_name_placeholder']()}
144
- required
145
- invalid={!isValidName}
146
- />
147
- </div>
148
-
149
- <div class="field">
150
- <label
151
- class="field-label"
152
- for="update-view-visibility">{i18n['scoria.label.visibility']()}</label
153
- >
154
- <SingleSelect
155
- inputId="update-view-visibility"
156
- name="Visibility"
157
- placeholder={i18n['scoria.label.select_visibility']()}
158
- options={visibilityOptions}
159
- labelProp="label"
160
- valueProp="value"
161
- value={selectedVisibility}
162
- valueAsObject
163
- searchable={false}
164
- onchange={(option: SelectOption<DatatableViewVisibility> | null) => {
165
- if (option) {
166
- visibility = option.value;
167
- }
168
- }}
169
- />
170
- </div>
171
- </div>
172
- </DesktopModal>
173
-
79
+ </script>
80
+
81
+ <DesktopModal
82
+ headerLabel={i18n['scoria.label.update_options_header']({ name: view.name })}
83
+ headerSubtitle={view.kind === 'filter'
84
+ ? i18n['scoria.text.update_filter_subtitle']()
85
+ : i18n['scoria.text.update_layout_subtitle']()}
86
+ onclose={() => {
87
+ if (!saving) {
88
+ onclose();
89
+ }
90
+ }}
91
+ width={cssLength('40vw')}
92
+ minWidth={cssLength('32rem')}
93
+ buttons={[
94
+ {
95
+ label: i18n['scoria.action.cancel'](),
96
+ callback: () => {
97
+ if (!saving) {
98
+ onclose();
99
+ }
100
+ },
101
+ disabled: saving,
102
+ },
103
+ {
104
+ label: saving ? i18n['scoria.action.saving']() : i18n['scoria.action.save'](),
105
+ callback: () => {
106
+ void save();
107
+ },
108
+ colourSet: ColourSet.Primary,
109
+ disabled: saving || !dirty || !isValidName,
110
+ },
111
+ ]}
112
+ >
113
+ <div class="options-body">
114
+ {#if errorMessage}
115
+ <div
116
+ class="error-banner"
117
+ role="alert"
118
+ >
119
+ <Icon
120
+ name="circle-exclamation"
121
+ size={Size.Small}
122
+ />
123
+ <span>{errorMessage}</span>
124
+ </div>
125
+ {/if}
126
+
127
+ <InfoAlert>
128
+ {view.kind === 'filter'
129
+ ? i18n['scoria.text.changes_apply_filter']()
130
+ : i18n['scoria.text.changes_apply_layout']()}
131
+ </InfoAlert>
132
+
133
+ <div class="field">
134
+ <label
135
+ class="field-label"
136
+ for="update-view-name">{i18n['scoria.label.name']()}</label
137
+ >
138
+ <TextInput
139
+ id="update-view-name"
140
+ bind:value={name}
141
+ placeholder={view.kind === 'filter'
142
+ ? i18n['scoria.label.filter_name_placeholder']()
143
+ : i18n['scoria.label.layout_name_placeholder']()}
144
+ required
145
+ invalid={!isValidName}
146
+ />
147
+ </div>
148
+
149
+ <div class="field">
150
+ <label
151
+ class="field-label"
152
+ for="update-view-visibility">{i18n['scoria.label.visibility']()}</label
153
+ >
154
+ <SingleSelect
155
+ inputId="update-view-visibility"
156
+ name="Visibility"
157
+ placeholder={i18n['scoria.label.select_visibility']()}
158
+ options={visibilityOptions}
159
+ labelProp="label"
160
+ valueProp="value"
161
+ value={selectedVisibility}
162
+ valueAsObject
163
+ searchable={false}
164
+ onchange={(option: SelectOption<DatatableViewVisibility> | null) => {
165
+ if (option) {
166
+ visibility = option.value;
167
+ }
168
+ }}
169
+ />
170
+ </div>
171
+ </div>
172
+ </DesktopModal>
173
+
174
174
  <style>.options-body {
175
175
  display: flex;
176
176
  flex-flow: column nowrap;
@@ -204,4 +204,4 @@ async function save() {
204
204
  font-size: 1.125rem;
205
205
  font-weight: 600;
206
206
  color: #3a4952;
207
- }</style>
207
+ }</style>
@@ -1,8 +1,8 @@
1
- <svelte:options runes />
2
-
3
- <script
4
- lang="ts"
5
- module
1
+ <svelte:options runes />
2
+
3
+ <script
4
+ lang="ts"
5
+ module
6
6
  >import Table from "./Table.svelte";
7
7
  import { TableContext } from "./Types/Context/TableContext.svelte.js";
8
8
  import { LocalTableDataRepository } from "./Types/DataRepository/LocalTableDataRepository.svelte.js";
@@ -31,11 +31,11 @@ const DEFAULT_NESTED_TABLE_OPTIONS = Object.freeze({
31
31
  toolbar: ToolbarPosition.None,
32
32
  displayFooter: false
33
33
  });
34
- </script>
35
-
36
- <script
37
- lang="ts"
38
- generics="T extends object,IdType extends Primitive"
34
+ </script>
35
+
36
+ <script
37
+ lang="ts"
38
+ generics="T extends object,IdType extends Primitive"
39
39
  >const { tableName, data, columnDefWrapper, options, oncontextmenu, getUserId } = $props();
40
40
  // Reactive wrapper exposing the `data` prop as `.value` so the
41
41
  // underlying LocalTableDataRepository can read it through its
@@ -87,24 +87,24 @@ const tableContext = TableContext.init(columnDefWrapper, tableName, dataRepo, {
87
87
  ...options,
88
88
  getUserId: () => getUserId()
89
89
  });
90
- </script>
91
-
92
- <!-- svelte-ignore a11y_no_static_element_interactions -->
93
- <div
94
- class="limit-height"
95
- bind:this={root}
96
- style:width={maxWidth != null ? `${maxWidth}px` : null}
97
- oncontextmenu={(e) => {
98
- e.stopPropagation();
99
- oncontextmenu?.(e);
100
- }}
101
- >
102
- <Table
103
- nested
104
- {tableContext}
105
- />
106
- </div>
107
-
90
+ </script>
91
+
92
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
93
+ <div
94
+ class="limit-height"
95
+ bind:this={root}
96
+ style:width={maxWidth != null ? `${maxWidth}px` : null}
97
+ oncontextmenu={(e) => {
98
+ e.stopPropagation();
99
+ oncontextmenu?.(e);
100
+ }}
101
+ >
102
+ <Table
103
+ nested
104
+ {tableContext}
105
+ />
106
+ </div>
107
+
108
108
  <style>.limit-height {
109
109
  position: sticky;
110
110
  left: 0;
@@ -113,4 +113,4 @@ const tableContext = TableContext.init(columnDefWrapper, tableName, dataRepo, {
113
113
  box-sizing: border-box;
114
114
  background-color: #f4f7f9;
115
115
  box-shadow: inset 0px 7px 5px -6px #cbd4da, inset 0px -7px 5px -6px #cbd4da;
116
- }</style>
116
+ }</style>
@@ -1,8 +1,8 @@
1
- <svelte:options runes />
2
-
3
- <script
4
- lang="ts"
5
- module
1
+ <svelte:options runes />
2
+
3
+ <script
4
+ lang="ts"
5
+ module
6
6
  >import { m as i18n } from "../../paraglide/messages.js";
7
7
  import { ContextMenuContext } from "../../Contexts/ContextMenuContext.svelte";
8
8
  import { cssLength, devCatch, refWrapper } from "../../Helpers/Helpers.svelte";
@@ -24,11 +24,11 @@ import { ToolbarPosition } from "./Types/Toolbar/ToolbarPosition.js";
24
24
  */
25
25
  export const quickFilterContextIdentifier = Symbol();
26
26
  const openedQuickFilterSelect = refWrapper(null);
27
- </script>
28
-
29
- <script
30
- lang="ts"
31
- generics="T extends object,IdType extends Primitive"
27
+ </script>
28
+
29
+ <script
30
+ lang="ts"
31
+ generics="T extends object,IdType extends Primitive"
32
32
  >const { nested = false, table, tableContext: tableContextProp } = $props();
33
33
  // Resolve the underlying TableContext from whichever prop was passed:
34
34
  // consumers pass `table`; internal `NestedTable` passes `tableContext`
@@ -429,135 +429,135 @@ $effect(() => {
429
429
  stickyRo?.disconnect();
430
430
  };
431
431
  });
432
- </script>
433
-
434
- <svelte:window
435
- onmouseup={(e: MouseEvent) => {
436
- if (
437
- // if it's not a click on an item in the context menu
438
- !(e.target as HTMLElement | undefined)?.classList.contains('context-menu-item') &&
439
- // if it's outside the table or inside the empty space of the table
440
- (e.target === unfocusRef ||
441
- ((e.target as HTMLElement | undefined)?.closest('.table-wrapper') == null &&
442
- mousedDownEmptySpace))
443
- ) {
444
- tableContext.unfocus();
445
- }
446
- mousedDownEmptySpace = false;
447
-
448
- if (tableContext.isMousingDown) {
449
- tableContext.isMousingDown = false;
450
- }
451
-
452
- removeOverrideResizeHandler();
453
- }}
454
- onclick={(e: MouseEvent) => {
455
- handleClickOutside(e);
456
- }}
457
- onmousedown={(e: MouseEvent) => {
458
- mousedDownEmptySpace =
459
- e.target === unfocusRef || (e.target as HTMLElement).closest('.table-wrapper') == null;
460
- }}
461
- />
462
-
463
- <div
464
- class="grid"
465
- class:nested
466
- style="--show-top-shadow: {hasScrolledPastHeader
467
- ? 1
468
- : 0}; --show-bottom-shadow: {hasContentBelowFooter ? 1 : 0};"
469
- >
470
- {#if tableContext.dataRepo.isLoading}
471
- <LoadingOverlay
472
- absolute
473
- borderRadius={cssLength('4px')}
474
- message={tableContext.dataRepo.loadingMessage}
475
- />
476
- {/if}
477
-
478
- <div
479
- class="horizontal-bar"
480
- class:border={tableContext.toolbarPosition === ToolbarPosition.Top}
481
- >
482
- {#if tableContext.toolbarPosition === ToolbarPosition.Top}
483
- <TableHorizontalBar />
484
- {/if}
485
- </div>
486
-
487
- <div
488
- class="sidebar-wrapper sidebar-wrapper-left"
489
- class:nested
490
- style="--nested-height: {nestedHeight}px;"
491
- >
492
- {#if tableContext.toolbarPosition === ToolbarPosition.Left}
493
- <div class="sidebar toolbar-left">
494
- <TableSidebar />
495
- </div>
496
- {/if}
497
- </div>
498
- <div
499
- class="sidebar-wrapper sidebar-wrapper-right"
500
- class:nested
501
- style="--nested-height: {nestedHeight}px;"
502
- >
503
- {#if tableContext.toolbarPosition === ToolbarPosition.Right}
504
- <div class="sidebar toolbar-right">
505
- <TableSidebar />
506
- </div>
507
- {/if}
508
- </div>
509
-
510
- <div class="footer">
511
- {#if tableContext.displayFooter}
512
- <TableFooter />
513
- {/if}
514
- </div>
515
-
516
- <!-- svelte-ignore a11y_no_static_element_interactions -->
517
- <div
518
- bind:this={tableRef}
519
- class="datatable"
520
- class:nested
521
- class:compact={tableContext.isCompact}
522
- class:quick-filtering={tableContext.showQuickFiltering}
523
- onkeydown={tableContext.handleTdKeydown}
524
- style="--pinned-start: {totalPinnedLeftWidth}px; --pinned-end: {totalPinnedRightWidth}px; --sticky-top-height: {stickyTopHeight}px;"
525
- >
526
- <div
527
- class="flex_table"
528
- bind:this={ref}
529
- class:nested
530
- >
531
- <div
532
- bind:this={unfocusRef}
533
- class="table-wrapper"
534
- oncontextmenu={openContextMenu}
535
- >
536
- <div
537
- role="table"
538
- class="datatable-grid"
539
- style="--cols: {colsTemplate};"
540
- >
541
- <TableHead />
542
- <TableBody />
543
- </div>
544
- </div>
545
- </div>
546
-
547
- {#if nested}
548
- <!-- svelte-ignore a11y_no_static_element_interactions -->
549
- <div
550
- class:isResizing
551
- class="resizer"
552
- onmousedown={(e) => {
553
- e.preventDefault();
554
- addOverrideResizeHandler();
555
- }}
556
- ></div>
557
- {/if}
558
- </div>
559
- </div>
560
-
432
+ </script>
433
+
434
+ <svelte:window
435
+ onmouseup={(e: MouseEvent) => {
436
+ if (
437
+ // if it's not a click on an item in the context menu
438
+ !(e.target as HTMLElement | undefined)?.classList.contains('context-menu-item') &&
439
+ // if it's outside the table or inside the empty space of the table
440
+ (e.target === unfocusRef ||
441
+ ((e.target as HTMLElement | undefined)?.closest('.table-wrapper') == null &&
442
+ mousedDownEmptySpace))
443
+ ) {
444
+ tableContext.unfocus();
445
+ }
446
+ mousedDownEmptySpace = false;
447
+
448
+ if (tableContext.isMousingDown) {
449
+ tableContext.isMousingDown = false;
450
+ }
451
+
452
+ removeOverrideResizeHandler();
453
+ }}
454
+ onclick={(e: MouseEvent) => {
455
+ handleClickOutside(e);
456
+ }}
457
+ onmousedown={(e: MouseEvent) => {
458
+ mousedDownEmptySpace =
459
+ e.target === unfocusRef || (e.target as HTMLElement).closest('.table-wrapper') == null;
460
+ }}
461
+ />
462
+
463
+ <div
464
+ class="grid"
465
+ class:nested
466
+ style="--show-top-shadow: {hasScrolledPastHeader
467
+ ? 1
468
+ : 0}; --show-bottom-shadow: {hasContentBelowFooter ? 1 : 0};"
469
+ >
470
+ {#if tableContext.dataRepo.isLoading}
471
+ <LoadingOverlay
472
+ absolute
473
+ borderRadius={cssLength('4px')}
474
+ message={tableContext.dataRepo.loadingMessage}
475
+ />
476
+ {/if}
477
+
478
+ <div
479
+ class="horizontal-bar"
480
+ class:border={tableContext.toolbarPosition === ToolbarPosition.Top}
481
+ >
482
+ {#if tableContext.toolbarPosition === ToolbarPosition.Top}
483
+ <TableHorizontalBar />
484
+ {/if}
485
+ </div>
486
+
487
+ <div
488
+ class="sidebar-wrapper sidebar-wrapper-left"
489
+ class:nested
490
+ style="--nested-height: {nestedHeight}px;"
491
+ >
492
+ {#if tableContext.toolbarPosition === ToolbarPosition.Left}
493
+ <div class="sidebar toolbar-left">
494
+ <TableSidebar />
495
+ </div>
496
+ {/if}
497
+ </div>
498
+ <div
499
+ class="sidebar-wrapper sidebar-wrapper-right"
500
+ class:nested
501
+ style="--nested-height: {nestedHeight}px;"
502
+ >
503
+ {#if tableContext.toolbarPosition === ToolbarPosition.Right}
504
+ <div class="sidebar toolbar-right">
505
+ <TableSidebar />
506
+ </div>
507
+ {/if}
508
+ </div>
509
+
510
+ <div class="footer">
511
+ {#if tableContext.displayFooter}
512
+ <TableFooter />
513
+ {/if}
514
+ </div>
515
+
516
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
517
+ <div
518
+ bind:this={tableRef}
519
+ class="datatable"
520
+ class:nested
521
+ class:compact={tableContext.isCompact}
522
+ class:quick-filtering={tableContext.showQuickFiltering}
523
+ onkeydown={tableContext.handleTdKeydown}
524
+ style="--pinned-start: {totalPinnedLeftWidth}px; --pinned-end: {totalPinnedRightWidth}px; --sticky-top-height: {stickyTopHeight}px;"
525
+ >
526
+ <div
527
+ class="flex_table"
528
+ bind:this={ref}
529
+ class:nested
530
+ >
531
+ <div
532
+ bind:this={unfocusRef}
533
+ class="table-wrapper"
534
+ oncontextmenu={openContextMenu}
535
+ >
536
+ <div
537
+ role="table"
538
+ class="datatable-grid"
539
+ style="--cols: {colsTemplate};"
540
+ >
541
+ <TableHead />
542
+ <TableBody />
543
+ </div>
544
+ </div>
545
+ </div>
546
+
547
+ {#if nested}
548
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
549
+ <div
550
+ class:isResizing
551
+ class="resizer"
552
+ onmousedown={(e) => {
553
+ e.preventDefault();
554
+ addOverrideResizeHandler();
555
+ }}
556
+ ></div>
557
+ {/if}
558
+ </div>
559
+ </div>
560
+
561
561
  <style>div.grid {
562
562
  border-radius: 4px;
563
563
  display: grid;
@@ -709,4 +709,4 @@ div.sidebar-wrapper .sidebar.toolbar-right {
709
709
  text-align: start;
710
710
  min-width: max-content;
711
711
  isolation: isolate;
712
- }</style>
712
+ }</style>
@@ -1,11 +1,11 @@
1
- <svelte:options runes />
2
-
1
+ <svelte:options runes />
2
+
3
3
  <script lang="ts">import { TestContext } from "../../Contexts/TestContext.svelte.js";
4
4
  import { getContext } from "svelte";
5
5
  const testContext = getContext(TestContext.identifier);
6
- </script>
7
-
8
- <h1>counter 1: {testContext.value1.value}</h1>
9
- <p>Ref wrapper 1 is incremented every time you click the button</p>
10
- <h2>counter 2: {testContext.value2.value}</h2>
11
- <p>ref wrapper 2 adds ref wrapper 1's value every time ref wrapper 1's value is divisible by 3</p>
6
+ </script>
7
+
8
+ <h1>counter 1: {testContext.value1.value}</h1>
9
+ <p>Ref wrapper 1 is incremented every time you click the button</p>
10
+ <h2>counter 2: {testContext.value2.value}</h2>
11
+ <p>ref wrapper 2 adds ref wrapper 1's value every time ref wrapper 1's value is divisible by 3</p>