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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c2817082f5751466a6e7bae6f77310304d3b58127a392c1e60341d561b65706a
4
- data.tar.gz: 2c6f4b882f26600890a7a21a241e3a3709fa155df21097ca3c484513cef5e4ba
3
+ metadata.gz: c119b203d422df51dd4ef79c0e28ae59d1a3e8a01536c74baef3931f35481428
4
+ data.tar.gz: fd6e00bacd9f5d5ea9bab4afdff42adb786e1b0d7293f571c71e1e1dacb1d8f6
5
5
  SHA512:
6
- metadata.gz: 4f1ca6699188d725ac053c230043316a96dbdb1fda2cf1c880a48e848ab31c6d4270e19f37f392c10d3205eafb27f529f5443f00fa39d20ec5f7f06dc32daa64
7
- data.tar.gz: 905835a47ca2348e8bd2cd5b5f2bc526a115782fbd3264c61b212e7c61192e87d6dbd1e9193f0d9598c9f4bf28916f410cf8fcee0919f1b747cf8f6119ac0516
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">{{ field.prop.format }}</span>
19
+ <span v-if="field.prop.format" class="field-format-badge">&lt;{{ field.prop.format }}&gt;</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 text-muted">JSON Preview</span>
209
+ <span class="toolbar-label">JSON Preview</span>
210
210
  <div class="toolbar-actions">
211
- <button class="btn btn-ghost btn-sm" @click="expandAllJson">Expand all</button>
212
- <button class="btn btn-ghost btn-sm" @click="collapseAllJson">Collapse all</button>
213
- <button class="btn btn-ghost btn-sm copy-btn-wrap" @click="copyJson">
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(--text-muted);
555
- background: var(--bg-secondary);
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-secondary);
1016
- border: 1px solid var(--border-light);
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-primary);
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(--border-light);
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(--text-muted);
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(--color-primary-dark);
1105
+ color: var(--panel-dark-key);
1083
1106
  }
1084
1107
 
1085
1108
  .json-block :deep(.jv-punct) {
1086
- color: var(--text-muted);
1109
+ color: var(--panel-dark-muted);
1087
1110
  }
1088
1111
 
1089
1112
  .json-block :deep(.jv-string) {
1090
- color: var(--color-green);
1113
+ color: var(--panel-dark-string);
1091
1114
  }
1092
1115
 
1093
1116
  .json-block :deep(.jv-number) {
1094
- color: var(--color-orange);
1117
+ color: var(--panel-dark-number);
1095
1118
  }
1096
1119
 
1097
1120
  .json-block :deep(.jv-boolean) {
1098
- color: var(--color-accent);
1121
+ color: var(--panel-dark-boolean);
1099
1122
  }
1100
1123
 
1101
1124
  .json-block :deep(.jv-null) {
1102
- color: var(--text-muted);
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(--color-primary);
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: var(--bg-hover);
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);
@@ -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
  }
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Lutaml
4
4
  module Jsonschema
5
- VERSION = "0.1.10"
5
+ VERSION = "0.1.11"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lutaml-jsonschema
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.10
4
+ version: 0.1.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.