@alemonjs/kook 0.2.7 → 2.1.0-alpha.0

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 (32) hide show
  1. package/lib/config.js +20 -0
  2. package/lib/desktop.d.ts +2 -2
  3. package/lib/desktop.js +54 -55
  4. package/lib/hook.d.ts +38 -0
  5. package/lib/hook.js +24 -0
  6. package/lib/index.d.ts +6 -7
  7. package/lib/index.js +314 -274
  8. package/lib/sdk/api.d.ts +275 -0
  9. package/lib/sdk/{platform/kook/sdk/api.js → api.js} +25 -26
  10. package/lib/sdk/{platform/kook/sdk/config.js → config.js} +1 -1
  11. package/lib/sdk/{platform/kook/sdk/message.js → message.js} +1 -4
  12. package/lib/sdk/typings.d.ts +109 -0
  13. package/package.json +2 -2
  14. package/dist/assets/index.css +0 -1
  15. package/dist/assets/index.js +0 -49
  16. package/dist/index.html +0 -15
  17. package/lib/sdk/core/utils/from.js +0 -42
  18. package/lib/sdk/platform/kook/sdk/api.d.ts +0 -288
  19. package/lib/sdk/platform/kook/sdk/message/INTERACTION.d.ts +0 -8
  20. package/lib/sdk/platform/kook/sdk/message/MEMBER_ADD.d.ts +0 -10
  21. package/lib/sdk/platform/kook/sdk/message/MEMBER_REMOVE.d.ts +0 -10
  22. package/lib/sdk/platform/kook/sdk/message/MESSAGES_DIRECT.d.ts +0 -10
  23. package/lib/sdk/platform/kook/sdk/message/MESSAGES_PUBLIC.d.ts +0 -10
  24. package/lib/sdk/platform/kook/sdk/message/REACTIONS.d.ts +0 -10
  25. package/lib/sdk/platform/kook/sdk/message.d.ts +0 -18
  26. package/lib/sdk/platform/kook/sdk/typings.d.ts +0 -221
  27. package/lib/sdk/platform/kook/sdk/wss.d.ts +0 -26
  28. package/lib/sdk/platform/kook/sdk/wss.types.d.ts +0 -12
  29. /package/lib/{sdk/core → core}/config.js +0 -0
  30. /package/lib/sdk/{platform/kook/sdk/conversation.js → conversation.js} +0 -0
  31. /package/lib/sdk/{platform/kook/sdk/typings.js → typings.js} +0 -0
  32. /package/lib/sdk/{platform/kook/sdk/wss.js → wss.js} +0 -0
