rapidoc 9.3.2 โ†’ 9.3.4

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 (47) hide show
  1. package/.github/workflow/words.yaml +22 -0
  2. package/dist/index.html +1 -1
  3. package/dist/index.html.gz +0 -0
  4. package/dist/rapidoc-min.js +857 -738
  5. package/dist/rapidoc-min.js.LICENSE.txt +9 -10
  6. package/dist/rapidoc-min.js.LICENSE.txt.gz +0 -0
  7. package/dist/rapidoc-min.js.gz +0 -0
  8. package/dist/rapidoc-min.js.map +1 -1
  9. package/dist/rapidoc-min.js.map.gz +0 -0
  10. package/dist/rapidoc.js +9341 -25092
  11. package/dist/report.html +5 -4
  12. package/index.html +2 -3
  13. package/package.json +20 -19
  14. package/src/components/api-request.js +344 -154
  15. package/src/components/api-response.js +16 -12
  16. package/src/components/json-tree.js +17 -12
  17. package/src/components/schema-table.js +50 -42
  18. package/src/components/schema-tree.js +56 -53
  19. package/src/components/tag-input.js +7 -4
  20. package/src/json-schema-viewer.js +1 -2
  21. package/src/rapidoc-mini.js +1 -3
  22. package/src/rapidoc.js +112 -45
  23. package/src/styles/endpoint-styles.js +1 -1
  24. package/src/styles/font-styles.js +1 -1
  25. package/src/styles/info-styles.js +2 -1
  26. package/src/styles/input-styles.js +2 -16
  27. package/src/styles/nav-styles.js +57 -10
  28. package/src/styles/schema-styles.js +27 -15
  29. package/src/styles/tab-styles.js +1 -0
  30. package/src/templates/callback-template.js +6 -7
  31. package/src/templates/code-samples-template.js +1 -0
  32. package/src/templates/components-template.js +3 -5
  33. package/src/templates/endpoint-template.js +41 -27
  34. package/src/templates/expanded-endpoint-template.js +63 -13
  35. package/src/templates/focused-endpoint-template.js +4 -1
  36. package/src/templates/header-template.js +2 -2
  37. package/src/templates/json-schema-viewer-template.js +2 -1
  38. package/src/templates/main-body-template.js +19 -18
  39. package/src/templates/navbar-template.js +98 -81
  40. package/src/templates/overview-template.js +1 -1
  41. package/src/templates/security-scheme-template.js +48 -25
  42. package/src/templates/server-template.js +1 -1
  43. package/src/utils/common-utils.js +2 -5
  44. package/src/utils/schema-utils.js +208 -83
  45. package/src/utils/spec-parser.js +1 -0
  46. package/src/utils/theme.js +11 -5
  47. package/webpack.config.js +2 -1
@@ -9,6 +9,7 @@ import InputStyles from '~/styles/input-styles';
9
9
  import TabStyles from '~/styles/tab-styles';
10
10
  import BorderStyles from '~/styles/border-styles';
11
11
  import CustomStyles from '~/styles/custom-styles';
12
+ import '~/components/json-tree';
12
13
  import '~/components/schema-tree';
13
14
  import '~/components/schema-table';
14
15
 
