iconograph-ui 1.4.9 → 1.4.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.
- package/example/src/lib/components/CustomTable.svelte +6 -0
- package/example/src/routes/+page.svelte +7 -0
- package/example/src/routes/user/+page.svelte +4 -0
- package/index.js +2 -0
- package/lib/assets/icons/icon-details.svg +69 -0
- package/lib/assets/icons/icon-next-w.svg +42 -0
- package/lib/form/ActionButton.svelte +109 -0
- package/lib/table/Table.svelte +26 -3
- package/lib/user/SelectUserInput.svelte +11 -4
- package/lib/user/UserSelect.svelte +4 -1
- package/package.json +1 -1
|
@@ -29,6 +29,12 @@
|
|
|
29
29
|
{ field: "city", label: "Ville", component: null, props: {}, width: 200, sort: (a, b) => a.name.localeCompare(b.name)},
|
|
30
30
|
{ field: "type", label: "Type", component: CustomLabel, props: {}, width: 120, sort: (a, b) => null, filterOptions: enumType},
|
|
31
31
|
{ field: "status", label: "Statut", component: null, props: {}, width: 120, sort: (a, b) => null, filterOptions: false},
|
|
32
|
+
{ field: "city", label: "Ville", component: null, props: {}, width: 200, sort: (a, b) => a.name.localeCompare(b.name)},
|
|
33
|
+
{ field: "city", label: "Ville", component: null, props: {}, width: 200, sort: (a, b) => a.name.localeCompare(b.name)},
|
|
34
|
+
{ field: "city", label: "Ville", component: null, props: {}, width: 200, sort: (a, b) => a.name.localeCompare(b.name)},
|
|
35
|
+
{ field: "city", label: "Ville", component: null, props: {}, width: 200, sort: (a, b) => a.name.localeCompare(b.name)},
|
|
36
|
+
{ field: "city", label: "Ville", component: null, props: {}, width: 200, sort: (a, b) => a.name.localeCompare(b.name)},
|
|
37
|
+
{ field: "city", label: "Ville", component: null, props: {}, width: 200, sort: (a, b) => a.name.localeCompare(b.name)},
|
|
32
38
|
]
|
|
33
39
|
|
|
34
40
|
let uri = "/example?"
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
import Editor from "$lib/iconograph-ui/inputs/Editor.svelte";
|
|
13
13
|
import SegmentedSwitchInput from "$lib/iconograph-ui/form/SegmentedSwitchInput.svelte"
|
|
14
14
|
import Link from "$lib/iconograph-ui/display/Link.svelte";
|
|
15
|
+
import SelectUserInput from "$lib/iconograph-ui/user/SelectUserInput.svelte";
|
|
15
16
|
|
|
16
17
|
let options = [{ key: "Value" }]
|
|
17
18
|
let inputs = [
|
|
@@ -67,6 +68,12 @@
|
|
|
67
68
|
<Card padding={'0px'}>
|
|
68
69
|
<Editor on:change={onEditorChange}></Editor>
|
|
69
70
|
</Card>
|
|
71
|
+
|
|
72
|
+
<Card>
|
|
73
|
+
|
|
74
|
+
<SelectUserInput multiple={true}></SelectUserInput>
|
|
75
|
+
|
|
76
|
+
</Card>
|
|
70
77
|
</BodySection>
|
|
71
78
|
|
|
72
79
|
<Modal bind:open={open}>
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
import UserSelect from "$lib/iconograph-ui/user/UserSelect.svelte";
|
|
9
9
|
|
|
10
10
|
import Form from "$lib/iconograph-ui/form/Form.svelte";
|
|
11
|
+
import ActionButton from "$lib/iconograph-ui/form/ActionButton.svelte";
|
|
11
12
|
import Input from "$lib/iconograph-ui/form/Input.svelte";
|
|
12
13
|
import SexeChoiceInput from "$lib/iconograph-ui/form/SexeChoiceInput.svelte";
|
|
13
14
|
import CustomInput from "$lib/components/CustomInput.svelte";
|
|
@@ -59,6 +60,9 @@
|
|
|
59
60
|
</div>
|
|
60
61
|
<span class="margin-l-s" style="text-transform: uppercase; color: #888; font-weight: 600;"></span>
|
|
61
62
|
</div>
|
|
63
|
+
<div style="margin-right: 60px;">
|
|
64
|
+
<ActionButton options={[{label: "Supprimer les derniers", action: () => {alert();}}]}></ActionButton>
|
|
65
|
+
</div>
|
|
62
66
|
</div>
|
|
63
67
|
</div>
|
|
64
68
|
</div>
|
package/index.js
CHANGED
|
@@ -22,6 +22,7 @@ import SegmentedSwitchInput from "./lib/form/SegmentedSwitchInput.svelte"
|
|
|
22
22
|
import DateStr from "./lib/display/DateStr.svelte";
|
|
23
23
|
import Field from "./lib/display/Field.svelte";
|
|
24
24
|
import Link from "./lib/display/Link.svelte";
|
|
25
|
+
import ActionButton from "./lib/form/ActionButton.svelte";
|
|
25
26
|
|
|
26
27
|
export {
|
|
27
28
|
Button,
|
|
@@ -47,5 +48,6 @@ export {
|
|
|
47
48
|
DateStr,
|
|
48
49
|
Field,
|
|
49
50
|
Link,
|
|
51
|
+
ActionButton,
|
|
50
52
|
addNotification,
|
|
51
53
|
};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
2
|
+
<svg
|
|
3
|
+
viewBox="0,0,256,256"
|
|
4
|
+
width="52px"
|
|
5
|
+
height="52px"
|
|
6
|
+
version="1.1"
|
|
7
|
+
id="svg2"
|
|
8
|
+
sodipodi:docname="icon-details.svg"
|
|
9
|
+
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
|
|
10
|
+
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
11
|
+
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
12
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
13
|
+
xmlns:svg="http://www.w3.org/2000/svg">
|
|
14
|
+
<defs
|
|
15
|
+
id="defs2" />
|
|
16
|
+
<sodipodi:namedview
|
|
17
|
+
id="namedview2"
|
|
18
|
+
pagecolor="#505050"
|
|
19
|
+
bordercolor="#ffffff"
|
|
20
|
+
borderopacity="1"
|
|
21
|
+
inkscape:showpageshadow="0"
|
|
22
|
+
inkscape:pageopacity="0"
|
|
23
|
+
inkscape:pagecheckerboard="1"
|
|
24
|
+
inkscape:deskcolor="#505050"
|
|
25
|
+
inkscape:zoom="5.639423"
|
|
26
|
+
inkscape:cx="34.134698"
|
|
27
|
+
inkscape:cy="24.913896"
|
|
28
|
+
inkscape:window-width="1366"
|
|
29
|
+
inkscape:window-height="697"
|
|
30
|
+
inkscape:window-x="1724"
|
|
31
|
+
inkscape:window-y="1432"
|
|
32
|
+
inkscape:window-maximized="1"
|
|
33
|
+
inkscape:current-layer="g2" />
|
|
34
|
+
<g
|
|
35
|
+
fill="#ffffff"
|
|
36
|
+
fill-rule="nonzero"
|
|
37
|
+
stroke="none"
|
|
38
|
+
stroke-width="1"
|
|
39
|
+
stroke-linecap="butt"
|
|
40
|
+
stroke-linejoin="miter"
|
|
41
|
+
stroke-miterlimit="10"
|
|
42
|
+
stroke-dasharray=""
|
|
43
|
+
stroke-dashoffset="0"
|
|
44
|
+
font-family="none"
|
|
45
|
+
font-weight="none"
|
|
46
|
+
font-size="none"
|
|
47
|
+
text-anchor="none"
|
|
48
|
+
style="mix-blend-mode: normal"
|
|
49
|
+
id="g2">
|
|
50
|
+
<circle
|
|
51
|
+
style="fill:#353435;fill-opacity:1;stroke-width:58.4123;paint-order:stroke markers fill"
|
|
52
|
+
id="path1"
|
|
53
|
+
cx="128"
|
|
54
|
+
cy="33.164097"
|
|
55
|
+
r="30.319672" />
|
|
56
|
+
<circle
|
|
57
|
+
style="mix-blend-mode:normal;fill:#353435;fill-opacity:1;stroke-width:58.4123;paint-order:stroke markers fill"
|
|
58
|
+
id="path1-1"
|
|
59
|
+
cx="128"
|
|
60
|
+
cy="129.33942"
|
|
61
|
+
r="30.319672" />
|
|
62
|
+
<circle
|
|
63
|
+
style="mix-blend-mode:normal;fill:#353435;fill-opacity:1;stroke-width:58.4123;paint-order:stroke markers fill"
|
|
64
|
+
id="path1-2"
|
|
65
|
+
cx="128"
|
|
66
|
+
cy="225.51472"
|
|
67
|
+
r="30.319672" />
|
|
68
|
+
</g>
|
|
69
|
+
</svg>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
2
|
+
<svg
|
|
3
|
+
viewBox="0 0 24 24"
|
|
4
|
+
width="96px"
|
|
5
|
+
height="96px"
|
|
6
|
+
version="1.1"
|
|
7
|
+
id="svg1"
|
|
8
|
+
sodipodi:docname="icon-next-w.svg"
|
|
9
|
+
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
|
|
10
|
+
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
11
|
+
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
12
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
13
|
+
xmlns:svg="http://www.w3.org/2000/svg">
|
|
14
|
+
<defs
|
|
15
|
+
id="defs1" />
|
|
16
|
+
<sodipodi:namedview
|
|
17
|
+
id="namedview1"
|
|
18
|
+
pagecolor="#505050"
|
|
19
|
+
bordercolor="#ffffff"
|
|
20
|
+
borderopacity="1"
|
|
21
|
+
inkscape:showpageshadow="0"
|
|
22
|
+
inkscape:pageopacity="0"
|
|
23
|
+
inkscape:pagecheckerboard="1"
|
|
24
|
+
inkscape:deskcolor="#505050"
|
|
25
|
+
inkscape:zoom="3.6902135"
|
|
26
|
+
inkscape:cx="34.279859"
|
|
27
|
+
inkscape:cy="51.081055"
|
|
28
|
+
inkscape:window-width="1366"
|
|
29
|
+
inkscape:window-height="697"
|
|
30
|
+
inkscape:window-x="296"
|
|
31
|
+
inkscape:window-y="1072"
|
|
32
|
+
inkscape:window-maximized="1"
|
|
33
|
+
inkscape:current-layer="svg1" />
|
|
34
|
+
<path
|
|
35
|
+
style="color:#000000;fill:#ffffff;stroke-linecap:square;-inkscape-stroke:none"
|
|
36
|
+
d="M 8.7481553,4.4712861 15.251845,10.974975"
|
|
37
|
+
id="path7" />
|
|
38
|
+
<path
|
|
39
|
+
id="path8"
|
|
40
|
+
style="color:#000000;fill:#ffffff;stroke-width:1.19665;stroke-linecap:square;-inkscape-stroke:none"
|
|
41
|
+
d="M 8.0956441,2.2032465 5.980469,4.3184215 7.0392251,5.3771777 13.762794,12.1025 7.0392251,18.828406 5.980469,19.884825 8.0956441,22 9.1544,20.94358 l 7.780572,-7.782908 1.058756,-1.058756 v -5.85e-4 L 17.729039,11.837226 15.878553,9.98674 15.877969,9.987324 9.1544,3.2620026 Z" />
|
|
42
|
+
</svg>
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
import { onMount } from 'svelte';
|
|
4
|
+
import Portal from 'svelte-portal';
|
|
5
|
+
import { clickOutside } from './../utils/clickOutside.js';
|
|
6
|
+
import detailsIcon from '../assets/icons/icon-details.svg?url';
|
|
7
|
+
|
|
8
|
+
export let options = [];
|
|
9
|
+
|
|
10
|
+
let open = false;
|
|
11
|
+
let dropdownEl;
|
|
12
|
+
let coords = { top: 0, left: 0, width: 0 };
|
|
13
|
+
|
|
14
|
+
function openDropdown() {
|
|
15
|
+
const rect = dropdownEl.getBoundingClientRect();
|
|
16
|
+
coords = { top: rect.bottom, left: rect.left, width: rect.width };
|
|
17
|
+
open = !open;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
23
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
24
|
+
<div class="dropdown {open ? 'open' : ''}" bind:this={dropdownEl} use:clickOutside on:click_outside={() => {open = false}}
|
|
25
|
+
on:click|preventDefault|stopPropagation={openDropdown}>
|
|
26
|
+
<div style:background-image={`url("${detailsIcon}")`}>Actions</div>
|
|
27
|
+
|
|
28
|
+
<!-- Liste déroulante -->
|
|
29
|
+
{#if open}
|
|
30
|
+
<Portal target="body" >
|
|
31
|
+
<div class="list" style="position: absolute; top:{coords.top + 2}px; left:{coords.left + coords.width - 200}px; width: {coords.width}px;" >
|
|
32
|
+
<!-- Options -->
|
|
33
|
+
{#each options as opt}
|
|
34
|
+
<div class="option" on:click={opt.action}>
|
|
35
|
+
<span>{opt.label}</span>
|
|
36
|
+
</div>
|
|
37
|
+
{/each}
|
|
38
|
+
</div>
|
|
39
|
+
</Portal>
|
|
40
|
+
{/if}
|
|
41
|
+
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<style>
|
|
45
|
+
.dropdown {
|
|
46
|
+
position: relative;
|
|
47
|
+
display: flex;
|
|
48
|
+
height: var(--theme-input-height, 40px);
|
|
49
|
+
flex: 1;
|
|
50
|
+
}
|
|
51
|
+
.dropdown.open {
|
|
52
|
+
border-bottom-left-radius: 0px;
|
|
53
|
+
border-bottom-right-radius: 0px;
|
|
54
|
+
}
|
|
55
|
+
.dropdown > div:first-of-type {
|
|
56
|
+
background-color: #ebebed;
|
|
57
|
+
height: 40px;
|
|
58
|
+
border: none;
|
|
59
|
+
border-radius: 8px;
|
|
60
|
+
cursor: pointer;
|
|
61
|
+
padding: 0px 16px;
|
|
62
|
+
font-size: 14px;
|
|
63
|
+
line-height: 40px;
|
|
64
|
+
font-weight: 600;
|
|
65
|
+
font-family: var(--theme-text-font);
|
|
66
|
+
color: #333;
|
|
67
|
+
flex: 1;
|
|
68
|
+
min-width: 76px;
|
|
69
|
+
background-size: 16px auto;
|
|
70
|
+
background-repeat: no-repeat;
|
|
71
|
+
background-position: center right 16px;
|
|
72
|
+
padding-left: 24px;
|
|
73
|
+
}
|
|
74
|
+
.dropdown > div:first-of-type:hover {
|
|
75
|
+
background-color: #ddd;
|
|
76
|
+
}
|
|
77
|
+
.list {
|
|
78
|
+
position: absolute;
|
|
79
|
+
top: 100%;
|
|
80
|
+
right: 0px;
|
|
81
|
+
background: var(--theme-input-bg-highlight, #ebebed);
|
|
82
|
+
border-radius: 8px;
|
|
83
|
+
padding: 8px 0px;
|
|
84
|
+
max-height: 220px;
|
|
85
|
+
overflow-y: auto;
|
|
86
|
+
z-index: 9999;
|
|
87
|
+
min-width: 200px;
|
|
88
|
+
}
|
|
89
|
+
.option {
|
|
90
|
+
display: flex;
|
|
91
|
+
align-items: center;
|
|
92
|
+
padding: 8px 24px;
|
|
93
|
+
gap: 8px;
|
|
94
|
+
cursor: pointer;
|
|
95
|
+
}
|
|
96
|
+
.option > span {
|
|
97
|
+
font-size: 14px;
|
|
98
|
+
line-height: 16px;
|
|
99
|
+
font-weight: 400;
|
|
100
|
+
font-family: var(--theme-text-font);
|
|
101
|
+
color: var(--theme-input-text-color);
|
|
102
|
+
overflow: hidden;
|
|
103
|
+
white-space: nowrap;
|
|
104
|
+
text-overflow: ellipsis;
|
|
105
|
+
}
|
|
106
|
+
.option:hover {
|
|
107
|
+
background: var(--theme-input-bg-hover);
|
|
108
|
+
}
|
|
109
|
+
</style>
|
package/lib/table/Table.svelte
CHANGED
|
@@ -23,6 +23,9 @@
|
|
|
23
23
|
|
|
24
24
|
let data = [];
|
|
25
25
|
|
|
26
|
+
let els = [];
|
|
27
|
+
let actualWidths = columns.map(c => c.width);
|
|
28
|
+
|
|
26
29
|
/*
|
|
27
30
|
function handleSort(sname) {
|
|
28
31
|
settings.forEach(e => {
|
|
@@ -82,13 +85,28 @@
|
|
|
82
85
|
|
|
83
86
|
onMount(() => {
|
|
84
87
|
resetAndGetData()
|
|
88
|
+
const observers = [];
|
|
89
|
+
|
|
90
|
+
columns.forEach((_, i) => {
|
|
91
|
+
const ob = new ResizeObserver(() => {
|
|
92
|
+
actualWidths[i] = els[i].offsetWidth;
|
|
93
|
+
//columns[i].width = actualWidths[i];
|
|
94
|
+
|
|
95
|
+
actualWidths = [...actualWidths];
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
ob.observe(els[i]);
|
|
99
|
+
observers.push(ob);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
return () => observers.forEach(o => o.disconnect());
|
|
85
103
|
});
|
|
86
104
|
|
|
87
105
|
</script>
|
|
88
106
|
|
|
89
107
|
<div class="table-wrapper">
|
|
90
108
|
<div>
|
|
91
|
-
<div
|
|
109
|
+
<div>
|
|
92
110
|
<div>
|
|
93
111
|
{#if header}
|
|
94
112
|
<div class="hd-actions" >
|
|
@@ -107,14 +125,16 @@
|
|
|
107
125
|
</div>
|
|
108
126
|
</div>
|
|
109
127
|
|
|
128
|
+
<div>
|
|
110
129
|
{#if filtering}
|
|
111
130
|
<TableFilter columns={columns} on:filter={(e) => resetAndGetData(e.detail)}></TableFilter>
|
|
112
131
|
{/if}
|
|
132
|
+
</div>
|
|
113
133
|
|
|
114
134
|
<div class="table-header">
|
|
115
135
|
<div><div>
|
|
116
|
-
{#each columns as c}
|
|
117
|
-
<div style="min-width: {c.width}px; width: {c.width}px;">
|
|
136
|
+
{#each columns as c, i}
|
|
137
|
+
<div bind:this={els[i]} style="min-width: {c.width}px; width: {c.width}px;" class="col-h">
|
|
118
138
|
{c.label}
|
|
119
139
|
{#if c.sort != null }
|
|
120
140
|
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
@@ -190,6 +210,9 @@
|
|
|
190
210
|
padding-right: 24px;
|
|
191
211
|
display: flex;
|
|
192
212
|
gap: 8px;
|
|
213
|
+
/*border-right: 1px red solid;
|
|
214
|
+
resize: horizontal;
|
|
215
|
+
overflow: hidden;*/
|
|
193
216
|
}
|
|
194
217
|
.table-body {
|
|
195
218
|
width: 100%;
|
|
@@ -31,7 +31,9 @@
|
|
|
31
31
|
<div>
|
|
32
32
|
<div class="user-label">
|
|
33
33
|
<UserPicture size={24} user={v}></UserPicture>
|
|
34
|
-
<
|
|
34
|
+
<a href={`/user/${v.id}`}>
|
|
35
|
+
<span>{v.firstname} {v.lastname}</span>
|
|
36
|
+
</a>
|
|
35
37
|
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
36
38
|
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
37
39
|
<div on:click={() => handleRemove(v.id)}>+</div>
|
|
@@ -49,7 +51,9 @@
|
|
|
49
51
|
{:else}
|
|
50
52
|
<div class="user-label">
|
|
51
53
|
<UserPicture size={24} user={value}></UserPicture>
|
|
52
|
-
<
|
|
54
|
+
<a href={`/user/${value.id}`}>
|
|
55
|
+
<span>{value.firstname} {value.lastname}</span>
|
|
56
|
+
</a>
|
|
53
57
|
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
54
58
|
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
55
59
|
<div on:click={handleRemove}>+</div>
|
|
@@ -76,7 +80,7 @@
|
|
|
76
80
|
display: flex;
|
|
77
81
|
align-items: center;
|
|
78
82
|
background-color: #ffffff;
|
|
79
|
-
height: var(--theme-input-height, 40px);
|
|
83
|
+
height: calc(var(--theme-input-height, 40px) - 2px);
|
|
80
84
|
border: 1px solid #e4e4e4;
|
|
81
85
|
border-radius: 8px;
|
|
82
86
|
padding: 0px 16px;
|
|
@@ -87,7 +91,7 @@
|
|
|
87
91
|
color: var(--theme-input-text-font);
|
|
88
92
|
flex: 1;
|
|
89
93
|
}
|
|
90
|
-
.user-label
|
|
94
|
+
.user-label span {
|
|
91
95
|
font-size: 14px;
|
|
92
96
|
line-height: 16px;
|
|
93
97
|
font-weight: 400;
|
|
@@ -99,6 +103,9 @@
|
|
|
99
103
|
margin-left: 8px;
|
|
100
104
|
flex: 1;
|
|
101
105
|
}
|
|
106
|
+
.user-label a, .user-label span {
|
|
107
|
+
flex: 1;
|
|
108
|
+
}
|
|
102
109
|
.user-label > div:nth-of-type(2) {
|
|
103
110
|
cursor: pointer;
|
|
104
111
|
margin-left: 8px;
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
let open = false;
|
|
17
17
|
let search = "";
|
|
18
18
|
|
|
19
|
+
let y = 0;
|
|
19
20
|
let dropdownEl;
|
|
20
21
|
let coords = { top: 0, left: 0, width: 0 };
|
|
21
22
|
|
|
@@ -48,6 +49,8 @@
|
|
|
48
49
|
|
|
49
50
|
</script>
|
|
50
51
|
|
|
52
|
+
<svelte:window bind:scrollY={y} />
|
|
53
|
+
|
|
51
54
|
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
52
55
|
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
53
56
|
<div class="dropdown {open ? 'open' : ''}" bind:this={dropdownEl} use:clickOutside on:click_outside={() => {open = false}}
|
|
@@ -58,7 +61,7 @@
|
|
|
58
61
|
<!-- Liste déroulante -->
|
|
59
62
|
{#if open}
|
|
60
63
|
<Portal target="body" >
|
|
61
|
-
<div class="list" style="position: absolute; top:{coords.top}px; left:{coords.left}px; width: {coords.width}px;" >
|
|
64
|
+
<div class="list" style="position: absolute; top:{coords.top + y}px; left:{coords.left}px; width: {coords.width}px;" >
|
|
62
65
|
<!-- Options -->
|
|
63
66
|
{#each users as user}
|
|
64
67
|
<div class="option" on:click={() => selectUser(user)}>
|