@lavalogic/scoria 0.38.10 → 0.38.12

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 (115) hide show
  1. package/README.md +58 -58
  2. package/dist/Components/AccordionGroup.svelte +46 -46
  3. package/dist/Components/AccordionGroupButton.svelte +76 -76
  4. package/dist/Components/Action.svelte +136 -136
  5. package/dist/Components/AppointmentCalendar/AppointmentCalendar.svelte +702 -702
  6. package/dist/Components/Base/BaseModal.svelte +125 -125
  7. package/dist/Components/Base/ContextWrapper.svelte +72 -72
  8. package/dist/Components/Base/Pagination.svelte +198 -198
  9. package/dist/Components/Base/Snippets.svelte +36 -36
  10. package/dist/Components/BigRadioSet.svelte +38 -38
  11. package/dist/Components/Bubble.svelte +101 -101
  12. package/dist/Components/Button.svelte +209 -209
  13. package/dist/Components/Checkbox.svelte +86 -86
  14. package/dist/Components/Contexts/ContextMenu.svelte +164 -164
  15. package/dist/Components/Contexts/ContextMenuDivider.svelte +15 -15
  16. package/dist/Components/Contexts/ContextMenuOption.svelte +60 -60
  17. package/dist/Components/Contexts/ToastContainer.svelte +65 -65
  18. package/dist/Components/Contexts/Tooltip.svelte +37 -37
  19. package/dist/Components/DataMatrixIcon.svelte +112 -112
  20. package/dist/Components/DateInput.svelte +148 -148
  21. package/dist/Components/DatePicker.svelte +300 -300
  22. package/dist/Components/DesktopModal.svelte +90 -90
  23. package/dist/Components/Dial.svelte +204 -204
  24. package/dist/Components/DimensionInput.svelte +170 -170
  25. package/dist/Components/DragMenu/DragMenuHolder.svelte +119 -119
  26. package/dist/Components/DragMenu/DraggableCard.svelte +77 -77
  27. package/dist/Components/FileCard.svelte +24 -24
  28. package/dist/Components/FileUpload.svelte +236 -236
  29. package/dist/Components/GridInputSet.svelte +29 -29
  30. package/dist/Components/HorizontalTabGroup.svelte +82 -82
  31. package/dist/Components/HorizontalTabGroupButton.svelte +44 -44
  32. package/dist/Components/Icon.svelte +128 -128
  33. package/dist/Components/Icons.js +357 -357
  34. package/dist/Components/LoadingAnimation.svelte +29 -29
  35. package/dist/Components/LoadingModal.svelte +45 -45
  36. package/dist/Components/LoadingOverlay.svelte +25 -25
  37. package/dist/Components/Modal.svelte +258 -258
  38. package/dist/Components/MultiSelect.svelte +220 -220
  39. package/dist/Components/Nav/NavServiceMenuList.svelte +43 -43
  40. package/dist/Components/Nav/NavTab.svelte +62 -62
  41. package/dist/Components/Nav/ServicesNav.svelte +80 -80
  42. package/dist/Components/NumberInput.svelte +157 -157
  43. package/dist/Components/PageHeading.svelte +25 -25
  44. package/dist/Components/PasswordInput.svelte +88 -88
  45. package/dist/Components/Portal.svelte +36 -36
  46. package/dist/Components/QuerySelect.svelte +366 -366
  47. package/dist/Components/SingleSelect.svelte +250 -250
  48. package/dist/Components/StepButton.svelte +70 -70
  49. package/dist/Components/StepForm.svelte +140 -140
  50. package/dist/Components/Switch.svelte +69 -69
  51. package/dist/Components/Table/Body/Rows/ColumnHighlight.svelte +51 -51
  52. package/dist/Components/Table/Body/Rows/ColumnList.svelte +59 -59
  53. package/dist/Components/Table/Body/Rows/Columns/AccessorComponent.svelte +79 -79
  54. package/dist/Components/Table/Body/Rows/Columns/ExpandCell.svelte +120 -120
  55. package/dist/Components/Table/Body/Rows/Columns/ProgressCell.svelte +105 -105
  56. package/dist/Components/Table/Body/Rows/Columns/TableAction.svelte +87 -87
  57. package/dist/Components/Table/Body/Rows/Columns/TableCheckbox.svelte +126 -126
  58. package/dist/Components/Table/Body/Rows/Columns/TableColumn.svelte +159 -159
  59. package/dist/Components/Table/Body/Rows/Columns/TableDatePicker.svelte +246 -246
  60. package/dist/Components/Table/Body/Rows/Columns/TableNumberInput.svelte +216 -216
  61. package/dist/Components/Table/Body/Rows/Columns/TableRowSelectionCheckbox.svelte +179 -179
  62. package/dist/Components/Table/Body/Rows/Columns/TableTextInput.svelte +197 -197
  63. package/dist/Components/Table/Body/Rows/Columns/ValidityCell.svelte +190 -190
  64. package/dist/Components/Table/Body/Rows/TableRow.svelte +290 -290
  65. package/dist/Components/Table/Headers/HighlightAllHeader.svelte +41 -41
  66. package/dist/Components/Table/Headers/SelectAllHeader.svelte +30 -30
  67. package/dist/Components/Table/Misc/FilterInput.svelte +37 -16
  68. package/dist/Components/Table/Misc/SidePanel.svelte +35 -35
  69. package/dist/Components/Table/Misc/TableConfigurationModal.svelte +71 -0
  70. package/dist/Components/Table/Misc/ToolboxPanel.svelte +100 -100
  71. package/dist/Components/Table/Misc/ToolboxPanelModal.svelte +107 -107
  72. package/dist/Components/Table/Misc/UpdateViewOptionsModal.svelte +225 -0
  73. package/dist/Components/Table/Misc/UpdateViewOptionsModal.svelte.d.ts +26 -0
  74. package/dist/Components/Table/Misc/UpdateViewOptionsModalProps.d.ts +21 -0
  75. package/dist/Components/Table/Misc/UpdateViewOptionsModalProps.js +1 -0
  76. package/dist/Components/Table/Types/Context/TableContext.svelte.d.ts +49 -1
  77. package/dist/Components/Table/Types/Context/TableContext.svelte.js +142 -1
  78. package/dist/Components/Table/Types/DataRepository/BuiltInRemoteRepository.svelte.d.ts +2 -2
  79. package/dist/Components/Table/Types/DataRepository/BuiltInRemoteRepository.svelte.js +20 -2
  80. package/dist/Components/Table/Types/DataRepository/IDataRepository.d.ts +9 -1
  81. package/dist/Components/Table/Types/DataRepository/ILocalDataRepository.d.ts +1 -1
  82. package/dist/Components/Table/Types/DataRepository/IRemoteDataRepository.d.ts +1 -1
  83. package/dist/Components/Table/Types/DataRepository/TableDataRepository.svelte.d.ts +1 -1
  84. package/dist/Components/Table/Types/Persistence/DatatableView.d.ts +25 -0
  85. package/dist/Components/Test/TestContextConsumer.svelte +13 -13
  86. package/dist/Components/TextArea.svelte +130 -130
  87. package/dist/Components/TextInput.svelte +176 -176
  88. package/dist/Components/ThreeStateRadio.svelte +131 -131
  89. package/dist/Components/Touch/BoolCard.svelte +45 -45
  90. package/dist/Components/Touch/DateModal.svelte +209 -209
  91. package/dist/Components/Touch/EditCard.svelte +59 -59
  92. package/dist/Components/Touch/InfoCard.svelte +31 -31
  93. package/dist/Components/Touch/InfoTextCard.svelte +28 -28
  94. package/dist/Components/Touch/ModalExplanation.svelte +17 -17
  95. package/dist/Components/Touch/NumberKeyboard.svelte +225 -225
  96. package/dist/Components/Touch/NumberModal.svelte +79 -79
  97. package/dist/Components/Touch/PlusMinusCard.svelte +46 -46
  98. package/dist/Components/Touch/SummaryCard.svelte +93 -93
  99. package/dist/Components/Touch/TextAreaModal.svelte +95 -95
  100. package/dist/Components/Touch/TextModal.svelte +106 -106
  101. package/dist/Components/Touch/TouchCard.svelte +33 -33
  102. package/dist/Components/Touch/TouchModal.svelte +274 -274
  103. package/dist/Components/Touch/UtilityButton.svelte +109 -109
  104. package/dist/Components/VerticalTabGroup.svelte +79 -79
  105. package/dist/Components/VerticalTabGroupButton.svelte +58 -58
  106. package/dist/Helpers/Datamatrix.d.ts +19 -19
  107. package/dist/Helpers/Datamatrix.js +291 -291
  108. package/dist/Types/Examples/ExampleModal.svelte +35 -35
  109. package/dist/index.d.ts +1 -1
  110. package/dist/scss/_basics.scss +12 -12
  111. package/dist/scss/_colours.scss +134 -134
  112. package/dist/scss/_motion.scss +57 -57
  113. package/dist/scss/_sizing.scss +85 -85
  114. package/dist/scss/_transitions.scss +8 -8
  115. package/package.json +1 -1
