@quickflo/quickview 1.0.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 (61) hide show
  1. package/README.md +222 -0
  2. package/dist/components/QuickView.vue.d.ts +20 -0
  3. package/dist/components/QuickView.vue.d.ts.map +1 -0
  4. package/dist/components/SmartValue.vue.d.ts +18 -0
  5. package/dist/components/SmartValue.vue.d.ts.map +1 -0
  6. package/dist/composables/useExpansionState.d.ts +38 -0
  7. package/dist/composables/useExpansionState.d.ts.map +1 -0
  8. package/dist/index.d.ts +26 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/quickview.css +1 -0
  11. package/dist/quickview.js +9168 -0
  12. package/dist/quickview.umd.cjs +1 -0
  13. package/dist/registry.d.ts +40 -0
  14. package/dist/registry.d.ts.map +1 -0
  15. package/dist/renderers/domain/ErrorObjectRenderer.vue.d.ts +5 -0
  16. package/dist/renderers/domain/ErrorObjectRenderer.vue.d.ts.map +1 -0
  17. package/dist/renderers/domain/FileObjectRenderer.vue.d.ts +5 -0
  18. package/dist/renderers/domain/FileObjectRenderer.vue.d.ts.map +1 -0
  19. package/dist/renderers/domain/HttpResponseRenderer.vue.d.ts +5 -0
  20. package/dist/renderers/domain/HttpResponseRenderer.vue.d.ts.map +1 -0
  21. package/dist/renderers/primitives/BooleanRenderer.vue.d.ts +5 -0
  22. package/dist/renderers/primitives/BooleanRenderer.vue.d.ts.map +1 -0
  23. package/dist/renderers/primitives/NullRenderer.vue.d.ts +5 -0
  24. package/dist/renderers/primitives/NullRenderer.vue.d.ts.map +1 -0
  25. package/dist/renderers/primitives/NumberRenderer.vue.d.ts +5 -0
  26. package/dist/renderers/primitives/NumberRenderer.vue.d.ts.map +1 -0
  27. package/dist/renderers/primitives/StringRenderer.vue.d.ts +5 -0
  28. package/dist/renderers/primitives/StringRenderer.vue.d.ts.map +1 -0
  29. package/dist/renderers/primitives/UndefinedRenderer.vue.d.ts +5 -0
  30. package/dist/renderers/primitives/UndefinedRenderer.vue.d.ts.map +1 -0
  31. package/dist/renderers/smart/Base64Renderer.vue.d.ts +5 -0
  32. package/dist/renderers/smart/Base64Renderer.vue.d.ts.map +1 -0
  33. package/dist/renderers/smart/ColorRenderer.vue.d.ts +5 -0
  34. package/dist/renderers/smart/ColorRenderer.vue.d.ts.map +1 -0
  35. package/dist/renderers/smart/DateRenderer.vue.d.ts +5 -0
  36. package/dist/renderers/smart/DateRenderer.vue.d.ts.map +1 -0
  37. package/dist/renderers/smart/EmailRenderer.vue.d.ts +5 -0
  38. package/dist/renderers/smart/EmailRenderer.vue.d.ts.map +1 -0
  39. package/dist/renderers/smart/JsonStringRenderer.vue.d.ts +5 -0
  40. package/dist/renderers/smart/JsonStringRenderer.vue.d.ts.map +1 -0
  41. package/dist/renderers/smart/LongStringRenderer.vue.d.ts +5 -0
  42. package/dist/renderers/smart/LongStringRenderer.vue.d.ts.map +1 -0
  43. package/dist/renderers/smart/UrlRenderer.vue.d.ts +5 -0
  44. package/dist/renderers/smart/UrlRenderer.vue.d.ts.map +1 -0
  45. package/dist/renderers/structures/ArrayRenderer.vue.d.ts +5 -0
  46. package/dist/renderers/structures/ArrayRenderer.vue.d.ts.map +1 -0
  47. package/dist/renderers/structures/EmptyRenderer.vue.d.ts +5 -0
  48. package/dist/renderers/structures/EmptyRenderer.vue.d.ts.map +1 -0
  49. package/dist/renderers/structures/ObjectRenderer.vue.d.ts +5 -0
  50. package/dist/renderers/structures/ObjectRenderer.vue.d.ts.map +1 -0
  51. package/dist/setup.d.ts +7 -0
  52. package/dist/setup.d.ts.map +1 -0
  53. package/dist/testers.d.ts +51 -0
  54. package/dist/testers.d.ts.map +1 -0
  55. package/dist/types.d.ts +89 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/utils.d.ts +49 -0
  58. package/dist/utils.d.ts.map +1 -0
  59. package/dist/vite.config.d.ts +4 -0
  60. package/dist/vite.config.d.ts.map +1 -0
  61. package/package.json +60 -0
