@pb33f/cowboy-components 0.3.4 → 0.4.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 (96) hide show
  1. package/dist/assets/css.worker-CTSQecos.js +84 -0
  2. package/dist/assets/editor.worker-CYC0jP-p.js +12 -0
  3. package/dist/assets/equalizer.worker-CdIiiqfH.js +1 -0
  4. package/dist/assets/html.worker-C1BIaUKh.js +461 -0
  5. package/dist/assets/json.worker-BCyBlh8h.js +49 -0
  6. package/dist/assets/rule-documentation.worker-B7xOWY5M.js +1 -0
  7. package/dist/components/credit-ticker/credit-ticker.css.d.ts +2 -0
  8. package/dist/components/credit-ticker/credit-ticker.css.js +36 -0
  9. package/dist/components/credit-ticker/credit-ticker.d.ts +14 -0
  10. package/dist/components/credit-ticker/credit-ticker.js +88 -0
  11. package/dist/components/editor/editor-breadcrumb.css.d.ts +2 -0
  12. package/dist/components/editor/editor-breadcrumb.css.js +49 -0
  13. package/dist/components/editor/editor-breadcrumb.d.ts +9 -0
  14. package/dist/components/editor/editor-breadcrumb.js +60 -0
  15. package/dist/components/editor/editor.css.d.ts +2 -0
  16. package/dist/components/editor/editor.css.js +62 -0
  17. package/dist/components/editor/editor.d.ts +25 -4
  18. package/dist/components/editor/editor.js +412 -76
  19. package/dist/components/manage-ruleset/manage-ruleset.css.js +5 -0
  20. package/dist/components/manage-ruleset/manage-ruleset.js +8 -6
  21. package/dist/components/model-icon/model-icon.d.ts +7 -0
  22. package/dist/components/model-icon/model-icon.js +56 -7
  23. package/dist/components/model-renderer/clickable-ref.d.ts +2 -2
  24. package/dist/components/model-renderer/clickable-ref.js +5 -4
  25. package/dist/components/model-renderer/header.js +10 -10
  26. package/dist/components/model-renderer/operation.js +2 -2
  27. package/dist/components/model-renderer/rendered-node.css.js +1 -1
  28. package/dist/components/model-renderer/schema.js +1 -1
  29. package/dist/components/model-tree/tree.css.js +1 -0
  30. package/dist/components/model-tree/tree.d.ts +8 -0
  31. package/dist/components/model-tree/tree.js +232 -24
  32. package/dist/components/paginator/paginator.css.js +6 -2
  33. package/dist/components/paginator/paginator.d.ts +1 -0
  34. package/dist/components/paginator/paginator.js +8 -4
  35. package/dist/components/problem-list/details-drawer.css.js +1 -1
  36. package/dist/components/problem-list/problem-item.js +6 -3
  37. package/dist/components/problem-list/problem-label-view-filter.d.ts +2 -1
  38. package/dist/components/problem-list/problem-label-view-filter.js +1 -0
  39. package/dist/components/problem-list/problem-list.d.ts +1 -0
  40. package/dist/components/problem-list/problem-list.js +19 -1
  41. package/dist/components/problem-list/problem-mainview.css.js +1 -1
  42. package/dist/components/problem-list/problem-mainview.js +6 -0
  43. package/dist/components/problem-list/problem-sort-filter.d.ts +2 -1
  44. package/dist/components/problem-list/problem-sort-filter.js +1 -0
  45. package/dist/components/problems-overview/diagnostic-evaluation.css.js +14 -4
  46. package/dist/components/problems-overview/diagnostic-evaluation.js +42 -1
  47. package/dist/components/problems-overview/problems-overview.css.js +1 -0
  48. package/dist/components/the-doctor/nuke-workspace.d.ts +13 -0
  49. package/dist/components/the-doctor/nuke-workspace.js +70 -0
  50. package/dist/components/the-doctor/sparks.d.ts +1 -0
  51. package/dist/components/the-doctor/sparks.js +11 -2
  52. package/dist/components/the-doctor/status-bar.css.js +6 -5
  53. package/dist/components/the-doctor/the-doctor.css.js +117 -16
  54. package/dist/components/the-doctor/the-doctor.d.ts +70 -21
  55. package/dist/components/the-doctor/the-doctor.js +1026 -169
  56. package/dist/components/the-doctor/upload-archive.css.d.ts +2 -0
  57. package/dist/components/the-doctor/upload-archive.css.js +98 -0
  58. package/dist/components/the-doctor/upload-archive.d.ts +33 -0
  59. package/dist/components/the-doctor/upload-archive.js +281 -0
  60. package/dist/components/visualizer/equalizer.d.ts +3 -1
  61. package/dist/components/visualizer/equalizer.js +55 -31
  62. package/dist/components/visualizer/explorer.js +6 -5
  63. package/dist/cowboy-components.umd.cjs +1846 -1273
  64. package/dist/css/hr.css.d.ts +2 -0
  65. package/dist/css/hr.css.js +12 -0
  66. package/dist/css/pb33f-theme.css +1 -0
  67. package/dist/events/doctor.d.ts +19 -1
  68. package/dist/events/doctor.js +5 -0
  69. package/dist/model/channels.d.ts +1 -0
  70. package/dist/model/channels.js +1 -0
  71. package/dist/model/graph.d.ts +17 -0
  72. package/dist/model/graph.js +17 -1
  73. package/dist/model/link.d.ts +8 -0
  74. package/dist/model/node_type.d.ts +22 -1
  75. package/dist/model/node_type.js +22 -0
  76. package/dist/model/panel-state.d.ts +5 -0
  77. package/dist/model/panel-state.js +1 -0
  78. package/dist/model/problem.d.ts +3 -1
  79. package/dist/model/problem.js +4 -2
  80. package/dist/model/rolodex.d.ts +34 -0
  81. package/dist/model/rolodex.js +1 -0
  82. package/dist/services/linting-service.d.ts +1 -1
  83. package/dist/services/linting-service.js +23 -11
  84. package/dist/services/model-service.d.ts +8 -1
  85. package/dist/services/model-service.js +127 -0
  86. package/dist/style.css +1 -1
  87. package/dist/workers/equalizer.worker.js +4 -3
  88. package/dist/workers/rule-documentation.worker.d.ts +2 -2
  89. package/dist/workers/rule-documentation.worker.js +26 -15
  90. package/package.json +3 -3
  91. package/dist/assets/css.worker-B_qZXUzt.js +0 -84
  92. package/dist/assets/editor.worker-HEmB0D7P.js +0 -11
  93. package/dist/assets/equalizer.worker-icLzyXQ7.js +0 -1
  94. package/dist/assets/html.worker-D3WUrk8Q.js +0 -458
  95. package/dist/assets/json.worker-CAhUaBo4.js +0 -42
  96. package/dist/assets/rule-documentation.worker-D39NS8Lx.js +0 -1
