lutaml-jsonschema 0.1.10 → 0.1.11
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/frontend/src/components/SchemaBuilder.vue +44 -24
- data/frontend/src/style.css +31 -0
- data/frontend/src/views/HomeView.vue +13 -1
- data/lib/lutaml/jsonschema/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c119b203d422df51dd4ef79c0e28ae59d1a3e8a01536c74baef3931f35481428
|
|
4
|
+
data.tar.gz: fd6e00bacd9f5d5ea9bab4afdff42adb786e1b0d7293f571c71e1e1dacb1d8f6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 56edc028665efb3442c0ffe58eb7fe62576c02686cabf184fc2337749c6d460e9a7f817aef2e7737a8cc6b1a2dc1bd61ee0765ae5df558df1fde73e9ac0cc0a3
|
|
7
|
+
data.tar.gz: fed677f3dfb49ad12f056a494e73c2dceee12929f7f15c1753a6aac9d03387bba4ab1aa68c33bdb2ee152af46dd4a0a76898d3466575ad88cf0fdf944af766d1
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
## [Unreleased]
|
|
2
2
|
|
|
3
|
+
## [0.1.11] - 2026-05-09
|
|
4
|
+
|
|
5
|
+
### Redoc-style UX improvements (round 5)
|
|
6
|
+
|
|
7
|
+
- Dark JSON preview panel with themed syntax colors in SchemaBuilder
|
|
8
|
+
- Select-on-click for source viewer and builder JSON blocks (double-click to select all)
|
|
9
|
+
- Print stylesheet: hides sidebar, header, controls; content prints full-width
|
|
10
|
+
- Format badges display with angle brackets (`<email>`) and accent color
|
|
11
|
+
- Responsive builder layout: stacks vertically on mobile (<768px)
|
|
12
|
+
|
|
3
13
|
## [0.1.10] - 2026-05-09
|
|
4
14
|
|
|
5
15
|
### Redoc-style UX improvements
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
<span class="font-mono">{{ field.prop.name }}</span>
|
|
17
17
|
</button>
|
|
18
18
|
<span class="field-type-badge" :class="typeBadgeClass(field.prop)">{{ displayType(field.prop, field.resolvedDef?.title || field.resolvedDef?.name) }}</span>
|
|
19
|
-
<span v-if="field.prop.format" class="field-format-badge"
|
|
19
|
+
<span v-if="field.prop.format" class="field-format-badge"><{{ field.prop.format }}></span>
|
|
20
20
|
<span v-if="field.prop.contentMediaType" class="field-format-badge">content-type: {{ field.prop.contentMediaType }}</span>
|
|
21
21
|
<span v-if="field.prop.contentEncoding" class="field-format-badge">encoding: {{ field.prop.contentEncoding }}</span>
|
|
22
22
|
<span v-if="field.prop.const != null" class="const-badge font-mono">const: {{ field.prop.const }}</span>
|
|
@@ -206,17 +206,17 @@
|
|
|
206
206
|
<div class="builder-preview">
|
|
207
207
|
<div class="preview-inner">
|
|
208
208
|
<div class="preview-toolbar">
|
|
209
|
-
<span class="toolbar-label
|
|
209
|
+
<span class="toolbar-label">JSON Preview</span>
|
|
210
210
|
<div class="toolbar-actions">
|
|
211
|
-
<button class="btn btn-
|
|
212
|
-
<button class="btn btn-
|
|
213
|
-
<button class="btn btn-
|
|
211
|
+
<button class="btn btn-sm btn-dark-panel" @click="expandAllJson">Expand all</button>
|
|
212
|
+
<button class="btn btn-sm btn-dark-panel" @click="collapseAllJson">Collapse all</button>
|
|
213
|
+
<button class="btn btn-sm btn-dark-panel copy-btn-wrap" @click="copyJson">
|
|
214
214
|
Copy
|
|
215
215
|
<span v-if="copied" class="copy-tooltip">Copied!</span>
|
|
216
216
|
</button>
|
|
217
217
|
</div>
|
|
218
218
|
</div>
|
|
219
|
-
<pre ref="jsonBlockRef" class="json-block" @click="handleJsonClick" v-html="highlightedJson"></pre>
|
|
219
|
+
<pre ref="jsonBlockRef" class="json-block" @click="handleJsonClick" @dblclick="selectJsonBlock" v-html="highlightedJson"></pre>
|
|
220
220
|
</div>
|
|
221
221
|
</div>
|
|
222
222
|
</div>
|
|
@@ -391,6 +391,18 @@ function handleJsonClick(event: MouseEvent) {
|
|
|
391
391
|
}
|
|
392
392
|
}
|
|
393
393
|
|
|
394
|
+
function selectJsonBlock() {
|
|
395
|
+
const el = jsonBlockRef.value
|
|
396
|
+
if (!el) return
|
|
397
|
+
const range = document.createRange()
|
|
398
|
+
range.selectNodeContents(el)
|
|
399
|
+
const selection = window.getSelection()
|
|
400
|
+
if (selection) {
|
|
401
|
+
selection.removeAllRanges()
|
|
402
|
+
selection.addRange(range)
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
|
|
394
406
|
const MAX_PATTERN_LEN = 45
|
|
395
407
|
|
|
396
408
|
function typeBadgeClass(prop: SpaProperty): string {
|
|
@@ -551,11 +563,12 @@ async function copyJson() {
|
|
|
551
563
|
|
|
552
564
|
.field-format-badge {
|
|
553
565
|
font-size: 10px;
|
|
554
|
-
color: var(--
|
|
555
|
-
background: var(--
|
|
566
|
+
color: var(--color-accent);
|
|
567
|
+
background: var(--color-accent-alpha);
|
|
556
568
|
padding: 1px 5px;
|
|
557
569
|
border-radius: var(--radius-sm);
|
|
558
570
|
font-family: var(--font-mono);
|
|
571
|
+
font-weight: 500;
|
|
559
572
|
}
|
|
560
573
|
|
|
561
574
|
.deprecated-badge {
|
|
@@ -1000,6 +1013,7 @@ async function copyJson() {
|
|
|
1000
1013
|
display: flex;
|
|
1001
1014
|
align-items: center;
|
|
1002
1015
|
justify-content: space-between;
|
|
1016
|
+
color: var(--panel-dark-muted);
|
|
1003
1017
|
}
|
|
1004
1018
|
|
|
1005
1019
|
.toolbar-label {
|
|
@@ -1011,9 +1025,18 @@ async function copyJson() {
|
|
|
1011
1025
|
padding: var(--space-1) var(--space-2);
|
|
1012
1026
|
}
|
|
1013
1027
|
|
|
1028
|
+
.btn-dark-panel {
|
|
1029
|
+
color: var(--panel-dark-muted);
|
|
1030
|
+
}
|
|
1031
|
+
|
|
1032
|
+
.btn-dark-panel:hover {
|
|
1033
|
+
color: var(--panel-dark-text);
|
|
1034
|
+
background: rgba(255, 255, 255, 0.08);
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1014
1037
|
.json-block {
|
|
1015
|
-
background: var(--bg
|
|
1016
|
-
border: 1px solid var(--
|
|
1038
|
+
background: var(--panel-dark-bg);
|
|
1039
|
+
border: 1px solid var(--panel-dark-bg);
|
|
1017
1040
|
border-radius: var(--radius-md);
|
|
1018
1041
|
padding: var(--space-4);
|
|
1019
1042
|
overflow-x: auto;
|
|
@@ -1023,7 +1046,7 @@ async function copyJson() {
|
|
|
1023
1046
|
max-height: 70vh;
|
|
1024
1047
|
overflow-y: auto;
|
|
1025
1048
|
font-family: var(--font-mono);
|
|
1026
|
-
color: var(--text
|
|
1049
|
+
color: var(--panel-dark-text);
|
|
1027
1050
|
}
|
|
1028
1051
|
|
|
1029
1052
|
.json-block :deep(ul) {
|
|
@@ -1038,7 +1061,7 @@ async function copyJson() {
|
|
|
1038
1061
|
|
|
1039
1062
|
.json-block :deep(.jv-toggle) {
|
|
1040
1063
|
background: none;
|
|
1041
|
-
border: 1px solid var(--
|
|
1064
|
+
border: 1px solid var(--panel-dark-muted);
|
|
1042
1065
|
border-radius: 2px;
|
|
1043
1066
|
cursor: pointer;
|
|
1044
1067
|
width: 14px;
|
|
@@ -1064,7 +1087,7 @@ async function copyJson() {
|
|
|
1064
1087
|
|
|
1065
1088
|
.json-block :deep(.jv-ellipsis) {
|
|
1066
1089
|
display: none;
|
|
1067
|
-
color: var(--
|
|
1090
|
+
color: var(--panel-dark-muted);
|
|
1068
1091
|
font-size: var(--text-xs);
|
|
1069
1092
|
font-style: italic;
|
|
1070
1093
|
margin-left: 4px;
|
|
@@ -1079,43 +1102,40 @@ async function copyJson() {
|
|
|
1079
1102
|
}
|
|
1080
1103
|
|
|
1081
1104
|
.json-block :deep(.jv-key) {
|
|
1082
|
-
color: var(--
|
|
1105
|
+
color: var(--panel-dark-key);
|
|
1083
1106
|
}
|
|
1084
1107
|
|
|
1085
1108
|
.json-block :deep(.jv-punct) {
|
|
1086
|
-
color: var(--
|
|
1109
|
+
color: var(--panel-dark-muted);
|
|
1087
1110
|
}
|
|
1088
1111
|
|
|
1089
1112
|
.json-block :deep(.jv-string) {
|
|
1090
|
-
color: var(--
|
|
1113
|
+
color: var(--panel-dark-string);
|
|
1091
1114
|
}
|
|
1092
1115
|
|
|
1093
1116
|
.json-block :deep(.jv-number) {
|
|
1094
|
-
color: var(--
|
|
1117
|
+
color: var(--panel-dark-number);
|
|
1095
1118
|
}
|
|
1096
1119
|
|
|
1097
1120
|
.json-block :deep(.jv-boolean) {
|
|
1098
|
-
color: var(--
|
|
1121
|
+
color: var(--panel-dark-boolean);
|
|
1099
1122
|
}
|
|
1100
1123
|
|
|
1101
1124
|
.json-block :deep(.jv-null) {
|
|
1102
|
-
color: var(--
|
|
1125
|
+
color: var(--panel-dark-null);
|
|
1103
1126
|
font-style: italic;
|
|
1104
1127
|
}
|
|
1105
1128
|
|
|
1106
1129
|
.json-block :deep(.jv-link) {
|
|
1107
|
-
color: var(--
|
|
1130
|
+
color: var(--panel-dark-string);
|
|
1108
1131
|
text-decoration: underline;
|
|
1109
1132
|
}
|
|
1110
1133
|
|
|
1111
1134
|
.json-block :deep(.jv-row:hover) {
|
|
1112
|
-
background:
|
|
1135
|
+
background: rgba(255, 255, 255, 0.06);
|
|
1113
1136
|
border-radius: 2px;
|
|
1114
1137
|
}
|
|
1115
1138
|
|
|
1116
|
-
:root[data-theme="dark"] .json-block :deep(.jv-key) { color: var(--color-primary-light); }
|
|
1117
|
-
:root[data-theme="dark"] .json-block :deep(.jv-string) { color: var(--color-teal); }
|
|
1118
|
-
|
|
1119
1139
|
.toolbar-actions {
|
|
1120
1140
|
display: flex;
|
|
1121
1141
|
gap: var(--space-1);
|
data/frontend/src/style.css
CHANGED
|
@@ -96,6 +96,15 @@
|
|
|
96
96
|
--type-array-bg: rgba(139, 92, 246, 0.1);
|
|
97
97
|
--type-null: #A8A29E;
|
|
98
98
|
--type-null-bg: rgba(168, 162, 158, 0.1);
|
|
99
|
+
|
|
100
|
+
--panel-dark-bg: #263238;
|
|
101
|
+
--panel-dark-text: #e8edf4;
|
|
102
|
+
--panel-dark-muted: #8b9db5;
|
|
103
|
+
--panel-dark-key: #80cbc4;
|
|
104
|
+
--panel-dark-string: #a5d6a7;
|
|
105
|
+
--panel-dark-number: #ffcc80;
|
|
106
|
+
--panel-dark-boolean: #90caf9;
|
|
107
|
+
--panel-dark-null: #8b9db5;
|
|
99
108
|
}
|
|
100
109
|
|
|
101
110
|
:root[data-theme="dark"] {
|
|
@@ -143,6 +152,15 @@
|
|
|
143
152
|
--type-array-bg: rgba(167, 139, 250, 0.15);
|
|
144
153
|
--type-null: #6b7a8f;
|
|
145
154
|
--type-null-bg: rgba(107, 122, 143, 0.15);
|
|
155
|
+
|
|
156
|
+
--panel-dark-bg: #1e2a35;
|
|
157
|
+
--panel-dark-text: #dce4f0;
|
|
158
|
+
--panel-dark-muted: #7b8fa8;
|
|
159
|
+
--panel-dark-key: #4db6ac;
|
|
160
|
+
--panel-dark-string: #81c784;
|
|
161
|
+
--panel-dark-number: #ffb74d;
|
|
162
|
+
--panel-dark-boolean: #64b5f6;
|
|
163
|
+
--panel-dark-null: #7b8fa8;
|
|
146
164
|
}
|
|
147
165
|
|
|
148
166
|
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
@@ -233,6 +251,19 @@ button { font-family: inherit; font-size: inherit; cursor: pointer; border: none
|
|
|
233
251
|
}
|
|
234
252
|
}
|
|
235
253
|
|
|
254
|
+
@media print {
|
|
255
|
+
.sidebar, .sidebar-overlay, .app-header,
|
|
256
|
+
.view-toggle, .schema-actions,
|
|
257
|
+
.ctrl-expand, .field-check,
|
|
258
|
+
.source-toolbar, .copy-btn-wrap,
|
|
259
|
+
.section-actions { display: none !important; }
|
|
260
|
+
.app-layout { grid-template-columns: 1fr !important; }
|
|
261
|
+
.app-main { padding: 0 !important; max-width: 100% !important; }
|
|
262
|
+
.card, .def-card { break-inside: avoid; box-shadow: none; border: 1px solid #ccc; }
|
|
263
|
+
.field-row { break-inside: avoid; }
|
|
264
|
+
body { color: #000; background: #fff; }
|
|
265
|
+
}
|
|
266
|
+
|
|
236
267
|
.text-muted { color: var(--text-muted); }
|
|
237
268
|
.text-secondary { color: var(--text-secondary); }
|
|
238
269
|
.font-mono { font-family: var(--font-mono); }
|
|
@@ -143,7 +143,7 @@
|
|
|
143
143
|
</div>
|
|
144
144
|
<div class="source-code-wrapper">
|
|
145
145
|
<div class="source-lines" aria-hidden="true"><span v-for="n in sourceLineCount" :key="n">{{ n }}</span></div>
|
|
146
|
-
<pre class="source-pre"><code v-html="highlightedSource"></code></pre>
|
|
146
|
+
<pre class="source-pre" @dblclick="selectSourceBlock"><code v-html="highlightedSource"></code></pre>
|
|
147
147
|
</div>
|
|
148
148
|
</div>
|
|
149
149
|
<div v-else class="source-empty">
|
|
@@ -285,6 +285,18 @@ function syntaxHighlight(json: string): string {
|
|
|
285
285
|
})
|
|
286
286
|
}
|
|
287
287
|
|
|
288
|
+
function selectSourceBlock() {
|
|
289
|
+
const el = document.querySelector('.source-pre') as HTMLElement | null
|
|
290
|
+
if (!el) return
|
|
291
|
+
const range = document.createRange()
|
|
292
|
+
range.selectNodeContents(el)
|
|
293
|
+
const selection = window.getSelection()
|
|
294
|
+
if (selection) {
|
|
295
|
+
selection.removeAllRanges()
|
|
296
|
+
selection.addRange(range)
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
288
300
|
function selectSchema(name: string) {
|
|
289
301
|
schemaStore.selectSchema(name)
|
|
290
302
|
}
|