darabos commited on
Commit
2fb9e9d
·
1 Parent(s): a8859a7

Start converting directory page to React.

Browse files
Files changed (3) hide show
  1. web/app/globals.css +230 -104
  2. web/app/page.tsx +77 -94
  3. web/package-lock.json +105 -105
web/app/globals.css CHANGED
@@ -8,113 +8,239 @@ body {
8
  font-family: Arial, Helvetica, sans-serif;
9
  }
10
 
11
- .top-bar {
12
- display: flex;
13
- justify-content: space-between;
14
- align-items: center;
15
- }
16
- .ws-name {
17
- font-size: 1.5em;
18
- flex: 1;
19
- color: white;
20
- }
21
- .top-bar .logo img {
22
- height: 2em;
23
- vertical-align: middle;
24
- margin: 4px;
25
- }
26
- .page {
27
  display: flex;
28
  flex-direction: column;
29
  height: 100vh;
30
- }
31
 
32
- .tools {
33
- display: flex;
34
- align-items: center;
35
- }
36
- .tools a {
37
- font-size: 1.5em;
38
- padding: 0 10px;
39
- }
40
- .error {
41
- background: #ffdddd;
42
- padding: 8px;
43
- font-size: 12px;
44
- }
45
- .title-icon {
46
- margin-left: 5px;
47
- float: right;
48
- }
49
- .node-container {
50
- padding: 8px;
51
- position: relative;
52
- }
53
- .lynxkite-node {
54
- box-shadow: 0px 5px 50px 0px rgba(0, 0, 0, 0.3);
55
- border-radius: 4px;
56
- background: white;
57
- }
58
- .expanded .lynxkite-node {
59
- overflow-y: auto;
60
- height: 100%;
61
- }
62
- .lynxkite-node .title {
63
- /* background: oklch(75% 0.2 55); */
64
- font-weight: bold;
65
- padding: 8px;
66
- }
67
- .handle-name {
68
- font-size: 10px;
69
- color: black;
70
- letter-spacing: 0.05em;
71
- text-align: right;
72
- white-space: nowrap;
73
- position: absolute;
74
- top: -5px;
75
- backdrop-filter: blur(10px);
76
- padding: 2px 8px;
77
- border-radius: 4px;
78
- visibility: hidden;
79
- }
80
- .left .handle-name {
81
- right: 20px;
82
- }
83
- .right .handle-name {
84
- left: 20px;
85
- }
86
- .top .handle-name,
87
- .bottom .handle-name {
88
- top: -5px;
89
- left: 5px;
90
- backdrop-filter: none;
91
- }
92
- .node-container:hover .handle-name {
93
- visibility: visible;
94
- }
95
- .node-resizer {
96
- position: absolute;
97
- bottom: 8px;
98
- right: 8px;
99
- cursor: nwse-resize;
100
- }
101
- .lynxkite-node {
102
- .param {
103
- padding: 4px 8px 4px 8px;
104
- display: block;
105
- }
106
- .param-name {
107
- display: block;
108
- font-size: 10px;
109
- letter-spacing: 0.05em;
110
- margin-left: 10px;
111
- width: fit-content;
112
- padding: 2px 8px;
113
- border-radius: 4px 4px 0 0;
114
- ;
115
- }
116
- .collapsed-param {
117
- min-height: 20px;
118
- line-height: 10px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
120
  }
 
8
  font-family: Arial, Helvetica, sans-serif;
9
  }
10
 