@@ -1,81 +1,81 @@
1
- <svelte:options runes />
2
-
3
- <script lang="ts">
4
- import { useAsyncFlag } from '../../Helpers/AsyncFlag.svelte.js';
5
- import { passthrough } from '../../Helpers/Helpers.svelte.js';
6
- import NumberKeyboard from './NumberKeyboard.svelte';
7
- import type { NumberModalProps } from './NumberModalProps.js';
8
- import TouchModal from './TouchModal.svelte';
9
- let {
10
- coerceValue = false,
11
- header,
12
- value,
13
- label,
14
- placeholder,
15
- min,
16
- max,
17
- cancelEditing,
18
- confirm,
19
- decimal,
20
- isValid,
21
- explanation,
22
- }: NumberModalProps = $props();
23
-
24
- // Mirror external `value` snapshots into a writable derived. Reads from
25
- // `value` are tracked; writes happen through the assignment binding
26
- // fed back to `NumberKeyboard`.
27
- let tempValue: number | null = $derived(value);
28
-
29
- const isAcceptableValue = useAsyncFlag(
30
- () => (tempValue == null ? false : (isValid?.(tempValue) ?? true)),
31
- false
32
- );
33
- </script>
34
-
35
- <TouchModal
36
- onclose={() => {
37
- cancelEditing();
38
- }}
39
- {header}
40
- mandatory
41
- onsubmit={(e: SubmitEvent) => {
42
- e.preventDefault();
43
- if (tempValue == null) {
44
- return;
45
- }
46
- confirm(tempValue);
47
- }}
48
- {explanation}
49
- >
50
- <div class="number-input-wrapper">
51
- <NumberKeyboard
52
- {coerceValue}
53
- {min}
54
- {max}
55
- {label}
56
- {placeholder}
57
- bind:value={tempValue}
58
- {decimal}
59
- />
60
- </div>
61
- {#snippet footer()}
62
- <div class="modal-footer">
63
- <button
64
- onkeydown={passthrough}
65
- type="submit"
66
- disabled={!isAcceptableValue.value}>Confirm</button
67
- >
68
- <button
69
- onkeydown={passthrough}
70
- type="button"
71
- onclick={() => {
72
- cancelEditing();
73
- }}>Cancel</button
74
- >
75
- </div>
76
- {/snippet}
77
- </TouchModal>
78
-
1
+ <svelte:options runes />
2
+
3
+ <script lang="ts">
4
+ import { useAsyncFlag } from '../../Helpers/AsyncFlag.svelte.js';
5
+ import { passthrough } from '../../Helpers/Helpers.svelte.js';
6
+ import NumberKeyboard from './NumberKeyboard.svelte';
7
+ import type { NumberModalProps } from './NumberModalProps.js';
8
+ import TouchModal from './TouchModal.svelte';
9
+ let {
10
+ coerceValue = false,
11
+ header,
12
+ value,
13
+ label,
14
+ placeholder,
15
+ min,
16
+ max,
17
+ cancelEditing,
18
+ confirm,
19
+ decimal,
20
+ isValid,
21
+ explanation,
22
+ }: NumberModalProps = $props();
23
+
24
+ // Mirror external `value` snapshots into a writable derived. Reads from
25
+ // `value` are tracked; writes happen through the assignment binding
26
+ // fed back to `NumberKeyboard`.
27
+ let tempValue: number | null = $derived(value);
28
+
29
+ const isAcceptableValue = useAsyncFlag(
30
+ () => (tempValue == null ? false : (isValid?.(tempValue) ?? true)),
31
+ false
32
+ );
33
+ </script>
34
+
35
+ <TouchModal
36
+ onclose={() => {
37
+ cancelEditing();
38
+ }}
39
+ {header}
40
+ mandatory
41
+ onsubmit={(e: SubmitEvent) => {
42
+ e.preventDefault();
43
+ if (tempValue == null) {
44
+ return;
45
+ }
46
+ confirm(tempValue);
47
+ }}
48
+ {explanation}
49
+ >
50
+ <div class="number-input-wrapper">
51
+ <NumberKeyboard
52
+ {coerceValue}
53
+ {min}
54
+ {max}
55
+ {label}
56
+ {placeholder}
57
+ bind:value={tempValue}
58
+ {decimal}
59
+ />
60
+ </div>
61
+ {#snippet footer()}
62
+ <div class="modal-footer">
63
+ <button
64
+ onkeydown={passthrough}
65
+ type="submit"
66
+ disabled={!isAcceptableValue.value}>Confirm</button
67
+ >
68
+ <button
69
+ onkeydown={passthrough}
70
+ type="button"
71
+ onclick={() => {
72
+ cancelEditing();
73
+ }}>Cancel</button
74
+ >
75
+ </div>
76
+ {/snippet}
77
+ </TouchModal>
78
+
79
79
  <style>dialog {
80
80
  overflow: clip;
81
81
  background-color: #e9ecf1;
@@ -342,4 +342,4 @@ button {
342
342
  }
343
343
  .modal-footer button[type=submit]:not([disabled]):focus {
344
344
  outline-offset: -2px;
345
- }</style>
345
+ }</style>
@@ -1,48 +1,48 @@
1
- <svelte:options runes />
2
-
3
- <script lang="ts">
4
- import { Size } from '../../Types/Internal/Size.js';
5
- import Action from '../Action.svelte';
6
- import type { PlusMinusCardProps } from './PlusMinusCardProps.js';
7
-
8
- let { callback, disabled = false, children }: PlusMinusCardProps = $props();
9
- </script>
10
-
11
- <div
12
- class="card pad-right"
13
- class:disabled
14
- >
15
- <div class="icon-left">
16
- <Action
17
- {disabled}
18
- label="Decrement"
19
- onclick={() => {
20
- callback(-1);
21
- }}
22
- icon={{
23
- name: 'circle-minus',
24
- size: Size.DoubleXLarge,
25
- }}
26
- size={Size.DoubleXLarge}
27
- />
28
- </div>
29
- <span class="value">{@render children()}</span>
30
- <div class="icon-right">
31
- <Action
32
- {disabled}
33
- label="Increment"
34
- onclick={() => {
35
- callback(1);
36
- }}
37
- icon={{
38
- name: 'circle-plus',
39
- size: Size.DoubleXLarge,
40
- }}
41
- size={Size.DoubleXLarge}
42
- />
43
- </div>
44
- </div>
45
-
1
+ <svelte:options runes />
2
+
3
+ <script lang="ts">
4
+ import { Size } from '../../Types/Internal/Size.js';
5
+ import Action from '../Action.svelte';
6
+ import type { PlusMinusCardProps } from './PlusMinusCardProps.js';
7
+
8
+ let { callback, disabled = false, children }: PlusMinusCardProps = $props();
9
+ </script>
10
+
11
+ <div
12
+ class="card pad-right"
13
+ class:disabled
14
+ >
15
+ <div class="icon-left">
16
+ <Action
17
+ {disabled}
18
+ label="Decrement"
19
+ onclick={() => {
20
+ callback(-1);
21
+ }}
22
+ icon={{
23
+ name: 'circle-minus',
24
+ size: Size.DoubleXLarge,
25
+ }}
26
+ size={Size.DoubleXLarge}
27
+ />
28
+ </div>
29
+ <span class="value">{@render children()}</span>
30
+ <div class="icon-right">
31
+ <Action
32
+ {disabled}
33
+ label="Increment"
34
+ onclick={() => {
35
+ callback(1);
36
+ }}
37
+ icon={{
38
+ name: 'circle-plus',
39
+ size: Size.DoubleXLarge,
40
+ }}
41
+ size={Size.DoubleXLarge}
42
+ />
43
+ </div>
44
+ </div>
45
+
46
46
  <style>.card {
47
47
  color: #3a4952;
48
48
  fill: #3a4952;
@@ -91,4 +91,4 @@
91
91
  .card.disabled {
92
92
  background-color: #f4f7f9;
93
93
  color: #8096a5;
94
- }</style>
94
+ }</style>
@@ -1,95 +1,95 @@
1
- <svelte:options runes />
2
-
3
- <script
4
- module
5
- lang="ts"
6
- >
7
- import { passthrough } from '../../Helpers/Helpers.svelte.js';
8
- import { Size } from '../../Types/Internal/Size.js';
9
- import Icon from '../Icon.svelte';
10
- import type { SummaryCardProps } from './SummaryCardProps.js';
11
-
12
- // CSS handles the dot-leader rendering via a flex pseudo element. We no
13
- // longer interpolate a 108-character literal of dots into the markup.
14
- </script>
15
-
16
- <script lang="ts">
17
- const {
18
- bubbles,
19
- desktop = false,
20
- heading,
21
- icon,
22
- keyValues,
23
- editable = false,
24
- error = false,
25
- onclick,
26
- }: SummaryCardProps = $props();
27
- </script>
28
-
29
- {#snippet _heading()}
30
- {#if desktop}
31
- <span
32
- class="desktop-heading"
33
- class:invalid={error}>{heading}</span
34
- >
35
- <span
36
- class="desktop-heading-border"
37
- class:invalid={error}>{heading}</span
38
- >
39
- {:else}
40
- {#if bubbles}
41
- {#each bubbles as bubble (bubble)}
42
- <div class="card-detail">{bubble}</div>
43
- {/each}
44
- {/if}
45
-
46
- <div class="card-row heading">
47
- <h3>{heading}</h3>
48
- {#if editable}
49
- <Icon
50
- name="edit"
51
- size={Size.DoubleXLarge}
52
- />
53
- {/if}
54
- </div>
55
- {/if}
56
- {/snippet}
57
-
58
- <button
59
- class:desktop
60
- onkeydown={passthrough}
61
- {onclick}
62
- class="summary-card"
63
- class:error
64
- aria-label={onclick ? heading : undefined}
65
- type="button"
66
- >
67
- <!-- eslint-disable-next-line @typescript-eslint/no-confusing-void-expression -->
68
- {@render _heading()}
69
- <div class="columns">
70
- <div class="left">
71
- {#each keyValues as { key, value } (key)}
72
- <div class="card-row detail">
73
- <span class="key">{key}</span>
74
- <span
75
- class="leader"
76
- aria-hidden="true"
77
- ></span>
78
- <span class="value">{value}</span>
79
- </div>
80
- {/each}
81
- </div>
82
- {#if icon}
83
- <div class="right">
84
- <Icon
85
- name={icon}
86
- size={Size.Medium}
87
- />
88
- </div>
89
- {/if}
90
- </div>
91
- </button>
92
-
1
+ <svelte:options runes />
2
+
3
+ <script
4
+ module
5
+ lang="ts"
6
+ >
7
+ import { passthrough } from '../../Helpers/Helpers.svelte.js';
8
+ import { Size } from '../../Types/Internal/Size.js';
9
+ import Icon from '../Icon.svelte';
10
+ import type { SummaryCardProps } from './SummaryCardProps.js';
11
+
12
+ // CSS handles the dot-leader rendering via a flex pseudo element. We no
13
+ // longer interpolate a 108-character literal of dots into the markup.
14
+ </script>
15
+
16
+ <script lang="ts">
17
+ const {
18
+ bubbles,
19
+ desktop = false,
20
+ heading,
21
+ icon,
22
+ keyValues,
23
+ editable = false,
24
+ error = false,
25
+ onclick,
26
+ }: SummaryCardProps = $props();
27
+ </script>
28
+
29
+ {#snippet _heading()}
30
+ {#if desktop}
31
+ <span
32
+ class="desktop-heading"
33
+ class:invalid={error}>{heading}</span
34
+ >
35
+ <span
36
+ class="desktop-heading-border"
37
+ class:invalid={error}>{heading}</span
38
+ >
39
+ {:else}
40
+ {#if bubbles}
41
+ {#each bubbles as bubble (bubble)}
42
+ <div class="card-detail">{bubble}</div>
43
+ {/each}
44
+ {/if}
45
+
46
+ <div class="card-row heading">
47
+ <h3>{heading}</h3>
48
+ {#if editable}
49
+ <Icon
50
+ name="edit"
51
+ size={Size.DoubleXLarge}
52
+ />
53
+ {/if}
54
+ </div>
55
+ {/if}
56
+ {/snippet}
57
+
58
+ <button
59
+ class:desktop
60
+ onkeydown={passthrough}
61
+ {onclick}
62
+ class="summary-card"
63
+ class:error
64
+ aria-label={onclick ? heading : undefined}
65
+ type="button"
66
+ >
67
+ <!-- eslint-disable-next-line @typescript-eslint/no-confusing-void-expression -->
68
+ {@render _heading()}
69
+ <div class="columns">
70
+ <div class="left">
71
+ {#each keyValues as { key, value } (key)}
72
+ <div class="card-row detail">
73
+ <span class="key">{key}</span>
74
+ <span
75
+ class="leader"
76
+ aria-hidden="true"
77
+ ></span>
78
+ <span class="value">{value}</span>
79
+ </div>
80
+ {/each}
81
+ </div>
82
+ {#if icon}
83
+ <div class="right">
84
+ <Icon
85
+ name={icon}
86
+ size={Size.Medium}
87
+ />
88
+ </div>
89
+ {/if}
90
+ </div>
91
+ </button>
92
+
93
93
  <style>ul {
94
94
  list-style: none;
95
95
  display: flex;
@@ -370,4 +370,4 @@ button.summary-card h3 {
370
370
  border-bottom: 1px dotted #647d8e;
371
371
  margin: 0 0.375rem;
372
372
  transform: translateY(-0.25em);
373
- }</style>
373
+ }</style>
@@ -1,97 +1,97 @@
1
- <svelte:options runes />
2
-
3
- <script lang="ts">
4
- import { useAsyncFlag } from '../../Helpers/AsyncFlag.svelte.js';
5
- import { devCatch, passthrough } from '../../Helpers/Helpers.svelte.js';
6
- import { Colour } from '../../scss/colours.js';
7
- import { InputVariant } from '../../Types/Internal/InputVariant.js';
8
- import { Size } from '../../Types/Internal/Size.js';
9
- import { onMount, tick } from 'svelte';
10
- import TextArea from '../TextArea.svelte';
11
- import type { TextAreaModalProps } from './TextAreaModalProps.js';
12
- import TouchModal from './TouchModal.svelte';
13
-
14
- let {
15
- header,
16
- value = $bindable(''),
17
- label,
18
- placeholder,
19
- cancelEditing,
20
- confirm,
21
- uppercase = false,
22
- textAreaRef = $bindable(),
23
- isValid: _isValid = true,
24
- explanation,
25
- }: TextAreaModalProps = $props();
26
-
27
- onMount(() => {
28
- tick()
29
- .then(() => {
30
- textAreaRef?.select();
31
- })
32
- .catch(devCatch);
33
- });
34
-
35
- async function resetValue() {
36
- value = '';
37
- await tick();
38
- textAreaRef?.select();
39
- }
40
-
41
- const isValid = useAsyncFlag(
42
- () => (typeof _isValid === 'function' ? _isValid(value) : _isValid),
43
- true
44
- );
45
- </script>
46
-
47
- <TouchModal
48
- onclose={() => {
49
- cancelEditing();
50
- }}
51
- {header}
52
- mandatory
53
- minHeight="400px"
54
- minWidth="600px"
55
- onsubmit={(e: SubmitEvent) => {
56
- e.preventDefault();
57
- confirm(value);
58
- }}
59
- {explanation}
60
- >
61
- <TextArea
62
- {uppercase}
63
- labelTop={label}
64
- {placeholder}
65
- bind:value
66
- variant={InputVariant.Modal}
67
- bind:textAreaRef
68
- invalid={!isValid.value}
69
- rightIcon={{
70
- name: 'cross',
71
- size: Size.Large,
72
- colour: Colour['$font-primary'],
73
- }}
74
- onRightIconClick={resetValue}
75
- />
76
-
77
- {#snippet footer()}
78
- <div class="modal-footer">
79
- <button
80
- onkeydown={passthrough}
81
- type="submit"
82
- disabled={!isValid.value}>Confirm</button
83
- >
84
- <button
85
- onkeydown={passthrough}
86
- type="button"
87
- onclick={() => {
88
- cancelEditing();
89
- }}>Cancel</button
90
- >
91
- </div>
92
- {/snippet}
93
- </TouchModal>
94
-
1
+ <svelte:options runes />
2
+
3
+ <script lang="ts">
4
+ import { useAsyncFlag } from '../../Helpers/AsyncFlag.svelte.js';
5
+ import { devCatch, passthrough } from '../../Helpers/Helpers.svelte.js';
6
+ import { Colour } from '../../scss/colours.js';
7
+ import { InputVariant } from '../../Types/Internal/InputVariant.js';
8
+ import { Size } from '../../Types/Internal/Size.js';
9
+ import { onMount, tick } from 'svelte';
10
+ import TextArea from '../TextArea.svelte';
11
+ import type { TextAreaModalProps } from './TextAreaModalProps.js';
12
+ import TouchModal from './TouchModal.svelte';
13
+
14
+ let {
15
+ header,
16
+ value = $bindable(''),
17
+ label,
18
+ placeholder,
19
+ cancelEditing,
20
+ confirm,
21
+ uppercase = false,
22
+ textAreaRef = $bindable(),
23
+ isValid: _isValid = true,
24
+ explanation,
25
+ }: TextAreaModalProps = $props();
26
+
27
+ onMount(() => {
28
+ tick()
29
+ .then(() => {
30
+ textAreaRef?.select();
31
+ })
32
+ .catch(devCatch);
33
+ });
34
+
35
+ async function resetValue() {
36
+ value = '';
37
+ await tick();
38
+ textAreaRef?.select();
39
+ }
40
+
41
+ const isValid = useAsyncFlag(
42
+ () => (typeof _isValid === 'function' ? _isValid(value) : _isValid),
43
+ true
44
+ );
45
+ </script>
46
+
47
+ <TouchModal
48
+ onclose={() => {
49
+ cancelEditing();
50
+ }}
51
+ {header}
52
+ mandatory
53
+ minHeight="400px"
54
+ minWidth="600px"
55
+ onsubmit={(e: SubmitEvent) => {
56
+ e.preventDefault();
57
+ confirm(value);
58
+ }}
59
+ {explanation}
60
+ >
61
+ <TextArea
62
+ {uppercase}
63
+ labelTop={label}
64
+ {placeholder}
65
+ bind:value
66
+ variant={InputVariant.Modal}
67
+ bind:textAreaRef
68
+ invalid={!isValid.value}
69
+ rightIcon={{
70
+ name: 'cross',
71
+ size: Size.Large,
72
+ colour: Colour['$font-primary'],
73
+ }}
74
+ onRightIconClick={resetValue}
75
+ />
76
+
77
+ {#snippet footer()}
78
+ <div class="modal-footer">
79
+ <button
80
+ onkeydown={passthrough}
81
+ type="submit"
82
+ disabled={!isValid.value}>Confirm</button
83
+ >
84
+ <button
85
+ onkeydown={passthrough}
86
+ type="button"
87
+ onclick={() => {
88
+ cancelEditing();
89
+ }}>Cancel</button
90
+ >
91
+ </div>
92
+ {/snippet}
93
+ </TouchModal>
94
+
95
95
  <style>dialog {
96
96
  overflow: clip;
97
97
  background-color: #e9ecf1;
@@ -339,4 +339,4 @@ button {
339
339
  display: block;
340
340
  border-width: 2px;
341
341
  border-radius: 4px;
342
- }</style>
342
+ }</style>