@@ -0,0 +1,275 @@
1
+ import * as axios from 'axios';
2
+ import { AxiosRequestConfig } from 'axios';
3
+ import { Readable } from 'stream';
4
+ import { SendMessageParams, SendDirectMessageParams } from './typings.js';
5
+
6
+ /**
7
+ * api接口
8
+ */
9
+ declare class KOOKAPI {
10
+ /**
11
+ * KOOK服务
12
+ * @param config
13
+ * @returns
14
+ */
15
+ service(opstoin: AxiosRequestConfig): Promise<axios.AxiosResponse<any, any>>;
16
+ /**
17
+ *
18
+ * @returns
19
+ */
20
+ gateway(): Promise<any>;
21
+ /**
22
+ * ************
23
+ * 资源床单
24
+ * ***********
25
+ */
26
+ /**
27
+ * 发送buffer资源
28
+ * @param id 私信传频道id,公信传子频道id
29
+ * @param message {消息编号,图片,内容}
30
+ * @returns
31
+ */
32
+ postImage(file: string | Buffer | Readable, Name?: string): Promise<false | {
33
+ data: {
34
+ url: string;
35
+ };
36
+ }>;
37
+ /**
38
+ * 发送buffer资源
39
+ * @param id 私信传频道id,公信传子频道id
40
+ * @param message {消息编号,图片,内容}
41
+ * @returns
42
+ */
43
+ postFile(file: Buffer, Name?: string): Promise<false | {
44
+ data: {
45
+ url: string;
46
+ };
47
+ }>;
48
+ /**
49
+ * 转存
50
+ * @param formdata
51
+ * @returns
52
+ */
53
+ createUrl(formdata: any): Promise<{
54
+ data: {
55
+ url: string;
56
+ };
57
+ }>;
58
+ /**
59
+ * *********
60
+ * 消息api
61
+ * *********
62
+ */
63
+ /**
64
+ * 创建消息
65
+ * @param data
66
+ * @returns
67
+ */
68
+ createMessage(data: SendMessageParams): Promise<{
69
+ data: {
70
+ msg_id: string;
71
+ msg_timestamp: number;
72
+ nonce: string;
73
+ };
74
+ }>;
75
+ /**
76
+ * 创建私聊消息
77
+ */
78
+ /**
79
+ * 创建消息
80
+ * @param target_id
81
+ * @returns
82
+ */
83
+ userChatCreate(target_id: string): Promise<{
84
+ data: {
85
+ code: string;
86
+ last_read_time: number;
87
+ latest_msg_time: number;
88
+ unread_count: number;
89
+ is_friend: boolean;
90
+ is_blocked: boolean;
91
+ is_target_blocked: boolean;
92
+ target_info: {
93
+ id: string;
94
+ username: string;
95
+ online: boolean;
96
+ avatar: string;
97
+ };
98
+ };
99
+ }>;
100
+ /**
101
+ * 创建消息
102
+ * @param data
103
+ * @returns
104
+ */
105
+ createDirectMessage(data: SendDirectMessageParams): Promise<{
106
+ data: {
107
+ msg_id: string;
108
+ msg_timestamp: number;
109
+ nonce: string;
110
+ };
111
+ }>;
112
+ /**
113
+ * 删除指定消息
114
+ * @param msg_id
115
+ * @returns
116
+ */
117
+ messageDelete(msg_id: string): Promise<{
118
+ data: {
119
+ code: number;
120
+ message: string;
121
+ data: any[];
122
+ };
123
+ }>;
124
+ /**
125
+ * 重编辑指定消息
126
+ * @param data
127
+ * @returns
128
+ */
129
+ messageUpdate(data: {
130
+ msg_id: string;
131
+ content: any;
132
+ quote?: string;
133
+ temp_target_id?: string;
134
+ }): Promise<{
135
+ data: {
136
+ code: number;
137
+ message: string;
138
+ data: any[];
139
+ };
140
+ }>;
141
+ /**
142
+ * 删回应
143
+ * @param data
144
+ * @returns
145
+ */
146
+ messageDeleteReaction(data: {
147
+ msg_id: string;
148
+ emoji: string;
149
+ user_id: string;
150
+ }): Promise<{
151
+ code: number;
152
+ message: string;
153
+ data: any[];
154
+ }>;
155
+ /**
156
+ * 发回应
157
+ * @param data
158
+ * @returns
159
+ */
160
+ messageAddReaction(data: {
161
+ msg_id: string;
162
+ emoji: string;
163
+ }): Promise<{
164
+ code: number;
165
+ message: string;
166
+ data: any[];
167
+ }>;
168
+ /**
169
+ * 某个回应的所有用户
170
+ * @param data
171
+ * @returns
172
+ */
173
+ messageReactionList(params: {
174
+ msg_id: string;
175
+ emoji: string;
176
+ }): Promise<{
177
+ code: number;
178
+ message: string;
179
+ data: {
180
+ id: string;
181
+ username: string;
182
+ identify_num: string;
183
+ online: boolean;
184
+ status: number;
185
+ avatar: string;
186
+ bot: boolean;
187
+ tag_info: {
188
+ color: string;
189
+ text: string;
190
+ };
191
+ nickname: string;
192
+ reaction_time: number;
193
+ };
194
+ }>;
195
+ /**
196
+ * **********
197
+ * user
198
+ * *********
199
+ */
200
+ /**
201
+ * 得到当前信息
202
+ * @param guild_id
203
+ * @param user_id
204
+ * @returns
205
+ */
206
+ userMe(): Promise<{
207
+ code: number;
208
+ message: string;
209
+ data: {
210
+ id: string;
211
+ username: string;
212
+ identify_num: string;
213
+ online: false;
214
+ os: string;
215
+ status: number;
216
+ avatar: string;
217
+ banner: string;
218
+ bot: true;
219
+ mobile_verified: true;
220
+ client_id: string;
221
+ mobile_prefix: string;
222
+ mobile: string;
223
+ invited_count: number;
224
+ };
225
+ }>;
226
+ /**
227
+ * 得到用户信息
228
+ * @param guild_id
229
+ * @param user_id
230
+ * @returns
231
+ */
232
+ userView(guild_id: string, user_id: string): Promise<{
233
+ code: number;
234
+ message: string;
235
+ data: {
236
+ id: string;
237
+ username: string;
238
+ identify_num: string;
239
+ online: false;
240
+ status: 0;
241
+ bot: true;
242
+ avatar: string;
243
+ vip_avatar: string;
244
+ mobile_verified: true;
245
+ roles: number[];
246
+ joined_at: number;
247
+ active_time: number;
248
+ };
249
+ }>;
250
+ /**
251
+ * 踢出
252
+ * @param guild_id
253
+ * @param user_id
254
+ * @returns
255
+ */
256
+ guildKickout(guild_id: string, user_id: string): Promise<{
257
+ code: number;
258
+ message: string;
259
+ data: any;
260
+ }>;
261
+ /**
262
+ * 创建角色
263
+ * @param channel_id
264
+ * @param type
265
+ * @param value
266
+ * @returns
267
+ */
268
+ channelRoleCreate(channel_id: string, type: string, value: string): Promise<{
269
+ code: number;
270
+ message: string;
271
+ data: any;
272
+ }>;
273
+ }
274
+
275
+ export { KOOKAPI };
@@ -2,39 +2,35 @@ import axios from 'axios';
2
2
  import FormData from 'form-data';