11
+ .workspace {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  display: flex;
13
  flex-direction: column;
14
  height: 100vh;
 
15
 
16
+ .top-bar {
17
+ display: flex;
18
+ justify-content: space-between;
19
+ align-items: center;
20
+
21
+ .ws-name {
22
+ font-size: 1.5em;
23
+ flex: 1;
24
+ color: white;
25
+ }
26
+
27
+ .logo img {
28
+ height: 2em;
29
+ vertical-align: middle;
30
+ margin: 4px;
31
+ }
32
+
33
+ .tools {
34
+ display: flex;
35
+ align-items: center;
36
+
37
+ a {
38
+ font-size: 1.5em;
39
+ padding: 0 10px;
40
+ }
41
+ }
42
+ }
43
+
44
+ .error {
45
+ background: #ffdddd;
46
+ padding: 8px;
47
+ font-size: 12px;
48
+ }
49
+
50
+ .title-icon {
51
+ margin-left: 5px;
52
+ float: right;
53
+ }
54
+
55
+ .node-container {
56
+ padding: 8px;
57
+ position: relative;
58
+ }
59
+
60
+ .lynxkite-node {
61
+ box-shadow: 0px 5px 50px 0px rgba(0, 0, 0, 0.3);
62
+ border-radius: 4px;
63
+ background: white;
64
+ }
65
+
66
+ .expanded .lynxkite-node {
67
+ overflow-y: auto;
68
+ height: 100%;
69
+ }
70
+
71
+ .lynxkite-node .title {
72
+ /* background: oklch(75% 0.2 55); */
73
+ font-weight: bold;
74
+ padding: 8px;
75
+ }
76
+
77
+ .handle-name {
78
+ font-size: 10px;
79
+ color: black;
80
+ letter-spacing: 0.05em;
81
+ text-align: right;
82
+ white-space: nowrap;
83
+ position: absolute;
84
+ top: -5px;
85
+ backdrop-filter: blur(10px);
86
+ padding: 2px 8px;
87
+ border-radius: 4px;
88
+ visibility: hidden;
89
+ }
90
+
91
+ .left .handle-name {
92
+ right: 20px;
93
+ }
94
+
95
+ .right .handle-name {
96
+ left: 20px;
97
+ }
98
+
99
+ .top .handle-name,
100
+ .bottom .handle-name {
101
+ top: -5px;
102
+ left: 5px;
103
+ backdrop-filter: none;
104
+ }
105
+
106
+ .node-container:hover .handle-name {
107
+ visibility: visible;
108
+ }
109
+
110
+ .node-resizer {
111
+ position: absolute;
112
+ bottom: 8px;
113
+ right: 8px;
114
+ cursor: nwse-resize;
115
+ }
116
+
117
+ .lynxkite-node {
118
+ .param {
119
+ padding: 4px 8px 4px 8px;
120
+ display: block;
121
+ }
122
+
123
+ .param-name {
124
+ display: block;
125
+ font-size: 10px;
126
+ letter-spacing: 0.05em;
127
+ margin-left: 10px;
128
+ width: fit-content;
129
+ padding: 2px 8px;
130
+ border-radius: 4px 4px 0 0;
131
+ ;
132
+ }
133
+
134
+ .collapsed-param {
135
+ min-height: 20px;
136
+ line-height: 10px;
137
+ }
138
+ }
139
  }
140
+
141
+ .directory {
142
+ .entry-list {
143
+ width: 100%;
144
+ margin: 10px auto;
145
+ background-color: white;
146
+ border-radius: 10px;
147
+ box-shadow: 0px 2px 4px;
148
+ padding: 0 0 10px 0;
149
+ }
150
+
151
+ @media (min-width: 768px) {
152
+ .entry-list {
153
+ width: 768px;
154
+ }
155
+ }
156
+
157
+ @media (min-width: 960px) {
158
+ .entry-list {
159
+ width: 80%;
160
+ }
161
+ }
162
+
163
+ .logo {
164
+ margin: 0;
165
+ padding-top: 50px;
166
+ text-align: center;
167
+ }
168
+
169
+ .logo-image {
170
+ max-width: 50%;
171
+ }
172
+
173
+ .tagline {
174
+ color: #39bcf3;
175
+ font-size: 14px;
176
+ font-weight: 500;
177
+ }
178
+
179
+ @media (min-width: 1400px) {
180
+ .tagline {
181
+ font-size: 18px;
182
+ }
183
+ }
184
+
185
+ .actions {
186
+ display: flex;
187
+ justify-content: space-evenly;
188
+ padding: 5px;
189
+ }
190
+
191
+ .actions a {
192
+ padding: 2px 10px;
193
+ border-radius: 5px;
194
+ }
195
+
196
+ .actions a:hover {
197
+ background: #39bcf3;
198
+ color: white;
199
+ }
200
+
201
+ .breadcrumbs {
202
+ padding-left: 10px;
203
+ font-size: 20px;
204
+ background: #002a4c20;
205
+ }
206
+
207
+ .breadcrumbs a:hover {
208
+ color: #39bcf3;
209
+ }
210
+
211
+ .entry-list .entry {
212
+ display: block;
213
+ border-bottom: 1px solid whitesmoke;
214
+ padding-left: 10px;
215
+ color: #004165;
216
+ cursor: pointer;
217
+ user-select: none;
218
+ text-decoration: none;
219
+ }
220
+
221
+ .entry-list .open .entry,
222
+ .entry-list .entry:hover,
223
+ .entry-list .entry:focus {
224
+ background: #39bcf3;
225
+ color: white;
226
+ }
227
+
228
+ .entry-list .entry:last-child {
229
+ border-bottom: none;
230
+ }
231
+
232
+ .directory-page {
233
+ background: #002a4c;
234
+ height: 100vh;
235
+ }
236
+
237
+ a {
238
+ color: black;
239
+ text-decoration: none;
240
+ }
241
+
242
+ .loading {
243
+ color: #39bcf3;
244
+ margin: 10px;
245
+ }
246
  }
