@humandialog/forms.svelte 0.4.19 → 0.4.20

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.
@@ -42,13 +42,13 @@ function on_changed() {
42
42
  }
43
43
  </script>
44
44
 
45
- <div class="ml-2 h-6 {cs} {color_style} {additional_class} flex items-center">
45
+ <div class="ml-1 h-6 text-sm font-medium {cs} {color_style} {additional_class} flex items-center">
46
46
  <input type="checkbox"
47
47
  bind:checked={value}
48
48
  on:change={on_changed}
49
49
  {disabled}
50
50
  class="w-4 h-4 bg-gray-100 border-gray-300 dark:ring-offset-gray-800 focus:ring-2 mr-2 dark:bg-gray-700 dark:border-gray-600 rounded text-blue-600 focus:ring-blue-500 dark:focus:ring-blue-600"/>
51
- <span class="text-sm font-medium ml-1">
51
+ <span class="ml-1">
52
52
  <slot/>
53
53
  </span>
54
54
 
@@ -10,6 +10,7 @@ export let size = 5;
10
10
  export let bg = "";
11
11
  export let circle = false;
12
12
  let additional_class = $$restProps.class ?? "";
13
+ let id = $$restProps.id ?? "";
13
14
  let _bg;
14
15
  let txt = "";
15
16
  let symbol_html = "";
