lynx-console 0.1.1 → 0.2.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 (49) hide show
  1. package/dist/index.cjs +183 -960
  2. package/dist/index.css +1248 -461
  3. package/dist/index.css.map +1 -1
  4. package/dist/index.d.cts +79 -1
  5. package/dist/index.d.cts.map +1 -1
  6. package/dist/index.d.mts +79 -1
  7. package/dist/index.d.mts.map +1 -1
  8. package/dist/index.mjs +183 -960
  9. package/dist/index.mjs.map +1 -1
  10. package/package.json +1 -4
  11. package/src/components/BottomSheet.css +91 -0
  12. package/src/components/BottomSheet.tsx +10 -10
  13. package/src/components/ConsolePanel.css +402 -0
  14. package/src/components/ConsolePanel.tsx +62 -28
  15. package/src/components/FadeList.tsx +10 -55
  16. package/{dist/assets/src/components/FloatingButton.css.ts.vanilla-BaG0OI6p.css → src/components/FloatingButton.css} +22 -16
  17. package/src/components/FloatingButton.tsx +6 -6
  18. package/src/components/LogPanel.tsx +46 -47
  19. package/src/components/NetworkDetailSection.tsx +13 -13
  20. package/src/components/NetworkPanel.css +280 -0
  21. package/src/components/NetworkPanel.tsx +30 -50
  22. package/src/components/PerformancePanel.css +249 -0
  23. package/src/components/PerformancePanel.tsx +40 -40
  24. package/src/components/Tabs.css +78 -0
  25. package/src/components/Tabs.tsx +13 -11
  26. package/src/globals.d.ts +0 -5
  27. package/src/index.tsx +9 -6
  28. package/src/styles/global.css +8 -0
  29. package/src/styles/vars/color.ts +26 -213
  30. package/src/styles/vars/dimension.ts +5 -74
  31. package/src/styles/vars/index.css +65 -457
  32. package/src/styles/vars/index.ts +5 -9
  33. package/src/styles/vars/radius.ts +1 -11
  34. package/src/types.ts +8 -0
  35. package/dist/assets/src/components/BottomSheet.css.ts.vanilla-CulwSDhG.css +0 -83
  36. package/dist/assets/src/components/ConsolePanel.css.ts.vanilla-DWdhFBJq.css +0 -337
  37. package/dist/assets/src/components/FadeList.css.ts.vanilla-sppTKMZj.css +0 -12
  38. package/dist/assets/src/components/NetworkPanel.css.ts.vanilla-BSE4s40D.css +0 -244
  39. package/dist/assets/src/components/PerformancePanel.css.ts.vanilla-Bb3zG5G8.css +0 -216
  40. package/dist/assets/src/components/Tabs.css.ts.vanilla-DD7L2oXt.css +0 -50
  41. package/src/components/BottomSheet.css.ts +0 -93
  42. package/src/components/ConsolePanel.css.ts +0 -349
  43. package/src/components/FadeList.css.ts +0 -16
  44. package/src/components/FloatingButton.css.ts +0 -73
  45. package/src/components/NetworkPanel.css.ts +0 -277
  46. package/src/components/PerformancePanel.css.ts +0 -224
  47. package/src/components/Tabs.css.ts +0 -66
  48. package/src/styles/global.css.ts +0 -10
  49. package/src/styles/typography.ts +0 -25