web/app/page.tsx CHANGED
@@ -1,101 +1,84 @@
 
1
  import Image from "next/image";
 
 
 
 
 
 
 
 
 
 
 
2
 
3
- export default function Home() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  return (
5
- <div className="grid grid-rows-[20px_1fr_20px] items-center justify-items-center min-h-screen p-8 pb-20 gap-16 sm:p-20 font-[family-name:var(--font-geist-sans)]">
6
- <main className="flex flex-col gap-8 row-start-2 items-center sm:items-start">
7
- <Image
8
- className="dark:invert"
9
- src="/next.svg"
10
- alt="Next.js logo"
11
- width={180}
12
- height={38}
13
- priority
14
- />
15
- <ol className="list-inside list-decimal text-sm text-center sm:text-left font-[family-name:var(--font-geist-mono)]">
16
- <li className="mb-2">
17
- Get started by editing{" "}
18
- <code className="bg-black/[.05] dark:bg-white/[.06] px-1 py-0.5 rounded font-semibold">
19
- app/page.tsx
20
- </code>
21
- .
22
- </li>
23
- <li>Save and see your changes instantly.</li>
24
- </ol>
25
-
26
- <div className="flex gap-4 items-center flex-col sm:flex-row">
27
- <a
28
- className="rounded-full border border-solid border-transparent transition-colors flex items-center justify-center bg-foreground text-background gap-2 hover:bg-[#383838] dark:hover:bg-[#ccc] text-sm sm:text-base h-10 sm:h-12 px-4 sm:px-5"
29
- href="https://vercel.com/new?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
30
- target="_blank"
31
- rel="noopener noreferrer"
32
- >
33
- <Image
34
- className="dark:invert"
35
- src="/vercel.svg"
36
- alt="Vercel logomark"
37
- width={20}
38
- height={20}
39
- />
40
- Deploy now
41
- </a>
42
- <a
43
- className="rounded-full border border-solid border-black/[.08] dark:border-white/[.145] transition-colors flex items-center justify-center hover:bg-[#f2f2f2] dark:hover:bg-[#1a1a1a] hover:border-transparent text-sm sm:text-base h-10 sm:h-12 px-4 sm:px-5 sm:min-w-44"
44
- href="https://nextjs.org/docs?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
45
- target="_blank"
46
- rel="noopener noreferrer"
47
- >
48
- Read our docs
49
- </a>
50
  </div>
51
- </main>
52
- <footer className="row-start-3 flex gap-6 flex-wrap items-center justify-center">
53
- <a
54
- className="flex items-center gap-2 hover:underline hover:underline-offset-4"
55
- href="https://nextjs.org/learn?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
56
- target="_blank"
57
- rel="noopener noreferrer"
58
- >
59
- <Image
60
- aria-hidden
61
- src="/file.svg"
62
- alt="File icon"
63
- width={16}
64
- height={16}
65
- />
66
- Learn
67
- </a>
68
- <a
69
- className="flex items-center gap-2 hover:underline hover:underline-offset-4"
70
- href="https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
71
- target="_blank"
72
- rel="noopener noreferrer"
73
- >
74
- <Image
75
- aria-hidden
76
- src="/window.svg"
77
- alt="Window icon"
78
- width={16}
79
- height={16}
80
- />
81
- Examples
82
- </a>
83
- <a
84
- className="flex items-center gap-2 hover:underline hover:underline-offset-4"
85
- href="https://nextjs.org?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
86
- target="_blank"
87
- rel="noopener noreferrer"
88
- >
89
- <Image
90
- aria-hidden
91
- src="/globe.svg"
92
- alt="Globe icon"
93
- width={16}
94
- height={16}
95
- />
96
- Go to nextjs.org →
97
- </a>
98
- </footer>
99
  </div>
100
  );