@@ -4,14 +4,12 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { css, html, LitElement } from "lit";
8
- import { customElement, property } from "lit/decorators.js";
7
+ import { html, LitElement } from "lit";
8
+ import { customElement, property, state } from "lit/decorators.js";
9
9
  import { createRef, ref } from "lit/directives/ref.js";
10
10
  // -- Monaco Editor Imports --
11
11
  import * as monaco from "monaco-editor";
12
12
  // @ts-ignore
13
- import styles from "monaco-editor/min/vs/editor/editor.main.css?inline";
14
- // @ts-ignore
15
13
  import editorWorker from "monaco-editor/esm/vs/editor/editor.worker.js?worker";
16
14
  // @ts-ignore
17
15
  import htmlWorker from "monaco-editor/esm/vs/language/html/html.worker.js?worker";
@@ -19,7 +17,9 @@ import htmlWorker from "monaco-editor/esm/vs/language/html/html.worker.js?worker
19
17
  import cssWorker from "monaco-editor/esm/vs/language/css/css.worker.js?worker";
20
18
  // @ts-ignore
21
19
  import jsonWorker from "monaco-editor/esm/vs/language/json/json.worker.js?worker";
22
- import { EditorClicked, EditorUpdated } from "../../events/doctor.js";
20
+ import { DocumentReferenceClicked, EditorClicked, EditorUpdated } from "../../events/doctor.js";
21
+ import { SpecEditorBreadcrumb } from "./editor-breadcrumb.js";
22
+ import editorCss from "./editor.css.js";
23
23
  // @ts-ignore