@@ -24,6 +25,7 @@ export default class ApiResponse extends LitElement {
24
25
  static get properties() {
25
26
  return {
26
27
  callback: { type: String },
28
+ webhook: { type: String },
27
29
  responses: { type: Object },
28
30
  parser: { type: Object },
29
31
  schemaStyle: { type: String, attribute: 'schema-style' },
@@ -48,6 +50,8 @@ export default class ApiResponse extends LitElement {
48
50
  InputStyles,
49
51
  BorderStyles,
50
52
  css`
53
+ :where(button, input[type="checkbox"], [tabindex="0"]):focus-visible { box-shadow: var(--focus-shadow); }
54
+ :where(input[type="text"], input[type="password"], select, textarea):focus-visible { border-color: var(--primary-color); }
51
55
  .resp-head{
52
56
  vertical-align: middle;
53
57
  padding:16px 0 8px;
@@ -119,8 +123,8 @@ export default class ApiResponse extends LitElement {
119
123
  mimeResp,
120
124
  mimeRespObj.examples,
121
125
  mimeRespObj.example,
122
- !(this.schemaHideReadOnly && (this.schemaHideReadOnly.includes(this.method) || this.schemaHideReadOnly === 'true')),
123
- !(this.schemaHideWriteOnly && (this.schemaHideWriteOnly.includes(this.method) || this.schemaHideWriteOnly === 'true')),
126
+ this.callback === 'true' || this.webhook === 'true' ? false : true, // eslint-disable-line no-unneeded-ternary
127
+ this.callback === 'true' || this.webhook === 'true' ? true : false, // eslint-disable-line no-unneeded-ternary
124
128
  mimeResp.includes('json') ? 'json' : 'text',
125
129
  );
126
130
  allMimeResp[mimeResp] = {
@@ -206,20 +210,20 @@ export default class ApiResponse extends LitElement {
206
210
  responseHeaderListTemplate(respHeaders) {
207
211
  return html`
208
212
  <div style="padding:16px 0 8px 0" class="resp-headers small-font-size bold-text">RESPONSE HEADERS</div>
209
- <table style="border-collapse: collapse; margin-bottom:16px; border:1px solid var(--border-color); border-radius: var(--border-radius)" class="small-font-size mono-font">
213
+ <table role="presentation" style="border-collapse: collapse; margin-bottom:16px; border:1px solid var(--border-color); border-radius: var(--border-radius)" class="small-font-size mono-font">
210
214
  ${respHeaders.map((v) => html`
211
215
  <tr>
212
216
  <td style="padding:8px; vertical-align: baseline; min-width:120px; border-top: 1px solid var(--light-border-color); text-overflow: ellipsis;">
213
217
  ${v.name || ''}
214
218
  </td>
215
219
  <td style="padding:4px; vertical-align: baseline; padding:0 5px; border-top: 1px solid var(--light-border-color); text-overflow: ellipsis;">
216
- ${v.schema.type || ''}
220
+ ${v.schema?.type || ''}
217
221
  </td>
218
222
  <td style="padding:8px; vertical-align: baseline; border-top: 1px solid var(--light-border-color);text-overflow: ellipsis;">
219
223
  <div class="m-markdown-small regular-font" >${unsafeHTML(marked(v.description || ''))}</div>
220
224
  </td>
221
225
  <td style="padding:8px; vertical-align: baseline; border-top: 1px solid var(--light-border-color); text-overflow: ellipsis;">
222
- ${v.schema.example || ''}
226
+ ${v.schema?.example || ''}
223
227
  </td>
224
228
  </tr>
225
229
  `)}
@@ -228,7 +232,7 @@ export default class ApiResponse extends LitElement {
228
232
 
229
233
  mimeTypeDropdownTemplate(mimeTypes) {
230
234
  return html`
231
- <select @change="${(e) => { this.selectedMimeType = e.target.value; }}" style='margin-bottom: -1px; z-index:1'>
235
+ <select aria-label='mime types' @change="${(e) => { this.selectedMimeType = e.target.value; }}" style='margin-bottom: -1px; z-index:1'>
232
236
  ${mimeTypes.map((mimeType) => html`<option value='${mimeType}' ?selected = '${mimeType === this.selectedMimeType}'> ${mimeType} </option>`)}
233
237
  </select>`;
234
238
  }
@@ -269,7 +273,7 @@ export default class ApiResponse extends LitElement {
269
273
  }`
270
274
  : html`
271
275
  <span class = 'example-panel ${this.renderStyle === 'read' ? 'border pad-8-16' : 'border-top pad-top-8'}'>
272
- <select style="min-width:100px; max-width:100%" @change='${(e) => this.onSelectExample(e)}'>
276
+ <select aria-label='response examples' style="min-width:100px; max-width:100%" @change='${(e) => this.onSelectExample(e)}'>
273
277
  ${mimeRespDetails.examples.map((v) => html`<option value="${v.exampleId}" ?selected=${v.exampleId === mimeRespDetails.selectedExample} >
274
278
  ${v.exampleSummary.length > 80 ? v.exampleId : v.exampleSummary}
275
279
  </option>`)}
@@ -305,23 +309,23 @@ export default class ApiResponse extends LitElement {
305
309
  ${this.schemaStyle === 'table'
306
310
  ? html`
307
311
  <schema-table
308
- render-style = "${this.renderStyle}"
309
312
  .data = "${mimeRespDetails.schemaTree}"
310
313
  schema-expand-level = "${this.schemaExpandLevel}"
311
314
  schema-description-expanded = "${this.schemaDescriptionExpanded}"
312
- allow-schema-description-expand-toggle = "${this.allowSchemaDescriptionExpandToggle}",
315
+ allow-schema-description-expand-toggle = "${this.allowSchemaDescriptionExpandToggle}"
313
316
  schema-hide-read-only = "${this.schemaHideReadOnly}"
314
317
  schema-hide-write-only = "${this.schemaHideWriteOnly}"
315
- > </schema-tree> `
318
+ exportparts = "schema-description:schema-description, schema-multiline-toggle:schema-multiline-toggle"
319
+ > </schema-table> `
316
320
  : html`
317
321
  <schema-tree
318
- render-style = "${this.renderStyle}"
319
322
  .data = '${mimeRespDetails.schemaTree}'
320
323
  schema-expand-level = "${this.schemaExpandLevel}"
321
324
  schema-description-expanded = "${this.schemaDescriptionExpanded}"
322
- allow-schema-description-expand-toggle = "${this.allowSchemaDescriptionExpandToggle}",
325
+ allow-schema-description-expand-toggle = "${this.allowSchemaDescriptionExpandToggle}"
323
326
  schema-hide-read-only = "${this.schemaHideReadOnly}"
324
327
  schema-hide-write-only = "${this.schemaHideWriteOnly}"
328
+ exportparts = "schema-description:schema-description, schema-multiline-toggle:schema-multiline-toggle"
325
329
  > </schema-tree>`
326
330
  }`;
327
331
  }
@@ -22,6 +22,8 @@ export default class JsonTree extends LitElement {
22
22
  :host{
23
23
  display:flex;
24
24
  }
25
+ :where(button, input[type="checkbox"], [tabindex="0"]):focus-visible { box-shadow: var(--focus-shadow); }
26
+ :where(input[type="text"], input[type="password"], select, textarea):focus-visible { border-color: var(--primary-color); }
25
27
  .json-tree {
26
28
  position: relative;
27
29
  font-family: var(--font-mono);
@@ -31,6 +33,7 @@ export default class JsonTree extends LitElement {
31
33
  word-break: break-all;
32
34
  flex:1;
33
35
  line-height: calc(var(--font-size-small) + 6px);
36
+ min-height: 40px;
34
37
  direction: ltr;
35
38
  text-align: left;
36
39
  }
@@ -58,8 +61,9 @@ export default class JsonTree extends LitElement {
58
61
  .open-bracket.expanded:hover ~ .close-bracket {
59
62
  color:var(--primary-color);
60
63
  }
61
- .inside-bracket{
64
+ .inside-bracket {
62
65
  padding-left:12px;
66
+ overflow: hidden;
63
67
  border-left:1px dotted var(--border-color);
64
68
  }
65
69
  .open-bracket.collapsed + .inside-bracket,
@@ -87,11 +91,11 @@ export default class JsonTree extends LitElement {
87
91
  /* eslint-disable indent */
88
92
  render() {
89
93
  return html`
90
- <div class = "json-tree" >
94
+ <div class = "json-tree" @click='${(e) => { if (e.target.classList.contains('btn-copy')) { copyToClipboard(JSON.stringify(this.data, null, 2), e); } else { this.toggleExpand(e); } }}'>
91
95
  <div class='toolbar'>
92
- <button class="toolbar-btn" part="btn btn-fill btn-copy" @click='${(e) => { copyToClipboard(JSON.stringify(this.data, null, 2), e); }}'> Copy </button>
96
+ <button class="toolbar-btn btn-copy" part="btn btn-fill btn-copy"> Copy </button>
93
97
  </div>
94
- ${this.generateTree(this.data, true)}
98
+ ${this.generateTree(this.data, true)}
95
99
  </div>
96
100
  `;
97
101
  }
@@ -106,7 +110,7 @@ export default class JsonTree extends LitElement {
106
110
  return html`${(Array.isArray(data) ? '[ ],' : '{ },')}`;
107
111
  }
108
112
  return html`
109
- <div class="open-bracket expanded ${detailType === 'array' ? 'array' : 'object'} " @click="${this.toggleExpand}" > ${detailType === 'array' ? '[' : '{'}</div>
113
+ <div class="open-bracket expanded ${detailType === 'array' ? 'array' : 'object'}" > ${detailType === 'array' ? '[' : '{'}</div>
110
114
  <div class="inside-bracket">
111
115
  ${Object.keys(data).map((key, i, a) => html`
112
116
  <div class="item">
@@ -118,7 +122,6 @@ export default class JsonTree extends LitElement {
118
122
  <div class="close-bracket">${detailType === 'array' ? ']' : '}'}${isLast ? '' : ','}</div>
119
123
  `;
120
124
  }
121
-
122
125
  return (typeof data === 'string' || data instanceof Date)
123
126
  ? html`<span class="${typeof data}">"${data}"</span>${isLast ? '' : ','}`
124
127
  : html`<span class="${typeof data}">${data}</span>${isLast ? '' : ','}`;
@@ -127,12 +130,14 @@ export default class JsonTree extends LitElement {
127
130
 
128
131
  toggleExpand(e) {
129
132
  const openBracketEl = e.target;
130
- if (openBracketEl.classList.contains('expanded')) {
131
- openBracketEl.classList.replace('expanded', 'collapsed');
132
- e.target.innerHTML = e.target.classList.contains('array') ? '[...]' : '{...}';
133
- } else {
134
- openBracketEl.classList.replace('collapsed', 'expanded');
135
- e.target.innerHTML = e.target.classList.contains('array') ? '[' : '{';
133
+ if (e.target.classList.contains('open-bracket')) {
134
+ if (openBracketEl.classList.contains('expanded')) {
135
+ openBracketEl.classList.replace('expanded', 'collapsed');
136
+ e.target.innerHTML = e.target.classList.contains('array') ? '[...]' : '{...}';
137
+ } else {
138
+ openBracketEl.classList.replace('collapsed', 'expanded');
139
+ e.target.innerHTML = e.target.classList.contains('array') ? '[' : '{';
140
+ }
136
141
  }
137
142
  }
138
143
  }
@@ -46,6 +46,9 @@ export default class SchemaTable extends LitElement {
46
46
  .table .key {
47
47
  width: 240px;
48
48
  }
49
+ .key .key-label {
50
+ font-size: var(--font-size-mono);
51
+ }
49
52
  .key.deprecated .key-label {
50
53
  color: var(--red);
51
54
  }
@@ -54,8 +57,8 @@ export default class SchemaTable extends LitElement {
54
57
  white-space: normal;
55
58
  width: 150px;
56
59
  }
57
- .collapsed-descr .tr {
58
- max-height: calc(var(--font-size-small) + var(--font-size-small) + 4px);
60
+ .collapsed-all-descr .tr:not(.expanded-descr) {
61
+ max-height: calc(var(--font-size-small) + var(--font-size-small));
59
62
  }
60
63
 
61
64
  .obj-toggle {
@@ -86,23 +89,20 @@ export default class SchemaTable extends LitElement {
86
89
  /* eslint-disable indent */
87
90
  render() {
88
91
  return html`
89
- <div class="table ${this.schemaDescriptionExpanded === 'true' ? 'expanded-descr' : 'collapsed-descr'}">
92
+ <div class="table ${this.schemaDescriptionExpanded === 'true' ? 'expanded-all-descr' : 'collapsed-all-descr'}" @click="${(e) => this.handleAllEvents(e)}">
90
93
  <div class='toolbar'>
91
94
  <div class="toolbar-item schema-root-type ${this.data?.['::type'] || ''} "> ${this.data?.['::type'] || ''} </div>
92
95
  ${this.allowSchemaDescriptionExpandToggle === 'true'
93
96
  ? html`
94
97
  <div style="flex:1"></div>
95
- <div part="schema-multiline-toggle" class='toolbar-item' @click='${() => { this.schemaDescriptionExpanded = (this.schemaDescriptionExpanded === 'true' ? 'false' : 'true'); }}'>
98
+ <div part="schema-multiline-toggle" class='toolbar-item schema-multiline-toggle' >
96
99
  ${this.schemaDescriptionExpanded === 'true' ? 'Single line description' : 'Multiline description'}
97
100
  </div>
98
101
  `
99
102
  : ''
100
103
  }
101
104
  </div>
102
- ${this.data?.['::description']
103
- ? html`<span part="schema-description" class='m-markdown'> ${unsafeHTML(marked(this.data['::description'] || ''))}</span>`
104
- : ''
105
- }
105
+ <span part="schema-description" class='m-markdown'> ${unsafeHTML(marked(this.data?.['::description'] || ''))} </span>
106
106
  <div style = 'border:1px solid var(--light-border-color)'>
107
107
  <div style='display:flex; background-color: var(--bg2); padding:8px 4px; border-bottom:1px solid var(--light-border-color);'>
108
108
  <div class='key' style='font-family:var(--font-regular); font-weight:bold; color:var(--fg);'> Field </div>
@@ -183,14 +183,14 @@ export default class SchemaTable extends LitElement {
183
183
  if (dataType === 'array') {
184
184
  detailObjType = 'array of object'; // Array of Object
185
185
  } else {
186
- detailObjType = 'object';
186
+ detailObjType = data['::dataTypeLabel'] || data['::type'];
187
187
  }
188
188
  } else if (data['::type'] === 'array') {
189
189
  if (dataType === 'array') {
190
190
  // detailObjType = 'array of array'; // Array of array
191
191
  detailObjType = `array of array ${arrayType !== 'object' ? `of ${arrayType}` : ''}`; // Array of array
192
192
  } else {
193
- detailObjType = 'array';
193
+ detailObjType = data['::dataTypeLabel'] || data['::type'];
194
194
  }
195
195
  }
196
196
 
@@ -202,11 +202,7 @@ export default class SchemaTable extends LitElement {
202
202
  <div class="td key ${data['::deprecated'] ? 'deprecated' : ''}" style='padding-left:${leftPadding}px'>
203
203
  ${(keyLabel || keyDescr)
204
204
  ? html`
205
- <span
206
- class='obj-toggle ${newSchemaLevel < this.schemaExpandLevel ? 'expanded' : 'collapsed'}'
207
- data-obj='${keyLabel}'
208
- @click= ${(e) => this.toggleObjectExpand(e, keyLabel)}
209
- >
205
+ <span class='obj-toggle ${newSchemaLevel < this.schemaExpandLevel ? 'expanded' : 'collapsed'}' data-obj='${keyLabel}'>
210
206
  ${schemaLevel < this.schemaExpandLevel ? '-' : '+'}
211
207
  </span>`
212
208
  : ''
@@ -226,25 +222,24 @@ export default class SchemaTable extends LitElement {
226
222
  <div class='td key-descr m-markdown-small' style='line-height:1.7'>${unsafeHTML(marked(description || ''))}</div>
227
223
  </div>`
228
224
  : html`
229
- ${data['::type'] === 'array' && dataType === 'array'
230
- ? html`
231
- <div class='tr'>
232
- <div class='td key'></div>
233
- <div class='td key-type'>
234
- ${arrayType && arrayType !== 'object' ? `${dataType} of ${arrayType}` : dataType}
235
- </div>
236
- <div class='td key-descr'></div>
237
- </div>`
238
- : ''
239
- }
240
- `
225
+ ${data['::type'] === 'array' && dataType === 'array'
226
+ ? html`
227
+ <div class='tr'>
228
+ <div class='td key'></div>
229
+ <div class='td key-type'>
230
+ ${arrayType && arrayType !== 'object' ? `${dataType} of ${arrayType}` : dataType}
231
+ </div>
232
+ <div class='td key-descr'></div>
233
+ </div>`
234
+ : ''
235
+ }`
241
236
  }
242
237
  <div class='object-body'>
243
238
  ${Array.isArray(data) && data[0]
244
239
  ? html`${this.generateTree(data[0], 'xxx-of-option', '', '::ARRAY~OF', '', newSchemaLevel, newIndentLevel, '')}`
245
240
  : html`
246
241
  ${Object.keys(data).map((dataKey) => html`
247
- ${['::title', '::description', '::type', '::props', '::deprecated', '::array-type', '::readwrite'].includes(dataKey)
242
+ ${['::title', '::description', '::type', '::props', '::deprecated', '::array-type', '::readwrite', '::dataTypeLabel'].includes(dataKey)
248
243
  ? data[dataKey]['::type'] === 'array' || data[dataKey]['::type'] === 'object'
249
244
  ? html`${this.generateTree(
250
245
  data[dataKey]['::type'] === 'array' ? data[dataKey]['::props'] : data[dataKey],
@@ -262,7 +257,7 @@ export default class SchemaTable extends LitElement {
262
257
  data[dataKey]['::type'],
263
258
  data[dataKey]['::array-type'] || '',
264
259
  dataKey,
265
- data[dataKey]['::description'],
260
+ data[dataKey]?.['::description'] || '',
266
261
  newSchemaLevel,
267
262
  newIndentLevel,
268
263
  data[dataKey]['::readwrite'] ? data[dataKey]['::readwrite'] : '',
@@ -276,6 +271,7 @@ export default class SchemaTable extends LitElement {
276
271
  }
277
272
 
278
273
  // For Primitive Data types
274
+ // eslint-disable-next-line no-unused-vars
279
275
  const [type, readOrWriteOnly, constraint, defaultValue, allowedValues, pattern, schemaDescription, schemaTitle, deprecated] = data.split('~|~');
280
276
  if (readOrWriteOnly === '๐Ÿ†' && this.schemaHideReadOnly === 'true') {
281
277
  return;
@@ -284,6 +280,7 @@ export default class SchemaTable extends LitElement {
284
280
  return;
285
281
  }
286
282
  const dataTypeCss = type.replace(/โ”ƒ.*/g, '').replace(/[^a-zA-Z0-9+]/g, '').substring(0, 4).toLowerCase();
283
+ const descrExpander = `${constraint || defaultValue || allowedValues || pattern ? '<span class="descr-expand-toggle">โž”</span>' : ''}`;
287
284
  let dataTypeHtml = '';
288
285
  if (dataType === 'array') {
289
286
  dataTypeHtml = html`
@@ -310,21 +307,18 @@ export default class SchemaTable extends LitElement {
310
307
  }
311
308
  </div>
312
309
  ${dataTypeHtml}
313
- <div class='td key-descr' @click="${() => { this.schemaDescriptionExpanded = 'true'; }}">
314
- ${dataType === 'array' ? html`<span class="m-markdown-small">${unsafeHTML(marked(description))}</span>` : ''}
315
- ${schemaDescription
316
- ? html`<span class="m-markdown-small">
317
- ${unsafeHTML(marked(`${schemaTitle ? `**${schemaTitle}:**` : ''} ${schemaDescription} ${constraint || defaultValue || allowedValues || pattern ? '<span class="more-content">โคต</span>' : ''}`))}
318
- </span>`
319
- : schemaTitle
320
- ? html`${schemaTitle} ${constraint || defaultValue || allowedValues || pattern
321
- ? html`<span class="more-content">โคต</span>`
322
- : ''}`
323
- : ''
310
+ <div class='td key-descr' style='font-size: var(--font-size-small)'>
311
+ ${html`<span class="m-markdown-small">
312
+ ${unsafeHTML(marked(dataType === 'array'
313
+ ? `${descrExpander} ${description}`
314
+ : schemaTitle
315
+ ? `${descrExpander} <b>${schemaTitle}:</b> ${schemaDescription}`
316
+ : `${descrExpander} ${schemaDescription}`))}
317
+ </span>`
324
318
  }
325
- ${constraint ? html`<div style='display:inline-block; line-break:anywhere; margin-right:8px;'> <span class='bold-text'>Constraints: </span> ${constraint}</div>` : ''}
319
+ ${constraint ? html`<div class='' style='display:inline-block; line-break:anywhere; margin-right:8px;'> <span class='bold-text'>Constraints: </span> ${constraint}</div>` : ''}
326
320
  ${defaultValue ? html`<div style='display:inline-block; line-break:anywhere; margin-right:8px;'> <span class='bold-text'>Default: </span>${defaultValue}</div>` : ''}
327
- ${allowedValues ? html`<div style='display:inline-block; line-break:anywhere; margin-right:8px;'> <span class='bold-text'>Allowed: </span>${allowedValues}</div>` : ''}
321
+ ${allowedValues ? html`<div style='display:inline-block; line-break:anywhere; margin-right:8px;'> <span class='bold-text'>${type === 'const' ? 'Value' : 'Allowed'}: </span>${allowedValues}</div>` : ''}
328
322
  ${pattern ? html`<div style='display:inline-block; line-break:anywhere; margin-right:8px;'> <span class='bold-text'>Pattern: </span>${pattern}</div>` : ''}
329
323
  </div>
330
324
  </div>
@@ -332,6 +326,20 @@ export default class SchemaTable extends LitElement {
332
326
  }
333
327
  /* eslint-enable indent */
334
328
 
329
+ handleAllEvents(e) {
330
+ if (e.target.classList.contains('obj-toggle')) {
331
+ this.toggleObjectExpand(e);
332
+ } else if (e.target.classList.contains('schema-multiline-toggle')) {
333
+ this.schemaDescriptionExpanded = (this.schemaDescriptionExpanded === 'true' ? 'false' : 'true');
334
+ } else if (e.target.classList.contains('descr-expand-toggle')) {
335
+ const trEl = e.target.closest('.tr');
336
+ if (trEl) {
337
+ trEl.classList.toggle('expanded-descr');
338
+ trEl.style.maxHeight = trEl.scrollHeight;
339
+ }
340
+ }
341
+ }
342
+
335
343
  toggleObjectExpand(e) {
336
344
  const rowEl = e.target.closest('.tr');
337
345
  if (rowEl.classList.contains('expanded')) {
@@ -41,13 +41,10 @@ export default class SchemaTree extends LitElement {
41
41
  .tree .tr:hover{
42
42
  background-color:var(--hover-color);
43
43
  }
44
- .collapsed-descr .tr {
44
+ .collapsed-all-descr .tr:not(.expanded-descr) {
45
+ overflow: hidden;
45
46
  max-height:calc(var(--font-size-small) + 8px);
46
47
  }
47
- .collapsed-descr .m-markdown-small p {
48
- line-height:calc(var(--font-size-small) + 6px);
49
- }
50
-
51
48
  .tree .key {
52
49
  max-width: 300px;
53
50
  }
@@ -63,7 +60,9 @@ export default class SchemaTree extends LitElement {
63
60
  .tr.expanded:hover + .inside-bracket + .close-bracket {
64
61
  color: var(--primary-color);
65
62
  }
66
-
63
+ .inside-bracket.xxx-of-option {
64
+ border-left: 1px solid transparent;
65
+ }
67
66
  .open-bracket{
68
67
  display:inline-block;
69
68
  padding: 0 20px 0 0;
@@ -82,17 +81,12 @@ export default class SchemaTree extends LitElement {
82
81
  }
83
82
  .tr.collapsed + .inside-bracket,
84
83
  .tr.collapsed + .inside-bracket + .close-bracket{
84
+ overflow: hidden;
85
85
  display:none;
86
86
  }
87
87
  .inside-bracket.object,
88
88
  .inside-bracket.array {
89
89
  border-left: 1px dotted var(--border-color);
90
- }
91
- .inside-bracket.xxx-of {
92
- padding:5px 0px;
93
- border-style: dotted;
94
- border-width: 0 0 1px 0;
95
- border-color:var(--primary-color);
96
90
  }`,
97
91
  CustomStyles,
98
92
  ];
@@ -101,23 +95,19 @@ export default class SchemaTree extends LitElement {
101
95
  /* eslint-disable indent */
102
96
  render() {
103
97
  return html`
104
- <div class="tree ${this.schemaDescriptionExpanded === 'true' ? 'expanded-descr' : 'collapsed-descr'}">
98
+ <div class="tree ${this.schemaDescriptionExpanded === 'true' ? 'expanded-all-descr' : 'collapsed-all-descr'}" @click="${(e) => this.handleAllEvents(e)}">
105
99
  <div class="toolbar">
106
100
  <div class="toolbar-item schema-root-type ${this.data?.['::type'] || ''} "> ${this.data?.['::type'] || ''} </div>
107
101
  ${this.allowSchemaDescriptionExpandToggle === 'true'
108
102
  ? html`
109
103
  <div style="flex:1"></div>
110
- <div part="schema-toolbar-item schema-multiline-toggle" class='toolbar-item' @click='${() => { this.schemaDescriptionExpanded = (this.schemaDescriptionExpanded === 'true' ? 'false' : 'true'); }}'>
104
+ <div part="schema-toolbar-item schema-multiline-toggle" class='toolbar-item schema-multiline-toggle'>
111
105
  ${this.schemaDescriptionExpanded === 'true' ? 'Single line description' : 'Multiline description'}
112
- </div>
113
- `
106
+ </div>`
114
107
  : ''
115
108
  }
116
109
  </div>
117
- ${this.data?.['::description']
118
- ? html`<span part="schema-description" class='m-markdown'> ${unsafeHTML(marked(this.data['::description'] || ''))}</span>`
119
- : ''
120
- }
110
+ <span part="schema-description" class='m-markdown'> ${unsafeHTML(marked(this.data?.['::description'] || ''))}</span>
121
111
  ${this.data
122
112
  ? html`
123
113
  ${this.generateTree(
@@ -138,7 +128,7 @@ export default class SchemaTree extends LitElement {
138
128
  return;
139
129
  }
140
130
  }
141
- if (data && data['::readwrite'] === 'readonly') {
131
+ if (data?.['::readwrite'] === 'readonly') {
142
132
  return;
143
133
  }
144
134
  }
@@ -148,7 +138,7 @@ export default class SchemaTree extends LitElement {
148
138
  return;
149
139
  }
150
140
  }
151
- if (data && data['::readwrite'] === 'writeonly') {
141
+ if (data?.['::readwrite'] === 'writeonly') {
152
142
  return;
153
143
  }
154
144
  }
@@ -174,8 +164,7 @@ export default class SchemaTree extends LitElement {
174
164
  keyLabel = key.replace('::', '').replace('~', ' ');
175
165
  } else if (key.startsWith('::OPTION')) {
176
166
  const parts = key.split('~');
177
- keyLabel = parts[1]; // eslint-disable-line prefer-destructuring
178
- keyDescr = parts[2]; // eslint-disable-line prefer-destructuring
167
+ [, keyLabel, keyDescr] = parts;
179
168
  } else {
180
169
  keyLabel = key;
181
170
  }
@@ -190,16 +179,16 @@ export default class SchemaTree extends LitElement {
190
179
  if (data['::type'] === 'object') {
191
180
  if (dataType === 'array') {
192
181
  if (schemaLevel < this.schemaExpandLevel) {
193
- openBracket = html`<span class="open-bracket array-of-object" @click="${this.toggleObjectExpand}">[{</span>`;
182
+ openBracket = html`<span class="open-bracket array-of-object" >[{</span>`;
194
183
  } else {
195
- openBracket = html`<span class="open-bracket array-of-object" @click="${this.toggleObjectExpand}">[{...}]</span>`;
184
+ openBracket = html`<span class="open-bracket array-of-object">[{...}]</span>`;
196
185
  }
197
186
  closeBracket = '}]';
198
187
  } else {
199
188
  if (schemaLevel < this.schemaExpandLevel) {
200
- openBracket = html`<span class="open-bracket object" @click="${this.toggleObjectExpand}">{</span>`;
189
+ openBracket = html`<span class="open-bracket object">{</span>`;
201
190
  } else {
202
- openBracket = html`<span class="open-bracket object" @click="${this.toggleObjectExpand}">{...}</span>`;
191
+ openBracket = html`<span class="open-bracket object">{...}</span>`;
203
192
  }
204
193
  closeBracket = '}';
205
194
  }
@@ -207,16 +196,16 @@ export default class SchemaTree extends LitElement {
207
196
  if (dataType === 'array') {
208
197
  const arrType = arrayType !== 'object' ? arrayType : '';
209
198
  if (schemaLevel < this.schemaExpandLevel) {
210
- openBracket = html`<span class="open-bracket array-of-array" data-array-type="${arrType}" @click="${this.toggleObjectExpand}">[[ ${arrType} </span>`;
199
+ openBracket = html`<span class="open-bracket array-of-array" data-array-type="${arrType}">[[ ${arrType} </span>`;
211
200
  } else {
212
- openBracket = html`<span class="open-bracket array-of-array" data-array-type="${arrType}" @click="${this.toggleObjectExpand}">[[...]]</span>`;
201
+ openBracket = html`<span class="open-bracket array-of-array" data-array-type="${arrType}">[[...]]</span>`;
213
202
  }
214
203
  closeBracket = ']]';
215
204
  } else {
216
205
  if (schemaLevel < this.schemaExpandLevel) {
217
- openBracket = html`<span class="open-bracket array" @click="${this.toggleObjectExpand}">[</span>`;
206
+ openBracket = html`<span class="open-bracket array">[</span>`;
218
207
  } else {
219
- openBracket = html`<span class="open-bracket array" @click="${this.toggleObjectExpand}">[...]</span>`;
208
+ openBracket = html`<span class="open-bracket array">[...]</span>`;
220
209
  }
221
210
  closeBracket = ']';
222
211
  }
@@ -236,7 +225,6 @@ export default class SchemaTree extends LitElement {
236
225
  </span>`
237
226
  : ''
238
227
  }
239
- ${data['::type'] === 'xxx-of' && dataType === 'array' ? html`<span style="color:var(--primary-color)">ARRAY</span>` : ''}
240
228
  ${openBracket}
241
229
  </div>
242
230
  <div class='td key-descr m-markdown-small'>${unsafeHTML(marked(description || ''))}</div>
@@ -246,7 +234,7 @@ export default class SchemaTree extends LitElement {
246
234
  ? html`${this.generateTree(data[0], 'xxx-of-option', '', '::ARRAY~OF', '', newSchemaLevel, newIndentLevel, data[0]['::readwrite'])}`
247
235
  : html`
248
236
  ${Object.keys(data).map((dataKey) => html`
249
- ${['::title', '::description', '::type', '::props', '::deprecated', '::array-type', '::readwrite'].includes(dataKey)
237
+ ${['::title', '::description', '::type', '::props', '::deprecated', '::array-type', '::readwrite', '::dataTypeLabel'].includes(dataKey)
250
238
  ? data[dataKey]['::type'] === 'array' || data[dataKey]['::type'] === 'object'
251
239
  ? html`${this.generateTree(
252
240
  data[dataKey]['::type'] === 'array' ? data[dataKey]['::props'] : data[dataKey],
@@ -264,7 +252,7 @@ export default class SchemaTree extends LitElement {
264
252
  data[dataKey]['::type'],
265
253
  data[dataKey]['::array-type'] || '',
266
254
  dataKey,
267
- data[dataKey]['::description'],
255
+ data[dataKey]?.['::description'] || '',
268
256
  newSchemaLevel,
269
257
  newIndentLevel,
270
258
  data[dataKey]['::readwrite'] ? data[dataKey]['::readwrite'] : '',
@@ -282,6 +270,7 @@ export default class SchemaTree extends LitElement {
282
270
  }
283
271
 
284
272
  // For Primitive types and array of Primitives
273
+ // eslint-disable-next-line no-unused-vars
285
274
  const [type, primitiveReadOrWrite, constraint, defaultValue, allowedValues, pattern, schemaDescription, schemaTitle, deprecated] = data.split('~|~');
286
275
  if (primitiveReadOrWrite === '๐Ÿ†' && this.schemaHideReadOnly === 'true') {
287
276
  return;
@@ -290,7 +279,7 @@ export default class SchemaTree extends LitElement {
290
279
  return;
291
280
  }
292
281
  const dataTypeCss = type.replace(/โ”ƒ.*/g, '').replace(/[^a-zA-Z0-9+]/g, '').substring(0, 4).toLowerCase();
293
-
282
+ const descrExpander = `${constraint || defaultValue || allowedValues || pattern ? `<span class="descr-expand-toggle ${this.schemaDescriptionExpanded === 'true' ? 'expanded-descr' : ''}">โž”</span>` : ''}`;
294
283
  let finalReadWriteText = '';
295
284
  let finalReadWriteTip = '';
296
285
  if (dataType === 'array') {
@@ -302,12 +291,12 @@ export default class SchemaTree extends LitElement {
302
291
  finalReadWriteTip = 'Write-Only';
303
292
  }
304
293
  } else if (primitiveReadOrWrite === '๐Ÿ†') {
305
- finalReadWriteText = '๐Ÿ†';
306
- finalReadWriteTip = 'Read-Only';
307
- } else if (primitiveReadOrWrite === '๐Ÿ††') {
308
- finalReadWriteText = '๐Ÿ††';
309
- finalReadWriteTip = 'Write-Only';
310
- }
294
+ finalReadWriteText = '๐Ÿ†';
295
+ finalReadWriteTip = 'Read-Only';
296
+ } else if (primitiveReadOrWrite === '๐Ÿ††') {
297
+ finalReadWriteText = '๐Ÿ††';
298
+ finalReadWriteTip = 'Write-Only';
299
+ }
311
300
 
312
301
  return html`
313
302
  <div class = "tr primitive" title="${deprecated ? 'Deprecated' : ''}">
@@ -325,20 +314,20 @@ export default class SchemaTree extends LitElement {
325
314
  </span>
326
315
  </div>
327
316
  <div class='td key-descr'>
328
- ${dataType === 'array' ? html`<span class="m-markdown-small">${unsafeHTML(marked(description))}</span>` : ''}
329
- ${schemaDescription
330
- ? html`<span class="m-markdown-small">
331
- ${unsafeHTML(marked(`${schemaTitle ? `**${schemaTitle}:**` : ''} ${schemaDescription} ${constraint || defaultValue || allowedValues || pattern ? '<span class="more-content">โคต</span>' : ''}`))}
317
+ ${description || schemaTitle || schemaDescription
318
+ ? html`${html`<span class="m-markdown-small">
319
+ ${unsafeHTML(marked(dataType === 'array'
320
+ ? `${descrExpander} ${description}`
321
+ : schemaTitle
322
+ ? `${descrExpander} <b>${schemaTitle}:</b> ${schemaDescription}`
323
+ : `${descrExpander} ${schemaDescription}`))}
332
324
  </span>`
333
- : schemaTitle
334
- ? html`${schemaTitle} ${constraint || defaultValue || allowedValues || pattern
335
- ? html`<span class="more-content">โคต</span>`
336
- : ''}`
337
- : ''
338
- }
325
+ }`
326
+ : ''
327
+ }
339
328
  ${constraint ? html`<div style='display:inline-block; line-break:anywhere; margin-right:8px'><span class='bold-text'>Constraints: </span>${constraint}</div>` : ''}
340
329
  ${defaultValue ? html`<div style='display:inline-block; line-break:anywhere; margin-right:8px'><span class='bold-text'>Default: </span>${defaultValue}</div>` : ''}
341
- ${allowedValues ? html`<div style='display:inline-block; line-break:anywhere; margin-right:8px'><span class='bold-text'>Allowed: </span>${allowedValues}</div>` : ''}
330
+ ${allowedValues ? html`<div style='display:inline-block; line-break:anywhere; margin-right:8px'><span class='bold-text'>${type === 'const' ? 'Value' : 'Allowed'}: </span>${allowedValues}</div>` : ''}
342
331
  ${pattern ? html`<div style='display:inline-block; line-break: anywhere; margin-right:8px'><span class='bold-text'>Pattern: </span>${pattern}</div>` : ''}
343
332
  </div>
344
333
  </div>
@@ -346,6 +335,20 @@ export default class SchemaTree extends LitElement {
346
335
  }
347
336
  /* eslint-enable indent */
348
337
 
338
+ handleAllEvents(e) {
339
+ if (e.target.classList.contains('open-bracket')) {
340
+ this.toggleObjectExpand(e);
341
+ } else if (e.target.classList.contains('schema-multiline-toggle')) {
342
+ this.schemaDescriptionExpanded = (this.schemaDescriptionExpanded === 'true' ? 'false' : 'true');
343
+ } else if (e.target.classList.contains('descr-expand-toggle')) {
344
+ const trEl = e.target.closest('.tr');
345
+ if (trEl) {
346
+ trEl.classList.toggle('expanded-descr');
347
+ trEl.style.maxHeight = trEl.scrollHeight;
348
+ }
349
+ }
350
+ }
351
+
349
352
  toggleObjectExpand(e) {
350
353
  const rowEl = e.target.closest('.tr');
351
354
  if (rowEl.classList.contains('expanded')) {