@pb33f/cowboy-components 0.3.3 → 0.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.
@@ -507,7 +507,6 @@ let ManageRuleset = class ManageRuleset extends LitElement {
507
507
  // if sortSeverity or sortAlpha is true, sort the ruleset by alpha or severity, or both starting
508
508
  // with severity and then alpha
509
509
  if (this.sortSeverity && !this._noSort) {
510
- console.log('yeah man');
511
510
  this._activeRuleset?.sort((a, b) => {
512
511
  if (a && b) {
513
512
  if (a.rule && b.rule) {
@@ -569,12 +568,16 @@ let ManageRuleset = class ManageRuleset extends LitElement {
569
568
  </div>
570
569
  `;
571
570
  sortByAlpha = html `<div class="sort-by-alpha">
572
- <sl-icon-button @click="${() => { this.sortAlpha = !this.sortAlpha; }}"
573
- name="${this.sortAlpha ? 'sort-alpha-down' : 'sort-alpha-down-alt'}" class="sort"></sl-icon-button>
571
+ <sl-tooltip content="Sort alphabetically" placement="top">
572
+ <sl-icon-button @click="${() => { this.sortAlpha = !this.sortAlpha; }}"
573
+ name="${this.sortAlpha ? 'sort-alpha-down' : 'sort-alpha-down-alt'}" class="sort"></sl-icon-button>
574
+ </sl-tooltip>
574
575
  </div>`;
575
576
  sortBySeverity = html `<div class="sort-by-severity">
576
- <sl-icon-button @click="${() => { this.sortSeverity = !this.sortSeverity; }}"
577
+ <sl-tooltip content="Sort by severity" placement="top">
578
+ <sl-icon-button @click="${() => { this.sortSeverity = !this.sortSeverity; }}"
577
579
  name="${this.sortSeverity ? 'sort-down-alt' : 'sort-down'}" class="sort"></sl-icon-button>
580
+ </sl-tooltip>
578
581
  </div>`;
579
582
  }
580
583
  let rules = html `
@@ -90,6 +90,9 @@ let PaginatorNavigation = class PaginatorNavigation extends LitElement {
90
90
  }
91
91
  }
92
92
  render() {
93
+ if (this.totalItems == 0) {
94
+ return html ``;
95
+ }
93
96
  if (this.currentPage == 1) {
94
97
  this.togglePrev(true);
95
98
  }
@@ -21,18 +21,21 @@ export default css `
21
21
  }
22
22
 
23
23
  .no-values {
24
- width: 400px;
25
- margin: 50px auto;
24
+ width: 500px;
25
+ margin: 0 auto;
26
+ padding-top: 50px;
26
27
  text-align: center;
27
28
  font-size: 1.9em;
28
29
  color: var(--font-color-sub3);
29
30
  font-family: var(--font-stack-bold), monospace;
31
+ overflow-y: hidden;
30
32
 
31
33
  }
32
34
 
33
35
  .no-values sl-icon {
34
36
  margin-bottom: 30px;
35
37
  font-size: 5em;
38
+
36
39
  }
37
40
 
38
41
  `;
@@ -9,6 +9,7 @@ export declare class Paginator extends LitElement {
9
9
  label: string;
10
10
  activeIndex: number;
11
11
  private renderValues;
12
+ private sparks;
12
13
  private paginatorNavigator;
13
14
  constructor();
14
15
  nextPage(event: CustomEvent): void;
@@ -9,9 +9,11 @@ import { html, LitElement } from "lit";
9
9
  import { PaginatorNavigation } from "./paginator-navigator.js";
10
10
  import { PaginatorFirstPage, PaginatorLastPage, PaginatorNextPage, PaginatorPreviousPage } from "./paginator-events.js";
11
11
  import paginatorCss from "./paginator.css.js";
12
+ import { PixelSparks } from "../the-doctor/sparks";
12
13
  let Paginator = class Paginator extends LitElement {
13
14
  constructor() {
14
15
  super();
16
+ this.sparks = new PixelSparks();
15
17
  this.currentPage = 1;
16
18
  this.totalPages = 1;
17
19
  this.totalItems = 0;
@@ -80,11 +82,15 @@ let Paginator = class Paginator extends LitElement {
80
82
  this.renderValues = this.values?.slice(this.paginatorNavigator.getRangeStart(), this.paginatorNavigator.getRangeEnd());
81
83
  }
82
84
  render() {
85
+ let sparks = new PixelSparks();
83
86
  if (this.renderValues?.length === 0 || !this.renderValues) {
84
- return html `<div class="no-values">
85
- <sl-icon name="x-square"></sl-icon><br/>
87
+ return html `
88
+ <div class="no-values" style="position: relative">
89
+ <div style="position: absolute; width: 100%; top: -50px; left: 0;">${this.sparks}</div>
90
+ <sl-icon name="x-square"></sl-icon><br/>
86
91
  no results
87
- </div>`;
92
+ </div>
93
+ `;
88
94
  }
89
95
  return html `
90
96
  ${this.paginatorNavigator}
@@ -0,0 +1,17 @@
1
+ import { LitElement } from "lit";
2
+ export declare class PixelSparks extends LitElement {
3
+ private sparkArray;
4
+ private readonly gravity;
5
+ private readonly spawnRate;
6
+ private ctx;
7
+ private canvas;
8
+ static styles: import("lit").CSSResult;
9
+ constructor();
10
+ firstUpdated(): void;
11
+ startAnimation(): void;
12
+ getRandomBetween(min: number, max: number): number;
13
+ spawnSpark(): void;
14
+ animateSparks(): void;
15
+ drawSpark(spark: any): void;
16
+ render(): import("lit-html").TemplateResult<1>;
17
+ }
@@ -0,0 +1,81 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
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
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { customElement } from "lit/decorators.js";
8
+ import { css, html, LitElement } from "lit";
9
+ let PixelSparks = class PixelSparks extends LitElement {
10
+ constructor() {
11
+ super();
12
+ this.sparkArray = [];
13
+ this.gravity = 0.0001;
14
+ this.spawnRate = 70;
15
+ }
16
+ firstUpdated() {
17
+ const canvas = this.renderRoot.querySelector('canvas');
18
+ if (canvas) {
19
+ this.canvas = canvas;
20
+ const ctx = this.canvas?.getContext('2d');
21
+ if (ctx) {
22
+ this.ctx = ctx;
23
+ }
24
+ }
25
+ this.startAnimation();
26
+ }
27
+ startAnimation() {
28
+ setInterval(() => this.spawnSpark(), 1000 / this.spawnRate);
29
+ this.animateSparks();
30
+ }
31
+ getRandomBetween(min, max) {
32
+ return Math.random() * (max - min) + min;
33
+ }
34
+ spawnSpark() {
35
+ this.sparkArray.push({
36
+ x: Math.random() * this.canvas.width,
37
+ y: -2,
38
+ size: 1,
39
+ color: Math.random() > 0.5 ? 'rgb(248, 58, 255)' : 'rgb(98, 196, 255)',
40
+ velocityY: this.getRandomBetween(0.05, 0.3),
41
+ lifetime: 300,
42
+ initialLifetime: 300,
43
+ opacity: 1
44
+ });
45
+ }
46
+ animateSparks() {
47
+ this.ctx?.clearRect(0, 0, this.canvas?.width, this.canvas?.height);
48
+ this.sparkArray = this.sparkArray.filter(spark => spark.lifetime > 0);
49
+ for (let spark of this.sparkArray) {
50
+ this.drawSpark(spark);
51
+ spark.y += spark.velocityY;
52
+ spark.velocityY += this.gravity; // Apply gravity
53
+ spark.lifetime--;
54
+ spark.opacity = spark.lifetime / spark.initialLifetime;
55
+ }
56
+ requestAnimationFrame(() => this.animateSparks());
57
+ }
58
+ drawSpark(spark) {
59
+ this.ctx.globalAlpha = spark.opacity; // Set transparency level
60
+ this.ctx.fillStyle = spark.color;
61
+ this.ctx.shadowColor = spark.color;
62
+ this.ctx.shadowBlur = 8;
63
+ this.ctx.fillRect(spark.x, spark.y, spark.size, spark.size);
64
+ this.ctx.globalAlpha = 1; // Reset alpha to default
65
+ }
66
+ render() {
67
+ return html `
68
+ <canvas width="100%" height="100%"></canvas>`;
69
+ }
70
+ };
71
+ PixelSparks.styles = css `
72
+ canvas {
73
+ width: 100%;
74
+ height: 100%;
75
+ image-rendering: pixelated; /* Ensures pixelated appearance */
76
+ }
77
+ `;
78
+ PixelSparks = __decorate([
79
+ customElement('pb33f-pixel-sparks')
80
+ ], PixelSparks);
81
+ export { PixelSparks };
@@ -24,11 +24,11 @@ export default css `
24
24
  overflow: hidden;
25
25
  width: 100%;
26
26
  }
27
-
27
+
28
28
  #manager-controls::part(nav) {
29
- max-width: 96%;
29
+ max-width: 96%;
30
30
  }
31
-
31
+
32
32
  .problems-data {
33
33
  height: min-content;
34
34
  max-height: calc(100vh - 50px);
@@ -50,7 +50,7 @@ export default css `
50
50
 
51
51
 
52
52
  sl-split-panel {
53
- width:100%;
53
+ width: 100%;
54
54
  height: 100%;
55
55
  --divider-width: 2px;
56
56
  }
@@ -79,13 +79,13 @@ export default css `
79
79
  background-color: var(--primary-color);
80
80
  color: var(--background-color);
81
81
  }
82
-
82
+
83
83
 
84
84
  .unavailable {
85
85
  opacity: 0.4;
86
86
  transition: all 0.5s;
87
87
  }
88
-
88
+
89
89
  .model-tree {
90
90
  height: calc(100vh - 95px);
91
91
  overflow-x: auto;
@@ -106,8 +106,8 @@ export default css `
106
106
  background: var(--secondary-color-lowalpha);
107
107
  padding: var(--global-padding);
108
108
  }
109
-
110
-
109
+
110
+
111
111
  .split-panel {
112
112
  --min: 550px;
113
113
  --max: calc(100vw - 550px);
@@ -118,10 +118,10 @@ export default css `
118
118
  --max: 550px;
119
119
  max-width: 100vw;
120
120
  }
121
-
121
+
122
122
  .explorer-panel {
123
123
  height: calc(100vh - 85px);
124
- width: 100%;
124
+ width: 100%;
125
125
  overflow-y: auto;
126
126
  }
127
127
 
@@ -139,8 +139,8 @@ export default css `
139
139
  background: var(--secondary-color-lowalpha);
140
140
  padding: var(--global-padding);
141
141
  }
142
-
143
-
142
+
143
+
144
144
  .overlay {
145
145
  width: 100%;
146
146
  opacity: 1;
@@ -159,27 +159,27 @@ export default css `
159
159
  margin-left: 10px;
160
160
  margin-right: 10px;
161
161
  }
162
-
162
+
163
163
  h3.loading {
164
164
  margin-top: 20px;
165
165
  padding-top: 0;
166
166
  text-align: center;
167
167
  }
168
-
169
- .tab-panel {
170
- height: calc(100vh - 110px);
171
- }
172
168
 
173
- sl-tab-panel.tab-panel::part(base) {
169
+ .tab-panel {
170
+ height: calc(100vh - 110px);
171
+ }
172
+
173
+ sl-tab-panel.tab-panel::part(base) {
174
174
  height: 100%;
175
- padding-top:5px;
175
+ padding-top: 5px;
176
176
  }
177
-
177
+
178
178
  sl-tab-panel::part(base) {
179
179
  height: 100%;
180
- padding-top:5px;
180
+ padding-top: 5px;
181
181
  }
182
-
182
+
183
183
  sl-switch::part(label) {
184
184
  font-family: var(--font-stack), monospace;
185
185
  }
@@ -208,7 +208,7 @@ export default css `
208
208
  top: 3px;
209
209
  right: 25px;
210
210
  }
211
-
211
+
212
212
  .spinner-draw-closed {
213
213
  top: 35px;
214
214
  right: 8px;
@@ -230,11 +230,11 @@ export default css `
230
230
  display: flex;
231
231
  margin-bottom: 20px;
232
232
  }
233
-
233
+
234
234
  .right {
235
235
  text-align: right;
236
236
  }
237
-
237
+
238
238
  .export-block {
239
239
  width: 50%;
240
240
  }
@@ -243,7 +243,7 @@ export default css `
243
243
  margin-left: 20px;
244
244
  padding-top: 3px;
245
245
  }
246
-
246
+
247
247
  sl-badge::part(base) {
248
248
  width: 10px;
249
249
  padding: 0;
@@ -251,6 +251,7 @@ export default css `
251
251
  margin-top: 2px;
252
252
  height: 10px;
253
253
  }
254
+
254
255
  .collapse-side {
255
256
  position: absolute;
256
257
  right: 5px;
@@ -259,8 +260,55 @@ export default css `
259
260
  color: var(--secondary-color);
260
261
  font-size: 1.4rem;
261
262
  }
263
+
262
264
  sl-icon-button.collapse-side::part(base) {
263
265
  padding: 0;
264
266
  }
267
+
268
+ .controls {
269
+ display: flex;
270
+ margin-left: 10px;
271
+ padding-top: 2px;
272
+ font-size: 0.8rem;
273
+ height: 38px;
274
+ border-bottom: 1px dashed var(--secondary-color-dimmer);
275
+ }
276
+
277
+ .url-input {
278
+ width: 50%;
279
+ }
280
+
281
+ .url-problem {
282
+ padding: 50px;
283
+ display: none;
284
+ }
285
+
286
+ #url-spinner {
287
+ padding: 5px 50px 5px 50px;
288
+ }
289
+
290
+ .main-view {
291
+ position: relative;
292
+ width: 100%;
293
+ height: 100%;
294
+ }
295
+
296
+ sl-button.url-input-button::part(base) {
297
+ margin-top: 0;
298
+ margin-left: 10px;
299
+ }
300
+
301
+ .editor-url-overlay {
302
+ position: absolute;
303
+ height: calc(100% - 5px);
304
+ width: 100%;
305
+ left: 0;
306
+ top: 0;
307
+ z-index: 3;
308
+ display: none;
309
+ backdrop-filter: blur(2px);
310
+ -webkit-backdrop-filter: blur(2px);
311
+ background-color: var(--background-color-withopacity);
312
+ }
265
313
 
266
314
  `;
@@ -10,7 +10,8 @@ import '@shoelace-style/shoelace/dist/components/avatar/avatar.js';
10
10
  import { LitElement } from "lit";
11
11
  import { AddToastEvent, EditorUpdatedEvent, ProblemRuleFilterChangedEvent, RulesetSavedEvent, RuleClickedEvent, NodeClickedEvent, NodeReferenceEvent, ExplorerEqualizerChangedEvent } from "../../events/doctor.js";
12
12
  import { ProblemDrawerEvent } from "../problem-list/details-drawer.js";
13
- import { SlDialog, SlIcon, SlRadioGroup, SlSplitPanel, SlTab, SlTabGroup } from "@shoelace-style/shoelace";
13
+ import { SlButton, SlDialog, SlIcon, SlInput, SlRadioGroup, SlSplitPanel, SlTab, SlTabGroup } from "@shoelace-style/shoelace";
14
+ import { PlatformError } from "../../model/errors.js";
14
15
  import { AttentionBox } from "../attention-box/attention-box.js";
15
16
  import { Toast } from "../../model/toast.js";
16
17
  import SlIconButton from "@shoelace-style/shoelace/dist/components/icon-button/icon-button.js";
@@ -18,6 +19,7 @@ import { Node } from "../../model/graph.js";
18
19
  import { ModelTree } from "../model-tree/tree.js";
19
20
  import { ExplorerComponent } from "../visualizer/explorer.js";
20
21
  import { RenderedNodeComponent } from "../model-renderer/rendered-node.js";
22
+ import { BusCallback, CommandResponse } from "@pb33f/ranch";
21
23
  export declare const GraphBag = "pb33f-doctor-graph";
22
24
  export declare const DoctorDocumentBag = "pb33f-doctor-editor";
23
25
  export declare const HowToFixBag = "pb33f-doctor-howtofix";
@@ -48,6 +50,8 @@ export declare class TheDoctor extends LitElement {
48
50
  downloadRulesetLink: HTMLAnchorElement;
49
51
  loadingOverlay: SlDialog;
50
52
  problemsDataDiv: HTMLDivElement;
53
+ urlInputButton: SlButton;
54
+ urlInput: SlInput;
51
55
  private unavailable;
52
56
  doctorEndpoint: string;
53
57
  exportRulesetDialog: SlDialog;
@@ -57,6 +61,7 @@ export declare class TheDoctor extends LitElement {
57
61
  private rulesetPulse;
58
62
  explorerVisible: boolean;
59
63
  explorerBooted: boolean;
64
+ activeURL: string;
60
65
  private readonly errorBanner;
61
66
  private bagManager;
62
67
  private readonly editor;
@@ -108,9 +113,23 @@ export declare class TheDoctor extends LitElement {
108
113
  filteredNodes: Map<string, Node>;
109
114
  renderedNode: RenderedNodeComponent;
110
115
  activeNode: Node;
116
+ private readonly bus;
117
+ private readonly specStreamChannel;
118
+ private readonly doctorServiceChannel;
119
+ private specChannelSubscription;
120
+ private doctorChannelSubscription;
121
+ private brokerConnectionId;
122
+ private readonly busPort;
123
+ private readonly busHost;
124
+ private readonly busVersion;
125
+ private useTLS;
111
126
  readonly nodeLimit: number;
112
127
  constructor(doctorEndpoint?: string);
128
+ whoAmI(): void;
129
+ protected connectToBroker(): void;
113
130
  addClickTrack(node: Node): void;
131
+ doctorServiceHandler(): BusCallback<CommandResponse>;
132
+ specStreamHandler(): BusCallback<CommandResponse>;
114
133
  filterTreeModel(event: CustomEvent<ExplorerEqualizerChangedEvent>): void;
115
134
  explorerReferenceClicked(evt: CustomEvent<NodeReferenceEvent>): void;
116
135
  modelTreeNodeClicked(evt: CustomEvent<NodeClickedEvent>): void;
@@ -151,5 +170,14 @@ export declare class TheDoctor extends LitElement {
151
170
  toggleExplorer(): void;
152
171
  closeExplorer(): void;
153
172
  render(): import("lit-html").TemplateResult<1>;
173
+ fetchUrl(): void;
174
+ urlOverlay: HTMLElement;
175
+ urlProblem: HTMLElement;
176
+ urlSpinner: HTMLDivElement;
177
+ urlErrorCode: number;
178
+ urlErrorMessage: string;
179
+ hideUrlError(): void;
180
+ showUrlError(e: PlatformError): void;
181
+ validateUrl(evt: KeyboardEvent): void;
154
182
  ungrabExplorer(): void;
155
183
  }