@social-mail/social-mail-client 1.2.148 → 1.2.149
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/dist/admin/AdminAppIndex.pack.js +160 -74
- package/dist/admin/AdminAppIndex.pack.js.map +1 -1
- package/dist/admin/AdminAppIndex.pack.min.js +30 -20
- package/dist/admin/AdminAppIndex.pack.min.js.map +1 -1
- package/dist/common/form/AppForm.d.ts +3 -0
- package/dist/common/form/AppForm.d.ts.map +1 -0
- package/dist/common/form/AppForm.js +41 -0
- package/dist/common/form/AppForm.js.map +1 -0
- package/dist/common/pages/user/login/LoginPage.d.ts +2 -0
- package/dist/common/pages/user/login/LoginPage.d.ts.map +1 -1
- package/dist/common/pages/user/login/LoginPage.js +51 -59
- package/dist/common/pages/user/login/LoginPage.js.map +1 -1
- package/dist/common/pages/user/multi-factor/MultiFactorSetupPage.d.ts.map +1 -1
- package/dist/common/pages/user/multi-factor/MultiFactorSetupPage.js +8 -8
- package/dist/common/pages/user/multi-factor/MultiFactorSetupPage.js.map +1 -1
- package/dist/common/pages/user/multi-factor/SetupMultiFactorPage.d.ts.map +1 -1
- package/dist/common/pages/user/multi-factor/SetupMultiFactorPage.js +6 -6
- package/dist/common/pages/user/multi-factor/SetupMultiFactorPage.js.map +1 -1
- package/dist/site-editor/blocks/Billboard.js +4 -2
- package/dist/site-editor/blocks/Billboard.js.map +1 -1
- package/dist/site-editor/blocks/OutlineText.d.ts +2 -0
- package/dist/site-editor/blocks/OutlineText.d.ts.map +1 -0
- package/dist/site-editor/blocks/OutlineText.js +37 -0
- package/dist/site-editor/blocks/OutlineText.js.map +1 -0
- package/dist/site-editor/drag-drop/DragDropHelper.d.ts.map +1 -1
- package/dist/site-editor/drag-drop/DragDropHelper.js +6 -0
- package/dist/site-editor/drag-drop/DragDropHelper.js.map +1 -1
- package/dist/site-editor/editor/HtmlPageEditor.d.ts.map +1 -1
- package/dist/site-editor/editor/HtmlPageEditor.js +5 -3
- package/dist/site-editor/editor/HtmlPageEditor.js.map +1 -1
- package/dist/site-editor/editor/SelectedElement.js +1 -1
- package/dist/site-editor/editor/SelectedElement.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/web/AppIndex.pack.js +166 -80
- package/dist/web/AppIndex.pack.js.map +1 -1
- package/dist/web/AppIndex.pack.min.js +36 -26
- package/dist/web/AppIndex.pack.min.js.map +1 -1
- package/package.json +1 -1
- package/src/common/form/AppForm.tsx +30 -0
- package/src/common/pages/user/login/LoginPage.tsx +52 -39
- package/src/common/pages/user/multi-factor/MultiFactorSetupPage.tsx +9 -8
- package/src/common/pages/user/multi-factor/SetupMultiFactorPage.tsx +5 -4
- package/src/site-editor/blocks/Billboard.tsx +3 -3
- package/src/site-editor/blocks/OutlineText.tsx +27 -0
- package/src/site-editor/drag-drop/DragDropHelper.ts +6 -0
- package/src/site-editor/editor/HtmlPageEditor.tsx +2 -0
- package/src/site-editor/editor/SelectedElement.tsx +1 -1
package/package.json
CHANGED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import XNode from "@web-atoms/core/dist/core/XNode";
|
|
2
|
+
import styled from "@web-atoms/core/dist/style/styled";
|
|
3
|
+
import Form from "@web-atoms/web-controls/dist/basic/Form";
|
|
4
|
+
|
|
5
|
+
styled.css `
|
|
6
|
+
padding: 10px;
|
|
7
|
+
border: solid 1px lightgray;
|
|
8
|
+
border-radius: 10px;
|
|
9
|
+
gap: 10px;
|
|
10
|
+
|
|
11
|
+
& h1, & h2, &h3, &h4, &h5, &h6 {
|
|
12
|
+
margin-block-start: 20px;
|
|
13
|
+
margin-block-end: 20px;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
& input {
|
|
17
|
+
outline: none;
|
|
18
|
+
border: none;
|
|
19
|
+
border-bottom: solid 1px #80808080;
|
|
20
|
+
min-width: 250px;
|
|
21
|
+
}
|
|
22
|
+
`.installGlobal("[data-app-form=app-form]");
|
|
23
|
+
|
|
24
|
+
export default function AppForm(a, ... nodes: XNode[]) {
|
|
25
|
+
return <Form
|
|
26
|
+
data-app-form="app-form"
|
|
27
|
+
{ ... a}>
|
|
28
|
+
{ ... nodes}
|
|
29
|
+
</Form>;
|
|
30
|
+
}
|
|
@@ -18,26 +18,7 @@ import styled from "@web-atoms/core/dist/style/styled";
|
|
|
18
18
|
import PageNavigator from "@web-atoms/web-controls/dist/PageNavigator";
|
|
19
19
|
import ForgotPassword from "../forgot/ForgotPassword";
|
|
20
20
|
import PopupService from "@web-atoms/core/dist/web/services/PopupService";
|
|
21
|
-
|
|
22
|
-
const css = styled.css `
|
|
23
|
-
& [data-border=frame] {
|
|
24
|
-
padding: 10px;
|
|
25
|
-
border-radius: 10px;
|
|
26
|
-
gap: 10px;
|
|
27
|
-
|
|
28
|
-
& h3 {
|
|
29
|
-
margin-block-start: 20px;
|
|
30
|
-
margin-block-end: 20px;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
& input {
|
|
34
|
-
outline: none;
|
|
35
|
-
border: none;
|
|
36
|
-
border-bottom: solid 1px #80808080;
|
|
37
|
-
min-width: 250px;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
`.installLocal();
|
|
21
|
+
import AppForm from "../../../form/AppForm";
|
|
41
22
|
|
|
42
23
|
const authTypes = [{
|
|
43
24
|
label: "Authenticator (TOTP)",
|
|
@@ -76,9 +57,9 @@ export default class LoginPage extends ContentPage {
|
|
|
76
57
|
this.model.checkPassword = "";
|
|
77
58
|
this.model.timeToken = "";
|
|
78
59
|
this.model.oneTimePassword = "";
|
|
79
|
-
this.render(<div
|
|
60
|
+
this.render(<div>
|
|
80
61
|
<div data-layout="center-all">
|
|
81
|
-
<
|
|
62
|
+
<AppForm>
|
|
82
63
|
<h3>
|
|
83
64
|
Sign in to continue
|
|
84
65
|
</h3>
|
|
@@ -105,7 +86,7 @@ export default class LoginPage extends ContentPage {
|
|
|
105
86
|
data-click-event="forgot-password"
|
|
106
87
|
data-layout="link">Forgot password?</span>
|
|
107
88
|
</div>}
|
|
108
|
-
</
|
|
89
|
+
</AppForm>
|
|
109
90
|
</div>
|
|
110
91
|
</div>);
|
|
111
92
|
}
|
|
@@ -123,41 +104,73 @@ export default class LoginPage extends ContentPage {
|
|
|
123
104
|
return;
|
|
124
105
|
}
|
|
125
106
|
|
|
107
|
+
this.showAuthenticator();
|
|
108
|
+
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
showAuthenticator() {
|
|
126
112
|
this.renderer = <div data-layout="center-all">
|
|
127
|
-
<
|
|
128
|
-
<
|
|
129
|
-
<ToggleButtonBar items={authTypes} value={Bind.twoWays(() => this.authType)}/>
|
|
130
|
-
</FormField>
|
|
113
|
+
<AppForm>
|
|
114
|
+
<h4>Enter Authenticator Code</h4>
|
|
131
115
|
<FormField
|
|
132
|
-
label="Code"
|
|
133
|
-
|
|
134
|
-
|
|
116
|
+
label="Code">
|
|
117
|
+
<input
|
|
118
|
+
autofocus={true}
|
|
119
|
+
type="tel" value={Bind.twoWaysImmediate(() => this.model.timeToken)} />
|
|
135
120
|
</FormField>
|
|
121
|
+
<div data-layout="row">
|
|
122
|
+
<button
|
|
123
|
+
event-click={() => this.showOTP()}
|
|
124
|
+
data-layout="link">
|
|
125
|
+
Enter One Time Password instead.
|
|
126
|
+
</button>
|
|
127
|
+
</div>
|
|
128
|
+
<div data-layout="command-row">
|
|
129
|
+
<SaveIconTextButton
|
|
130
|
+
event-click={() => this.login()}
|
|
131
|
+
text="Go" />
|
|
132
|
+
</div>
|
|
133
|
+
</AppForm>
|
|
134
|
+
</div>;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
showOTP() {
|
|
138
|
+
this.renderer = <div data-layout="center-all">
|
|
139
|
+
<AppForm>
|
|
140
|
+
<h4>Enter One Time Password</h4>
|
|
136
141
|
<FormField
|
|
137
|
-
label="
|
|
138
|
-
|
|
139
|
-
|
|
142
|
+
label="Password">
|
|
143
|
+
<input
|
|
144
|
+
autofocus={true}
|
|
145
|
+
type="tel" value={Bind.twoWaysImmediate(() => this.model.oneTimePassword)} />
|
|
140
146
|
</FormField>
|
|
147
|
+
<div data-layout="row">
|
|
148
|
+
<button
|
|
149
|
+
event-click={() => this.showAuthenticator()}
|
|
150
|
+
data-layout="link">
|
|
151
|
+
Enter Authenticator Code instad.
|
|
152
|
+
</button>
|
|
153
|
+
</div>
|
|
141
154
|
<div data-layout="command-row">
|
|
142
155
|
<SaveIconTextButton
|
|
143
156
|
event-click={() => this.login()}
|
|
144
|
-
text="Go"
|
|
145
|
-
/>
|
|
157
|
+
text="Go" />
|
|
146
158
|
</div>
|
|
147
|
-
</
|
|
159
|
+
</AppForm>
|
|
148
160
|
</div>;
|
|
149
|
-
|
|
150
161
|
}
|
|
151
162
|
|
|
163
|
+
|
|
152
164
|
async showChangePassword() {
|
|
153
165
|
this.model.newPassword = "";
|
|
154
166
|
|
|
155
167
|
this.renderer = <div>
|
|
156
168
|
<div data-layout="center-all">
|
|
157
|
-
<
|
|
169
|
+
<AppForm>
|
|
158
170
|
<div>Update your password, your one time password is expired.</div>
|
|
159
171
|
<FormField
|
|
160
172
|
label="Password"
|
|
173
|
+
autofocus={true}
|
|
161
174
|
required={true}
|
|
162
175
|
error={Bind.oneWay(() => Validators.isValidPassword(this.password)
|
|
163
176
|
? ""
|
|
@@ -182,7 +195,7 @@ export default class LoginPage extends ContentPage {
|
|
|
182
195
|
data-submit-event="login"
|
|
183
196
|
text="Change Password & Login"/>
|
|
184
197
|
</div>
|
|
185
|
-
</
|
|
198
|
+
</AppForm>
|
|
186
199
|
</div>
|
|
187
200
|
</div>;
|
|
188
201
|
|
|
@@ -10,6 +10,7 @@ import Bind from "@web-atoms/core/dist/core/Bind";
|
|
|
10
10
|
import Action from "@web-atoms/core/dist/view-model/Action";
|
|
11
11
|
import AtomRepeater from "@web-atoms/web-controls/dist/basic/AtomRepeater";
|
|
12
12
|
import { DateFormats } from "../../../date/DateFormats";
|
|
13
|
+
import AppForm from "../../../form/AppForm";
|
|
13
14
|
|
|
14
15
|
export default class MultiFactorSetupPage extends ContentPage {
|
|
15
16
|
|
|
@@ -33,7 +34,7 @@ export default class MultiFactorSetupPage extends ContentPage {
|
|
|
33
34
|
|
|
34
35
|
if (multiFactor) {
|
|
35
36
|
this.renderer = <div data-layout="center-page-900px">
|
|
36
|
-
<
|
|
37
|
+
<AppForm>
|
|
37
38
|
<FormField label="Methods">
|
|
38
39
|
<AtomRepeater
|
|
39
40
|
for="table"
|
|
@@ -57,7 +58,7 @@ export default class MultiFactorSetupPage extends ContentPage {
|
|
|
57
58
|
text="Disable"
|
|
58
59
|
/>
|
|
59
60
|
</div>
|
|
60
|
-
</
|
|
61
|
+
</AppForm>
|
|
61
62
|
</div>;
|
|
62
63
|
return;
|
|
63
64
|
}
|
|
@@ -67,7 +68,7 @@ export default class MultiFactorSetupPage extends ContentPage {
|
|
|
67
68
|
|| this.model.authFactors.filter((i) => i.method === "one-time").length < 8;
|
|
68
69
|
|
|
69
70
|
this.renderer = <div data-layout="center-page-900px">
|
|
70
|
-
<
|
|
71
|
+
<AppForm>
|
|
71
72
|
<FormField label="Methods">
|
|
72
73
|
<AtomRepeater
|
|
73
74
|
for="table"
|
|
@@ -106,7 +107,7 @@ export default class MultiFactorSetupPage extends ContentPage {
|
|
|
106
107
|
text="Disable"
|
|
107
108
|
/>
|
|
108
109
|
</div>}
|
|
109
|
-
</
|
|
110
|
+
</AppForm>
|
|
110
111
|
</div>;
|
|
111
112
|
}
|
|
112
113
|
|
|
@@ -151,7 +152,7 @@ export default class MultiFactorSetupPage extends ContentPage {
|
|
|
151
152
|
const authFactor = await this.userService.createAuthFactor(this.model);
|
|
152
153
|
this.authFactor = authFactor;
|
|
153
154
|
this.renderer = <div data-layout="center-page-900px">
|
|
154
|
-
<
|
|
155
|
+
<AppForm>
|
|
155
156
|
<FormField label="">
|
|
156
157
|
<div>Scan following QR Code in any compatible Authenticator App. Enter the generated code and hit the verify button.</div>
|
|
157
158
|
</FormField>
|
|
@@ -173,7 +174,7 @@ export default class MultiFactorSetupPage extends ContentPage {
|
|
|
173
174
|
text="Verify"
|
|
174
175
|
/>
|
|
175
176
|
</div>
|
|
176
|
-
</
|
|
177
|
+
</AppForm>
|
|
177
178
|
</div>;
|
|
178
179
|
}
|
|
179
180
|
|
|
@@ -194,7 +195,7 @@ export default class MultiFactorSetupPage extends ContentPage {
|
|
|
194
195
|
}
|
|
195
196
|
text += "\r\n";
|
|
196
197
|
this.renderer = <div data-layout="center-page-900px">
|
|
197
|
-
<
|
|
198
|
+
<AppForm>
|
|
198
199
|
<FormField label="One Time Passwords">
|
|
199
200
|
<div>Please copy and save these passwords somewhere safe. You can use
|
|
200
201
|
them if you cannot access Authenticator app.
|
|
@@ -215,7 +216,7 @@ export default class MultiFactorSetupPage extends ContentPage {
|
|
|
215
216
|
text="Go"
|
|
216
217
|
/>
|
|
217
218
|
</div>
|
|
218
|
-
</
|
|
219
|
+
</AppForm>
|
|
219
220
|
</div>;
|
|
220
221
|
}
|
|
221
222
|
|
|
@@ -10,6 +10,7 @@ import Bind from "@web-atoms/core/dist/core/Bind";
|
|
|
10
10
|
import Action from "@web-atoms/core/dist/view-model/Action";
|
|
11
11
|
import AtomRepeater from "@web-atoms/web-controls/dist/basic/AtomRepeater";
|
|
12
12
|
import { DateFormats } from "../../../date/DateFormats";
|
|
13
|
+
import AppForm from "../../../form/AppForm";
|
|
13
14
|
|
|
14
15
|
export default class SetupMultiFactorPage extends PopupWindowPage {
|
|
15
16
|
|
|
@@ -61,7 +62,7 @@ export default class SetupMultiFactorPage extends PopupWindowPage {
|
|
|
61
62
|
const authFactor = await this.userService.createAuthFactor(this.model);
|
|
62
63
|
this.authFactor = authFactor;
|
|
63
64
|
this.renderer = <div data-layout="center-page-900px">
|
|
64
|
-
<
|
|
65
|
+
<AppForm>
|
|
65
66
|
<FormField label="">
|
|
66
67
|
<div>Scan following QR Code in any compatible Authenticator App. Enter the generated code and hit the verify button.</div>
|
|
67
68
|
</FormField>
|
|
@@ -83,7 +84,7 @@ export default class SetupMultiFactorPage extends PopupWindowPage {
|
|
|
83
84
|
text="Verify"
|
|
84
85
|
/>
|
|
85
86
|
</div>
|
|
86
|
-
</
|
|
87
|
+
</AppForm>
|
|
87
88
|
</div>;
|
|
88
89
|
}
|
|
89
90
|
|
|
@@ -118,7 +119,7 @@ export default class SetupMultiFactorPage extends PopupWindowPage {
|
|
|
118
119
|
|
|
119
120
|
text += "\r\n";
|
|
120
121
|
this.renderer = <div data-layout="center-page-900px">
|
|
121
|
-
<
|
|
122
|
+
<AppForm>
|
|
122
123
|
<FormField label="One Time Passwords">
|
|
123
124
|
<div>Please copy and save these one time codes somewhere safe. You can use
|
|
124
125
|
them if you cannot access Authenticator app.
|
|
@@ -139,7 +140,7 @@ export default class SetupMultiFactorPage extends PopupWindowPage {
|
|
|
139
140
|
text="Setup Authenticator"
|
|
140
141
|
/>
|
|
141
142
|
</div>
|
|
142
|
-
</
|
|
143
|
+
</AppForm>
|
|
143
144
|
</div>;
|
|
144
145
|
}
|
|
145
146
|
|
|
@@ -71,10 +71,10 @@ StylerSets.register("low", styled.css `
|
|
|
71
71
|
);
|
|
72
72
|
|
|
73
73
|
export const Billboard = Block({
|
|
74
|
-
className: "fad fa-
|
|
74
|
+
className: "fad fa-text-size",
|
|
75
75
|
title: "Add Billboard",
|
|
76
76
|
factory: () => <section styler-layout="billboard">
|
|
77
|
-
<h1
|
|
78
|
-
<h4
|
|
77
|
+
<h1 styler-color="border-color">Billboard</h1>
|
|
78
|
+
<h4>Billboard</h4>
|
|
79
79
|
</section>
|
|
80
80
|
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import XNode from "@web-atoms/core/dist/core/XNode";
|
|
2
|
+
import { Block } from "./Block";
|
|
3
|
+
import styled from "@web-atoms/core/dist/style/styled";
|
|
4
|
+
import { StylerSets } from "../styler/StylerSets";
|
|
5
|
+
|
|
6
|
+
styled.css `
|
|
7
|
+
-webkit-text-fill-color: transparent;
|
|
8
|
+
-webkit-text-stroke-color: currentColor;
|
|
9
|
+
-webkit-text-stroke-width: 1px;
|
|
10
|
+
text-decoration: none;
|
|
11
|
+
font-style: normal;
|
|
12
|
+
font-weight: 900;
|
|
13
|
+
text-align: center;
|
|
14
|
+
padding-left: 7px;
|
|
15
|
+
font-family: monospace;
|
|
16
|
+
font-size: 1.5rem;
|
|
17
|
+
`.installGlobal(".editor-outlined-text");
|
|
18
|
+
|
|
19
|
+
export const OutlineText = Block({
|
|
20
|
+
className: "editor-outlined-text",
|
|
21
|
+
title: "Add Text with Outline",
|
|
22
|
+
text:"A",
|
|
23
|
+
factory: () => <div
|
|
24
|
+
styler-text-outline="size1px">
|
|
25
|
+
Outline
|
|
26
|
+
</div>
|
|
27
|
+
});
|
|
@@ -23,12 +23,14 @@ export function InstallDragDropHelper(editor: HtmlPageEditor) {
|
|
|
23
23
|
const dropTarget = (editor as any).dropTarget as SelectedElement;
|
|
24
24
|
|
|
25
25
|
document.addEventListener("dragstart", (e) => {
|
|
26
|
+
setTimeout(() => document.body.contentEditable = "false", 0);
|
|
26
27
|
dragged = e.target as HTMLElement;
|
|
27
28
|
e.dataTransfer.dropEffect = "move";
|
|
28
29
|
e.dataTransfer.setDragImage(dragged, 0, 0);
|
|
29
30
|
});
|
|
30
31
|
|
|
31
32
|
document.addEventListener("dragover", (e) => {
|
|
33
|
+
setTimeout(() => document.body.contentEditable = "false", 0);
|
|
32
34
|
const target = dropTarget.getDropTarget( dragged, e.target as HTMLElement);
|
|
33
35
|
e.preventDefault();
|
|
34
36
|
e.dataTransfer.dropEffect = "copy";
|
|
@@ -68,6 +70,7 @@ export function InstallDragDropHelper(editor: HtmlPageEditor) {
|
|
|
68
70
|
e.preventDefault();
|
|
69
71
|
dropTarget.clear();
|
|
70
72
|
dragged = null;
|
|
73
|
+
setTimeout(() => document.body.contentEditable = "true", 0);
|
|
71
74
|
});
|
|
72
75
|
|
|
73
76
|
document.addEventListener("drop", (e) => {
|
|
@@ -87,6 +90,7 @@ export function InstallDragDropHelper(editor: HtmlPageEditor) {
|
|
|
87
90
|
target.appendChild(insert);
|
|
88
91
|
dropTarget.clear();
|
|
89
92
|
editor.commit();
|
|
93
|
+
setTimeout(() => document.body.contentEditable = "true", 0);
|
|
90
94
|
return;
|
|
91
95
|
}
|
|
92
96
|
switch(dropTarget.dropAnchor) {
|
|
@@ -101,10 +105,12 @@ export function InstallDragDropHelper(editor: HtmlPageEditor) {
|
|
|
101
105
|
}
|
|
102
106
|
editor.commit();
|
|
103
107
|
dropTarget.clear();
|
|
108
|
+
setTimeout(() => document.body.contentEditable = "true", 0);
|
|
104
109
|
});
|
|
105
110
|
|
|
106
111
|
document.addEventListener("dragleave", (e) => {
|
|
107
112
|
dropTarget.clear();
|
|
113
|
+
setTimeout(() => document.body.contentEditable = "true", 0);
|
|
108
114
|
});
|
|
109
115
|
|
|
110
116
|
setTimeout(() => {
|
|
@@ -34,6 +34,7 @@ import { descendentElementIterator } from "@web-atoms/core/dist/web/core/AtomUI"
|
|
|
34
34
|
import { PriceTable } from "../blocks/PriceBox";
|
|
35
35
|
import { BindableProperty } from "@web-atoms/core/dist/core/BindableProperty";
|
|
36
36
|
import { Billboard } from "../blocks/Billboard";
|
|
37
|
+
import { OutlineText } from "../blocks/OutlineText";
|
|
37
38
|
|
|
38
39
|
styled.css `
|
|
39
40
|
display: grid;
|
|
@@ -286,6 +287,7 @@ export default class HtmlPageEditor extends AtomControl {
|
|
|
286
287
|
<PriceTable/>
|
|
287
288
|
<TypeWriterComponent/>
|
|
288
289
|
<Billboard/>
|
|
290
|
+
<OutlineText/>
|
|
289
291
|
</EditorToolbar>
|
|
290
292
|
<div data-element="editor"
|
|
291
293
|
style-max-width={Bind.oneWay(() => this.maxWidth > 768 ? "" : this.maxWidth + "px" )}>
|
|
@@ -66,7 +66,7 @@ export class SelectedElement {
|
|
|
66
66
|
const isDropTarget = /^(main|section)$/i;
|
|
67
67
|
|
|
68
68
|
// check if dragged has root only....
|
|
69
|
-
if (isDropTarget.test(dragged
|
|
69
|
+
if (isDropTarget.test(dragged?.tagName)) {
|
|
70
70
|
let start = target;
|
|
71
71
|
while (!isDropTarget.test(start.tagName)) {
|
|
72
72
|
start = start.parentElement;
|