3
3
  import { ApiEnum } from './typings.js';
4
4
  import { config } from './config.js';
5
- import 'fs';
6
- import 'path';
7
- import 'qrcode';
8
- import 'public-ip';
9
- import { createPicFrom } from '../../../core/utils/from.js';
5
+ import { createPicFrom } from 'alemonjs/utils';
10
6
 
7
+ const API_URL = 'https://www.kookapp.cn';
11
8
  /**
12
9
  * api接口
13
10
  */
14
11
  class KOOKAPI {
15
- API_URL = 'https://www.kookapp.cn';
16
12
  /**
17
13
  * KOOK服务
18
14
  * @param config
19
15
  * @returns
20
16
  */
21
- kookService(opstoin) {
17
+ service(opstoin) {
22
18
  const token = config.get('token');
23
- const service = axios.create({
24
- baseURL: this.API_URL,
19
+ const req = axios.create({
20
+ baseURL: API_URL,
25
21
  timeout: 30000,
26
22
  headers: {
27
23
  Authorization: `Bot ${token}`
28
24
  }
29
25
  });
30
- return service(opstoin);
26
+ return req(opstoin);
31
27
  }
32
28
  /**
33
29
  *
34
30
  * @returns
35
31
  */
36
32
  async gateway() {
37
- return this.kookService({
33
+ return this.service({
38
34
  baseURL: 'https://www.kookapp.cn/api/v3/gateway/index',
39
35
  method: 'get',
40
36
  params: {
@@ -54,7 +50,10 @@ class KOOKAPI {
54
50
  * @returns
55
51
  */
56
52
  async postImage(file, Name = 'image.jpg') {
57
- const from = await createPicFrom(file, Name);
53
+ const from = await createPicFrom({
54
+ image: file,
55
+ name: Name
56
+ });
58
57
  if (!from)
59
58
  return false;
60
59
  const { picData, name } = from;
@@ -85,7 +84,7 @@ class KOOKAPI {
85
84
  * @returns
86
85
  */
87
86
  async createUrl(formdata) {
88
- return await this.kookService({
87
+ return await this.service({
89
88
  method: 'post',
90
89
  url: ApiEnum.AssetCreate,
91
90
  data: formdata,
@@ -103,7 +102,7 @@ class KOOKAPI {
103
102
  * @returns
104
103
  */
105
104
  async createMessage(data) {
106
- return await this.kookService({
105
+ return await this.service({
107
106
  method: 'post',
108
107
  url: ApiEnum.MessageCreate,
109
108
  data
@@ -118,7 +117,7 @@ class KOOKAPI {
118
117
  * @returns
119
118
  */
120
119
  async userChatCreate(target_id) {
121
- return this.kookService({
120
+ return this.service({
122
121
  method: 'post',
123
122
  url: ApiEnum.UserChatCreate,
124
123
  data: {
@@ -132,7 +131,7 @@ class KOOKAPI {
132
131
  * @returns
133
132
  */
134
133
  async createDirectMessage(data) {
135
- return this.kookService({
134
+ return this.service({
136
135
  method: 'post',
137
136
  url: ApiEnum.DirectMessageCreate,
138
137
  data
@@ -144,7 +143,7 @@ class KOOKAPI {
144
143
  * @returns
145
144
  */
146
145
  async messageDelete(msg_id) {
147
- return this.kookService({
146
+ return this.service({
148
147
  method: 'post',
149
148
  url: ApiEnum.MessageDelete,
150
149
  data: {
@@ -158,7 +157,7 @@ class KOOKAPI {
158
157
  * @returns
159
158
  */
160
159
  async messageUpdate(data) {
161
- return this.kookService({
160
+ return this.service({
162
161
  method: 'post',
163
162
  url: ApiEnum.MessageUpdate,
164
163
  data
@@ -170,7 +169,7 @@ class KOOKAPI {
170
169
  * @returns
171
170
  */
172
171
  async messageDeleteReaction(data) {
173
- return this.kookService({
172
+ return this.service({
174
173
  method: 'post',
175
174
  url: ApiEnum.MessageDeleteReaction,
176
175
  data
@@ -182,7 +181,7 @@ class KOOKAPI {
182
181
  * @returns
183
182
  */
184
183
  async messageAddReaction(data) {
185
- return this.kookService({
184
+ return this.service({
186
185
  method: 'post',
187
186
  url: ApiEnum.MessageAddReaction,
188
187
  data
@@ -194,7 +193,7 @@ class KOOKAPI {
194
193
  * @returns
195
194
  */
196
195
  async messageReactionList(params) {
197
- return this.kookService({
196
+ return this.service({
198
197
  method: 'get',
199
198
  url: ApiEnum.MessageReactionList,
200
199
  params
@@ -212,7 +211,7 @@ class KOOKAPI {
212
211
  * @returns
213
212
  */
214
213
  async userMe() {
215
- return this.kookService({
214
+ return this.service({
216
215
  method: 'get',
217
216
  url: ApiEnum.UserMe
218
217
  }).then(res => res?.data);
@@ -224,7 +223,7 @@ class KOOKAPI {
224
223
  * @returns
225
224
  */
226
225
  async userView(guild_id, user_id) {
227
- return this.kookService({
226
+ return this.service({
228
227
  method: 'get',
229
228
  url: ApiEnum.UserView,
230
229
  params: {
@@ -240,7 +239,7 @@ class KOOKAPI {
240
239
  * @returns
241
240
  */
242
241
  async guildKickout(guild_id, user_id) {
243
- return this.kookService({
242
+ return this.service({
244
243
  method: 'post',
245
244
  url: ApiEnum.GuildKickout,
246
245
  data: {
@@ -257,7 +256,7 @@ class KOOKAPI {
257
256
  * @returns
258
257
  */
259
258
  async channelRoleCreate(channel_id, type, value) {
260
- return this.kookService({
259
+ return this.service({
261
260
  method: 'post',
262
261
  url: ApiEnum.ChannelRoleCreate,
263
262
  data: {
@@ -269,4 +268,4 @@ class KOOKAPI {
269
268
  }
270
269
  }
271
270
 
272
- export { KOOKAPI };
271
+ export { API_URL, KOOKAPI };
@@ -1,4 +1,4 @@
1
- import { BaseConfig } from '../../../core/config.js';
1
+ import { BaseConfig } from '../core/config.js';
2
2
 
3
3
  const config = new BaseConfig({
4
4
  token: ''
@@ -10,9 +10,6 @@ const KOOKEventKey = {
10
10
  // 频道消息
11
11
  MESSAGES_PUBLIC: 'MESSAGES_PUBLIC',
12
12
  // 系统消息
13
- REACTIONS: 'REACTIONS',
14
- // 错误消息
15
- ERROR: 'ERROR'
16
- };
13
+ REACTIONS: 'REACTIONS'};
17
14
 
18
15
  export { KOOKEventKey };
@@ -0,0 +1,109 @@
1
+ type MessageType = 1 | 2 | 3 | 4 | 8 | 9 | 10 | 255;
2
+ /**
3
+ * 消息通道类型, GROUP 为组播消息, PERSON 为单播消息, BROADCAST 为广播消息
4
+ */
5
+ type MessageChannelType = 'GROUP' | 'PERSON' | 'BROADCAST';
6
+ /**
7
+ * 会话数据
8
+ */
9
+ interface EventData {
10
+ channel_type: MessageChannelType;
11
+ type: MessageType;
12
+ target_id: string;
13
+ author_id: string;
14
+ content: string;
15
+ extra: Extra;
16
+ msg_id: string;
17
+ msg_timestamp: number;
18
+ nonce: string;
19
+ from_type: number;
20
+ }
21
+ /**
22
+ * 消息发送参数
23
+ */
24
+ interface SendMessageParams {
25
+ /**
26
+ * 消息类型
27
+ */
28
+ type?: number;
29
+ /**
30
+ * 频道编号
31
+ */
32
+ target_id: string;
33
+ /**
34
+ * 消息内容
35
+ */
36
+ content: string;
37
+ /**
38
+ * 引用--消息id
39
+ */
40
+ quote?: string;
41
+ nonce?: string;
42
+ temp_target_id?: string;
43
+ }
44
+ /**
45
+ * 作者信息
46
+ */
47
+ interface Author {
48
+ id: string;
49
+ username: string;
50
+ identify_num: string;
51
+ online: boolean;
52
+ os: string;
53
+ status: number;
54
+ avatar: string;
55
+ vip_avatar: string;
56
+ banner: string;
57
+ nickname: string;
58
+ roles: string[];
59
+ is_vip: boolean;
60
+ vip_amp: boolean;
61
+ is_ai_reduce_noise: boolean;
62
+ is_personal_card_bg: boolean;
63
+ bot: boolean;
64
+ decorations_id_map: null | unknown;
65
+ is_sys: boolean;
66
+ }
67
+ /**
68
+ * mk接口
69
+ */
70
+ interface KMarkdown {
71
+ raw_content: string;
72
+ mention_part: any[];
73
+ mention_role_part: any[];
74
+ channel_part: any[];
75
+ }
76
+ /**
77
+ * 数据包
78
+ */
79
+ interface Extra {
80
+ type: number;
81
+ code: string;
82
+ guild_id: string;
83
+ guild_type: number;
84
+ channel_name: string;
85
+ author: Author;
86
+ visible_only: null;
87
+ mention: any[];
88
+ mention_all: boolean;
89
+ mention_roles: any[];
90
+ mention_here: boolean;
91
+ nav_channels: any[];
92
+ kmarkdown: KMarkdown;
93
+ emoji: any[];
94
+ last_msg_content: string;
95
+ send_msg_device: number;
96
+ }
97
+ /**
98
+ * 私聊消息
99
+ */
100
+ interface SendDirectMessageParams {
101
+ type?: MessageType;
102
+ target_id?: string;
103
+ chat_code?: string;
104
+ content: string;
105
+ quote?: string;
106
+ nonce?: string;
107
+ }
108
+
109
+ export type { Author, EventData, Extra, KMarkdown, MessageChannelType, MessageType, SendDirectMessageParams, SendMessageParams };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@alemonjs/kook",
3
- "version": "0.2.7",
4
- "description": "阿柠檬kook平台连接",
3
+ "version": "2.1.0-alpha.0",
4
+ "description": "kook platform connection",
5
5
  "author": "lemonade",
6
6
  "license": "MIT",
7
7
  "type": "module",
@@ -1 +0,0 @@
1
- *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.mb-4{margin-bottom:1rem}.mt-1{margin-top:.25rem}.block{display:block}.flex{display:flex}.w-full{width:100%}.max-w-md{max-width:28rem}.items-center{align-items:center}.justify-center{justify-content:center}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.p-2{padding:.5rem}.p-8{padding:2rem}.py-4{padding-top:1rem;padding-bottom:1rem}.text-sm{font-size:.875rem;line-height:1.25rem}.font-medium{font-weight:500}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.shadow-inner{--tw-shadow: inset 0 2px 4px 0 rgb(0 0 0 / .05);--tw-shadow-colored: inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}html,body{margin:0;display:flex;height:100%;width:100%;flex-direction:column;padding:0}#root{display:flex;flex-direction:column;margin:0;height:100%;width:100%;padding:0}body::-webkit-scrollbar{height:0px;width:0px}.container{margin-left:auto;margin-right:auto;padding-left:1.25rem;padding-right:1.25rem}*::-webkit-scrollbar{width:0px;height:0px}input,div,textarea{outline:2px solid transparent!important;outline-offset:2px!important}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}