101
  }
 
1
+ // The directory browser.
2
  import Image from "next/image";
3
+ import Link from 'next/link';
4
+ // @ts-ignore
5
+ import Home from '~icons/tabler/home'
6
+ // @ts-ignore
7
+ import Folder from '~icons/tabler/folder'
8
+ // @ts-ignore
9
+ import FolderPlus from '~icons/tabler/folder-plus'
10
+ // @ts-ignore
11
+ import File from '~icons/tabler/file'
12
+ // @ts-ignore
13
+ import FilePlus from '~icons/tabler/file-plus'
14
 
15
+ export default async function Home({
16
+ searchParams,
17
+ }: {
18
+ searchParams?: Promise<{ [key: string]: string | string[] | undefined }>;
19
+ }) {
20
+ ;
21
+ async function fetchList(path) {
22
+ const encodedPath = encodeURIComponent(path || '');
23
+ const res = await fetch(`http://localhost:8000/api/dir/list?path=${encodedPath}`);
24
+ const j = await res.json();
25
+ return j;
26
+ }
27
+ const path = (await searchParams)?.path || '';
28
+ const list = await fetchList(path);
29
+ function link(item) {
30
+ if (item.type === 'directory') {
31
+ return `/dir?path=${item.name}`;
32
+ } else {
33
+ return `/workspace?path=${item.name}`;
34
+ }
35
+ }
36
+ function shortName(item) {
37
+ return item.name.split('/').pop();
38
+ }
39
+ function newName(list) {
40
+ let i = 0;
41
+ while (true) {
42
+ const name = `Untitled${i ? ` ${i}` : ''}`;
43
+ if (!list.find(item => item.name === name)) {
44
+ return name;
45
+ }
46
+ i++;
47
+ }
48
+ }
49
+ function newWorkspaceIn(path, list) {
50
+ const pathSlash = path ? `${path}/` : '';
51
+ return `/workspace?path=${pathSlash}${newName(list)}`;
52
+ }
53
+ async function newFolderIn(path, list) {
54
+ const pathSlash = path ? `${path}/` : '';
55
+ const name = newName(list);
56
+ const res = await fetch(`/api/dir/mkdir`, {
57
+ method: 'POST',
58
+ headers: { 'Content-Type': 'application/json' },
59
+ body: JSON.stringify({ path: pathSlash + name }),
60
+ });
61
+ list = await res.json();
62
+ }
63
  return (
64
+ <div className="directory-page">
65
+ <div className="logo">
66
+ <Link href="https://lynxkite.com/"><img src='/logo.png' className="logo-image" alt="LynxKite logo" /></Link>
67
+ <div className="tagline">The Complete Graph Data Science Platform</div>
68
+ </div>
69
+ <div className="entry-list">
70
+ <div className="actions">
71
+ <a href={newWorkspaceIn(path, list)}><FilePlus /> New workspace</a>
72
+ <a href="" onClick={() => newFolderIn(path, list)}><FolderPlus /> New folder</a>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
  </div>
74
+ {path && <div className="breadcrumbs"><a href="#dir"><Home /></a> {path} </div>}
75
+ {list.map(item =>
76
+ <a className="entry" href={link(item)}>
77
+ {item.type === 'directory' ? <Folder /> : <File />}
78
+ {shortName(item)}
79
+ </a>
80
+ )}
81
+ </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
  </div>
83
  );
84
  }
web/package-lock.json CHANGED
@@ -645,6 +645,111 @@
645
  "node": ">= 10"
646
  }
