@kingsleyweb/bun-ui 0.0.0-stage → 3.0.0-rc.2

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 (240) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +80 -2
  3. package/app/docs/App.tsx +72 -0
  4. package/app/docs/api/client.ts +303 -0
  5. package/app/docs/api/contract.ts +24 -0
  6. package/app/docs/api/docs.ts +38 -0
  7. package/app/docs/api/errors.ts +144 -0
  8. package/app/docs/boot.tsx +58 -0
  9. package/app/docs/components/Badge.tsx +65 -0
  10. package/app/docs/components/Button.tsx +37 -0
  11. package/app/docs/components/Card.tsx +41 -0
  12. package/app/docs/components/ConfirmDialog.tsx +173 -0
  13. package/app/docs/components/CopyButton.tsx +68 -0
  14. package/app/docs/components/Dialog.tsx +230 -0
  15. package/app/docs/components/EmptyState.tsx +34 -0
  16. package/app/docs/components/ErrorView.tsx +70 -0
  17. package/app/docs/components/Field.tsx +93 -0
  18. package/app/docs/components/JsonEditor.tsx +151 -0
  19. package/app/docs/components/JsonView.tsx +338 -0
  20. package/app/docs/components/KeyValue.tsx +63 -0
  21. package/app/docs/components/ProblemBanner.tsx +116 -0
  22. package/app/docs/components/ScreenErrorBoundary.tsx +141 -0
  23. package/app/docs/components/Spinner.tsx +33 -0
  24. package/app/docs/components/Table.tsx +33 -0
  25. package/app/docs/components/Tabs.tsx +226 -0
  26. package/app/docs/components/classNames.ts +4 -0
  27. package/app/docs/components/components.css +691 -0
  28. package/app/docs/components/copy.ts +89 -0
  29. package/app/docs/components/fieldContext.ts +29 -0
  30. package/app/docs/components/inputValues.ts +142 -0
  31. package/app/docs/components/inputs.tsx +387 -0
  32. package/app/docs/components/jsonParse.ts +338 -0
  33. package/app/docs/components/listKeys.ts +30 -0
  34. package/app/docs/config.ts +86 -0
  35. package/app/docs/context.ts +33 -0
  36. package/app/docs/embed.ts +74 -0
  37. package/app/docs/env.d.ts +2 -0
  38. package/app/docs/format.ts +9 -0
  39. package/app/docs/hooks/useUrlTab.ts +16 -0
  40. package/app/docs/main.tsx +11 -0
  41. package/app/docs/queryClient.ts +54 -0
  42. package/app/docs/router.tsx +194 -0
  43. package/app/docs/routing.ts +194 -0
  44. package/app/docs/screens/docs/document.ts +27 -0
  45. package/app/docs/screens/docs/http/OperationView.tsx +407 -0
  46. package/app/docs/screens/docs/http/Sidebar.tsx +190 -0
  47. package/app/docs/screens/docs/http/TryItPanel.tsx +603 -0
  48. package/app/docs/screens/docs/http/http.css +405 -0
  49. package/app/docs/screens/docs/http/index.tsx +395 -0
  50. package/app/docs/screens/docs/http/model.ts +604 -0
  51. package/app/docs/screens/docs/http/tryIt.ts +455 -0
  52. package/app/docs/screens/docs/permissions.ts +6 -0
  53. package/app/docs/screens/docs/schema/Prose.tsx +43 -0
  54. package/app/docs/screens/docs/schema/SchemaTree.tsx +319 -0
  55. package/app/docs/screens/docs/schema/index.ts +30 -0
  56. package/app/docs/screens/docs/schema/resolve.ts +466 -0
  57. package/app/docs/screens/docs/schema/schema.css +137 -0
  58. package/app/docs/screens/docs/schema/skeleton.ts +92 -0
  59. package/app/docs/screens/docs/viewer.tsx +154 -0
  60. package/app/docs/screens/docs/ws/InlineText.tsx +25 -0
  61. package/app/docs/screens/docs/ws/PayloadSchema.tsx +39 -0
  62. package/app/docs/screens/docs/ws/format.ts +82 -0
  63. package/app/docs/screens/docs/ws/index.tsx +286 -0
  64. package/app/docs/screens/docs/ws/items.tsx +786 -0
  65. package/app/docs/screens/docs/ws/model.ts +1178 -0
  66. package/app/docs/screens/docs/ws/panels.tsx +440 -0
  67. package/app/docs/screens/docs/ws/ws.css +231 -0
  68. package/app/docs/shortcuts.ts +94 -0
  69. package/app/docs/styles/base.css +847 -0
  70. package/app/docs/styles/tokens.css +143 -0
  71. package/app/docs/theme.ts +56 -0
  72. package/app/kit/unauthorized.ts +222 -0
  73. package/dist/docs/assets/main-0rchxtv5.js +18 -0
  74. package/dist/docs/assets/main-0rchxtv5.js.map +99 -0
  75. package/dist/docs/assets/main-cqgyvs86.css +1 -0
  76. package/dist/docs/manifest.json +26 -0
  77. package/dist/jobs/assets/AddFlowDialog-h6xkgx9b.js +6 -0
  78. package/dist/jobs/assets/AddFlowDialog-h6xkgx9b.js.map +11 -0
  79. package/dist/jobs/assets/AddFlowDialog-n7gtc84v.css +1 -0
  80. package/dist/jobs/assets/added-cbwsxv3e.js +4 -0
  81. package/dist/jobs/assets/added-cbwsxv3e.js.map +11 -0
  82. package/dist/jobs/assets/bodies-yyw5hmrp.js +6 -0
  83. package/dist/jobs/assets/bodies-yyw5hmrp.js.map +10 -0
  84. package/dist/jobs/assets/channel-tgkvqm8y.js +4 -0
  85. package/dist/jobs/assets/channel-tgkvqm8y.js.map +10 -0
  86. package/dist/jobs/assets/channelChecks-s4yz4yhw.js +4 -0
  87. package/dist/jobs/assets/channelChecks-s4yz4yhw.js.map +10 -0
  88. package/dist/jobs/assets/index-02427smp.css +1 -0
  89. package/dist/jobs/assets/index-09z2cjft.js +4 -0
  90. package/dist/jobs/assets/index-09z2cjft.js.map +16 -0
  91. package/dist/jobs/assets/index-18bn0gvy.css +1 -0
  92. package/dist/jobs/assets/index-47pxmyxn.js +4 -0
  93. package/dist/jobs/assets/index-47pxmyxn.js.map +10 -0
  94. package/dist/jobs/assets/index-4e55z986.js +4 -0
  95. package/dist/jobs/assets/index-4e55z986.js.map +11 -0
  96. package/dist/jobs/assets/index-5c933424.js +4 -0
  97. package/dist/jobs/assets/index-5c933424.js.map +18 -0
  98. package/dist/jobs/assets/index-5kbyqspm.css +1 -0
  99. package/dist/jobs/assets/index-5ng37hk6.css +1 -0
  100. package/dist/jobs/assets/index-5w8w7fvc.css +1 -0
  101. package/dist/jobs/assets/index-71qs5qyx.css +1 -0
  102. package/dist/jobs/assets/index-btpg4r8b.css +1 -0
  103. package/dist/jobs/assets/index-d5r5n0mm.js +4 -0
  104. package/dist/jobs/assets/index-d5r5n0mm.js.map +23 -0
  105. package/dist/jobs/assets/index-e0yy2skq.css +1 -0
  106. package/dist/jobs/assets/index-hs60b25v.js +10 -0
  107. package/dist/jobs/assets/index-hs60b25v.js.map +62 -0
  108. package/dist/jobs/assets/index-k2smrr70.js +4 -0
  109. package/dist/jobs/assets/index-k2smrr70.js.map +9 -0
  110. package/dist/jobs/assets/index-q24jw3w9.js +4 -0
  111. package/dist/jobs/assets/index-q24jw3w9.js.map +32 -0
  112. package/dist/jobs/assets/index-qfb80xen.css +1 -0
  113. package/dist/jobs/assets/index-rtynx6wj.js +4 -0
  114. package/dist/jobs/assets/index-rtynx6wj.js.map +10 -0
  115. package/dist/jobs/assets/live-6k7s6358.js +4 -0
  116. package/dist/jobs/assets/live-6k7s6358.js.map +10 -0
  117. package/dist/jobs/assets/main-0jmeh6mq.js +6 -0
  118. package/dist/jobs/assets/main-0jmeh6mq.js.map +12 -0
  119. package/dist/jobs/assets/main-3yj6bv90.js +5 -0
  120. package/dist/jobs/assets/main-3yj6bv90.js.map +10 -0
  121. package/dist/jobs/assets/main-4g69fn3x.js +5 -0
  122. package/dist/jobs/assets/main-4g69fn3x.js.map +10 -0
  123. package/dist/jobs/assets/main-4gte3eqq.js +5 -0
  124. package/dist/jobs/assets/main-4gte3eqq.js.map +10 -0
  125. package/dist/jobs/assets/main-4j1fcevh.js +5 -0
  126. package/dist/jobs/assets/main-4j1fcevh.js.map +10 -0
  127. package/dist/jobs/assets/main-54qwkz28.css +1 -0
  128. package/dist/jobs/assets/main-5grjvsy7.js +5 -0
  129. package/dist/jobs/assets/main-5grjvsy7.js.map +11 -0
  130. package/dist/jobs/assets/main-5zbx60gq.js +5 -0
  131. package/dist/jobs/assets/main-5zbx60gq.js.map +11 -0
  132. package/dist/jobs/assets/main-9prgjhg4.js +5 -0
  133. package/dist/jobs/assets/main-9prgjhg4.js.map +10 -0
  134. package/dist/jobs/assets/main-a250ffk7.js +17 -0
  135. package/dist/jobs/assets/main-a250ffk7.js.map +115 -0
  136. package/dist/jobs/assets/main-d6ge7w08.js +5 -0
  137. package/dist/jobs/assets/main-d6ge7w08.js.map +10 -0
  138. package/dist/jobs/assets/main-gngzht43.js +5 -0
  139. package/dist/jobs/assets/main-gngzht43.js.map +10 -0
  140. package/dist/jobs/assets/main-hg0hrg8j.js +5 -0
  141. package/dist/jobs/assets/main-hg0hrg8j.js.map +10 -0
  142. package/dist/jobs/assets/main-hm1ng3yg.js +5 -0
  143. package/dist/jobs/assets/main-hm1ng3yg.js.map +12 -0
  144. package/dist/jobs/assets/main-jkvd92z9.js +5 -0
  145. package/dist/jobs/assets/main-jkvd92z9.js.map +10 -0
  146. package/dist/jobs/assets/main-jv5xqd13.js +5 -0
  147. package/dist/jobs/assets/main-jv5xqd13.js.map +21 -0
  148. package/dist/jobs/assets/main-jxre7w93.js +5 -0
  149. package/dist/jobs/assets/main-jxre7w93.js.map +23 -0
  150. package/dist/jobs/assets/main-kwmqkjfx.js +5 -0
  151. package/dist/jobs/assets/main-kwmqkjfx.js.map +11 -0
  152. package/dist/jobs/assets/main-n9cf6bxm.js +5 -0
  153. package/dist/jobs/assets/main-n9cf6bxm.js.map +11 -0
  154. package/dist/jobs/assets/main-pegp0ygb.js +5 -0
  155. package/dist/jobs/assets/main-pegp0ygb.js.map +10 -0
  156. package/dist/jobs/assets/main-qr573853.js +5 -0
  157. package/dist/jobs/assets/main-qr573853.js.map +12 -0
  158. package/dist/jobs/assets/main-rq97rdr4.js +4 -0
  159. package/dist/jobs/assets/main-rq97rdr4.js.map +22 -0
  160. package/dist/jobs/assets/main-szjdmydc.js +5 -0
  161. package/dist/jobs/assets/main-szjdmydc.js.map +13 -0
  162. package/dist/jobs/assets/main-tnbhrm9n.js +7 -0
  163. package/dist/jobs/assets/main-tnbhrm9n.js.map +11 -0
  164. package/dist/jobs/assets/main-ts19j4n0.js +5 -0
  165. package/dist/jobs/assets/main-ts19j4n0.js.map +25 -0
  166. package/dist/jobs/assets/main-w93x1dzs.js +5 -0
  167. package/dist/jobs/assets/main-w93x1dzs.js.map +10 -0
  168. package/dist/jobs/assets/sections-0ksdxs8m.css +1 -0
  169. package/dist/jobs/assets/sections-0y7w4fb4.js +4 -0
  170. package/dist/jobs/assets/sections-0y7w4fb4.js.map +10 -0
  171. package/dist/jobs/assets/sse-mn0t0fh7.js +5 -0
  172. package/dist/jobs/assets/sse-mn0t0fh7.js.map +11 -0
  173. package/dist/jobs/assets/sseChecks-t7tcm7ra.js +4 -0
  174. package/dist/jobs/assets/sseChecks-t7tcm7ra.js.map +10 -0
  175. package/dist/jobs/assets/validation-ysjfy072.js +4 -0
  176. package/dist/jobs/assets/validation-ysjfy072.js.map +9 -0
  177. package/dist/jobs/manifest.json +511 -0
  178. package/dts/docs/assets.d.ts +144 -0
  179. package/dts/docs/assets.d.ts.map +1 -0
  180. package/dts/docs/browser/config.d.ts +61 -0
  181. package/dts/docs/browser/config.d.ts.map +1 -0
  182. package/dts/docs/browser/index.d.ts +12 -0
  183. package/dts/docs/browser/index.d.ts.map +1 -0
  184. package/dts/docs/docsUi.d.ts +42 -0
  185. package/dts/docs/docsUi.d.ts.map +1 -0
  186. package/dts/docs/hosted.d.ts +22 -0
  187. package/dts/docs/hosted.d.ts.map +1 -0
  188. package/dts/docs/index.d.ts +18 -0
  189. package/dts/docs/index.d.ts.map +1 -0
  190. package/dts/docs/shell.d.ts +57 -0
  191. package/dts/docs/shell.d.ts.map +1 -0
  192. package/dts/docs/types.d.ts +137 -0
  193. package/dts/docs/types.d.ts.map +1 -0
  194. package/dts/index.d.ts +21 -0
  195. package/dts/index.d.ts.map +1 -0
  196. package/dts/jobs/assets.d.ts +157 -0
  197. package/dts/jobs/assets.d.ts.map +1 -0
  198. package/dts/jobs/browser/config.d.ts +67 -0
  199. package/dts/jobs/browser/config.d.ts.map +1 -0
  200. package/dts/jobs/browser/index.d.ts +10 -0
  201. package/dts/jobs/browser/index.d.ts.map +1 -0
  202. package/dts/jobs/browser/unauthorized.d.ts +9 -0
  203. package/dts/jobs/browser/unauthorized.d.ts.map +1 -0
  204. package/dts/jobs/index.d.ts +24 -0
  205. package/dts/jobs/index.d.ts.map +1 -0
  206. package/dts/jobs/jobsUi.d.ts +63 -0
  207. package/dts/jobs/jobsUi.d.ts.map +1 -0
  208. package/dts/jobs/shell.d.ts +77 -0
  209. package/dts/jobs/shell.d.ts.map +1 -0
  210. package/dts/jobs/types.d.ts +146 -0
  211. package/dts/jobs/types.d.ts.map +1 -0
  212. package/dts/kit/browser/shared.d.ts +10 -0
  213. package/dts/kit/browser/shared.d.ts.map +1 -0
  214. package/dts/kit/browser/unauthorized.d.ts +74 -0
  215. package/dts/kit/browser/unauthorized.d.ts.map +1 -0
  216. package/dts/kit/unauthorized.d.ts +47 -0
  217. package/dts/kit/unauthorized.d.ts.map +1 -0
  218. package/guides/docs.md +170 -0
  219. package/guides/jobs.md +1120 -0
  220. package/lib/docs/assets.ts +427 -0
  221. package/lib/docs/browser/config.ts +66 -0
  222. package/lib/docs/browser/index.ts +24 -0
  223. package/lib/docs/docsUi.ts +623 -0
  224. package/lib/docs/hosted.ts +31 -0
  225. package/lib/docs/index.ts +37 -0
  226. package/lib/docs/shell.ts +156 -0
  227. package/lib/docs/types.ts +149 -0
  228. package/lib/index.ts +27 -0
  229. package/lib/jobs/assets.ts +448 -0
  230. package/lib/jobs/browser/config.ts +65 -0
  231. package/lib/jobs/browser/index.ts +9 -0
  232. package/lib/jobs/browser/unauthorized.ts +11 -0
  233. package/lib/jobs/index.ts +41 -0
  234. package/lib/jobs/jobsUi.ts +709 -0
  235. package/lib/jobs/shell.ts +205 -0
  236. package/lib/jobs/types.ts +162 -0
  237. package/lib/kit/browser/shared.ts +11 -0
  238. package/lib/kit/browser/unauthorized.ts +114 -0
  239. package/lib/kit/unauthorized.ts +222 -0
  240. package/package.json +198 -4
