@redvars/peacock 3.6.0 → 3.6.1
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.
- package/dist/code-highlighter.js +1 -1
- package/dist/code-highlighter.js.map +1 -1
- package/dist/custom-elements-jsdocs.json +928 -96
- package/dist/custom-elements.json +1294 -379
- package/dist/{flow-designer-dZnLJOQT.js → flow-designer-DvTUrDp5.js} +3 -3
- package/dist/{flow-designer-dZnLJOQT.js.map → flow-designer-DvTUrDp5.js.map} +1 -1
- package/dist/{flow-designer-node-XMe-jlKg.js → flow-designer-node-BWrPuxAR.js} +2 -2
- package/dist/flow-designer-node-BWrPuxAR.js.map +1 -0
- package/dist/flow-designer-node.js +1 -1
- package/dist/flow-designer.js +2 -2
- package/dist/html-editor.js +27245 -87
- package/dist/html-editor.js.map +1 -1
- package/dist/index.js +3 -3
- package/dist/modal.js +1 -7
- package/dist/modal.js.map +1 -1
- package/dist/{navigation-rail-DyO0oAZU.js → navigation-rail-DTTkqohi.js} +763 -214
- package/dist/navigation-rail-DTTkqohi.js.map +1 -0
- package/dist/peacock-loader.js +12 -3
- package/dist/peacock-loader.js.map +1 -1
- package/dist/src/html-editor/html-editor.d.ts +44 -11
- package/dist/src/index.d.ts +2 -0
- package/dist/src/list/index.d.ts +2 -0
- package/dist/src/list/list-item.d.ts +35 -0
- package/dist/src/list/list.d.ts +28 -0
- package/dist/src/modal/modal.d.ts +1 -7
- package/dist/src/navigation-rail/navigation-rail.d.ts +3 -7
- package/dist/src/number-field/number-field.d.ts +2 -2
- package/dist/src/svg/index.d.ts +1 -0
- package/dist/src/svg/svg.d.ts +38 -0
- package/dist/src/toolbar/toolbar.d.ts +3 -3
- package/dist/toolbar.js +3 -3
- package/dist/toolbar.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -1
- package/readme.md +3 -3
- package/src/code-highlighter/code-highlighter.ts +1 -1
- package/src/flow-designer/flow-designer-node.ts +1 -1
- package/src/html-editor/html-editor.scss +44 -2
- package/src/html-editor/html-editor.ts +309 -94
- package/src/index.ts +2 -1
- package/src/list/index.ts +2 -0
- package/src/list/list-item.scss +111 -0
- package/src/list/list-item.ts +175 -0
- package/src/list/list.scss +24 -0
- package/src/list/list.ts +51 -0
- package/src/modal/modal.ts +1 -7
- package/src/navigation-rail/navigation-rail-item.scss +7 -38
- package/src/navigation-rail/navigation-rail-item.ts +1 -2
- package/src/navigation-rail/navigation-rail.scss +17 -21
- package/src/navigation-rail/navigation-rail.ts +6 -9
- package/src/number-field/number-field.ts +2 -2
- package/src/peacock-loader.ts +12 -0
- package/src/svg/index.ts +1 -0
- package/src/svg/svg.scss +91 -0
- package/src/svg/svg.ts +160 -0
- package/src/toolbar/toolbar.ts +3 -3
- package/dist/flow-designer-node-XMe-jlKg.js.map +0 -1
- package/dist/navigation-rail-DyO0oAZU.js.map +0 -1
package/src/svg/svg.scss
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
@use '../../scss/mixin';
|
|
2
|
+
|
|
3
|
+
@include mixin.base-styles;
|
|
4
|
+
|
|
5
|
+
:host {
|
|
6
|
+
display: inline-flex;
|
|
7
|
+
vertical-align: middle;
|
|
8
|
+
--svg-size: inherit;
|
|
9
|
+
--svg-color: inherit;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.svg-wrapper {
|
|
13
|
+
height: var(--svg-size, 1rem);
|
|
14
|
+
width: var(--svg-size, 1rem);
|
|
15
|
+
display: inline-flex;
|
|
16
|
+
align-items: center;
|
|
17
|
+
justify-content: center;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.svg-content {
|
|
21
|
+
height: 100%;
|
|
22
|
+
width: 100%;
|
|
23
|
+
display: inline-flex;
|
|
24
|
+
align-items: center;
|
|
25
|
+
justify-content: center;
|
|
26
|
+
|
|
27
|
+
svg {
|
|
28
|
+
fill: var(--svg-color);
|
|
29
|
+
height: 100%;
|
|
30
|
+
width: 100%;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.svg-content.clickable {
|
|
35
|
+
cursor: zoom-in;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.placeholder {
|
|
39
|
+
display: block;
|
|
40
|
+
height: 100%;
|
|
41
|
+
width: 100%;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.preview-overlay {
|
|
45
|
+
display: none;
|
|
46
|
+
position: fixed;
|
|
47
|
+
inset: 0;
|
|
48
|
+
z-index: 9999;
|
|
49
|
+
background: rgba(0, 0, 0, 0.85);
|
|
50
|
+
align-items: center;
|
|
51
|
+
justify-content: center;
|
|
52
|
+
cursor: zoom-out;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.preview-overlay.open {
|
|
56
|
+
display: flex;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.preview-close {
|
|
60
|
+
position: absolute;
|
|
61
|
+
top: 1rem;
|
|
62
|
+
right: 1rem;
|
|
63
|
+
background: transparent;
|
|
64
|
+
border: none;
|
|
65
|
+
color: #fff;
|
|
66
|
+
font-size: 1.5rem;
|
|
67
|
+
cursor: pointer;
|
|
68
|
+
line-height: 1;
|
|
69
|
+
padding: 0.25rem 0.5rem;
|
|
70
|
+
|
|
71
|
+
&:focus-visible {
|
|
72
|
+
outline: 2px solid #fff;
|
|
73
|
+
outline-offset: 2px;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.preview-content {
|
|
78
|
+
max-width: 90vw;
|
|
79
|
+
max-height: 90vh;
|
|
80
|
+
display: flex;
|
|
81
|
+
align-items: center;
|
|
82
|
+
justify-content: center;
|
|
83
|
+
cursor: default;
|
|
84
|
+
|
|
85
|
+
svg {
|
|
86
|
+
max-width: 90vw;
|
|
87
|
+
max-height: 90vh;
|
|
88
|
+
box-shadow: 0 8px 40px rgba(0, 0, 0, 0.6);
|
|
89
|
+
border-radius: 4px;
|
|
90
|
+
}
|
|
91
|
+
}
|
package/src/svg/svg.ts
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { html, LitElement } from 'lit';
|
|
2
|
+
import { property, state } from 'lit/decorators.js';
|
|
3
|
+
import { unsafeSVG } from 'lit/directives/unsafe-svg.js';
|
|
4
|
+
|
|
5
|
+
import { sanitizeSvg } from '@/__utils/sanitize-svg.js';
|
|
6
|
+
import { fetchSVG } from '../icon/datasource.js';
|
|
7
|
+
|
|
8
|
+
import styles from './svg.scss';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @label SVG
|
|
12
|
+
* @tag wc-svg
|
|
13
|
+
* @rawTag svg
|
|
14
|
+
* @summary An SVG component with lazy loading and optional preview support.
|
|
15
|
+
* @overview Renders an inline SVG fetched from a URL, with lazy loading via IntersectionObserver and an optional click-to-preview lightbox.
|
|
16
|
+
*
|
|
17
|
+
* @cssprop --svg-color - Controls the fill color of the SVG.
|
|
18
|
+
* @cssprop [--svg-size=1rem] - Controls the size of the SVG. Defaults to "1rem"
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```html
|
|
22
|
+
* <wc-svg src="/icons/my-icon.svg" image-title="My icon"></wc-svg>
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export class Svg extends LitElement {
|
|
26
|
+
static styles = [styles];
|
|
27
|
+
|
|
28
|
+
/** URL of the SVG asset to fetch and render inline. */
|
|
29
|
+
@property({ type: String, reflect: true }) src = '';
|
|
30
|
+
|
|
31
|
+
/** Accessible title / alt text for the SVG. */
|
|
32
|
+
@property({ attribute: 'image-title' }) imageTitle = '';
|
|
33
|
+
|
|
34
|
+
/** Enable click-to-preview lightbox. */
|
|
35
|
+
@property({ type: Boolean, reflect: true }) preview = false;
|
|
36
|
+
|
|
37
|
+
@state() private _loaded = false;
|
|
38
|
+
|
|
39
|
+
@state() private _previewOpen = false;
|
|
40
|
+
|
|
41
|
+
@state() private _svgContent: string = '';
|
|
42
|
+
|
|
43
|
+
// token to avoid stale fetch results
|
|
44
|
+
private _fetchId = 0;
|
|
45
|
+
|
|
46
|
+
private _intersectionObserver: IntersectionObserver | null = null;
|
|
47
|
+
|
|
48
|
+
disconnectedCallback() {
|
|
49
|
+
super.disconnectedCallback();
|
|
50
|
+
this._intersectionObserver?.disconnect();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
firstUpdated() {
|
|
54
|
+
this._setupIntersectionObserver();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
updated(changedProperties: Map<string, unknown>) {
|
|
58
|
+
if (changedProperties.has('src')) {
|
|
59
|
+
// Reset lazy-load state so the new src is fetched when visible
|
|
60
|
+
this._loaded = false;
|
|
61
|
+
this._svgContent = '';
|
|
62
|
+
this._setupIntersectionObserver();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
private _setupIntersectionObserver() {
|
|
67
|
+
this._intersectionObserver?.disconnect();
|
|
68
|
+
|
|
69
|
+
const wrapper = this.shadowRoot?.querySelector('.svg-wrapper');
|
|
70
|
+
if (!wrapper) return;
|
|
71
|
+
|
|
72
|
+
this._intersectionObserver = new IntersectionObserver(
|
|
73
|
+
(entries) => {
|
|
74
|
+
if (entries[0].isIntersecting) {
|
|
75
|
+
this._loaded = true;
|
|
76
|
+
this._intersectionObserver?.disconnect();
|
|
77
|
+
this._fetchSvg();
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
{ rootMargin: '200px' },
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
this._intersectionObserver.observe(wrapper);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
private async _fetchSvg() {
|
|
87
|
+
if (!this.src) return;
|
|
88
|
+
|
|
89
|
+
this._fetchId += 1;
|
|
90
|
+
const currentId = this._fetchId;
|
|
91
|
+
|
|
92
|
+
try {
|
|
93
|
+
const raw = await fetchSVG(this.src);
|
|
94
|
+
if (currentId !== this._fetchId) return;
|
|
95
|
+
|
|
96
|
+
this._svgContent = raw ? sanitizeSvg(raw) : '';
|
|
97
|
+
} catch {
|
|
98
|
+
if (currentId === this._fetchId) {
|
|
99
|
+
this._svgContent = '';
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
private _handleClick() {
|
|
105
|
+
if (this.preview) {
|
|
106
|
+
this._previewOpen = true;
|
|
107
|
+
// Move focus into the dialog after render
|
|
108
|
+
this.updateComplete.then(() => {
|
|
109
|
+
const closeBtn = this.shadowRoot?.querySelector<HTMLElement>('.preview-close');
|
|
110
|
+
closeBtn?.focus();
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private _closePreview(e: Event) {
|
|
116
|
+
e.stopPropagation();
|
|
117
|
+
const wasOpen = this._previewOpen;
|
|
118
|
+
this._previewOpen = false;
|
|
119
|
+
if (wasOpen) {
|
|
120
|
+
// Return focus to the trigger
|
|
121
|
+
const trigger = this.shadowRoot?.querySelector<HTMLElement>('.svg-content');
|
|
122
|
+
trigger?.focus();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
render() {
|
|
127
|
+
return html`
|
|
128
|
+
<div class="svg-wrapper">
|
|
129
|
+
${this._loaded && this._svgContent
|
|
130
|
+
? html`<div
|
|
131
|
+
class="svg-content ${this.preview ? 'clickable' : ''}"
|
|
132
|
+
role=${this.imageTitle ? 'img' : 'presentation'}
|
|
133
|
+
aria-label=${this.imageTitle || ''}
|
|
134
|
+
@click=${this._handleClick}
|
|
135
|
+
>
|
|
136
|
+
${unsafeSVG(this._svgContent)}
|
|
137
|
+
</div>`
|
|
138
|
+
: html`<span class="placeholder" aria-hidden="true"></span>`}
|
|
139
|
+
</div>
|
|
140
|
+
|
|
141
|
+
<div
|
|
142
|
+
class="preview-overlay ${this._previewOpen ? 'open' : ''}"
|
|
143
|
+
role="dialog"
|
|
144
|
+
aria-modal="true"
|
|
145
|
+
aria-label=${this.imageTitle ? `Preview: ${this.imageTitle}` : 'SVG preview'}
|
|
146
|
+
@click=${this._closePreview}
|
|
147
|
+
@keydown=${(e: KeyboardEvent) => e.key === 'Escape' && this._closePreview(e)}
|
|
148
|
+
>
|
|
149
|
+
<button
|
|
150
|
+
class="preview-close"
|
|
151
|
+
aria-label="Close preview"
|
|
152
|
+
@click=${this._closePreview}
|
|
153
|
+
>✕</button>
|
|
154
|
+
<div class="preview-content" @click=${(e: Event) => e.stopPropagation()}>
|
|
155
|
+
${unsafeSVG(this._svgContent)}
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
`;
|
|
159
|
+
}
|
|
160
|
+
}
|
package/src/toolbar/toolbar.ts
CHANGED
|
@@ -33,10 +33,10 @@ import colorStyles from './toolbar-colors.scss';
|
|
|
33
33
|
* ```html
|
|
34
34
|
* <!-- Docked toolbar -->
|
|
35
35
|
* <wc-toolbar>
|
|
36
|
-
* <wc-icon-button variant="text"><wc-icon name="home"></wc-icon></wc-icon-button>
|
|
36
|
+
* <wc-icon-button variant="text" color="surface"><wc-icon name="home"></wc-icon></wc-icon-button>
|
|
37
37
|
* <wc-icon-button variant="tonal"><wc-icon name="search"></wc-icon></wc-icon-button>
|
|
38
|
-
* <wc-icon-button variant="text"><wc-icon name="favorite"></wc-icon></wc-icon-button>
|
|
39
|
-
* <wc-icon-button variant="text"><wc-icon name="account_circle"></wc-icon></wc-icon-button>
|
|
38
|
+
* <wc-icon-button variant="text" color="surface"><wc-icon name="favorite"></wc-icon></wc-icon-button>
|
|
39
|
+
* <wc-icon-button variant="text" color="surface"><wc-icon name="account_circle"></wc-icon></wc-icon-button>
|
|
40
40
|
* </wc-toolbar>
|
|
41
41
|
* ```
|
|
42
42
|
*
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flow-designer-node-XMe-jlKg.js","sources":["../../src/flow-designer/flow-designer-node.ts"],"sourcesContent":["import { html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport IndividualComponent from '@/IndividualComponent.js';\nimport styles from './flow-designer.scss';\nimport type { WorkflowNode } from './types.js';\n\n/**\n * Individual node component for flow designer\n * Renders a single workflow node with customizable slot templates\n *\n * @tag wc-flow-designer-node\n * @rawTag flow-designer-node\n * @wip true\n */\n@IndividualComponent\nexport class FlowDesignerNode extends LitElement {\n static styles = [styles];\n\n /**\n * The workflow node to render\n */\n @property({ type: Object })\n node: WorkflowNode = { id: '', type: 'action', label: '' };\n\n /**\n * Whether this node is currently selected\n */\n @property({ type: Boolean, reflect: true, attribute: 'selected' })\n isSelected: boolean = false;\n\n /**\n * Whether this node is in edit mode\n */\n @property({ type: Boolean, reflect: true, attribute: 'editing' })\n isEditing: boolean = false;\n\n /**\n * Whether this node is disabled\n */\n @property({ type: Boolean, reflect: true })\n disabled: boolean = false;\n\n /**\n * Whether to show the delete button\n */\n @property({ type: Boolean, attribute: 'show-delete' })\n showDelete: boolean = true;\n\n private _handleClick = () => {\n this.dispatchEvent(\n new CustomEvent('node-click', {\n detail: { nodeId: this.node.id },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n private _handleDoubleClick = () => {\n this.dispatchEvent(\n new CustomEvent('node-edit-start', {\n detail: { nodeId: this.node.id },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n private _handleDelete = (e: Event) => {\n e.stopPropagation();\n if (confirm(`Delete \"${this.node.label}\"?`)) {\n this.dispatchEvent(\n new CustomEvent('node-delete', {\n detail: { nodeId: this.node.id },\n bubbles: true,\n composed: true,\n })\n );\n }\n };\n\n private _handleMouseEnter = () => {\n // Node hover state handled via CSS\n };\n\n private _handleMouseLeave = () => {\n // Node hover state handled via CSS\n };\n\n render() {\n const { node, isSelected, isEditing, disabled } = this;\n const nodeType = node.type || 'action';\n\n return html`\n <div\n class=\"node-card ${nodeType}\"\n ?selected=${isSelected}\n ?editing=${isEditing}\n ?disabled=${disabled}\n @click=${this._handleClick}\n @dblclick=${this._handleDoubleClick}\n role=\"button\"\n tabindex=\"0\"\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') this._handleClick();\n }}\n >\n <!-- Customizable header slot -->\n <slot name=\"${nodeType}-header\">\n ${this._renderDefaultHeader()}\n </slot>\n\n <!-- Customizable body slot -->\n <slot name=\"${nodeType}-body\">${this._renderDefaultBody()}</slot>\n\n <!-- Action buttons -->\n ${this.isEditing\n ? html`\n <div class=\"node-actions\">\n <button class=\"btn-sm\" @click=${this._handleDelete}>\n Delete\n </button>\n </div>\n `\n : nothing}\n </div>\n `;\n }\n\n private _renderDefaultHeader() {\n const { node } = this;\n const iconMap: Record<string, string> = {\n trigger: 'play-circle',\n action: 'check-circle',\n decision: 'help-circle',\n loop_start: 'repeat',\n loop_end: 'repeat',\n fork: 'git-branch',\n join: 'git-merge',\n };\n\n const icon = iconMap[node.type] || 'activity';\n\n return html`\n <div class=\"node-header\">\n <wc-icon name=${icon} class=\"node-icon\"></wc-icon>\n <span class=\"node-title\">${node.label}</span>\n </div>\n `;\n }\n\n private _renderDefaultBody() {\n const { node } = this;\n return html`\n <div class=\"node-body\">\n ${node.description\n ? html`<p class=\"node-description\">${node.description}</p>`\n : nothing}\n <div class=\"node-metadata\">\n <span class=\"node-type-tag\">${node.type}</span>\n ${node.id ? html`<span class=\"node-id\">${node.id}</span>` : nothing}\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-flow-designer-node': FlowDesignerNode;\n }\n}\n"],"names":["LitElement","html","nothing","styles","property"],"mappings":"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"}
|