647
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
648
  "node_modules/@nodelib/fs.scandir": {
649
  "version": "2.1.5",
650
  "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -6932,111 +7037,6 @@
6932
  "version": "2.3.0",
6933
  "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
6934
  "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
6935
- },
6936
- "node_modules/@next/swc-darwin-x64": {
6937
- "version": "15.0.3",
6938
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.0.3.tgz",
6939
- "integrity": "sha512-Zxl/TwyXVZPCFSf0u2BNj5sE0F2uR6iSKxWpq4Wlk/Sv9Ob6YCKByQTkV2y6BCic+fkabp9190hyrDdPA/dNrw==",
6940
- "cpu": [
6941
- "x64"
6942
- ],
6943
- "optional": true,
6944
- "os": [
6945
- "darwin"
6946
- ],
6947
- "engines": {
6948
- "node": ">= 10"
6949
- }
6950
- },
6951
- "node_modules/@next/swc-linux-arm64-gnu": {
6952
- "version": "15.0.3",
6953
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.0.3.tgz",
6954
- "integrity": "sha512-T5+gg2EwpsY3OoaLxUIofmMb7ohAUlcNZW0fPQ6YAutaWJaxt1Z1h+8zdl4FRIOr5ABAAhXtBcpkZNwUcKI2fw==",
6955
- "cpu": [
6956
- "arm64"
6957
- ],
6958
- "optional": true,
6959
- "os": [
6960
- "linux"
6961
- ],
6962
- "engines": {
6963
- "node": ">= 10"
6964
- }
6965
- },
6966
- "node_modules/@next/swc-linux-arm64-musl": {
6967
- "version": "15.0.3",
6968
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.0.3.tgz",
6969
- "integrity": "sha512-WkAk6R60mwDjH4lG/JBpb2xHl2/0Vj0ZRu1TIzWuOYfQ9tt9NFsIinI1Epma77JVgy81F32X/AeD+B2cBu/YQA==",
6970
- "cpu": [
6971
- "arm64"
6972
- ],
6973
- "optional": true,
6974
- "os": [
6975
- "linux"
6976
- ],
6977
- "engines": {
6978
- "node": ">= 10"
6979
- }
6980
- },
6981
- "node_modules/@next/swc-linux-x64-gnu": {
6982
- "version": "15.0.3",
6983
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.0.3.tgz",
6984
- "integrity": "sha512-gWL/Cta1aPVqIGgDb6nxkqy06DkwJ9gAnKORdHWX1QBbSZZB+biFYPFti8aKIQL7otCE1pjyPaXpFzGeG2OS2w==",
6985
- "cpu": [
6986
- "x64"
6987
- ],
6988
- "optional": true,
6989
- "os": [
6990
- "linux"
6991
- ],
6992
- "engines": {
6993
- "node": ">= 10"
6994
- }
6995
- },
6996
- "node_modules/@next/swc-linux-x64-musl": {
6997
- "version": "15.0.3",
6998
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.0.3.tgz",
6999
- "integrity": "sha512-QQEMwFd8r7C0GxQS62Zcdy6GKx999I/rTO2ubdXEe+MlZk9ZiinsrjwoiBL5/57tfyjikgh6GOU2WRQVUej3UA==",
7000
- "cpu": [
7001
- "x64"
7002
- ],
7003
- "optional": true,
7004
- "os": [
7005
- "linux"
7006
- ],
7007
- "engines": {
7008
- "node": ">= 10"
7009
- }
7010
- },
7011
- "node_modules/@next/swc-win32-arm64-msvc": {
7012
- "version": "15.0.3",
7013
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.0.3.tgz",
7014
- "integrity": "sha512-9TEp47AAd/ms9fPNgtgnT7F3M1Hf7koIYYWCMQ9neOwjbVWJsHZxrFbI3iEDJ8rf1TDGpmHbKxXf2IFpAvheIQ==",
7015
- "cpu": [
7016
- "arm64"
7017
- ],
7018
- "optional": true,
7019
- "os": [
7020
- "win32"
7021
- ],
7022
- "engines": {
7023
- "node": ">= 10"
7024
- }
7025
- },
7026
- "node_modules/@next/swc-win32-x64-msvc": {
7027
- "version": "15.0.3",
7028
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.0.3.tgz",
7029
- "integrity": "sha512-VNAz+HN4OGgvZs6MOoVfnn41kBzT+M+tB+OK4cww6DNyWS6wKaDpaAm/qLeOUbnMh0oVx1+mg0uoYARF69dJyA==",
7030
- "cpu": [
7031
- "x64"
7032
- ],
7033
- "optional": true,
7034
- "os": [
7035
- "win32"
7036
- ],
7037
- "engines": {
7038
- "node": ">= 10"
7039
- }
7040
  }
7041
  }
7042
  }
 
645
  "node": ">= 10"
646
  }
647
  },