@@ -0,0 +1,691 @@
1
+ /*
2
+ * The M2 component kit's styles. Colours come only from tokens.css; the
3
+ * `--json-*` and `--overlay` aliases below point at existing tokens (or,
4
+ * for the backdrop, follow the same light/dark pattern tokens.css uses).
5
+ */
6
+ :root {
7
+ --json-key: var(--text);
8
+ --json-string: var(--success-text);
9
+ --json-number: var(--info-text);
10
+ --json-boolean: var(--state-delayed);
11
+ --json-null: var(--text-muted);
12
+ --overlay: rgb(16 24 40 / 45%);
13
+ }
14
+
15
+ @media (prefers-color-scheme: dark) {
16
+ :root:not([data-theme="light"]) {
17
+ --overlay: rgb(0 0 0 / 60%);
18
+ }
19
+ }
20
+
21
+ :root[data-theme="dark"] {
22
+ --overlay: rgb(0 0 0 / 60%);
23
+ }
24
+
25
+ /* ---- Dialog ---- */
26
+ .dialog {
27
+ padding: 0;
28
+ border: 1px solid var(--border);
29
+ border-radius: var(--radius);
30
+ background: var(--surface);
31
+ color: var(--text);
32
+ box-shadow: var(--shadow);
33
+ width: min(560px, calc(100vw - 2 * var(--space-4)));
34
+ max-height: calc(100vh - 2 * var(--space-5));
35
+ }
36
+
37
+ .dialog-sm {
38
+ width: min(400px, calc(100vw - 2 * var(--space-4)));
39
+ }
40
+
41
+ .dialog-lg {
42
+ width: min(800px, calc(100vw - 2 * var(--space-4)));
43
+ }
44
+
45
+ .dialog::backdrop {
46
+ background: var(--overlay);
47
+ }
48
+
49
+ .dialog:focus {
50
+ outline: none;
51
+ }
52
+
53
+ .dialog-panel {
54
+ display: flex;
55
+ flex-direction: column;
56
+ gap: var(--space-3);
57
+ padding: var(--space-4);
58
+ max-height: inherit;
59
+ }
60
+
61
+ .dialog-header {
62
+ display: flex;
63
+ align-items: flex-start;
64
+ justify-content: space-between;
65
+ gap: var(--space-3);
66
+ }
67
+
68
+ .dialog-title {
69
+ margin: 0;
70
+ font-size: var(--text-lg);
71
+ }
72
+
73
+ .dialog-close {
74
+ margin: calc(-1 * var(--space-1)) calc(-1 * var(--space-2)) 0 0;
75
+ font-size: var(--text-lg);
76
+ line-height: 1;
77
+ }
78
+
79
+ .dialog-description {
80
+ margin: 0;
81
+ color: var(--text-muted);
82
+ font-size: var(--text-sm);
83
+ }
84
+
85
+ .dialog-body {
86
+ min-height: 0;
87
+ overflow: auto;
88
+ }
89
+
90
+ .dialog-footer {
91
+ display: flex;
92
+ flex-wrap: wrap;
93
+ justify-content: flex-end;
94
+ gap: var(--space-2);
95
+ }
96
+
97
+ .confirm-dialog-body {
98
+ display: flex;
99
+ flex-direction: column;
100
+ gap: var(--space-3);
101
+ }
102
+
103
+ /* ---- Problem banner ---- */
104
+ .problem-banner {
105
+ display: flex;
106
+ align-items: flex-start;
107
+ gap: var(--space-3);
108
+ padding: var(--space-2) var(--space-3);
109
+ border: 1px solid var(--danger);
110
+ border-left-width: 3px;
111
+ border-radius: var(--radius-sm);
112
+ background: var(--danger-bg);
113
+ color: var(--danger-text);
114
+ font-size: var(--text-sm);
115
+ min-width: 0;
116
+ }
117
+
118
+ .problem-banner p {
119
+ margin: 0;
120
+ }
121
+
122
+ .problem-banner-main {
123
+ display: flex;
124
+ flex-direction: column;
125
+ gap: var(--space-1);
126
+ flex: 1;
127
+ min-width: 0;
128
+ overflow-wrap: anywhere;
129
+ }
130
+
131
+ .problem-banner-title {
132
+ display: flex;
133
+ flex-wrap: wrap;
134
+ align-items: baseline;
135
+ gap: var(--space-2);
136
+ }
137
+
138
+ .problem-banner-code {
139
+ font-size: var(--text-xs);
140
+ opacity: 0.85;
141
+ }
142
+
143
+ .problem-banner-context,
144
+ .problem-banner-issues {
145
+ margin: 0;
146
+ padding: 0;
147
+ list-style: none;
148
+ display: flex;
149
+ flex-wrap: wrap;
150
+ gap: var(--space-1) var(--space-3);
151
+ font-size: var(--text-xs);
152
+ }
153
+
154
+ .problem-banner-issues {
155
+ flex-direction: column;
156
+ }
157
+
158
+ .problem-banner-key {
159
+ opacity: 0.85;
160
+ }
161
+
162
+ .problem-banner-actions {
163
+ display: flex;
164
+ gap: var(--space-1);
165
+ flex: none;
166
+ }
167
+
168
+ /* ---- Toasts ---- */
169
+ .toast-viewport {
170
+ position: fixed;
171
+ right: var(--space-4);
172
+ bottom: var(--space-4);
173
+ z-index: 20;
174
+ display: flex;
175
+ flex-direction: column;
176
+ gap: var(--space-2);
177
+ width: min(380px, calc(100vw - 2 * var(--space-4)));
178
+ pointer-events: none;
179
+ }
180
+
181
+ .toast-list {
182
+ margin: 0;
183
+ padding: 0;
184
+ list-style: none;
185
+ display: flex;
186
+ flex-direction: column;
187
+ gap: var(--space-2);
188
+ }
189
+
190
+ .toast {
191
+ display: flex;
192
+ align-items: flex-start;
193
+ gap: var(--space-2);
194
+ padding: var(--space-3);
195
+ border: 1px solid var(--border);
196
+ border-left: 4px solid var(--toast-color, var(--border));
197
+ border-radius: var(--radius-sm);
198
+ background: var(--surface);
199
+ color: var(--text);
200
+ box-shadow: var(--shadow);
201
+ font-size: var(--text-sm);
202
+ pointer-events: auto;
203
+ }
204
+
205
+ .toast-success {
206
+ --toast-color: var(--state-completed);
207
+ }
208
+ .toast-error {
209
+ --toast-color: var(--danger);
210
+ }
211
+ .toast-info {
212
+ --toast-color: var(--accent);
213
+ }
214
+
215
+ .toast-text {
216
+ flex: 1;
217
+ min-width: 0;
218
+ overflow-wrap: anywhere;
219
+ }
220
+
221
+ .toast-text p {
222
+ margin: 0;
223
+ }
224
+
225
+ .toast-message {
226
+ font-weight: 600;
227
+ }
228
+
229
+ .toast-description {
230
+ color: var(--text-muted);
231
+ }
232
+
233
+ .toast-dismiss {
234
+ font-size: var(--text-md);
235
+ line-height: 1;
236
+ }
237
+
238
+ /* ---- Tabs ---- */
239
+ .tabs {
240
+ display: flex;
241
+ flex-direction: column;
242
+ gap: var(--space-3);
243
+ min-width: 0;
244
+ }
245
+
246
+ .tabs-list {
247
+ display: flex;
248
+ gap: var(--space-1);
249
+ border-bottom: 1px solid var(--border);
250
+ overflow-x: auto;
251
+ }
252
+
253
+ .tab {
254
+ display: inline-flex;
255
+ align-items: center;
256
+ gap: var(--space-2);
257
+ padding: var(--space-2) var(--space-3);
258
+ border: 0;
259
+ border-bottom: 2px solid transparent;
260
+ margin-bottom: -1px;
261
+ background: transparent;
262
+ color: var(--text-muted);
263
+ font: inherit;
264
+ font-size: var(--text-sm);
265
+ white-space: nowrap;
266
+ cursor: pointer;
267
+ }
268
+
269
+ .tab:hover {
270
+ color: var(--text);
271
+ }
272
+
273
+ .tab[aria-selected="true"] {
274
+ border-bottom-color: var(--accent);
275
+ color: var(--text);
276
+ font-weight: 600;
277
+ }
278
+
279
+ .tab:disabled {
280
+ opacity: 0.5;
281
+ cursor: not-allowed;
282
+ }
283
+
284
+ .tab-count {
285
+ padding: 0 var(--space-2);
286
+ border-radius: var(--radius-pill);
287
+ background: var(--neutral-bg);
288
+ color: var(--neutral-text);
289
+ font-size: var(--text-xs);
290
+ font-weight: 550;
291
+ font-variant-numeric: tabular-nums;
292
+ }
293
+
294
+ .tab[aria-selected="true"] .tab-count {
295
+ background: var(--info-bg);
296
+ color: var(--info-text);
297
+ }
298
+
299
+ .tabs-panel:focus-visible {
300
+ outline-offset: 4px;
301
+ }
302
+
303
+ /* ---- Pager ---- */
304
+ .pager {
305
+ display: flex;
306
+ flex-wrap: wrap;
307
+ align-items: center;
308
+ justify-content: flex-end;
309
+ gap: var(--space-2) var(--space-4);
310
+ font-size: var(--text-sm);
311
+ }
312
+
313
+ .pager-range {
314
+ margin-right: auto;
315
+ color: var(--text-muted);
316
+ font-variant-numeric: tabular-nums;
317
+ }
318
+
319
+ .pager-size {
320
+ display: inline-flex;
321
+ align-items: center;
322
+ gap: var(--space-2);
323
+ color: var(--text-muted);
324
+ }
325
+
326
+ .pager-select {
327
+ width: auto;
328
+ padding: var(--space-1) var(--space-2);
329
+ }
330
+
331
+ /* The exact-page control: a select of every page, or an input beyond a threshold. */
332
+ .pager-page {
333
+ display: inline-flex;
334
+ align-items: center;
335
+ gap: var(--space-2);
336
+ color: var(--text-muted);
337
+ }
338
+
339
+ /* Room for a five-digit page plus the spinner, not a full-width field. */
340
+ .pager-page-input {
341
+ width: 9ch;
342
+ padding: var(--space-1) var(--space-2);
343
+ font-variant-numeric: tabular-nums;
344
+ }
345
+
346
+ .pager-page-count {
347
+ font-variant-numeric: tabular-nums;
348
+ }
349
+
350
+ .pager-buttons {
351
+ display: inline-flex;
352
+ gap: var(--space-2);
353
+ }
354
+
355
+ /* ---- Form ---- */
356
+ .field {
357
+ display: flex;
358
+ flex-direction: column;
359
+ gap: var(--space-1);
360
+ min-width: 0;
361
+ }
362
+
363
+ .field-label {
364
+ font-size: var(--text-sm);
365
+ font-weight: 600;
366
+ }
367
+
368
+ .field-required {
369
+ color: var(--danger);
370
+ }
371
+
372
+ .field-hint,
373
+ .field-error {
374
+ margin: 0;
375
+ font-size: var(--text-xs);
376
+ }
377
+
378
+ .field-hint {
379
+ color: var(--text-muted);
380
+ }
381
+
382
+ .field-error {
383
+ color: var(--danger);
384
+ }
385
+
386
+ .input[aria-invalid="true"] {
387
+ border-color: var(--danger);
388
+ }
389
+
390
+ .input:disabled {
391
+ opacity: 0.6;
392
+ cursor: not-allowed;
393
+ }
394
+
395
+ .input-group {
396
+ display: flex;
397
+ align-items: center;
398
+ gap: var(--space-2);
399
+ min-width: 0;
400
+ }
401
+
402
+ .input-suffix {
403
+ flex: none;
404
+ color: var(--text-muted);
405
+ font-size: var(--text-xs);
406
+ }
407
+
408
+ .checkbox {
409
+ display: grid;
410
+ grid-template-columns: auto 1fr;
411
+ align-items: center;
412
+ column-gap: var(--space-2);
413
+ font-size: var(--text-sm);
414
+ }
415
+
416
+ .checkbox input {
417
+ margin: 0;
418
+ accent-color: var(--accent);
419
+ }
420
+
421
+ .checkbox-hint {
422
+ grid-column: 2;
423
+ }
424
+
425
+ /* ---- Copy button ---- */
426
+ .copy-button[data-status="copied"] {
427
+ color: var(--success-text);
428
+ }
429
+
430
+ .copy-button[data-status="failed"] {
431
+ color: var(--danger);
432
+ }
433
+
434
+ /* ---- JSON view ---- */
435
+ .json-view {
436
+ position: relative;
437
+ padding: var(--space-2) var(--space-3);
438
+ border: 1px solid var(--border);
439
+ border-radius: var(--radius-sm);
440
+ background: var(--surface-2);
441
+ font-family: var(--font-mono);
442
+ font-size: var(--text-sm);
443
+ overflow: auto;
444
+ max-height: 60vh;
445
+ }
446
+
447
+ .json-view-toolbar {
448
+ position: sticky;
449
+ top: 0;
450
+ float: right;
451
+ font-family: var(--font-sans);
452
+ }
453
+
454
+ .json-tree,
455
+ .json-children {
456
+ margin: 0;
457
+ padding: 0;
458
+ list-style: none;
459
+ }
460
+
461
+ .json-children {
462
+ padding-left: var(--space-4);
463
+ border-left: 1px dotted var(--border);
464
+ margin-left: 5px;
465
+ }
466
+
467
+ .json-row {
468
+ white-space: pre-wrap;
469
+ overflow-wrap: anywhere;
470
+ }
471
+
472
+ .json-toggle,
473
+ .json-more {
474
+ padding: 0;
475
+ border: 0;
476
+ background: none;
477
+ color: inherit;
478
+ font: inherit;
479
+ cursor: pointer;
480
+ text-align: left;
481
+ }
482
+
483
+ .json-more {
484
+ margin-left: var(--space-2);
485
+ color: var(--accent);
486
+ font-family: var(--font-sans);
487
+ font-size: var(--text-xs);
488
+ text-decoration: underline;
489
+ }
490
+
491
+ .json-caret {
492
+ display: inline-block;
493
+ width: 0;
494
+ height: 0;
495
+ margin-right: var(--space-1);
496
+ border-top: 4px solid transparent;
497
+ border-bottom: 4px solid transparent;
498
+ border-left: 6px solid var(--text-muted);
499
+ transition: transform 0.1s;
500
+ }
501
+
502
+ .json-toggle[aria-expanded="true"] .json-caret {
503
+ transform: rotate(90deg);
504
+ }
505
+
506
+ .json-key {
507
+ color: var(--json-key);
508
+ font-weight: 550;
509
+ }
510
+ .json-string {
511
+ color: var(--json-string);
512
+ }
513
+ .json-number {
514
+ color: var(--json-number);
515
+ }
516
+ .json-boolean {
517
+ color: var(--json-boolean);
518
+ }
519
+ .json-null,
520
+ .json-undefined,
521
+ .json-other,
522
+ .json-circular {
523
+ color: var(--json-null);
524
+ font-style: italic;
525
+ }
526
+ .json-punct {
527
+ color: var(--text-muted);
528
+ }
529
+
530
+ .json-summary {
531
+ margin: 0 var(--space-1);
532
+ color: var(--text-muted);
533
+ font-family: var(--font-sans);
534
+ font-size: var(--text-xs);
535
+ }
536
+
537
+ /* ---- JSON editor ---- */
538
+ .json-editor {
539
+ display: flex;
540
+ flex-direction: column;
541
+ gap: var(--space-1);
542
+ min-width: 0;
543
+ }
544
+
545
+ .json-editor-text {
546
+ font-family: var(--font-mono);
547
+ font-size: var(--text-sm);
548
+ line-height: 1.5;
549
+ resize: vertical;
550
+ tab-size: 2;
551
+ }
552
+
553
+ .json-editor-bar {
554
+ display: flex;
555
+ flex-wrap: wrap;
556
+ align-items: center;
557
+ gap: var(--space-1) var(--space-3);
558
+ font-size: var(--text-xs);
559
+ }
560
+
561
+ .json-editor-bar p {
562
+ margin: 0;
563
+ flex: 1;
564
+ min-width: 0;
565
+ }
566
+
567
+ .json-editor-error {
568
+ color: var(--danger);
569
+ }
570
+
571
+ .json-editor-size {
572
+ display: inline-flex;
573
+ align-items: center;
574
+ gap: var(--space-2);
575
+ color: var(--text-muted);
576
+ font-variant-numeric: tabular-nums;
577
+ }
578
+
579
+ .json-editor-size.is-over {
580
+ color: var(--danger);
581
+ font-weight: 600;
582
+ }
583
+
584
+ .json-editor-meter {
585
+ width: 80px;
586
+ height: 8px;
587
+ }
588
+
589
+ .json-editor-actions {
590
+ display: inline-flex;
591
+ gap: var(--space-1);
592
+ }
593
+
594
+ /* ---- Key/value ---- */
595
+ .kv {
596
+ margin: 0;
597
+ display: grid;
598
+ gap: var(--space-2) var(--space-4);
599
+ font-size: var(--text-sm);
600
+ }
601
+
602
+ .kv-grid {
603
+ grid-template-columns: max-content minmax(0, 1fr);
604
+ }
605
+
606
+ .kv-row {
607
+ display: contents;
608
+ }
609
+
610
+ .kv-stacked {
611
+ grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
612
+ }
613
+
614
+ .kv-stacked .kv-row {
615
+ display: flex;
616
+ flex-direction: column;
617
+ gap: 2px;
618
+ min-width: 0;
619
+ }
620
+
621
+ .kv-label {
622
+ color: var(--text-muted);
623
+ }
624
+
625
+ .kv-value {
626
+ margin: 0;
627
+ min-width: 0;
628
+ overflow-wrap: anywhere;
629
+ }
630
+
631
+ .kv-hint {
632
+ display: block;
633
+ color: var(--text-muted);
634
+ font-size: var(--text-xs);
635
+ }
636
+
637
+ .relative-time {
638
+ white-space: nowrap;
639
+ }
640
+
641
+ @media (prefers-reduced-motion: reduce) {
642
+ .json-caret {
643
+ transition: none;
644
+ }
645
+ }
646
+
647
+ @media (max-width: 720px) {
648
+ .kv-grid {
649
+ grid-template-columns: minmax(0, 1fr);
650
+ gap: var(--space-1);
651
+ }
652
+
653
+ .kv-grid .kv-value {
654
+ margin-bottom: var(--space-2);
655
+ }
656
+
657
+ .pager-range {
658
+ flex-basis: 100%;
659
+ }
660
+ }
661
+
662
+ /* ---- Keyboard shortcuts dialog ---- */
663
+ .shortcut-list {
664
+ margin: 0;
665
+ display: grid;
666
+ gap: var(--space-2);
667
+ font-size: var(--text-sm);
668
+ }
669
+
670
+ .shortcut-row {
671
+ display: grid;
672
+ grid-template-columns: minmax(7rem, max-content) minmax(0, 1fr);
673
+ gap: var(--space-3);
674
+ align-items: baseline;
675
+ }
676
+
677
+ .shortcut-row dd {
678
+ margin: 0;
679
+ }
680
+
681
+ kbd {
682
+ display: inline-block;
683
+ min-width: 1.6em;
684
+ padding: 0 var(--space-1);
685
+ border: 1px solid var(--border-strong);
686
+ border-radius: var(--radius-sm);
687
+ background: var(--surface-2);
688
+ font-family: var(--font-mono);
689
+ font-size: var(--text-xs);
690
+ text-align: center;
691
+ }