@@ -63,6 +64,7 @@ $: {
63
64
  style:height={icon_size}
64
65
  style:background-color={_bg}
65
66
  style:border-radius={ circle ? '50%' : ''}
67
+ {id}
66
68
  on:blur
67
69
  on:click
68
70
  on:focus
@@ -13,13 +13,26 @@
13
13
  export let context = ""
14
14
  export let itype="text"
15
15
  export let typename = '';
16
+ export let invalid = false;
16
17
 
17
18
  export let val = ''
18
19
 
19
- export const placeholder = 'pl'
20
+ export let placeholder = 'pl'
20
21
 
21
22
  export let s = 'sm'
22
23
  export let c = ''
24
+ export let validate_cb = undefined;
25
+ export function validate()
26
+ {
27
+ if(!validate_cb)
28
+ {
29
+ invalid = false;
30
+ return true;
31
+ }
32
+
33
+ invalid = !validate_cb(val);
34
+ return !invalid;
35
+ }
23
36
 
24
37
 
25
38
  let item = null
@@ -41,6 +54,7 @@
41
54
  let ctx = context ? context : getContext('ctx');
42
55
 
43
56
  let last_tick = -1
57
+ let border_style = "border-gray-300 dark:border-gray-600"
44
58
 
45
59
  $:{
46
60
  if($data_tick_store > last_tick)
@@ -60,12 +74,13 @@
60
74
 
61
75
  if(label == '')
62
76
  label = a
77
+
78
+
63
79
  }
64
80
 
65
-
66
-
67
81
  function value_changed()
68
82
  {
83
+ validate();
69
84
  if(item != null)
70
85
  {
71
86
  item[a] = val
@@ -81,22 +96,33 @@
81
96
  push_changes();
82
97
 
83
98
  }
99
+
100
+ function check_validity()
101
+ {
102
+ if(invalid)
103
+ validate();
104
+ }
84
105
 
85
106
 
86
107
  </script>
87
108
 
88
109
  {#if itype == 'text'}
110
+ {@const border_style = invalid ? "border-red-300 dark:border-red-600" : "border-gray-300 dark:border-gray-600" }
89
111
  <div class={cs}>
90
112
  <label for="name" class="block {label_mb} text-xs font-small text-gray-900 dark:text-white">{label}</label>
91
113
 
92
114
  <input type=text name="name" id="name"
93
115
  bind:value={val}
94
116
  on:change={()=> (value_changed())}
95
- on:blur={() => { accept_change(); } }
117
+ on:blur={() => { accept_change();} }
118
+ on:keydown={(e)=>{check_validity();}}
96
119
 
97
- class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg
98
- focus:ring-primary-600 focus:border-primary-600 block w-full {input_pb} {input_pt} px-2.5 dark:bg-gray-700
99
- dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-primary-500 dark:focus:border-primary-500"
120
+ class=" bg-gray-50 dark:bg-gray-700
121
+ border {border_style} rounded-lg
122
+ focus:ring-primary-600 focus:border-primary-600 dark:focus:ring-primary-500 dark:focus:border-primary-500
123
+ text-gray-900 dark:text-white text-sm
124
+ block w-full {input_pb} {input_pt} px-2.5
125
+ dark:placeholder-gray-400"
100
126
 
101
127
  placeholder={placeholder}>
102
128
  </div>
@@ -3,6 +3,7 @@
3
3
  /** @typedef {typeof __propDef.slots} InputboxSlots */
4
4
  export default class Inputbox extends SvelteComponentTyped<{
5
5
  [x: string]: any;
6
+ invalid?: boolean | undefined;
6
7
  label?: string | undefined;
7
8
  context?: string | undefined;
8
9
  self?: null | undefined;
@@ -13,10 +14,12 @@ export default class Inputbox extends SvelteComponentTyped<{
13
14
  placeholder?: string | undefined;
14
15
  itype?: string | undefined;
15
16
  val?: string | undefined;
17
+ validate_cb?: any;
18
+ validate?: (() => boolean) | undefined;
16
19
  }, {
17
20
  [evt: string]: CustomEvent<any>;
18
21
  }, {}> {
19
- get placeholder(): string;
22
+ get validate(): () => boolean;
20
23
  }
21
24
  export type InputboxProps = typeof __propDef.props;
22
25
  export type InputboxEvents = typeof __propDef.events;
@@ -25,6 +28,7 @@ import { SvelteComponentTyped } from "svelte";
25
28
  declare const __propDef: {
26
29
  props: {
27
30
  [x: string]: any;
31
+ invalid?: boolean | undefined;
28
32
  label?: string | undefined;
29
33
  context?: string | undefined;
30
34
  self?: null | undefined;
@@ -35,6 +39,8 @@ declare const __propDef: {
35
39
  placeholder?: string | undefined;
36
40
  itype?: string | undefined;
37
41
  val?: string | undefined;
42
+ validate_cb?: any;
43
+ validate?: (() => boolean) | undefined;
38
44
  };
39
45
  events: {
40
46
  [evt: string]: CustomEvent<any>;
@@ -20,8 +20,12 @@ export declare class rList_property_combo extends rList_property {
20
20
  export declare class rList_definition {
21
21
  title: string;
22
22
  title_editable: boolean;
23
+ on_title_changed: Function | undefined;
24
+ title_readonly: boolean;
23
25
  summary: string;
24
26
  summary_editable: boolean;
27
+ on_summary_changed: Function | undefined;
28
+ summary_readonly: boolean;
25
29
  can_insert: boolean;
26
30
  oninsert: Function | undefined;
27
31
  properties: rList_property[];
@@ -26,8 +26,12 @@ export class rList_property_combo extends rList_property {
26
26
  export class rList_definition {
27
27
  title = '';
28
28
  title_editable = false;
29
+ on_title_changed = undefined;
30
+ title_readonly = false;
29
31
  summary = '';
30
32
  summary_editable = false;
33
+ on_summary_changed = undefined;
34
+ summary_readonly = false;
31
35
  can_insert = false;
32
36
  oninsert = undefined;
33
37
  properties = [];
@@ -38,6 +38,14 @@ if (!typename) {
38
38
  typename = s[0];
39
39
  }
40
40
  }
41
+ let item_key = "";
42
+ let keys = Object.keys(item);
43
+ if (keys.includes("Id"))
44
+ item_key = "Id";
45
+ else if (keys.includes("$ref"))
46
+ item_key = "$ref";
47
+ else if (keys.length > 0)
48
+ item_key = keys[0];
41
49
  if (!title)
42
50
  title = definition.title;
43
51
  if (!summary)
@@ -49,14 +57,22 @@ function selected(...args) {
49
57
  return is_selected(item);
50
58
  }
51
59
  async function change_name(text) {
52
- item[title] = text;
53
- inform_modification(item, title, typename);
54
- push_changes();
60
+ if (definition.on_title_changed) {
61
+ definition.on_title_changed(item, text, title);
62
+ } else {
63
+ item[title] = text;
64
+ inform_modification(item, title, typename);
65
+ push_changes();
66
+ }
55
67
  }
56
68
  async function change_summary(text) {
57
- item[summary] = text;
58
- inform_modification(item, summary, typename);
59
- push_changes();
69
+ if (definition.on_summary_changed) {
70
+ definition.on_summary_changed(item, text, summary);
71
+ } else {
72
+ item[summary] = text;
73
+ inform_modification(item, summary, typename);
74
+ push_changes();
75
+ }
60
76
  }
61
77
  function edit(e) {
62
78
  if (!is_row_active)
@@ -129,7 +145,9 @@ function on_combo_changed(key, name, prop) {
129
145
  }
130
146
  }
131
147
  export function edit_property(field) {
132
- if (field == "Summary")
148
+ if (field == title)
149
+ force_editing("Title");
150
+ else if (field == summary)
133
151
  force_editing("Summary");
134
152
  else {
135
153
  let prop_idx = definition.properties.findIndex((p) => p.name == field);
@@ -147,7 +165,7 @@ export function edit_property(field) {
147
165
  }
148
166
  }
149
167
  async function force_editing(field) {
150
- let element_id = `__hd_list_ctrl_${item.Id}_${field}`;
168
+ let element_id = `__hd_list_ctrl_${item[item_key]}_${field}`;
151
169
  let element_node = document.getElementById(element_id);
152
170
  if (!element_node) {
153
171
  placeholder = field;
@@ -204,11 +222,17 @@ async function edit_date(field, prop_idx) {
204
222
  <div class="ml-3 w-full py-1" use:selectable={item} on:click={(e) => {activate_row(e, item)}} role="row" tabindex="0">
205
223
  <div class="flex flex-row">
206
224
  <p class="font-bold whitespace-nowrap overflow-clip flex-none w-1/2 sm:w-1/3">
207
- <span id="__hd_list_ctrl_{item.Id}_Title" role="gridcell" tabindex="0"
208
- use:editable={(text) => {change_name(text)}}
209
- on:click={edit}>
225
+ {#if definition.title_readonly}
226
+ <span id="__hd_list_ctrl_{item[item_key]}_Title" role="gridcell" tabindex="0">
210
227
  {item[title]}
211
228
  </span>
229
+ {:else}
230
+ <span id="__hd_list_ctrl_{item[item_key]}_Title" role="gridcell" tabindex="0"
231
+ use:editable={(text) => {change_name(text)}}
232
+ on:click={edit}>
233
+ {item[title]}
234
+ </span>
235
+ {/if}
212
236
  </p>
213
237
 
214
238
  <!--div class="flex flex-row justify-between text-xs flex-none w-1/2 sm:w-2/3"-->
@@ -248,9 +272,13 @@ async function edit_date(field, prop_idx) {
248
272
  </div>
249
273
 
250
274
  {#if summary && (item[summary] || placeholder=='Summary')}
251
- {@const element_id = `__hd_list_ctrl_${item.Id}_Summary`}
275
+ {@const element_id = `__hd_list_ctrl_${item[item_key]}_Summary`}
252
276
  <p class="text-xs text-slate-400" style="min-height: 1rem;">
253
- {#if item[summary]}
277
+ {#if definition.summary_readonly}
278
+ <span id={element_id} role="gridcell" tabindex="0">
279
+ {item[summary]}
280
+ </span>
281
+ {:else if item[summary]}
254
282
  <span id={element_id} role="gridcell" tabindex="0"
255
283
  use:editable={(text) => {change_summary(text)}}
256
284
  on:click={edit}>
@@ -1,6 +1,4 @@
1
1
  <script>import { editable, start_editing } from "../../../utils";
2
- import Icon from "../../icon.svelte";
3
- import { FaRegCircle } from "svelte-icons/fa";
4
2
  export let oninsert;
5
3
  export function run(onclose) {
6
4
  start_editing(insertion_paragraph, onclose);
@@ -9,9 +7,7 @@ let insertion_paragraph;
9
7
  </script>
10
8
 
11
9
  <section class="flex flex-row my-0 w-full text-sm text-slate-700 dark:text-slate-400 cursor-default rounded-md border-2 border-transparent bg-gray-200 dark:bg-gray-700">
12
- <Icon size={4}
13
- component={FaRegCircle}
14
- class="cursor-pointer mt-1.5 ml-2 "/>
10
+ <slot name='left'/>
15
11
 
16
12
  <p class="ml-3 py-1 font-bold whitespace-nowrap overflow-clip flex-none w-1/2 sm:w-1/3"
17
13
  bind:this={insertion_paragraph}
@@ -7,7 +7,9 @@ declare const __propDef: {
7
7
  events: {
8
8
  [evt: string]: CustomEvent<any>;
9
9
  };
10
- slots: {};
10
+ slots: {
11
+ left: {};
12
+ };
11
13
  };
12
14
  export type ListProps = typeof __propDef.props;
13
15
  export type ListEvents = typeof __propDef.events;
@@ -1,7 +1,11 @@
1
1
  <script>import { getContext } from "svelte";
2
2
  export let a;
3
3
  export let editable = false;
4
+ export let on_change = void 0;
5
+ export let readonly = false;
4
6
  let definition = getContext("rList-definition");
5
7
  definition.summary = a;
6
8
  definition.summary_editable = editable;
9
+ definition.on_summary_changed = on_change;
10
+ definition.summary_readonly = readonly;
7
11
  </script>
@@ -3,6 +3,8 @@ declare const __propDef: {
3
3
  props: {
4
4
  a: string;
5
5
  editable?: boolean | undefined;
6
+ on_change?: Function | undefined;
7
+ readonly?: boolean | undefined;
6
8
  };
7
9
  events: {
8
10
  [evt: string]: CustomEvent<any>;
@@ -25,6 +25,7 @@ const END_OF_LIST = {};
25
25
  let rows = [];
26
26
  let activate_after_dom_update = null;
27
27
  let inserter;
28
+ let item_key = "";
28
29
  clear_active_item("props");
29
30
  let last_tick = -1;
30
31
  $:
@@ -38,6 +39,18 @@ function setup(...args) {
38
39
  items = item[a];
39
40
  else
40
41
  items = [];
42
+ if (items.length > 0) {
43
+ let first_element = items[0];
44
+ let keys = Object.keys(first_element);
45
+ if (keys.includes("Id"))
46
+ item_key = "Id";
47
+ else if (keys.includes("$ref"))
48
+ item_key = "$ref";
49
+ else if (keys.length > 0)
50
+ item_key = keys[0];
51
+ else
52
+ item_key = "";
53
+ }
41
54
  if (!typename)
42
55
  typename = $context_types_store[ctx];
43
56
  }
@@ -121,8 +134,8 @@ export function edit(element, property_name) {
121
134
  {/if}
122
135
 
123
136
 
124
- {#if items && items.length > 0 }
125
- {#each items as element, i (element.Id)}
137
+ {#if items && items.length > 0 && !!item_key }
138
+ {#each items as element, i (element[item_key])}
126
139
 
127
140
  <List_element item={element}
128
141
  {toolbar_operations}
@@ -1,7 +1,11 @@
1
1
  <script>import { getContext } from "svelte";
2
2
  export let a;
3
3
  export let editable = false;
4
+ export let on_change = void 0;
5
+ export let readonly = false;
4
6
  let definition = getContext("rList-definition");
5
7
  definition.title = a;
6
8
  definition.title_editable = editable;
9
+ definition.on_title_changed = on_change;
10
+ definition.title_readonly = readonly;
7
11
  </script>
@@ -3,6 +3,8 @@ declare const __propDef: {
3
3
  props: {
4
4
  a: string;
5
5
  editable?: boolean | undefined;
6
+ on_change?: Function | undefined;
7
+ readonly?: boolean | undefined;
6
8
  };
7
9
  events: {
8
10
  [evt: string]: CustomEvent<any>;
package/index.d.ts CHANGED
@@ -34,6 +34,7 @@ export { default as ListSummary } from './components/list/list.summary.svelte';
34
34
  export { default as ListInserter } from './components/list/list.inserter.svelte';
35
35
  export { default as ListDateProperty } from './components/list/list.date.svelte';
36
36
  export { default as ListComboProperty } from './components/list/list.combo.svelte';
37
+ export { default as Modal } from './modal.svelte';
37
38
  export { select_item, activate_item, clear_active_item, is_active, is_selected, get_active, editable, start_editing, selectable, handle_select } from './utils';
38
39
  export { data_tick_store, has_selected_item, has_data_item } from "./stores";
39
40
  export { context_toolbar_operations, page_toolbar_operations, context_items_store, context_types_store } from './stores';
package/index.js CHANGED
@@ -40,6 +40,7 @@ export { default as ListSummary } from './components/list/list.summary.svelte';
40
40
  export { default as ListInserter } from './components/list/list.inserter.svelte';
41
41
  export { default as ListDateProperty } from './components/list/list.date.svelte';
42
42
  export { default as ListComboProperty } from './components/list/list.combo.svelte';
43
+ export { default as Modal } from './modal.svelte';
43
44
  export { select_item, activate_item, clear_active_item, is_active, is_selected, get_active, editable, start_editing, selectable, handle_select } from './utils';
44
45
  export { data_tick_store, has_selected_item, has_data_item } from "./stores";
45
46
  export { context_toolbar_operations, page_toolbar_operations, context_items_store, context_types_store } from './stores'; // tmp
package/modal.svelte ADDED
@@ -0,0 +1,100 @@
1
+ <script>import Icon from "./components/icon.svelte";
2
+ export let title = "";
3
+ export let open = false;
4
+ export let content = "";
5
+ export let icon = void 0;
6
+ export const OK = 0;
7
+ export const OKCancel = 1;
8
+ export const Custom = 2;
9
+ export let mode = OKCancel;
10
+ export let ok_caption = "OK";
11
+ export let cancel_caption = "Cancel";
12
+ export let on_ok_callback = void 0;
13
+ export let on_cancel_callback = void 0;
14
+ export function show(on_close_callback = void 0) {
15
+ open = true;
16
+ close_callback = on_close_callback;
17
+ }
18
+ let close_callback = void 0;
19
+ function on_ok(event) {
20
+ if (on_ok_callback)
21
+ on_ok_callback();
22
+ if (close_callback)
23
+ close_callback("OK");
24
+ }
25
+ function on_cancel(event) {
26
+ open = false;
27
+ if (on_cancel_callback)
28
+ on_cancel_callback();
29
+ if (close_callback)
30
+ close_callback("Cancel");
31
+ }
32
+ </script>
33
+
34
+ {#if open}
35
+ <div class="relative z-10" aria-labelledby="modal-title" role="dialog" aria-modal="true">
36
+ <!--
37
+ Background backdrop, show/hide based on modal state.
38
+
39
+ Entering: "ease-out duration-300"
40
+ From: "opacity-0"
41
+ To: "opacity-100"
42
+ Leaving: "ease-in duration-200"
43
+ From: "opacity-100"
44
+ To: "opacity-0"
45
+ -->
46
+ <div class="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity"></div>
47
+
48
+ <div class="fixed inset-0 z-10 w-screen overflow-y-auto">
49
+ <div class="flex min-h-full items-end justify-center p-4 text-center sm:items-center sm:p-0">
50
+ <!--
51
+ Modal panel, show/hide based on modal state.
52
+
53
+ Entering: "ease-out duration-300"
54
+ From: "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
55
+ To: "opacity-100 translate-y-0 sm:scale-100"
56
+ Leaving: "ease-in duration-200"
57
+ From: "opacity-100 translate-y-0 sm:scale-100"
58
+ To: "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
59
+ -->
60
+ <div class="relative transform overflow-hidden rounded-lg bg-white text-left shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-lg">
61
+ <div class="bg-white px-4 pb-4 pt-5 sm:p-6 sm:pb-4">
62
+ <div class="sm:flex sm:items-start">
63
+ <div class="mx-auto flex h-12 w-12 flex-shrink-0 items-center justify-center rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10">
64
+ {#if icon}
65
+ <Icon component={icon} size={6} class="text-gray-700"/>
66
+ {/if}
67
+ </div>
68
+ <div class="grow mt-3 text-center sm:ml-4 sm:mt-0 sm:text-left">
69
+ <h3 class="text-base font-semibold leading-6 text-gray-900" id="modal-title">{title}</h3>
70
+ <div class="mt-2">
71
+ {#if content}
72
+ <p class="text-sm text-gray-500">{content}</p>
73
+ {:else}
74
+ <slot/>
75
+ {/if}
76
+ </div>
77
+ </div>
78
+ </div>
79
+ </div>
80
+ <div class="bg-gray-50 px-4 py-3 sm:flex sm:flex-row-reverse sm:px-6">
81
+ {#if mode == OK}
82
+ <button type="button" class="inline-flex w-full justify-center rounded-md bg-blue-700 px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-blue-800 sm:ml-3 sm:w-auto"
83
+ on:click={on_ok}>
84
+ {ok_caption}</button>
85
+ {:else if mode == OKCancel}
86
+ <button type="button" class="inline-flex w-full justify-center rounded-md bg-blue-700 px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-blue-800 sm:ml-3 sm:w-auto"
87
+ on:click={on_ok}>
88
+ {ok_caption}</button>
89
+ <button type="button" class="mt-3 inline-flex w-full justify-center rounded-md bg-white px-3 py-2 text-sm font-semibold text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50 sm:mt-0 sm:w-auto"
90
+ on:click={on_cancel}>
91
+ {cancel_caption}</button>
92
+ {:else if mode == Custom}
93
+ <slot name="footer"/>
94
+ {/if}
95
+ </div>
96
+ </div>
97
+ </div>
98
+ </div>
99
+ </div>
100
+ {/if}
@@ -0,0 +1,35 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ title?: string | undefined;
5
+ open?: boolean | undefined;
6
+ content?: string | undefined;
7
+ icon?: undefined;
8
+ OK?: 0 | undefined;
9
+ OKCancel?: 1 | undefined;
10
+ Custom?: 2 | undefined;
11
+ mode?: number | undefined;
12
+ ok_caption?: string | undefined;
13
+ cancel_caption?: string | undefined;
14
+ on_ok_callback?: Function | undefined;
15
+ on_cancel_callback?: Function | undefined;
16
+ show?: ((on_close_callback?: Function | undefined) => void) | undefined;
17
+ };
18
+ events: {
19
+ [evt: string]: CustomEvent<any>;
20
+ };
21
+ slots: {
22
+ default: {};
23
+ footer: {};
24
+ };
25
+ };
26
+ export type ModalProps = typeof __propDef.props;
27
+ export type ModalEvents = typeof __propDef.events;
28
+ export type ModalSlots = typeof __propDef.slots;
29
+ export default class Modal extends SvelteComponentTyped<ModalProps, ModalEvents, ModalSlots> {
30
+ get OK(): 0;
31
+ get OKCancel(): 1;
32
+ get Custom(): 2;
33
+ get show(): (on_close_callback?: Function | undefined) => void;
34
+ }
35
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@humandialog/forms.svelte",
3
- "version": "0.4.19",
3
+ "version": "0.4.20",
4
4
  "description": "Basic Svelte UI components for Object Reef applications",
5
5
  "devDependencies": {
6
6
  "@playwright/test": "^1.28.1",
@@ -26,7 +26,7 @@
26
26
  },
27
27
  "type": "module",
28
28
  "dependencies": {
29
- "@humandialog/auth.svelte": "^1.1.2",
29
+ "@humandialog/auth.svelte": "^1.2.0",
30
30
  "flowbite-svelte": "^0.29.13",
31
31
  "svelte-icons": "^2.1.0",
32
32
  "svelte-spa-router": "^3.3.0"
@@ -102,6 +102,7 @@
102
102
  ".": "./index.js",
103
103
  "./internal/configurable.content.svelte": "./internal/configurable.content.svelte",
104
104
  "./internal/loading.svelte": "./internal/loading.svelte",
105
+ "./modal.svelte": "./modal.svelte",
105
106
  "./operations.svelte": "./operations.svelte",
106
107
  "./page.row.svelte": "./page.row.svelte",
107
108
  "./page.svelte": "./page.svelte",