648
+ "node_modules/@next/swc-darwin-x64": {
649
+ "version": "15.0.3",
650
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.0.3.tgz",
651
+ "integrity": "sha512-Zxl/TwyXVZPCFSf0u2BNj5sE0F2uR6iSKxWpq4Wlk/Sv9Ob6YCKByQTkV2y6BCic+fkabp9190hyrDdPA/dNrw==",
652
+ "cpu": [
653
+ "x64"
654
+ ],
655
+ "optional": true,
656
+ "os": [
657
+ "darwin"
658
+ ],
659
+ "engines": {
660
+ "node": ">= 10"
661
+ }
662
+ },
663
+ "node_modules/@next/swc-linux-arm64-gnu": {
664
+ "version": "15.0.3",
665
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.0.3.tgz",
666
+ "integrity": "sha512-T5+gg2EwpsY3OoaLxUIofmMb7ohAUlcNZW0fPQ6YAutaWJaxt1Z1h+8zdl4FRIOr5ABAAhXtBcpkZNwUcKI2fw==",
667
+ "cpu": [
668
+ "arm64"
669
+ ],
670
+ "optional": true,
671
+ "os": [
672
+ "linux"
673
+ ],
674
+ "engines": {
675
+ "node": ">= 10"
676
+ }
677
+ },
678
+ "node_modules/@next/swc-linux-arm64-musl": {
679
+ "version": "15.0.3",
680
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.0.3.tgz",
681
+ "integrity": "sha512-WkAk6R60mwDjH4lG/JBpb2xHl2/0Vj0ZRu1TIzWuOYfQ9tt9NFsIinI1Epma77JVgy81F32X/AeD+B2cBu/YQA==",
682
+ "cpu": [
683
+ "arm64"
684
+ ],
685
+ "optional": true,
686
+ "os": [
687
+ "linux"
688
+ ],
689
+ "engines": {
690
+ "node": ">= 10"
691
+ }
692
+ },
693
+ "node_modules/@next/swc-linux-x64-gnu": {
694
+ "version": "15.0.3",
695
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.0.3.tgz",
696
+ "integrity": "sha512-gWL/Cta1aPVqIGgDb6nxkqy06DkwJ9gAnKORdHWX1QBbSZZB+biFYPFti8aKIQL7otCE1pjyPaXpFzGeG2OS2w==",
697
+ "cpu": [
698
+ "x64"
699
+ ],
700
+ "optional": true,
701
+ "os": [
702
+ "linux"
703
+ ],
704
+ "engines": {
705
+ "node": ">= 10"
706
+ }
707
+ },
708
+ "node_modules/@next/swc-linux-x64-musl": {
709
+ "version": "15.0.3",
710
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.0.3.tgz",
711
+ "integrity": "sha512-QQEMwFd8r7C0GxQS62Zcdy6GKx999I/rTO2ubdXEe+MlZk9ZiinsrjwoiBL5/57tfyjikgh6GOU2WRQVUej3UA==",
712
+ "cpu": [
713
+ "x64"
714
+ ],
715
+ "optional": true,
716
+ "os": [
717
+ "linux"
718
+ ],
719
+ "engines": {
720
+ "node": ">= 10"
721
+ }
722
+ },
723
+ "node_modules/@next/swc-win32-arm64-msvc": {
724
+ "version": "15.0.3",
725
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.0.3.tgz",
726
+ "integrity": "sha512-9TEp47AAd/ms9fPNgtgnT7F3M1Hf7koIYYWCMQ9neOwjbVWJsHZxrFbI3iEDJ8rf1TDGpmHbKxXf2IFpAvheIQ==",
727
+ "cpu": [
728
+ "arm64"
729
+ ],
730
+ "optional": true,
731
+ "os": [
732
+ "win32"
733
+ ],
734
+ "engines": {
735
+ "node": ">= 10"
736
+ }
737
+ },
738
+ "node_modules/@next/swc-win32-x64-msvc": {
739
+ "version": "15.0.3",
740
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.0.3.tgz",
741
+ "integrity": "sha512-VNAz+HN4OGgvZs6MOoVfnn41kBzT+M+tB+OK4cww6DNyWS6wKaDpaAm/qLeOUbnMh0oVx1+mg0uoYARF69dJyA==",
742
+ "cpu": [
743
+ "x64"
744
+ ],
745
+ "optional": true,
746
+ "os": [
747
+ "win32"
748
+ ],
749
+ "engines": {
750
+ "node": ">= 10"
751
+ }
752
+ },
753
  "node_modules/@nodelib/fs.scandir": {
754
  "version": "2.1.5",
755
  "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
 
7037
  "version": "2.3.0",
7038
  "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
7039
  "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7040
  }
7041
  }
7042
  }