@@ -1,4 +1,4 @@
1
- .FloatingButton_wrapper__1homwpu0 {
1
+ .fb-wrapper {
2
2
  position: fixed;
3
3
  z-index: 9999;
4
4
  display: flex;
@@ -6,9 +6,10 @@
6
6
  align-items: center;
7
7
  gap: 8px;
8
8
  overflow: visible;
9
- transition: transform var(--seed-duration-d4) cubic-bezier(0.4, 0, 0.2, 1);
9
+ transition: transform var(--lynx-console-duration-d4) cubic-bezier(0.4, 0, 0.2, 1);
10
10
  }
11
- .FloatingButton_button__1homwpu1 {
11
+
12
+ .fb-button {
12
13
  position: relative;
13
14
  overflow: hidden;
14
15
  padding-left: 8px;
@@ -16,7 +17,7 @@
16
17
  padding-top: 4px;
17
18
  padding-bottom: 4px;
18
19
  border-radius: 12px;
19
- background-color: var(--seed-color-palette-green-600);
20
+ background-color: var(--lynx-console-color-palette-green-600);
20
21
  display: flex;
21
22
  flex-direction: column;
22
23
  align-items: center;
@@ -24,7 +25,8 @@
24
25
  gap: 2px;
25
26
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
26
27
  }
27
- .FloatingButton_shineOverlay__1homwpu2 {
28
+
29
+ .fb-shineOverlay {
28
30
  position: absolute;
29
31
  top: -50%;
30
32
  left: -25%;
@@ -33,35 +35,39 @@
33
35
  background-color: rgba(255, 255, 255, 0.2);
34
36
  border-radius: 9999px;
35
37
  }
36
- .FloatingButton_title__1homwpu3 {
38
+
39
+ .fb-title {
37
40
  font-size: 0.875rem;
38
41
  line-height: 1.1875rem;
39
- font-weight: var(--seed-font-weight-regular);
40
- color: var(--seed-color-palette-static-white);
42
+ font-weight: var(--lynx-console-font-weight-regular);
43
+ color: var(--lynx-console-color-palette-static-white);
41
44
  text-align: center;
42
45
  }
43
- .FloatingButton_subtitle__1homwpu4 {
46
+
47
+ .fb-subtitle {
44
48
  font-size: 0.8125rem;
45
49
  line-height: 1.125rem;
46
- font-weight: var(--seed-font-weight-regular);
47
- color: var(--seed-color-palette-static-white);
50
+ font-weight: var(--lynx-console-font-weight-regular);
51
+ color: var(--lynx-console-color-palette-static-white);
48
52
  text-align: center;
49
53
  }
50
- .FloatingButton_reloadButton__1homwpu5 {
54
+
55
+ .fb-reloadButton {
51
56
  overflow: visible;
52
57
  width: 32px;
53
58
  height: 32px;
54
59
  border-radius: 16px;
55
- background-color: var(--seed-color-palette-green-600);
60
+ background-color: var(--lynx-console-color-palette-green-600);
56
61
  display: flex;
57
62
  align-items: center;
58
63
  justify-content: center;
59
64
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
60
65
  }
61
- .FloatingButton_reloadIcon__1homwpu6 {
66
+
67
+ .fb-reloadIcon {
62
68
  font-size: 20px;
63
69
  line-height: 32px;
64
70
  margin-bottom: 5px;
65
- color: var(--seed-color-palette-static-white);
71
+ color: var(--lynx-console-color-palette-static-white);
66
72
  text-align: center;
67
- }
73
+ }
@@ -1,6 +1,6 @@
1
1
  import type { ReactNode } from "@lynx-js/react";
2
2
  import { useLongPressDrag } from "../hooks/useLongPressDrag";
3
- import * as css from "./FloatingButton.css";
3
+ import "./FloatingButton.css";
4
4
 
5
5
  interface FloatingButtonProps {
6
6
  bindtap: () => void;
@@ -47,7 +47,7 @@ export const FloatingButton = ({
47
47
  return (
48
48
  <>
49
49
  <view
50
- className={css.wrapper}
50
+ className={"fb-wrapper"}
51
51
  consume-slide-event={[[-180, 180]]}
52
52
  style={{
53
53
  right: `${right}px`,
@@ -56,16 +56,16 @@ export const FloatingButton = ({
56
56
  }}
57
57
  {...handlers}
58
58
  >
59
- <view className={css.button}>
59
+ <view className={"fb-button"}>
60
60
  {children}
61
- <view className={css.shineOverlay} style={SHINE_STYLES[phase]} />
61
+ <view className={"fb-shineOverlay"} style={SHINE_STYLES[phase]} />
62
62
  </view>
63
63
  <view
64
- className={css.reloadButton}
64
+ className={"fb-reloadButton"}
65
65
  catchtouchstart={() => clearTimer()}
66
66
  bindtap={handleReload}
67
67
  >
68
- <text className={css.reloadIcon}>{"\u21BB"}</text>
68
+ <text className={"fb-reloadIcon"}>{"\u21BB"}</text>
69
69
  </view>
70
70
  </view>
71
71
  </>
@@ -2,7 +2,7 @@ import { useEffect, useMemo, useRef, useState } from "@lynx-js/react";
2
2
  import type { BaseEvent, InputInputEvent, NodesRef } from "@lynx-js/types";
3
3
  import { stringify } from "javascript-stringify";
4
4
  import type { LogEntry, LogLevel } from "../types";
5
- import * as css from "./ConsolePanel.css";
5
+ import "./ConsolePanel.css";
6
6
  import { FadeList } from "./FadeList";
7
7
 
8
8
  const LOG_LEVELS: LogLevel[] = ["log", "info", "warn", "error"];
@@ -139,11 +139,11 @@ export const LogPanel = ({ logs, clearLogs }: LogPanelProps) => {
139
139
  const isExpanded = expandedArgs.has(key);
140
140
 
141
141
  if (arg === null) {
142
- return <text className={css.argNull}>null</text>;
142
+ return <text className={"cp-argNull"}>null</text>;
143
143
  }
144
144
 
145
145
  if (arg === undefined) {
146
- return <text className={css.argUndefined}>undefined</text>;
146
+ return <text className={"cp-argUndefined"}>undefined</text>;
147
147
  }
148
148
 
149
149
  if (typeof arg === "string") {
@@ -151,17 +151,16 @@ export const LogPanel = ({ logs, clearLogs }: LogPanelProps) => {
151
151
  const shouldTruncate = arg.length > MAX_LENGTH;
152
152
 
153
153
  if (!shouldTruncate) {
154
- return <text className={css.argString({ level })}>{arg}</text>;
154
+ return <text className={`cp-argString cp-argString--${level}`}>{arg}</text>;
155
155
  }
156
156
 
157
- // 문자열이 길 경우 토글 버튼 추가
158
157
  return (
159
- <view className={css.argObject}>
160
- <view className={css.argObjectHeader} bindtap={() => toggleArg(key)}>
161
- <text className={css.toggleIndicator}>
158
+ <view className={"cp-argObject"}>
159
+ <view className={"cp-argObjectHeader"} bindtap={() => toggleArg(key)}>
160
+ <text className={"cp-toggleIndicator"}>
162
161
  {isExpanded ? "▼" : "▶"}
163
162
  </text>
164
- <text className={css.argString({ level })}>
163
+ <text className={`cp-argString cp-argString--${level}`}>
165
164
  {isExpanded ? arg : `${arg.slice(0, MAX_LENGTH)}...`}
166
165
  </text>
167
166
  </view>
@@ -170,7 +169,7 @@ export const LogPanel = ({ logs, clearLogs }: LogPanelProps) => {
170
169
  }
171
170
 
172
171
  if (typeof arg === "number" || typeof arg === "boolean") {
173
- return <text className={css.argPrimitive({ level })}>{String(arg)}</text>;
172
+ return <text className={`cp-argPrimitive cp-argPrimitive--${level}`}>{String(arg)}</text>;
174
173
  }
175
174
 
176
175
  if (typeof arg === "object") {
@@ -206,50 +205,50 @@ export const LogPanel = ({ logs, clearLogs }: LogPanelProps) => {
206
205
  }
207
206
 
208
207
  return (
209
- <view className={css.argObject}>
210
- <view className={css.argObjectHeader} bindtap={() => toggleArg(key)}>
211
- <text className={css.toggleIndicator}>
208
+ <view className={"cp-argObject"}>
209
+ <view className={"cp-argObjectHeader"} bindtap={() => toggleArg(key)}>
210
+ <text className={"cp-toggleIndicator"}>
212
211
  {isExpanded ? "▼" : "▶"}
213
212
  </text>
214
- <text className={css.argObjectPreview}>{preview}</text>
213
+ <text className={"cp-argObjectPreview"}>{preview}</text>
215
214
  </view>
216
215
  {isExpanded && (
217
- <view className={css.argObjectContent}>
218
- <text className={css.argObjectJson}>{jsonString}</text>
216
+ <view className={"cp-argObjectContent"}>
217
+ <text className={"cp-argObjectJson"}>{jsonString}</text>
219
218
  </view>
220
219
  )}
221
220
  </view>
222
221
  );
223
222
  }
224
223
 
225
- return <text className={css.argPrimitive({ level })}>{String(arg)}</text>;
224
+ return <text className={`cp-argPrimitive cp-argPrimitive--${level}`}>{String(arg)}</text>;
226
225
  };
227
226
 
228
227
  return (
229
228
  <view
230
- className={css.logContainer}
229
+ className={"cp-logContainer"}
231
230
  bindtap={() => { if (filterOpen) setFilterOpen(false); }}
232
231
  >
233
- <view className={css.logHeader}>
234
- <view className={css.filterWrapper}>
232
+ <view className={"cp-logHeader"}>
233
+ <view className={"cp-filterWrapper"}>
235
234
  <view
236
- className={css.filterButton}
235
+ className={"cp-filterButton"}
237
236
  catchtap={() => setFilterOpen((v) => !v)}
238
237
  >
239
- <text className={css.filterButtonText}>Filter ▼</text>
238
+ <text className={"cp-filterButtonText"}>Filter ▼</text>
240
239
  </view>
241
240
  {filterOpen && (
242
- <view className={css.filterDropdown} catchtap={() => {}}>
241
+ <view className={"cp-filterDropdown"} catchtap={() => {}}>
243
242
  {LOG_LEVELS.map((level) => (
244
243
  <view
245
244
  key={level}
246
- className={css.filterOption}
245
+ className={"cp-filterOption"}
247
246
  bindtap={() => toggleLevel(level)}
248
247
  >
249
- <text className={css.filterCheckbox({ level })}>
248
+ <text className={`cp-filterCheckbox cp-filterCheckbox--${level}`}>
250
249
  {enabledLevels.has(level) ? "✅" : "⬜"}
251
250
  </text>
252
- <text className={css.filterLabel({ level })}>
251
+ <text className={`cp-filterLabel cp-filterLabel--${level}`}>
253
252
  {level.toUpperCase()}
254
253
  </text>
255
254
  </view>
@@ -257,11 +256,11 @@ export const LogPanel = ({ logs, clearLogs }: LogPanelProps) => {
257
256
  </view>
258
257
  )}
259
258
  </view>
260
- <view className={css.searchWrapper}>
261
- <text className={css.searchPrompt}>{"›"}</text>
259
+ <view className={"cp-searchWrapper"}>
260
+ <text className={"cp-searchPrompt"}>{"›"}</text>
262
261
  <input
263
262
  ref={searchInputRef}
264
- className={css.searchInput}
263
+ className={"cp-searchInput"}
265
264
  placeholder="Search logs..."
266
265
  bindinput={(e: BaseEvent<"bindinput", InputInputEvent>) =>
267
266
  setSearchQuery(e.detail.value)
@@ -269,7 +268,7 @@ export const LogPanel = ({ logs, clearLogs }: LogPanelProps) => {
269
268
  />
270
269
  {searchQuery.length > 0 && (
271
270
  <view
272
- className={css.searchClear}
271
+ className={"cp-searchClear"}
273
272
  bindtap={() => {
274
273
  setSearchQuery("");
275
274
  searchInputRef.current
@@ -277,26 +276,26 @@ export const LogPanel = ({ logs, clearLogs }: LogPanelProps) => {
277
276
  .exec();
278
277
  }}
279
278
  >
280
- <text className={css.searchClearText}>✕</text>
279
+ <text className={"cp-searchClearText"}>✕</text>
281
280
  </view>
282
281
  )}
283
282
  </view>
284
283
  <view style={{ display: "flex", flexDirection: "row", gap: 8 }}>
285
- <view className={css.clearButton} bindtap={clearLogs}>
286
- <text className={css.clearButtonText}>🗑</text>
284
+ <view className={"cp-clearButton"} bindtap={clearLogs}>
285
+ <text className={"cp-clearButtonText"}>🗑</text>
287
286
  </view>
288
287
  </view>
289
288
  </view>
290
289
  <FadeList
291
290
  listRef={listRef}
292
- className={css.logList}
291
+ className={"cp-logList"}
293
292
  preload-buffer-count={10}
294
293
  initial-scroll-index={Math.max(0, filteredLogs.length - 1)}
295
294
  >
296
295
  {filteredLogs.length === 0 ? (
297
296
  <list-item item-key="empty-state">
298
- <view className={css.placeholder}>
299
- <text className={css.placeholderText}>
297
+ <view className={"cp-placeholder"}>
298
+ <text className={"cp-placeholderText"}>
300
299
  No logs yet. Try console.log("Hello!")
301
300
  </text>
302
301
  </view>
@@ -305,20 +304,20 @@ export const LogPanel = ({ logs, clearLogs }: LogPanelProps) => {
305
304
  filteredLogs.map((log) => {
306
305
  return (
307
306
  <list-item key={log.id} item-key={log.id}>
308
- <view className={css.logItem({ level: log.level })}>
309
- <view className={css.logItemHeader}>
310
- <text className={css.logLevel({ level: log.level })}>
307
+ <view className={`cp-logItem cp-logItem--${log.level}`}>
308
+ <view className={"cp-logItemHeader"}>
309
+ <text className={`cp-logLevel cp-logLevel--${log.level}`}>
311
310
  {log.level.toUpperCase()}
312
311
  </text>
313
- <text className={css.logTime}>
312
+ <text className={"cp-logTime"}>
314
313
  {new Date(log.timestamp).toISOString()}
315
314
  </text>
316
315
  </view>
317
- <view className={css.logArgsContainer}>
316
+ <view className={"cp-logArgsContainer"}>
318
317
  {log.args.map((arg, index) => (
319
318
  <view
320
319
  key={`${log.id}-${index.toString()}`}
321
- className={css.logArgItem}
320
+ className={"cp-logArgItem"}
322
321
  >
323
322
  {renderArg(
324
323
  arg,
@@ -334,19 +333,19 @@ export const LogPanel = ({ logs, clearLogs }: LogPanelProps) => {
334
333
  })
335
334
  )}
336
335
  </FadeList>
337
- <view className={css.replInputRow}>
338
- <text className={css.replPrompt}>{"›"}</text>
336
+ <view className={"cp-replInputRow"}>
337
+ <text className={"cp-replPrompt"}>{"›"}</text>
339
338
  <input
340
339
  ref={inputRef}
341
- className={css.replInput}
340
+ className={"cp-replInput"}
342
341
  placeholder="enter code..."
343
342
  bindinput={(e: BaseEvent<"bindinput", InputInputEvent>) =>
344
343
  setCode(e.detail.value)
345
344
  }
346
345
  bindconfirm={handleRun}
347
346
  />
348
- <view className={css.replRunButton} bindtap={handleRun}>
349
- <text className={css.replRunButtonText}>Run</text>
347
+ <view className={"cp-replRunButton"} bindtap={handleRun}>
348
+ <text className={"cp-replRunButtonText"}>Run</text>
350
349
  </view>
351
350
  </view>
352
351
  </view>
@@ -1,4 +1,4 @@
1
- import * as css from "./NetworkPanel.css";
1
+ import "./NetworkPanel.css";
2
2
 
3
3
  interface NetworkDetailSectionProps {
4
4
  headers?: Record<string, string> | undefined;
@@ -14,28 +14,28 @@ export const NetworkDetailSection = ({
14
14
  return (
15
15
  <>
16
16
  {/* Headers */}
17
- <view className={css.detailSection}>
18
- <text className={css.detailSectionTitle}>Headers</text>
17
+ <view className={"np-detailSection"}>
18
+ <text className={"np-detailSectionTitle"}>Headers</text>
19
19
  {headers && Object.keys(headers).length > 0 ? (
20
- <view className={css.table}>
20
+ <view className={"np-table"}>
21
21
  {Object.entries(headers).map(([key, value]) => (
22
- <view key={key} className={css.tableRow}>
23
- <text className={css.tableKey}>{key}</text>
24
- <text className={css.tableValue}>{value}</text>
22
+ <view key={key} className={"np-tableRow"}>
23
+ <text className={"np-tableKey"}>{key}</text>
24
+ <text className={"np-tableValue"}>{value}</text>
25
25
  </view>
26
26
  ))}
27
27
  </view>
28
28
  ) : (
29
- <text className={css.emptyText}>No headers</text>
29
+ <text className={"np-emptyText"}>No headers</text>
30
30
  )}
31
31
  </view>
32
32
 
33
33
  {/* Body */}
34
- <view className={css.detailSection}>
35
- <text className={css.detailSectionTitle}>Body</text>
36
- {error && <text className={css.errorText}>{error}</text>}
37
- {body && <text className={css.bodyText}>{body}</text>}
38
- {!error && !body && <text className={css.emptyText}>No body</text>}
34
+ <view className={"np-detailSection"}>
35
+ <text className={"np-detailSectionTitle"}>Body</text>
36
+ {error && <text className={"np-errorText"}>{error}</text>}
37
+ {body && <text className={"np-bodyText"}>{body}</text>}
38
+ {!error && !body && <text className={"np-emptyText"}>No body</text>}
39
39
  </view>
40
40
  </>
41
41
  );
@@ -0,0 +1,280 @@
1
+ .np-container {
2
+ display: flex;
3
+ flex-direction: column;
4
+ flex: 1;
5
+ padding-top: 4px;
6
+ }
7
+
8
+ .np-header {
9
+ display: flex;
10
+ flex-direction: row;
11
+ align-items: center;
12
+ justify-content: space-between;
13
+ margin-bottom: 8px;
14
+ padding-bottom: 4px;
15
+ }
16
+
17
+ .np-count {
18
+ font-size: 0.8125rem;
19
+ line-height: 1.125rem;
20
+ font-weight: var(--lynx-console-font-weight-regular);
21
+ color: var(--lynx-console-color-fg-neutral-subtle);
22
+ }
23
+
24
+ .np-clearButton {
25
+ padding: 3px 6px;
26
+ background-color: var(--lynx-console-color-bg-neutral-weak);
27
+ border-radius: 4px;
28
+ }
29
+
30
+ .np-clearButtonText {
31
+ font-size: 0.8125rem;
32
+ line-height: 1.125rem;
33
+ font-weight: var(--lynx-console-font-weight-medium);
34
+ color: var(--lynx-console-color-fg-neutral-muted);
35
+ }
36
+
37
+ .np-list {
38
+ flex: 1;
39
+ }
40
+
41
+ .np-placeholder {
42
+ display: flex;
43
+ align-items: center;
44
+ justify-content: center;
45
+ height: 100%;
46
+ }
47
+
48
+ .np-placeholderText {
49
+ font-size: 0.875rem;
50
+ line-height: 1.1875rem;
51
+ font-weight: var(--lynx-console-font-weight-regular);
52
+ color: var(--lynx-console-color-fg-disabled);
53
+ }
54
+
55
+ .np-item {
56
+ padding: 8px;
57
+ border-bottom-width: 1px;
58
+ border-bottom-color: var(--lynx-console-color-stroke-neutral-weak);
59
+ border-bottom-style: solid;
60
+ }
61
+
62
+ .np-item--pending {
63
+ background-color: var(--lynx-console-color-palette-gray-100);
64
+ }
65
+
66
+ .np-item--error {
67
+ background-color: var(--lynx-console-color-palette-red-100);
68
+ }
69
+
70
+ .np-itemHeader {
71
+ display: flex;
72
+ flex-direction: row;
73
+ align-items: center;
74
+ margin-bottom: 4px;
75
+ gap: 8px;
76
+ }
77
+
78
+ .np-method {
79
+ font-size: 0.75rem;
80
+ line-height: 1rem;
81
+ font-weight: var(--lynx-console-font-weight-bold);
82
+ padding: 0 4px;
83
+ border-radius: 2px;
84
+ color: var(--lynx-console-color-fg-neutral);
85
+ background-color: var(--lynx-console-color-bg-neutral-weak);
86
+ }
87
+
88
+ .np-method--GET {
89
+ color: var(--lynx-console-color-palette-blue-600);
90
+ background-color: var(--lynx-console-color-palette-blue-100);
91
+ }
92
+
93
+ .np-method--POST {
94
+ color: var(--lynx-console-color-palette-green-600);
95
+ background-color: var(--lynx-console-color-palette-green-100);
96
+ }
97
+
98
+ .np-method--PUT {
99
+ color: var(--lynx-console-color-palette-yellow-600);
100
+ background-color: var(--lynx-console-color-palette-yellow-100);
101
+ }
102
+
103
+ .np-method--PATCH {
104
+ color: var(--lynx-console-color-palette-purple-600);
105
+ background-color: var(--lynx-console-color-palette-purple-100);
106
+ }
107
+
108
+ .np-method--DELETE {
109
+ color: var(--lynx-console-color-palette-red-600);
110
+ background-color: var(--lynx-console-color-palette-red-100);
111
+ }
112
+
113
+ .np-statusCode {
114
+ font-size: 0.75rem;
115
+ line-height: 1rem;
116
+ font-weight: var(--lynx-console-font-weight-bold);
117
+ }
118
+
119
+ .np-statusCode--success {
120
+ color: var(--lynx-console-color-palette-green-600);
121
+ }
122
+
123
+ .np-statusCode--error {
124
+ color: var(--lynx-console-color-palette-red-600);
125
+ }
126
+
127
+ .np-statusCode--pending {
128
+ color: var(--lynx-console-color-fg-neutral-subtle);
129
+ }
130
+
131
+ .np-time {
132
+ font-size: 0.75rem;
133
+ line-height: 1rem;
134
+ font-weight: var(--lynx-console-font-weight-regular);
135
+ color: var(--lynx-console-color-fg-neutral-subtle);
136
+ }
137
+
138
+ .np-url {
139
+ font-size: 0.8125rem;
140
+ line-height: 1.125rem;
141
+ font-weight: var(--lynx-console-font-weight-regular);
142
+ color: var(--lynx-console-color-fg-neutral);
143
+ word-break: break-all;
144
+ margin-bottom: 4px;
145
+ }
146
+
147
+ .np-path {
148
+ font-size: 0.8125rem;
149
+ line-height: 1.125rem;
150
+ font-weight: var(--lynx-console-font-weight-regular);
151
+ color: var(--lynx-console-color-fg-neutral);
152
+ word-break: break-all;
153
+ white-space: pre-wrap;
154
+ overflow: visible;
155
+ margin-bottom: 4px;
156
+ }
157
+
158
+ .np-details {
159
+ font-size: 0.8125rem;
160
+ line-height: 1.125rem;
161
+ font-weight: var(--lynx-console-font-weight-regular);
162
+ color: var(--lynx-console-color-fg-neutral-subtle);
163
+ }
164
+
165
+ .np-detailsContainer {
166
+ margin-top: 12px;
167
+ padding-top: 12px;
168
+ border-top-width: 1px;
169
+ border-top-color: var(--lynx-console-color-stroke-neutral-subtle);
170
+ border-top-style: solid;
171
+ }
172
+
173
+ .np-tabs {
174
+ display: flex;
175
+ flex-direction: row;
176
+ gap: 4px;
177
+ padding-bottom: 6px;
178
+ }
179
+
180
+ .np-tab {
181
+ padding: 4px 8px;
182
+ border-radius: 4px;
183
+ cursor: pointer;
184
+ }
185
+
186
+ .np-tab--active {
187
+ background-color: var(--lynx-console-color-bg-neutral-weak);
188
+ }
189
+
190
+ .np-tabText {
191
+ font-size: 0.875rem;
192
+ line-height: 1.1875rem;
193
+ font-weight: var(--lynx-console-font-weight-medium);
194
+ color: var(--lynx-console-color-fg-neutral-subtle);
195
+ }
196
+
197
+ .np-tabText--active {
198
+ color: var(--lynx-console-color-fg-neutral);
199
+ }
200
+
201
+ .np-tabContent {
202
+ padding-top: 8px;
203
+ }
204
+
205
+ .np-detailSection {
206
+ margin-bottom: 12px;
207
+ }
208
+
209
+ .np-detailSectionTitle {
210
+ font-size: 0.8125rem;
211
+ line-height: 1.125rem;
212
+ font-weight: var(--lynx-console-font-weight-bold);
213
+ color: var(--lynx-console-color-fg-neutral);
214
+ margin-bottom: 8px;
215
+ }
216
+
217
+ .np-table {
218
+ display: flex;
219
+ flex-direction: column;
220
+ gap: 4px;
221
+ }
222
+
223
+ .np-tableRow {
224
+ display: flex;
225
+ flex-direction: row;
226
+ gap: 8px;
227
+ padding: 4px 8px;
228
+ background-color: var(--lynx-console-color-bg-neutral-weak);
229
+ border-radius: 2px;
230
+ }
231
+
232
+ .np-tableKey {
233
+ font-size: 0.8125rem;
234
+ line-height: 1.125rem;
235
+ font-weight: var(--lynx-console-font-weight-bold);
236
+ color: var(--lynx-console-color-fg-neutral-subtle);
237
+ min-width: 70px;
238
+ flex-shrink: 0;
239
+ }
240
+
241
+ .np-tableValue {
242
+ font-size: 0.8125rem;
243
+ line-height: 1.125rem;
244
+ font-weight: var(--lynx-console-font-weight-regular);
245
+ color: var(--lynx-console-color-fg-neutral);
246
+ word-break: break-all;
247
+ flex: 1;
248
+ }
249
+
250
+ .np-bodyText {
251
+ font-size: 0.8125rem;
252
+ line-height: 1.125rem;
253
+ font-weight: var(--lynx-console-font-weight-regular);
254
+ color: var(--lynx-console-color-fg-neutral);
255
+ padding: 8px;
256
+ background-color: var(--lynx-console-color-bg-neutral-weak);
257
+ border-radius: 4px;
258
+ word-break: break-all;
259
+ white-space: pre-wrap;
260
+ }
261
+
262
+ .np-errorText {
263
+ font-size: 0.8125rem;
264
+ line-height: 1.125rem;
265
+ font-weight: var(--lynx-console-font-weight-regular);
266
+ color: var(--lynx-console-color-palette-red-600);
267
+ padding: 8px;
268
+ background-color: var(--lynx-console-color-palette-red-100);
269
+ border-radius: 4px;
270
+ word-break: break-all;
271
+ }
272
+
273
+ .np-emptyText {
274
+ font-size: 0.8125rem;
275
+ line-height: 1.125rem;
276
+ font-weight: var(--lynx-console-font-weight-regular);
277
+ color: var(--lynx-console-color-fg-disabled);
278
+ text-align: center;
279
+ padding: 16px 0;
280
+ }