package/README.md ADDED
@@ -0,0 +1,222 @@
1
+ # @quickflo/quickview
2
+
3
+ A Vue 3 component library for intelligently rendering complex data structures. Automatically detects and beautifully displays HTTP responses, file objects, errors, arrays, nested objects, and primitive types with built-in search, copy, and navigation.
4
+
5
+ ## Features
6
+
7
+ - **Smart Type Detection** - Automatically identifies and renders HTTP responses, file objects, errors, dates, URLs, emails, colors, and more
8
+ - **Pluggable Renderer System** - Register custom renderers for domain-specific data types
9
+ - **Built-in Search** - Search across keys, values, and paths with jump-to navigation
10
+ - **Collapsible Structures** - Expand/collapse nested objects and arrays with configurable default depth
11
+ - **File Downloads** - Built-in file renderer with customizable download handler for cloud storage (GCS, S3, SFTP)
12
+ - **Copy Support** - One-click copy for individual values or entire structures
13
+ - **Quasar Integration** - Built with Quasar components for a polished UI
14
+
15
+ ## Installation
16
+
17
+ ```bash
18
+ npm install @quickflo/quickview
19
+ # or
20
+ pnpm add @quickflo/quickview
21
+ # or
22
+ yarn add @quickflo/quickview
23
+ ```
24
+
25
+ ### Peer Dependencies
26
+
27
+ QuickView requires Vue 3 and Quasar:
28
+
29
+ ```bash
30
+ npm install vue quasar @quasar/extras
31
+ ```
32
+
33
+ ## Quick Start
34
+
35
+ ```vue
36
+ <script setup>
37
+ import { QuickView } from '@quickflo/quickview'
38
+ import '@quickflo/quickview/styles'
39
+
40
+ const data = {
41
+ status: 200,
42
+ statusText: 'OK',
43
+ headers: { 'content-type': 'application/json' },
44
+ body: {
45
+ users: [
46
+ { id: 1, name: 'Alice', email: 'alice@example.com' },
47
+ { id: 2, name: 'Bob', email: 'bob@example.com' },
48
+ ]
49
+ }
50
+ }
51
+ </script>
52
+
53
+ <template>
54
+ <QuickView :value="data" />
55
+ </template>
56
+ ```
57
+
58
+ ## Built-in Renderers
59
+
60
+ ### Primitives
61
+ - `null` / `undefined` - Styled null indicators
62
+ - `boolean` - Color-coded true/false chips
63
+ - `number` - Formatted numbers
64
+ - `string` - With smart detection for URLs, emails, dates, colors, JSON, base64
65
+
66
+ ### Smart String Detection
67
+ - **URLs** - Clickable links with external icon
68
+ - **Emails** - Mailto links
69
+ - **Dates** - Formatted with relative time
70
+ - **Colors** - Hex/RGB preview swatches
71
+ - **JSON Strings** - Parsed and rendered as objects
72
+ - **Base64** - Decoded preview with copy support
73
+ - **Long Text** - Truncated with expand option
74
+
75
+ ### Structures
76
+ - **Objects** - Collapsible with key-value display
77
+ - **Arrays** - Collapsible with item count, table view for homogeneous data
78
+ - **Empty** - Styled empty object/array indicators
79
+
80
+ ### Domain Types
81
+ - **HTTP Response** - Status badge, collapsible headers, body preview
82
+ - **File Object** - Icon, mime type, size, download button, image preview
83
+ - **Error Object** - Error styling, stack trace, details expansion
84
+
85
+ ## Options
86
+
87
+ ```typescript
88
+ interface QuickViewOptions {
89
+ // Default depth to auto-expand (default: 2)
90
+ maxAutoExpandDepth?: number
91
+
92
+ // Max string length before truncation (default: 500)
93
+ maxStringLength?: number
94
+
95
+ // Max array items in collapsed preview (default: 5)
96
+ maxArrayPreview?: number
97
+
98
+ // Show copy buttons on hover (default: true)
99
+ showCopyButtons?: boolean
100
+
101
+ // Custom renderers to add/override
102
+ renderers?: RegisteredRenderer[]
103
+
104
+ // Handler for file downloads (cloud storage support)
105
+ onDownload?: (file: FileObject) => void | Promise<void>
106
+ }
107
+ ```
108
+
109
+ ### Example with Options
110
+
111
+ ```vue
112
+ <template>
113
+ <QuickView
114
+ :value="workflowOutput"
115
+ :options="{
116
+ maxAutoExpandDepth: 3,
117
+ onDownload: handleFileDownload
118
+ }"
119
+ />
120
+ </template>
121
+
122
+ <script setup>
123
+ async function handleFileDownload(file) {
124
+ // Call your API to get a signed URL for cloud storage files
125
+ const signedUrl = await api.getSignedUrl(file.url)
126
+ window.open(signedUrl, '_blank')
127
+ }
128
+ </script>
129
+ ```
130
+
131
+ ## Custom Renderers
132
+
133
+ Register custom renderers for your domain types:
134
+
135
+ ```typescript
136
+ import {
137
+ QuickView,
138
+ RendererRegistry,
139
+ createDefaultRegistry
140
+ } from '@quickflo/quickview'
141
+
142
+ // Create a registry with default renderers
143
+ const registry = createDefaultRegistry()
144
+
145
+ // Add a custom renderer
146
+ registry.register({
147
+ name: 'user-avatar',
148
+ priority: 100,
149
+ tester: (value) => {
150
+ return (
151
+ typeof value === 'object' &&
152
+ value !== null &&
153
+ 'avatarUrl' in value &&
154
+ 'displayName' in value
155
+ )
156
+ },
157
+ component: UserAvatarRenderer
158
+ })
159
+ ```
160
+
161
+ ```vue
162
+ <template>
163
+ <QuickView :value="data" :registry="registry" />
164
+ </template>
165
+ ```
166
+
167
+ ## File Object Shape
168
+
169
+ The file renderer detects objects with this shape:
170
+
171
+ ```typescript
172
+ interface FileObject {
173
+ url?: string // gs://, s3://, sftp://, or https://
174
+ content?: string // File content (base64 or text)
175
+ filename?: string // Display name
176
+ mimeType?: string // MIME type for icon/preview
177
+ size?: number // Size in bytes
178
+ isBase64?: boolean // Whether content is base64 encoded
179
+ metadata?: Record<string, unknown>
180
+ }
181
+ ```
182
+
183
+ ## Styling
184
+
185
+ QuickView uses CSS custom properties for theming:
186
+
187
+ ```css
188
+ .quickview {
189
+ --qv-bg: #ffffff;
190
+ --qv-bg-hover: #f8fafc;
191
+ --qv-bg-selected: #e0e7ff;
192
+ --qv-border: #e2e8f0;
193
+ --qv-text: #1e293b;
194
+ --qv-text-muted: #64748b;
195
+ --qv-text-subtle: #94a3b8;
196
+ --qv-info: #6366f1;
197
+ --qv-success: #22c55e;
198
+ --qv-warning: #f59e0b;
199
+ --qv-error: #ef4444;
200
+ --qv-mono: 'SF Mono', Menlo, Monaco, monospace;
201
+ }
202
+ ```
203
+
204
+ ## Development
205
+
206
+ ```bash
207
+ # Install dependencies
208
+ pnpm install
209
+
210
+ # Start dev server with demo
211
+ pnpm dev
212
+
213
+ # Build library
214
+ pnpm build
215
+
216
+ # Type check
217
+ pnpm typecheck
218
+ ```
219
+
220
+ ## License
221
+
222
+ MIT
@@ -0,0 +1,20 @@
1
+ import { RendererRegistry } from '../registry';
2
+ import { QuickViewOptions } from '../types';
3
+ import { DefineComponent, ComponentOptionsMixin, PublicProps, ComponentProvideOptions, VNodeProps, AllowedComponentProps, ComponentCustomProps } from 'vue';
4
+ import { QInputProps, QInputSlots } from 'quasar';
5
+ interface Props {
6
+ value: unknown;
7
+ options?: QuickViewOptions;
8
+ registry?: RendererRegistry;
9
+ }
10
+ declare const _default: DefineComponent<Props, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<Props> & Readonly<{}>, {
11
+ options: QuickViewOptions;
12
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {
13
+ searchInputRef: {
14
+ $props: VNodeProps & AllowedComponentProps & ComponentCustomProps & QInputProps;
15
+ $slots: QInputSlots;
16
+ } | null;
17
+ contentRef: HTMLDivElement;
18
+ }, HTMLDivElement>;
19
+ export default _default;
20
+ //# sourceMappingURL=QuickView.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuickView.vue.d.ts","sourceRoot":"","sources":["../../components/QuickView.vue"],"names":[],"mappings":";;AAyFA;AA0cA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,UAAU,KAAK;IACb,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;;aAFW,gBAAgB;;;;;;;;AAylB5B,wBASG"}
@@ -0,0 +1,18 @@
1
+ import { FileObject } from '../types';
2
+ import { DefineComponent, ComponentOptionsMixin, PublicProps, ComponentProvideOptions } from 'vue';
3
+ interface Props {
4
+ value: unknown;
5
+ path?: string;
6
+ keyName?: string;
7
+ depth?: number;
8
+ parent?: unknown;
9
+ onNavigate?: (path: string) => void;
10
+ onCopy?: (value: unknown, path: string) => void;
11
+ onDownload?: (file: FileObject) => void | Promise<void>;
12
+ }
13
+ declare const _default: DefineComponent<Props, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<Props> & Readonly<{}>, {
14
+ path: string;
15
+ depth: number;
16
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
17
+ export default _default;
18
+ //# sourceMappingURL=SmartValue.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmartValue.vue.d.ts","sourceRoot":"","sources":["../../components/SmartValue.vue"],"names":[],"mappings":";AAQA;AAiEA,OAAO,KAAK,EAAmB,UAAU,EAAE,MAAM,UAAU,CAAA;AAG3D,UAAU,KAAK;IACb,KAAK,EAAE,OAAO,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/C,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACxD;;UAPQ,MAAM;WAEL,MAAM;;AAkGhB,wBAOG"}
@@ -0,0 +1,38 @@
1
+ import { Ref } from 'vue';
2
+ export interface ExpansionState {
3
+ /** Map of expanded paths (using object for reactivity) */
4
+ expandedPaths: Ref<Record<string, boolean>>;
5
+ /** Currently highlighted path (for search results) */
6
+ highlightedPath: Ref<string | null>;
7
+ /** Expansion version - increments on expandAll/collapseAll to force re-render */
8
+ version: Ref<number>;
9
+ }
10
+ export interface ExpansionActions {
11
+ /** Check if a path is expanded */
12
+ isExpanded: (path: string) => boolean;
13
+ /** Toggle expansion for a path */
14
+ toggle: (path: string) => void;
15
+ /** Expand a specific path */
16
+ expand: (path: string) => void;
17
+ /** Collapse a specific path */
18
+ collapse: (path: string) => void;
19
+ /** Expand all paths up to a certain depth */
20
+ expandAll: (maxDepth?: number, rootValue?: unknown) => void;
21
+ /** Collapse all paths */
22
+ collapseAll: () => void;
23
+ /** Expand all parent paths to reveal a target path, then highlight it */
24
+ jumpToPath: (targetPath: string) => void;
25
+ /** Clear the highlight */
26
+ clearHighlight: () => void;
27
+ /** Check if a path is currently highlighted */
28
+ isHighlighted: (path: string) => boolean;
29
+ }
30
+ /**
31
+ * Create expansion state management for QuickView
32
+ */
33
+ export declare function createExpansionState(_defaultExpandDepth?: number): {
34
+ state: ExpansionState;
35
+ actions: ExpansionActions;
36
+ };
37
+ export type { ExpansionState as ExpansionStateType };
38
+ //# sourceMappingURL=useExpansionState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useExpansionState.d.ts","sourceRoot":"","sources":["../../composables/useExpansionState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AAEnC,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAC3C,sDAAsD;IACtD,eAAe,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IACnC,iFAAiF;IACjF,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,kCAAkC;IAClC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;IACrC,kCAAkC;IAClC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,6BAA6B;IAC7B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,+BAA+B;IAC/B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,6CAA6C;IAC7C,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IAC3D,yBAAyB;IACzB,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,yEAAyE;IACzE,UAAU,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,0BAA0B;IAC1B,cAAc,EAAE,MAAM,IAAI,CAAA;IAC1B,+CAA+C;IAC/C,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;CACzC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,mBAAmB,SAAI,GAAG;IAC7D,KAAK,EAAE,cAAc,CAAA;IACrB,OAAO,EAAE,gBAAgB,CAAA;CAC1B,CAkHA;AAwBD,YAAY,EAAE,cAAc,IAAI,kBAAkB,EAAE,CAAA"}
@@ -0,0 +1,26 @@
1
+ export { default as QuickView } from './components/QuickView.vue';
2
+ export { default as SmartValue } from './components/SmartValue.vue';
3
+ export { RendererRegistry, defaultRegistry } from './registry';
4
+ export { createDefaultRegistry } from './setup';
5
+ export * from './testers';
6
+ export type { FileObject, RendererContext, RendererProps, TesterFunction, RegisteredRenderer, QuickViewOptions, DetectedType, } from './types';
7
+ export * from './utils';
8
+ export { default as NullRenderer } from './renderers/primitives/NullRenderer.vue';
9
+ export { default as UndefinedRenderer } from './renderers/primitives/UndefinedRenderer.vue';
10
+ export { default as BooleanRenderer } from './renderers/primitives/BooleanRenderer.vue';
11
+ export { default as NumberRenderer } from './renderers/primitives/NumberRenderer.vue';
12
+ export { default as StringRenderer } from './renderers/primitives/StringRenderer.vue';
13
+ export { default as UrlRenderer } from './renderers/smart/UrlRenderer.vue';
14
+ export { default as EmailRenderer } from './renderers/smart/EmailRenderer.vue';
15
+ export { default as DateRenderer } from './renderers/smart/DateRenderer.vue';
16
+ export { default as ColorRenderer } from './renderers/smart/ColorRenderer.vue';
17
+ export { default as LongStringRenderer } from './renderers/smart/LongStringRenderer.vue';
18
+ export { default as Base64Renderer } from './renderers/smart/Base64Renderer.vue';
19
+ export { default as JsonStringRenderer } from './renderers/smart/JsonStringRenderer.vue';
20
+ export { default as ObjectRenderer } from './renderers/structures/ObjectRenderer.vue';
21
+ export { default as ArrayRenderer } from './renderers/structures/ArrayRenderer.vue';
22
+ export { default as EmptyRenderer } from './renderers/structures/EmptyRenderer.vue';
23
+ export { default as HttpResponseRenderer } from './renderers/domain/HttpResponseRenderer.vue';
24
+ export { default as FileObjectRenderer } from './renderers/domain/FileObjectRenderer.vue';
25
+ export { default as ErrorObjectRenderer } from './renderers/domain/ErrorObjectRenderer.vue';
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAGA,OAAO,eAAe,CAAA;AAGtB,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAGnE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAG/C,cAAc,WAAW,CAAA;AAGzB,YAAY,EACV,UAAU,EACV,eAAe,EACf,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,GACb,MAAM,SAAS,CAAA;AAGhB,cAAc,SAAS,CAAA;AAGvB,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,yCAAyC,CAAA;AACjF,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,8CAA8C,CAAA;AAC3F,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,4CAA4C,CAAA;AACvF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,2CAA2C,CAAA;AACrF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,2CAA2C,CAAA;AAErF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mCAAmC,CAAA;AAC1E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qCAAqC,CAAA;AAC9E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oCAAoC,CAAA;AAC5E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qCAAqC,CAAA;AAC9E,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,0CAA0C,CAAA;AACxF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,sCAAsC,CAAA;AAChF,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,0CAA0C,CAAA;AAExF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,2CAA2C,CAAA;AACrF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,0CAA0C,CAAA;AACnF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,0CAA0C,CAAA;AAEnF,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,6CAA6C,CAAA;AAC7F,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,2CAA2C,CAAA;AACzF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,4CAA4C,CAAA"}
@@ -0,0 +1 @@
1
+ .quickview{--qv-bg: #ffffff;--qv-bg-hover: #f8fafc;--qv-bg-selected: #eff6ff;--qv-border: #e2e8f0;--qv-text: #1e293b;--qv-text-muted: #64748b;--qv-text-subtle: #94a3b8;--qv-string: #059669;--qv-number: #2563eb;--qv-boolean: #7c3aed;--qv-null: #94a3b8;--qv-key: #0f172a;--qv-bracket: #64748b;--qv-success: #10b981;--qv-error: #ef4444;--qv-warning: #f59e0b;--qv-info: #3b82f6;--qv-mono: "Monaco", "Menlo", "Ubuntu Mono", "Consolas", monospace;font-family:var(--qv-mono);font-size:13px;line-height:1.6;background:var(--qv-bg);border:1px solid var(--qv-border);border-radius:8px;overflow:hidden}.qv-mono{font-family:var(--qv-mono)}.qv-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.qv-clickable{cursor:pointer}.qv-clickable:hover{background:var(--qv-bg-hover)}.qv-copy-btn{opacity:0;transition:opacity .15s ease}.qv-copy-target:hover .qv-copy-btn{opacity:1}.dark .quickview,.quickview.dark{--qv-bg: #1e293b;--qv-bg-hover: #334155;--qv-bg-selected: #1e3a5f;--qv-border: #475569;--qv-text: #f1f5f9;--qv-text-muted: #94a3b8;--qv-text-subtle: #64748b;--qv-string: #34d399;--qv-number: #60a5fa;--qv-boolean: #a78bfa;--qv-null: #64748b;--qv-key: #e2e8f0;--qv-bracket: #94a3b8}.qv-unknown[data-v-a944b92c]{color:var(--qv-text-muted);font-style:italic}.qv-null[data-v-9d11bc73],.qv-undefined[data-v-f5b5f6f8]{color:var(--qv-null);font-style:italic}.qv-boolean[data-v-a548880f]{color:var(--qv-boolean);display:inline-flex;align-items:center}.qv-number[data-v-6ccf2b38]{color:var(--qv-number)}.qv-string[data-v-ca8a8cad]{color:var(--qv-string);word-break:break-word}.quote[data-v-ca8a8cad]{color:var(--qv-string);opacity:.7}.value[data-v-ca8a8cad]{white-space:pre-wrap}.qv-url[data-v-c8a4b9a7]{display:inline-flex;align-items:center;gap:4px}.url-icon[data-v-c8a4b9a7]{color:var(--qv-info);flex-shrink:0}.url-link[data-v-c8a4b9a7]{color:var(--qv-info);text-decoration:none;word-break:break-all}.url-link[data-v-c8a4b9a7]:hover{text-decoration:underline}.open-btn[data-v-c8a4b9a7]{opacity:0;transition:opacity .15s ease;color:var(--qv-text-muted)}.qv-url:hover .open-btn[data-v-c8a4b9a7]{opacity:1}.qv-email[data-v-3aa3ca8e]{display:inline-flex;align-items:center;gap:4px}.email-icon[data-v-3aa3ca8e]{color:var(--qv-info);flex-shrink:0}.email-link[data-v-3aa3ca8e]{color:var(--qv-info);text-decoration:none}.email-link[data-v-3aa3ca8e]:hover{text-decoration:underline}.qv-date[data-v-64972e62]{display:inline-flex;align-items:center;gap:6px}.date-icon[data-v-64972e62]{color:var(--qv-text-muted);flex-shrink:0}.date-formatted[data-v-64972e62]{color:var(--qv-string)}.date-relative[data-v-64972e62]{color:var(--qv-text-subtle);font-size:.9em}.qv-color[data-v-df679191]{display:inline-flex;align-items:center;gap:6px}.color-swatch[data-v-df679191]{width:16px;height:16px;border-radius:3px;border:1px solid var(--qv-border);flex-shrink:0}.color-value[data-v-df679191]{color:var(--qv-string);font-family:inherit}.qv-long-string[data-v-06922b61]{display:flex;flex-direction:column;gap:8px}.string-header[data-v-06922b61]{display:flex;align-items:center;gap:8px;color:var(--qv-text-muted);font-size:12px}.string-length[data-v-06922b61]{color:var(--qv-text-subtle)}.string-content[data-v-06922b61]{background:var(--qv-bg-hover);border-radius:4px;padding:8px 12px;max-height:150px;overflow:hidden;transition:max-height .3s ease}.string-content.expanded[data-v-06922b61]{max-height:none}.string-content pre[data-v-06922b61]{margin:0;white-space:pre-wrap;word-break:break-word;color:var(--qv-string);font-size:12px}.qv-base64[data-v-01a0d3e1]{display:flex;flex-direction:column;gap:8px}.base64-header[data-v-01a0d3e1]{display:flex;align-items:center;gap:8px;color:var(--qv-text-muted);font-size:12px}.base64-label[data-v-01a0d3e1]{background:#e0e7ff;color:#4f46e5;padding:2px 6px;border-radius:4px;font-size:11px;font-weight:500}.base64-size[data-v-01a0d3e1]{color:var(--qv-text-subtle)}.base64-content[data-v-01a0d3e1]{background:var(--qv-bg-hover);border-radius:4px;padding:8px 12px;overflow:hidden}.encoded-text[data-v-01a0d3e1],.decoded-text[data-v-01a0d3e1]{margin:0;white-space:pre-wrap;word-break:break-all;color:var(--qv-text-muted);font-size:11px;max-height:100px;overflow:auto}.decoded-image[data-v-01a0d3e1]{max-width:100%;max-height:200px;border-radius:4px}.qv-json-string[data-v-e8c37fcb]{display:flex;flex-direction:column;gap:8px}.json-header[data-v-e8c37fcb]{display:flex;align-items:center;gap:8px;color:var(--qv-text-muted);font-size:12px}.json-label[data-v-e8c37fcb]{background:#fef3c7;color:#92400e;padding:2px 6px;border-radius:4px;font-size:11px;font-weight:500}.json-content[data-v-e8c37fcb]{background:var(--qv-bg-hover);border-radius:4px;padding:8px 12px}.json-preview[data-v-e8c37fcb]{color:var(--qv-text-muted);font-size:12px}.qv-object.is-root[data-v-95f1d502]{padding:12px}.qv-object.is-highlighted>.object-header[data-v-95f1d502]{animation:highlight-pulse-95f1d502 2s ease-out}.object-header[data-v-95f1d502]{display:flex;align-items:center;gap:4px;padding:2px 4px;margin-left:-4px;border-radius:4px}.expand-icon[data-v-95f1d502]{color:var(--qv-text-muted);transition:transform .15s ease}.bracket[data-v-95f1d502]{color:var(--qv-bracket)}.preview[data-v-95f1d502]{color:var(--qv-text-muted);font-size:.95em;margin:0 4px}.key-count[data-v-95f1d502]{color:var(--qv-text-subtle);font-size:11px;margin-left:8px}.object-entries[data-v-95f1d502]{margin-left:16px;border-left:1px solid var(--qv-border);padding-left:12px}.object-entry[data-v-95f1d502]{display:flex;align-items:flex-start;gap:4px;padding:3px 4px;margin:0 -4px;position:relative;border-radius:4px;transition:background-color .15s ease}.object-entry[data-v-95f1d502]:hover{background:var(--qv-bg-hover)}.object-entry.is-highlighted[data-v-95f1d502]{animation:highlight-pulse-95f1d502 2s ease-out}.entry-key[data-v-95f1d502]{color:var(--qv-key);flex-shrink:0;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.colon[data-v-95f1d502]{color:var(--qv-bracket);margin-right:6px}.entry-value[data-v-95f1d502]{flex:1;min-width:0}.entry-copy[data-v-95f1d502]{position:absolute;right:4px;top:2px}.closing-bracket[data-v-95f1d502]{margin-top:2px}@keyframes highlight-pulse-95f1d502{0%{background-color:#6366f14d}50%{background-color:#6366f126}to{background-color:transparent}}.qv-array.is-root[data-v-dc619f16]{padding:12px}.qv-array.is-highlighted>.array-header[data-v-dc619f16]{animation:highlight-pulse-dc619f16 2s ease-out}.array-header[data-v-dc619f16]{display:flex;align-items:center;gap:4px;padding:2px 4px;margin-left:-4px;border-radius:4px}.expand-icon[data-v-dc619f16]{color:var(--qv-text-muted)}.bracket[data-v-dc619f16]{color:var(--qv-bracket)}.preview[data-v-dc619f16]{color:var(--qv-text-muted);font-size:.95em;margin:0 4px}.length-chip[data-v-dc619f16]{font-size:10px;height:18px}.view-toggle[data-v-dc619f16]{margin-left:8px}.array-items[data-v-dc619f16]{margin-left:16px;border-left:1px solid var(--qv-border);padding-left:12px}.array-item[data-v-dc619f16]{display:flex;align-items:flex-start;gap:8px;padding:3px 4px;margin:0 -4px;border-radius:4px;transition:background-color .15s ease}.array-item[data-v-dc619f16]:hover{background:var(--qv-bg-hover)}.array-item.is-highlighted[data-v-dc619f16]{animation:highlight-pulse-dc619f16 2s ease-out}.item-index[data-v-dc619f16]{color:var(--qv-text-subtle);font-size:11px;min-width:24px;text-align:right;flex-shrink:0}.item-value[data-v-dc619f16]{flex:1;min-width:0}.show-more[data-v-dc619f16]{padding:8px 0}.closing-bracket[data-v-dc619f16]{margin-top:2px}.array-table-container[data-v-dc619f16]{margin:8px 0;border:1px solid var(--qv-border);border-radius:6px;overflow:hidden}.array-table [data-v-dc619f16] th{font-weight:600;background:var(--qv-bg-hover)}.array-table [data-v-dc619f16] td{font-family:inherit;vertical-align:top}@keyframes highlight-pulse-dc619f16{0%{background-color:#6366f14d}50%{background-color:#6366f126}to{background-color:transparent}}.qv-empty[data-v-ac41a1e6]{display:inline-flex;align-items:center;gap:6px}.bracket[data-v-ac41a1e6]{color:var(--qv-bracket)}.label[data-v-ac41a1e6]{color:var(--qv-text-subtle);font-size:11px;font-style:italic}.qv-http-response[data-v-7227aa88]{border:1px solid var(--qv-border);border-radius:8px;overflow:hidden;background:var(--qv-bg)}.http-status-bar[data-v-7227aa88]{display:flex;align-items:center;gap:12px;padding:10px 12px;background:var(--qv-bg-hover);border-bottom:1px solid var(--qv-border)}.status-chip[data-v-7227aa88]{font-weight:600}.response-url[data-v-7227aa88]{color:var(--qv-text-muted);font-size:12px;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.response-timing[data-v-7227aa88]{display:flex;align-items:center;gap:4px;color:var(--qv-text-subtle);font-size:12px;flex-shrink:0}.http-sections [data-v-7227aa88] .q-expansion-item{border-bottom:1px solid var(--qv-border)}.http-sections [data-v-7227aa88] .q-expansion-item:last-child{border-bottom:none}.section-header[data-v-7227aa88]{padding:8px 12px!important;min-height:40px!important}.section-title[data-v-7227aa88]{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:500;color:var(--qv-text)}.headers-content[data-v-7227aa88]{background:var(--qv-bg-hover)}.headers-toolbar[data-v-7227aa88],.body-toolbar[data-v-7227aa88]{display:flex;align-items:center;justify-content:space-between;padding:6px 12px;border-bottom:1px solid var(--qv-border)}.view-toggle[data-v-7227aa88]{display:flex;gap:2px}.toggle-btn[data-v-7227aa88]{border:none;background:transparent;color:var(--qv-text-subtle);font-size:11px;font-weight:500;padding:3px 6px;border-radius:3px;cursor:pointer;transition:all .15s ease;font-family:inherit}.toggle-btn[data-v-7227aa88]:hover{color:var(--qv-text-muted)}.toggle-btn.active[data-v-7227aa88]{color:var(--qv-text-muted);background:#0000000a}.raw-headers[data-v-7227aa88]{margin:0;padding:12px;font-size:12px;white-space:pre-wrap;word-break:break-word;color:var(--qv-text)}.header-row[data-v-7227aa88]{display:flex;gap:12px;padding:4px 12px;font-size:12px;border-radius:4px}.header-row.is-highlighted[data-v-7227aa88]{animation:highlight-pulse-7227aa88 2s ease-out}.header-key[data-v-7227aa88]{color:var(--qv-key);font-weight:500;min-width:150px;flex-shrink:0}.header-value[data-v-7227aa88]{color:var(--qv-text-muted);word-break:break-all}.body-content[data-v-7227aa88]{background:var(--qv-bg-hover)}.body-view[data-v-7227aa88]{padding:12px;max-height:400px;overflow:auto}.raw-body[data-v-7227aa88]{margin:0;font-size:12px;white-space:pre-wrap;word-break:break-word;color:var(--qv-text)}.timing-content[data-v-7227aa88]{padding:12px;background:var(--qv-bg-hover)}.timing-bar[data-v-7227aa88]{display:flex;height:8px;border-radius:4px;overflow:hidden;background:#e2e8f0}.timing-phase[data-v-7227aa88]{height:100%;min-width:2px}.timing-legend[data-v-7227aa88]{display:flex;flex-wrap:wrap;gap:12px;margin-top:12px}.timing-item[data-v-7227aa88]{display:flex;align-items:center;gap:6px;font-size:11px}.timing-dot[data-v-7227aa88]{width:8px;height:8px;border-radius:50%}.timing-label[data-v-7227aa88]{color:var(--qv-text-muted);text-transform:capitalize}.timing-value[data-v-7227aa88]{color:var(--qv-text);font-weight:500}@keyframes highlight-pulse-7227aa88{0%{background-color:#6366f14d}50%{background-color:#6366f126}to{background-color:transparent}}.qv-file-object[data-v-8c9554b5]{border:1px solid var(--qv-border);border-radius:8px;overflow:hidden;background:var(--qv-bg)}.file-card[data-v-8c9554b5]{display:flex;align-items:center;gap:12px;padding:12px}.file-preview[data-v-8c9554b5]{width:56px;height:56px;border-radius:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0;background:#f1f5f9;color:#64748b}.file-preview.image[data-v-8c9554b5]{background:#faf5ff;color:#7c3aed;padding:0;overflow:hidden}.file-preview.text[data-v-8c9554b5]{background:#eff6ff;color:#3b82f6}.file-preview.json[data-v-8c9554b5]{background:#fff7ed;color:#ea580c}.image-preview[data-v-8c9554b5]{width:100%;height:100%;object-fit:cover;cursor:pointer;transition:transform .2s ease}.image-preview[data-v-8c9554b5]:hover{transform:scale(1.05)}.file-info[data-v-8c9554b5]{flex:1;min-width:0}.file-name[data-v-8c9554b5]{font-weight:600;color:var(--qv-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-bottom:4px}.file-meta[data-v-8c9554b5]{display:flex;align-items:center;gap:8px;margin-bottom:4px}.file-size[data-v-8c9554b5]{color:var(--qv-text-subtle);font-size:12px}.file-url[data-v-8c9554b5]{color:var(--qv-text-muted);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-actions[data-v-8c9554b5]{display:flex;gap:4px;flex-shrink:0}.file-content-preview[data-v-8c9554b5]{border-top:1px solid var(--qv-border);background:var(--qv-bg-hover)}.content-header[data-v-8c9554b5]{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;font-size:12px;font-weight:500;color:var(--qv-text-muted);border-bottom:1px solid var(--qv-border)}.content-body[data-v-8c9554b5]{margin:0;padding:12px;font-size:12px;max-height:200px;overflow:auto;white-space:pre-wrap;word-break:break-word}.image-dialog[data-v-8c9554b5]{max-width:90vw;max-height:90vh}.full-image[data-v-8c9554b5]{max-width:100%;max-height:70vh;object-fit:contain}.qv-error-object[data-v-3f124526]{border:1px solid #fecaca;border-radius:8px;background:#fef2f2;overflow:hidden}.error-header[data-v-3f124526]{display:flex;align-items:flex-start;gap:10px;padding:12px}.error-message[data-v-3f124526]{color:#991b1b;font-weight:500;line-height:1.4;flex:1}.error-code[data-v-3f124526]{padding:0 12px 12px;font-size:12px;color:#7f1d1d}.stack-header[data-v-3f124526],.details-header[data-v-3f124526]{font-size:12px;color:#991b1b;background:#fee2e2;padding:8px 12px!important;min-height:auto!important}.stack-trace[data-v-3f124526]{margin:0;padding:12px;font-size:11px;background:#fff5f5;color:#7f1d1d;white-space:pre-wrap;word-break:break-all;max-height:200px;overflow:auto}.error-details[data-v-3f124526]{padding:12px;background:#fff5f5}.qv-error-object.is-highlighted[data-v-3f124526]{animation:highlight-pulse-3f124526 2s ease-out}@keyframes highlight-pulse-3f124526{0%{background-color:#6366f14d}50%{background-color:#6366f126}to{background-color:#fef2f2}}.quickview[data-v-2a61925b]{position:relative;display:flex;flex-direction:column;min-height:100px}.qv-toolbar[data-v-2a61925b]{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border-bottom:1px solid var(--qv-border);background:var(--qv-bg-hover);gap:8px 12px;flex-wrap:wrap}.toolbar-left[data-v-2a61925b]{display:flex;align-items:center;gap:8px;flex:1 1 200px;min-width:120px}.toolbar-right[data-v-2a61925b]{display:flex;align-items:center;gap:4px;flex-shrink:0}.search-container[data-v-2a61925b]{position:relative;flex:1;min-width:120px}.search-input[data-v-2a61925b]{width:100%}.search-input [data-v-2a61925b] .q-field__control{height:32px}.qv-content[data-v-2a61925b]{flex:1;overflow:auto;padding:12px}.search-results[data-v-2a61925b]{position:absolute;top:100%;left:0;width:350px;max-height:320px;background:#fff;border:1px solid var(--qv-border);border-radius:8px;box-shadow:0 4px 20px #00000026;z-index:1000;overflow:hidden;margin-top:4px}.search-results-header[data-v-2a61925b]{padding:8px 12px;font-size:12px;color:var(--qv-text-muted);background:var(--qv-bg-hover);border-bottom:1px solid var(--qv-border);display:flex;align-items:center;gap:8px}.results-note[data-v-2a61925b]{color:var(--qv-text-subtle);font-size:11px}.search-results-list[data-v-2a61925b]{max-height:270px;overflow:auto}.search-result-item[data-v-2a61925b]{display:flex;flex-direction:column;gap:2px;padding:8px 12px;cursor:pointer;border-bottom:1px solid var(--qv-border)}.search-result-item[data-v-2a61925b]:last-child{border-bottom:none}.search-result-item[data-v-2a61925b]:hover,.search-result-item.selected[data-v-2a61925b]{background:var(--qv-bg-selected)}.result-path[data-v-2a61925b]{font-size:12px;color:var(--qv-info);font-weight:500;font-family:var(--qv-mono)}.result-preview[data-v-2a61925b]{font-size:11px;color:var(--qv-text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}