24
24
  self.MonacoEnvironment = {
25
25
  getWorker(_, label) {
@@ -35,18 +35,202 @@ self.MonacoEnvironment = {
35
35
  return new editorWorker();
36
36
  },
37
37
  };
38
+ const editorGreen = '#00FF00FF';
39
+ const editorGreenDim = '#008a00';
40
+ const editorRed = '#ff3c74';
41
+ const editorBrown = '#004f0d';
42
+ const editorBlue = '#62C4FFFF';
43
+ const editorPink = '#E400FB';
44
+ const Alive = 'pb33f';
45
+ const Dead = 'dead';
46
+ function generatePb33fTheme() {
47
+ return {
48
+ base: 'vs-dark',
49
+ renderSideBySide: false,
50
+ inherit: true,
51
+ rules: [
52
+ {
53
+ "foreground": "E400FB",
54
+ "token": "string"
55
+ },
56
+ {
57
+ "foreground": "fddb00",
58
+ "token": "number"
59
+ },
60
+ {
61
+ "foreground": "62C4FF",
62
+ "token": "type"
63
+ },
64
+ {
65
+ "foreground": "fddb00",
66
+ "token": "keyword"
67
+ },
68
+ { token: 'constant', foreground: 'ff0000' },
69
+ {
70
+ "foreground": "787878",
71
+ "token": "comment",
72
+ "fontStyle": "italic"
73
+ },
74
+ {
75
+ "foreground": "787878",
76
+ "token": "delimiter.curly",
77
+ },
78
+ {
79
+ "foreground": "787878",
80
+ "token": "delimiter.parenthesis",
81
+ },
82
+ {
83
+ "foreground": "787878",
84
+ "token": "delimiter.square",
85
+ },
86
+ ],
87
+ colors: {
88
+ 'editor.foreground': editorBlue,
89
+ 'editor.background': '#0d1117',
90
+ 'editorCursor.foreground': editorBlue,
91
+ 'editor.lineHighlightBackground': '#E400FB30',
92
+ 'editorLineNumber.foreground': '#6368747F',
93
+ 'editorLineNumber.activeForeground': editorPink,
94
+ 'editor.inactiveSelectionBackground': '#FF3C742D',
95
+ 'diffEditor.removedTextBackground': '#FF3C741A',
96
+ 'diffEditor.insertedTextBackground': '#62C4FF1A',
97
+ 'editorLink.activeForeground': editorRed,
98
+ 'editorHoverWidget.background': '#0d1117',
99
+ 'editorHoverWidget.border': editorPink,
100
+ 'peekView.border': editorRed,
101
+ 'editorStickyScroll.border': '#F83AFF72', // Red bottom border
102
+ 'editorBracketMatch.border': editorGreen, // Green border for matching brackets
103
+ 'editorBracketMatch.background': '#004400',
104
+ 'editorBracketHighlight.foreground1': editorGreen, // Red for the first pair
105
+ 'editorBracketHighlight.foreground2': editorGreen, // Green for the second pair
106
+ 'editorBracketHighlight.foreground3': editorGreen, // Green for the second pair
107
+ 'editorBracketHighlight.foreground4': editorGreen, // Green for the second pair
108
+ }
109
+ };
110
+ }
111
+ function generateDeadTheme() {
112
+ return {
113
+ base: 'vs-dark',
114
+ renderSideBySide: false,
115
+ inherit: true,
116
+ rules: [
117
+ {
118
+ "foreground": "9A6D9A", // Muted purple for strings
119
+ "token": "string"
120
+ },
121
+ {
122
+ "foreground": "D3A300", // Muted gold for numbers
123
+ "token": "number"
124
+ },
125
+ {
126
+ "foreground": "75A9C6", // Muted blue for types
127
+ "token": "type"
128
+ },
129
+ {
130
+ "foreground": "D3A300", // Muted gold for keywords
131
+ "token": "keyword"
132
+ },
133
+ {
134
+ "token": "constant",
135
+ "foreground": "A66161" // Muted red for constants
136
+ },
137
+ {
138
+ "foreground": "8A8A8A", // Gray with slight vibrance for comments
139
+ "token": "comment",
140
+ "fontStyle": "italic"
141
+ },
142
+ {
143
+ "foreground": "8A8A8A", // Gray for curly braces
144
+ "token": "delimiter.curly",
145
+ },
146
+ {
147
+ "foreground": "8A8A8A", // Gray for parentheses
148
+ "token": "delimiter.parenthesis",
149
+ },
150
+ {
151
+ "foreground": "8A8A8A", // Gray for square brackets
152
+ "token": "delimiter.square",
153
+ },
154
+ ],
155
+ colors: {
156
+ 'editor.foreground': '#909090', // Slightly muted text
157
+ 'editor.background': '#0d1117', // Keeps the dark background
158
+ 'editorCursor.foreground': '#A8A8A8', // Subtle but noticeable cursor
159
+ 'editor.lineHighlightBackground': '#2A2A2A', // Subtle line highlight
160
+ 'editorLineNumber.foreground': '#5A5A5A', // Dimmed but distinguishable line numbers
161
+ 'editorLineNumber.activeForeground': '#858585', // Slightly brighter active line number
162
+ 'editor.inactiveSelectionBackground': '#464646', // Subtle selection background
163
+ 'diffEditor.removedTextBackground': '#9A2B2B1A', // Muted red for removed text
164
+ 'diffEditor.insertedTextBackground': '#2B9A6B1A', // Muted green for inserted text
165
+ 'editorLink.activeForeground': '#7D7D7D', // Subtle color for active links
166
+ 'editorHoverWidget.background': '#191919', // Slightly lighter hover widget background
167
+ 'editorHoverWidget.border': '#6F6F6F', // Subtle border for hover widget
168
+ 'peekView.border': '#5F5F5F', // Subtle border for peek view
169
+ 'editorStickyScroll.border': '#707070', // Slightly noticeable border
170
+ 'editorBracketMatch.border': '#4D4D4D', // Slightly brighter gray for matching brackets
171
+ 'editorBracketMatch.background': '#292929', // Slightly brighter background for matching brackets
172
+ 'editorBracketHighlight.foreground1': '#857B85', // Muted tones for brackets
173
+ 'editorBracketHighlight.foreground2': '#768A76',
174
+ 'editorBracketHighlight.foreground3': '#798A79',
175
+ 'editorBracketHighlight.foreground4': '#858A85',
176
+ }
177
+ };
178
+ }
179
+ let monacoConfigured = false;
180
+ function setupMonaco() {
181
+ if (!monacoConfigured) {
182
+ const options = generatePb33fTheme();
183
+ const deadOptions = generateDeadTheme();
184
+ // @ts-ignore
185
+ monaco.editor.defineTheme(Dead, deadOptions);
186
+ // @ts-ignore
187
+ monaco.editor.defineTheme(Alive, options);
188
+ monaco.editor.setTheme(Alive);
189
+ monacoConfigured = true;
190
+ }
191
+ }
38
192
  let SpecEditor = class SpecEditor extends LitElement {
39
193
  constructor(id = "spec") {
40
194
  super();
41
195
  this.container = createRef();
196
+ this.decorationIdToLinkTarget = new Map();
42
197
  this.id = id;
198
+ this.links = [];
199
+ this.decorationIdToLinkTarget = new Map();
200
+ this.minimapVisible = true;
201
+ this.breadcumb = new SpecEditorBreadcrumb();
202
+ this.breadcumb.currentPath = this.currentPath;
203
+ this.showBreadcrumb = false;
204
+ this.isActive = true;
205
+ }
206
+ createRenderRoot() {
207
+ return this;
208
+ }
209
+ revive() {
210
+ if (!this.isActive) {
211
+ this.isActive = true;
212
+ monaco.editor.setTheme(Alive);
213
+ this.breadcumb.isInvalid = false;
214
+ }
215
+ }
216
+ dead() {
217
+ if (this.isActive) {
218
+ this.isActive = false;
219
+ this.links = [];
220
+ this.applyLinkDecorations();
221
+ monaco.editor.setTheme(Dead);
222
+ }
223
+ }
224
+ setCurrentPath(path) {
225
+ this.currentPath = path;
226
+ this.breadcumb.currentPath = path;
43
227
  }
44
228
  render() {
45
229
  return html `
46
- <style>
47
- ${styles}
48
- </style>
49
- <main ${ref(this.container)}></main>
230
+ <div style="width: 100%; height: calc(100vh - ${this.showBreadcrumb ? '155px' : '129px'});"
231
+ ${ref(this.container)}>
232
+ </div>
233
+ ${this.showBreadcrumb ? this.breadcumb : null}
50
234
  `;
51
235
  }
52
236
  getFile() {
@@ -69,90 +253,148 @@ let SpecEditor = class SpecEditor extends LitElement {
69
253
  return "vs-dark";
70
254
  return "vs-light";
71
255
  }
256
+ switchLanguage(language) {
257
+ if (this.editor) {
258
+ const model = this.editor.getModel(); // Get the current model
259
+ if (model) {
260
+ monaco.editor.setModelLanguage(model, language);
261
+ }
262
+ }
263
+ }
72
264
  isDark() {
73
265
  return (window.matchMedia &&
74
266
  window.matchMedia("(prefers-color-scheme: dark)").matches);
75
267
  }
76
- setValue(value, firstboot = false) {
77
- if (firstboot) {
78
- this.firstboot = firstboot;
268
+ setValue(value, firstBoot = false) {
269
+ if (firstBoot) {
270
+ this.firstboot = firstBoot;
79
271
  }
80
- this.editor.setValue(value);
272
+ this.editor?.setValue(value);
81
273
  }
82
274
  getValue() {
83
- return this.editor.getValue();
275
+ return this.editor?.getValue();
276
+ }
277
+ clearDecorations() {
278
+ this.linkDecorations.clear();
279
+ this.editor?.deltaDecorations([], []);
280
+ }
281
+ clearAllMarkers() {
282
+ monaco.editor.removeAllMarkers("owner-" + this.id);
84
283
  }
85
284
  setMarkers(markers) {
86
- monaco.editor.removeAllMarkers("owner");
87
- monaco.editor.setModelMarkers(this.model, "owner", markers);
285
+ monaco.editor.removeAllMarkers("owner-" + this.id);
286
+ monaco.editor.setModelMarkers(this.model, "owner-" + this.id, markers);
88
287
  }
89
- firstUpdated() {
90
- const options = {
91
- base: 'vs-dark',
92
- //renderSideBySide: false,
93
- inherit: true,
94
- rules: [
95
- {
96
- "foreground": "E400FB",
97
- "token": "string"
98
- },
99
- {
100
- "foreground": "E400FB",
101
- "token": "number"
102
- },
103
- {
104
- "foreground": "62C4FFFF",
105
- "token": "type"
106
- },
107
- {
108
- "foreground": "787878",
109
- "token": "comment",
110
- "fontStyle": "italic"
111
- },
112
- {
113
- "foreground": "787878",
114
- "token": "delimiter.curly",
115
- },
116
- {
117
- "foreground": "787878",
118
- "token": "delimiter.square",
119
- },
120
- ],
121
- colors: {
122
- 'editor.fontFamily': 'arial',
123
- 'editor.foreground': '#ffffff',
124
- 'editor.background': '#0d1117',
125
- 'editorCursor.foreground': '#62C4FFFF',
126
- 'editor.lineHighlightBackground': '#E400FB30',
127
- 'editorLineNumber.foreground': '#6368747F',
128
- 'editorLineNumber.activeForeground': '#E400FB',
129
- 'editor.inactiveSelectionBackground': '#FF3C742D',
130
- 'diffEditor.removedTextBackground': '#FF3C741A',
131
- 'diffEditor.insertedTextBackground': '#62C4FF1A',
132
- 'editorBracketMatch.border': '#787878'
288
+ toggleMinimap() {
289
+ this.minimapVisible = !this.minimapVisible;
290
+ this.editor?.updateOptions({
291
+ minimap: {
292
+ enabled: this.minimapVisible
133
293
  }
134
- };
135
- // @ts-ignore
136
- monaco.editor.defineTheme("pb33f", options);
137
- monaco.editor.setTheme('pb33f');
294
+ });
295
+ }
296
+ firstUpdated() {
297
+ setupMonaco();
138
298
  const uri = monaco.Uri.parse("inmemory://doc-" + this.id);
139
299
  const value = this.getCode();
140
300
  this.model = monaco.editor.createModel(value, "yaml", uri);
141
301
  this.editor = monaco.editor.create(this.container.value, {
142
302
  model: this.model,
143
- language: 'yaml',
303
+ language: 'json',
144
304
  theme: 'pb33f',
305
+ glyphMargin: true,
145
306
  readOnly: this.readOnly,
146
307
  automaticLayout: true,
147
308
  fontFamily: 'BerkeleyMono-Regular',
148
309
  fontSize: 14,
149
310
  minimap: {
150
- enabled: false
311
+ enabled: this.minimapVisible
151
312
  },
152
313
  hover: {
153
- enabled: true
154
- }
314
+ enabled: true,
315
+ delay: 100,
316
+ above: false,
317
+ sticky: true,
318
+ },
319
+ });
320
+ monaco.languages.registerLinkProvider('yaml', { provideLinks: this.provideLinks.bind(this) });
321
+ monaco.editor.registerLinkOpener({ open: this.open.bind(this) });
322
+ // monaco.languages.registerCodeActionProvider("yaml", {
323
+ // provideCodeActions: (
324
+ // model /**ITextModel*/,
325
+ // range /**Range*/,
326
+ // context /**CodeActionContext*/,
327
+ // token /**CancellationToken*/
328
+ // ) => {
329
+ //
330
+ // const actions = context.markers.map(error => {
331
+ // return {
332
+ // title: `Example quick fix`,
333
+ // diagnostics: [error],
334
+ // kind: "quickfix",
335
+ // edit: {
336
+ // edits: [
337
+ // {
338
+ // resource: model.uri,
339
+ // edits: [
340
+ // {
341
+ // range: error,
342
+ // text: "This text replaces the text with the error"
343
+ // }
344
+ // ]
345
+ // }
346
+ // ]
347
+ // },
348
+ // isPreferred: true
349
+ // };
350
+ // });
351
+ // return {
352
+ // actions: actions,
353
+ // dispose: () => {}
354
+ // }
355
+ // }
356
+ // });
357
+ monaco.languages.registerHoverProvider('yaml', {
358
+ provideHover: (_model, position) => {
359
+ const link = this.links.find((link) => {
360
+ const range = new monaco.Range(link.line, link.startColumn, link.line, link.endColumn);
361
+ return range.containsPosition(position);
362
+ });
363
+ let linkMeta = new Array();
364
+ if (link) {
365
+ const name = link.fullDefinition.split('/').pop();
366
+ linkMeta = [
367
+ { value: `#### **&rightarrow; ${name}**` },
368
+ { value: `XPath: _${link.definition}_` },
369
+ ];
370
+ if (link.isPolymorphic) {
371
+ linkMeta.push({ value: '`Polymorphic Pointer`' });
372
+ }
373
+ if (link.jsonPath) {
374
+ linkMeta.push({ value: `JSON Pointer: __${link.jsonPath}__` });
375
+ }
376
+ const uri = link.fullDefinition.split("#/");
377
+ if (uri.length == 2) {
378
+ if (uri[0] !== '/')
379
+ linkMeta.push({ value: `File: **${uri[0]}**` });
380
+ }
381
+ else {
382
+ linkMeta.push({ value: `Location: **${link.fullDefinition}**` });
383
+ }
384
+ if (link.targetLine && link.targetColumn) {
385
+ linkMeta.push({ value: `Target: Line [**${link.targetLine}]**, Column **[${link.targetColumn}]**` });
386
+ }
387
+ }
388
+ if (link) {
389
+ return {
390
+ range: new monaco.Range(link.line, link.startColumn, link.line, link.endColumn),
391
+ contents: linkMeta,
392
+ };
393
+ }
394
+ return null;
395
+ },
155
396
  });
397
+ this.linkDecorations = this.editor.createDecorationsCollection();
156
398
  this.model.onDidChangeContent(() => {
157
399
  if (!this.firstboot) {
158
400
  this.dispatchEvent(new CustomEvent(EditorUpdated, {
@@ -178,21 +420,100 @@ let SpecEditor = class SpecEditor extends LitElement {
178
420
  }
179
421
  }));
180
422
  });
423
+ // handle link clicks
424
+ //this.editor.onMouseUp((e) => {
425
+ // const position = e.target.position;
426
+ // if (position && this.editor) {
427
+ // const model = this.editor.getModel();
428
+ // if (model) {
429
+ // const range = new monaco.Range(
430
+ // position.lineNumber,
431
+ // position.column,
432
+ // position.lineNumber,
433
+ // position.column
434
+ // );
435
+ // const decorations = model.getDecorationsInRange(range);
436
+ // if (decorations) {
437
+ // for (const decoration of decorations) {
438
+ // const linkTarget = this.decorationIdToLinkTarget.get(decoration.id);
439
+ // if (linkTarget) {
440
+ // this.dispatchEvent(new CustomEvent<DocumentReference>(DocumentReferenceClicked, {
441
+ // bubbles: true,
442
+ // composed: true,
443
+ // detail: {
444
+ // jsonPath: linkTarget
445
+ // }
446
+ // }))
447
+ // break; // Stop after handling the first matching link
448
+ // }
449
+ // }
450
+ // }
451
+ // }
452
+ // }
453
+ //})
181
454
  window
182
455
  .matchMedia("(prefers-color-scheme: dark)")
183
456
  .addEventListener("change", () => {
184
457
  monaco.editor.setTheme(this.getTheme());
185
458
  });
186
459
  }
187
- };
188
- SpecEditor.styles = css `
189
- main {
190
- width: 100%;
191
- height: 100%;
192
- position: relative;
193
- word-spacing: normal;
460
+ open(uri) {
461
+ if (uri.scheme == 'doctor') {
462
+ this.dispatchEvent(new CustomEvent(DocumentReferenceClicked, {
463
+ bubbles: true,
464
+ composed: true,
465
+ detail: {
466
+ jsonPath: uri.authority
467
+ }
468
+ }));
194
469
  }
195
- `;
470
+ return Promise.resolve(true);
471
+ }
472
+ applyLinkDecorations() {
473
+ if (this.editor) {
474
+ this.linkDecorations.clear();
475
+ const newDecorations = this.links.map((link) => {
476
+ let inlineClassName = 'ref';
477
+ let glyphClassName = 'ref-margin';
478
+ let hoverMessage = { value: "Reference (_JSON Pointer_) to: **" + link.fullDefinition + "**" };
479
+ let minimap = editorGreenDim;
480
+ if (link.isPolymorphic) {
481
+ inlineClassName = 'ref-poly';
482
+ glyphClassName = 'ref-poly-margin';
483
+ hoverMessage = { value: "Polymorphic Reference (_JSON Pointer_) to: **" + link.fullDefinition + "**" };
484
+ minimap = editorBrown;
485
+ }
486
+ return {
487
+ range: new monaco.Range(link.line, link.startColumn, link.line, link.endColumn),
488
+ options: {
489
+ inlineClassName: inlineClassName,
490
+ glyphMarginClassName: glyphClassName,
491
+ glyphMarginHoverMessage: hoverMessage,
492
+ minimap: { color: minimap, position: monaco.editor.MinimapPosition.Inline }
493
+ },
494
+ };
495
+ });
496
+ const decorationIds = this.linkDecorations.set(newDecorations);
497
+ this.decorationIdToLinkTarget.clear();
498
+ decorationIds.forEach((decorationId, index) => {
499
+ const target = this.links[index].jsonPath + '||' + this.links[index].targetLine + ':' + this.links[index].targetColumn + "||" + this.links[index].fullDefinition + "||" + this.links[index].rolodexIdHash;
500
+ this.decorationIdToLinkTarget.set(decorationId, target);
501
+ });
502
+ }
503
+ }
504
+ provideLinks(_model, _token) {
505
+ const links = this.links.map((link) => {
506
+ const range = new monaco.Range(link.line, link.startColumn, link.line, link.endColumn);
507
+ const linkString = link.jsonPath + '||' + link.targetLine + ':' + link.targetColumn + "||" + link.fullDefinition + "||" + link.rolodexIdHash;
508
+ return {
509
+ range: range,
510
+ url: monaco.Uri.parse(`doctor://${encodeURIComponent(linkString)}`),
511
+ };
512
+ });
513
+ return { links };
514
+ }
515
+ };
516
+ SpecEditor.styles = [editorCss];
196
517
  __decorate([
197
518
  property({ type: Boolean, attribute: "readonly" })
198
519
  ], SpecEditor.prototype, "readOnly", void 0);
@@ -205,6 +526,21 @@ __decorate([
205
526
  __decorate([
206
527
  property()
207
528
  ], SpecEditor.prototype, "code", void 0);
529
+ __decorate([
530
+ state()
531
+ ], SpecEditor.prototype, "links", void 0);
532
+ __decorate([
533
+ property()
534
+ ], SpecEditor.prototype, "minimapVisible", void 0);
535
+ __decorate([
536
+ property()
537
+ ], SpecEditor.prototype, "currentPath", void 0);
538
+ __decorate([
539
+ property()
540
+ ], SpecEditor.prototype, "id", void 0);
541
+ __decorate([
542
+ state()
543
+ ], SpecEditor.prototype, "showBreadcrumb", void 0);
208
544
  SpecEditor = __decorate([
209
545
  customElement("pb33f-editor")
210
546
  ], SpecEditor);
@@ -17,6 +17,11 @@ export default css `
17
17
  text-align: right;
18
18
  padding-top: 2px;
19
19
  }
20
+
21
+ .pulse {
22
+ color: var(--warn-color);
23
+ animation: pulse-animation 1.5s infinite;
24
+ }
20
25
 
21
26
  sl-icon {
22
27
  font-size: 1.2rem;
@@ -309,8 +309,10 @@ let ManageRuleset = class ManageRuleset extends LitElement {
309
309
  });
310
310
  }
311
311
  else {
312
- this.switchRuleset(button.value);
313
- this.requestUpdate();
312
+ if (this.currentRuleset !== button.value) {
313
+ this.switchRuleset(button.value);
314
+ this.requestUpdate();
315
+ }
314
316
  }
315
317
  }
316
318
  cancelCustomOverride() {
@@ -593,14 +595,14 @@ let ManageRuleset = class ManageRuleset extends LitElement {
593
595
  <div class="ruleset">
594
596
  <div class="ruleset-header">
595
597
  <sl-radio-group label="Select a ruleset" name="ruleset" value="default">
596
- <sl-radio-button value=${defaultRuleset} @sl-focus="${this.changeActiveRuleset}">Default
598
+ <sl-radio-button value=${defaultRuleset} @click="${this.changeActiveRuleset}">Default
597
599
  </sl-radio-button>
598
- <sl-radio-button value=${owaspRuleset} @sl-focus="${this.changeActiveRuleset}">OWASP
600
+ <sl-radio-button value=${owaspRuleset} @click="${this.changeActiveRuleset}">OWASP
599
601
  </sl-radio-button>
600
- <sl-radio-button value=${allRuleset} @sl-focus="${this.changeActiveRuleset}">All
602
+ <sl-radio-button value=${allRuleset} @click="${this.changeActiveRuleset}">All
601
603
  </sl-radio-button>
602
604
  <sl-radio-button value=${customRuleset} disabled id="custom-ruleset"
603
- @sl-focus="${this.changeActiveRuleset}">Custom
605
+ @click="${this.changeActiveRuleset}">Custom
604
606
  </sl-radio-button>
605
607
  </sl-radio-group>
606
608
  <div class="ruleset-controls">
@@ -30,5 +30,12 @@ export declare class ModelIconComponent extends LitElement {
30
30
  constructor();
31
31
  getNodeTypeFromIcon(icon: string): NodeType;
32
32
  static getIconForType(nodeType: NodeType): string;
33
+ openapiIcon(): string;
34
+ goIcon(): string;
35
+ typescriptIcon(): string;
36
+ csIcon(): string;
37
+ cIcon(): string;
38
+ cppIcon(): string;
39
+ zigLogo(): string;
33
40
  render(): import("lit-html").TemplateResult<1>;
34
41
  }