@redvars/peacock 3.5.0 → 3.6.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.
- package/dist/BaseButton-BNFAYn-S.js +219 -0
- package/dist/BaseButton-BNFAYn-S.js.map +1 -0
- package/dist/BaseHyperlinkMixin-BNuwbiEf.js +65 -0
- package/dist/BaseHyperlinkMixin-BNuwbiEf.js.map +1 -0
- package/dist/BaseInput-14YmcfK7.js +27 -0
- package/dist/BaseInput-14YmcfK7.js.map +1 -0
- package/dist/assets/components.css +1 -1
- package/dist/assets/components.css.map +1 -1
- package/dist/assets/styles.css +1 -1
- package/dist/assets/styles.css.map +1 -1
- package/dist/banner.js +14 -30
- package/dist/banner.js.map +1 -1
- package/dist/{button-DMN1dPAg.js → button-colors-Ccys3hvS.js} +5 -468
- package/dist/button-colors-Ccys3hvS.js.map +1 -0
- package/dist/button-group.js +228 -8
- package/dist/button-group.js.map +1 -1
- package/dist/button.js +294 -8
- package/dist/button.js.map +1 -1
- package/dist/calendar-column-view.js +634 -0
- package/dist/calendar-column-view.js.map +1 -0
- package/dist/calendar-event-BrQ_SEKD.js +199 -0
- package/dist/calendar-event-BrQ_SEKD.js.map +1 -0
- package/dist/calendar-month-view.js +376 -0
- package/dist/calendar-month-view.js.map +1 -0
- package/dist/calendar.js +339 -0
- package/dist/calendar.js.map +1 -0
- package/dist/canvas.js +361 -0
- package/dist/canvas.js.map +1 -0
- package/dist/card.js +18 -73
- package/dist/card.js.map +1 -1
- package/dist/cb-compound-expression.js +125 -0
- package/dist/cb-compound-expression.js.map +1 -0
- package/dist/cb-divider.js +150 -0
- package/dist/cb-divider.js.map +1 -0
- package/dist/cb-expression.js +75 -0
- package/dist/cb-expression.js.map +1 -0
- package/dist/cb-predicate.js +137 -0
- package/dist/cb-predicate.js.map +1 -0
- package/dist/chart-bar.js.map +1 -1
- package/dist/chart-doughnut.js +2 -2
- package/dist/chart-doughnut.js.map +1 -1
- package/dist/chart-pie.js +2 -2
- package/dist/chart-pie.js.map +1 -1
- package/dist/chart-stacked-bar.js.map +1 -1
- package/dist/code-editor.js +2 -1
- package/dist/code-editor.js.map +1 -1
- package/dist/code-highlighter.js +2 -1
- package/dist/code-highlighter.js.map +1 -1
- package/dist/condition-builder.js +58 -0
- package/dist/condition-builder.js.map +1 -0
- package/dist/custom-elements-jsdocs.json +10860 -5567
- package/dist/custom-elements.json +16180 -7996
- package/dist/dropdown-button.js +216 -0
- package/dist/dropdown-button.js.map +1 -0
- package/dist/event-manager-D-QCmUgR.js +113 -0
- package/dist/event-manager-D-QCmUgR.js.map +1 -0
- package/dist/fab.js +421 -9
- package/dist/fab.js.map +1 -1
- package/dist/flow-designer-dZnLJOQT.js +1656 -0
- package/dist/flow-designer-dZnLJOQT.js.map +1 -0
- package/dist/flow-designer-node-XMe-jlKg.js +548 -0
- package/dist/flow-designer-node-XMe-jlKg.js.map +1 -0
- package/dist/flow-designer-node.js +4 -0
- package/dist/flow-designer-node.js.map +1 -0
- package/dist/flow-designer.js +16 -0
- package/dist/flow-designer.js.map +1 -0
- package/dist/html-editor.js +358 -0
- package/dist/html-editor.js.map +1 -0
- package/dist/icon-button-CK1ZuE-2.js +247 -0
- package/dist/icon-button-CK1ZuE-2.js.map +1 -0
- package/dist/index.js +31 -8
- package/dist/index.js.map +1 -1
- package/dist/{is-dark-mode-DicqGkCJ.js → is-dark-mode-DOcaw4Yq.js} +2 -27
- package/dist/is-dark-mode-DOcaw4Yq.js.map +1 -0
- package/dist/modal.js +418 -0
- package/dist/modal.js.map +1 -0
- package/dist/{select-4pl4XBj7.js → navigation-rail-DyO0oAZU.js} +2000 -2767
- package/dist/navigation-rail-DyO0oAZU.js.map +1 -0
- package/dist/notification-manager.js +268 -0
- package/dist/notification-manager.js.map +1 -0
- package/dist/notification.js +3 -2
- package/dist/notification.js.map +1 -1
- package/dist/peacock-loader.js +102 -14
- package/dist/peacock-loader.js.map +1 -1
- package/dist/popover-NC7b1lTq.js +1971 -0
- package/dist/popover-NC7b1lTq.js.map +1 -0
- package/dist/popover-content.js +125 -0
- package/dist/popover-content.js.map +1 -0
- package/dist/popover.js +4 -0
- package/dist/popover.js.map +1 -0
- package/dist/search.js +4 -0
- package/dist/search.js.map +1 -1
- package/dist/split-button.js +388 -0
- package/dist/split-button.js.map +1 -0
- package/dist/src/__controllers/floating-controller.d.ts +35 -0
- package/dist/src/__mixins/BaseButtonMixin.d.ts +20 -0
- package/dist/src/__mixins/BaseHyperlinkMixin.d.ts +18 -0
- package/dist/src/__mixins/MixinConstructor.d.ts +1 -0
- package/dist/src/banner/banner.d.ts +0 -4
- package/dist/src/button/BaseButton.d.ts +4 -47
- package/dist/src/button/button/button.d.ts +32 -3
- package/dist/src/button/button-group/button-group.d.ts +2 -2
- package/dist/src/button/icon-button/icon-button.d.ts +33 -8
- package/dist/src/calendar/base-event.d.ts +10 -0
- package/dist/src/calendar/calendar-column-view.d.ts +41 -0
- package/dist/src/calendar/calendar-event.d.ts +7 -0
- package/dist/src/calendar/calendar-month-view.d.ts +31 -0
- package/dist/src/calendar/calendar.d.ts +65 -0
- package/dist/src/calendar/event-manager.d.ts +17 -0
- package/dist/src/calendar/index.d.ts +4 -0
- package/dist/src/calendar/types.d.ts +13 -0
- package/dist/src/calendar/utils.d.ts +31 -0
- package/dist/src/canvas/canvas.d.ts +92 -0
- package/dist/src/canvas/index.d.ts +2 -0
- package/dist/src/card/card.d.ts +4 -15
- package/dist/src/condition-builder/cb-compound-expression.d.ts +31 -0
- package/dist/src/condition-builder/cb-divider.d.ts +26 -0
- package/dist/src/condition-builder/cb-expression.d.ts +31 -0
- package/dist/src/condition-builder/cb-predicate.d.ts +30 -0
- package/dist/src/condition-builder/condition-builder.d.ts +27 -0
- package/dist/src/condition-builder/index.d.ts +5 -0
- package/dist/src/dropdown-button/dropdown-button.d.ts +68 -0
- package/dist/src/dropdown-button/index.d.ts +1 -0
- package/dist/src/fab/fab.d.ts +4 -35
- package/dist/src/flow-designer/commands.d.ts +66 -0
- package/dist/src/flow-designer/flow-designer-node.d.ts +46 -0
- package/dist/src/flow-designer/flow-designer.d.ts +133 -0
- package/dist/src/flow-designer/index.d.ts +7 -0
- package/dist/src/flow-designer/layout.d.ts +30 -0
- package/dist/src/flow-designer/types.d.ts +142 -0
- package/dist/src/flow-designer/validation.d.ts +43 -0
- package/dist/src/flow-designer/workflow-utils.d.ts +40 -0
- package/dist/src/focus-ring/focus-ring.d.ts +11 -5
- package/dist/src/html-editor/html-editor.d.ts +56 -0
- package/dist/src/html-editor/index.d.ts +2 -0
- package/dist/src/index.d.ts +16 -1
- package/dist/src/link/link.d.ts +1 -1
- package/dist/src/menu/menu/menu.d.ts +5 -7
- package/dist/src/menu/menu-item/menu-item.d.ts +14 -13
- package/dist/src/modal/index.d.ts +1 -0
- package/dist/src/modal/modal.d.ts +63 -0
- package/dist/src/navigation-rail/index.d.ts +2 -0
- package/dist/src/navigation-rail/navigation-rail-item.d.ts +55 -0
- package/dist/src/navigation-rail/navigation-rail.d.ts +71 -0
- package/dist/src/notification-manager/index.d.ts +1 -0
- package/dist/src/notification-manager/notification-manager.d.ts +44 -0
- package/dist/src/popover/index.d.ts +2 -0
- package/dist/src/popover/popover-content.d.ts +29 -0
- package/dist/src/popover/popover.d.ts +62 -0
- package/dist/src/sidebar-menu/index.d.ts +3 -0
- package/dist/src/sidebar-menu/sidebar-menu-item.d.ts +58 -0
- package/dist/src/sidebar-menu/sidebar-menu.d.ts +38 -0
- package/dist/src/sidebar-menu/sidebar-sub-menu.d.ts +35 -0
- package/dist/src/split-button/index.d.ts +1 -0
- package/dist/src/split-button/split-button.d.ts +72 -0
- package/dist/src/toolbar/toolbar.d.ts +10 -10
- package/dist/src/tooltip/tooltip.d.ts +5 -15
- package/dist/src/url-field/index.d.ts +1 -0
- package/dist/src/url-field/url-field.d.ts +48 -0
- package/dist/test/flow-designer.test.d.ts +1 -0
- package/dist/test/sidebar-menu.test.d.ts +1 -0
- package/dist/toolbar.js +10 -10
- package/dist/toolbar.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -2
- package/readme.md +73 -65
- package/scss/mixin.scss +16 -0
- package/src/__controllers/floating-controller.ts +237 -0
- package/src/__mixins/BaseButtonMixin.ts +83 -0
- package/src/__mixins/BaseHyperlinkMixin.ts +68 -0
- package/src/__mixins/MixinConstructor.ts +1 -0
- package/src/{__base_element → __mixins}/README.md +2 -2
- package/src/banner/banner.scss +20 -25
- package/src/banner/banner.ts +1 -7
- package/src/button/BaseButton.ts +11 -100
- package/src/button/button/button-sizes.scss +4 -2
- package/src/button/button/button.ts +77 -23
- package/src/button/button-group/button-group.ts +2 -2
- package/src/button/icon-button/icon-button.ts +75 -33
- package/src/calendar/base-event.ts +49 -0
- package/src/calendar/calendar-column-view.scss +326 -0
- package/src/calendar/calendar-column-view.ts +392 -0
- package/src/calendar/calendar-event.ts +20 -0
- package/src/calendar/calendar-month-view.scss +192 -0
- package/src/calendar/calendar-month-view.ts +244 -0
- package/src/calendar/calendar.scss +71 -0
- package/src/calendar/calendar.ts +298 -0
- package/src/calendar/event-manager.ts +117 -0
- package/src/calendar/index.ts +4 -0
- package/src/calendar/types.ts +14 -0
- package/src/calendar/utils.ts +180 -0
- package/src/canvas/canvas.scss +60 -0
- package/src/canvas/canvas.ts +391 -0
- package/src/canvas/index.ts +2 -0
- package/src/card/card.ts +11 -71
- package/src/chart-bar/chart-bar.ts +9 -14
- package/src/chart-bar/chart-stacked-bar.ts +12 -18
- package/src/chart-doughnut/chart-doughnut.ts +23 -27
- package/src/chart-pie/chart-pie.ts +19 -23
- package/src/checkbox/checkbox.scss +17 -34
- package/src/checkbox/checkbox.ts +3 -1
- package/src/code-highlighter/code-highlighter.scss +1 -0
- package/src/code-highlighter/code-highlighter.ts +1 -1
- package/src/condition-builder/cb-compound-expression.scss +37 -0
- package/src/condition-builder/cb-compound-expression.ts +80 -0
- package/src/condition-builder/cb-divider.scss +93 -0
- package/src/condition-builder/cb-divider.ts +56 -0
- package/src/condition-builder/cb-expression.scss +14 -0
- package/src/condition-builder/cb-expression.ts +49 -0
- package/src/condition-builder/cb-predicate.scss +35 -0
- package/src/condition-builder/cb-predicate.ts +102 -0
- package/src/condition-builder/condition-builder.scss +13 -0
- package/src/condition-builder/condition-builder.ts +38 -0
- package/src/condition-builder/index.ts +5 -0
- package/src/date-picker/date-picker.ts +1 -1
- package/src/dropdown-button/demo/index.html +110 -0
- package/src/dropdown-button/dropdown-button.scss +22 -0
- package/src/dropdown-button/dropdown-button.ts +206 -0
- package/src/dropdown-button/index.ts +1 -0
- package/src/elevation/elevation.scss +5 -5
- package/src/fab/fab.ts +29 -100
- package/src/flow-designer/DEMO.md +239 -0
- package/src/flow-designer/commands.ts +278 -0
- package/src/flow-designer/flow-designer-node.ts +172 -0
- package/src/flow-designer/flow-designer.scss +457 -0
- package/src/flow-designer/flow-designer.ts +611 -0
- package/src/flow-designer/index.ts +41 -0
- package/src/flow-designer/layout.ts +357 -0
- package/src/flow-designer/types.ts +166 -0
- package/src/flow-designer/validation.ts +284 -0
- package/src/flow-designer/workflow-utils.ts +282 -0
- package/src/focus-ring/focus-ring.ts +47 -40
- package/src/html-editor/html-editor.scss +146 -0
- package/src/html-editor/html-editor.ts +276 -0
- package/src/html-editor/index.ts +3 -0
- package/src/index.ts +28 -1
- package/src/input/input.ts +3 -1
- package/src/link/link.ts +2 -2
- package/src/menu/menu/menu.scss +2 -2
- package/src/menu/menu/menu.ts +91 -101
- package/src/menu/menu-item/menu-item.scss +4 -0
- package/src/menu/menu-item/menu-item.ts +85 -79
- package/src/modal/index.ts +1 -0
- package/src/modal/modal.scss +206 -0
- package/src/modal/modal.ts +201 -0
- package/src/navigation-rail/index.ts +2 -0
- package/src/navigation-rail/navigation-rail-item.scss +216 -0
- package/src/navigation-rail/navigation-rail-item.ts +223 -0
- package/src/navigation-rail/navigation-rail.scss +72 -0
- package/src/navigation-rail/navigation-rail.ts +149 -0
- package/src/notification/notification.ts +3 -2
- package/src/notification-manager/index.ts +1 -0
- package/src/notification-manager/notification-manager.scss +113 -0
- package/src/notification-manager/notification-manager.ts +199 -0
- package/src/number-field/number-field.ts +6 -4
- package/src/pagination/pagination.ts +6 -4
- package/src/peacock-loader.ts +93 -5
- package/src/popover/index.ts +2 -0
- package/src/popover/popover-content.scss +69 -0
- package/src/popover/popover-content.ts +51 -0
- package/src/popover/popover.scss +7 -0
- package/src/popover/popover.ts +170 -0
- package/src/search/search.ts +4 -0
- package/src/sidebar-menu/demo/index.html +68 -0
- package/src/sidebar-menu/index.ts +3 -0
- package/src/sidebar-menu/sidebar-menu-item.scss +102 -0
- package/src/sidebar-menu/sidebar-menu-item.ts +151 -0
- package/src/{tree-view/tree-view.scss → sidebar-menu/sidebar-menu.scss} +1 -1
- package/src/sidebar-menu/sidebar-menu.ts +182 -0
- package/src/sidebar-menu/sidebar-sub-menu.scss +130 -0
- package/src/sidebar-menu/sidebar-sub-menu.ts +160 -0
- package/src/skeleton/skeleton.scss +18 -24
- package/src/snackbar/snackbar.ts +1 -1
- package/src/split-button/index.ts +1 -0
- package/src/split-button/split-button-colors.scss +56 -0
- package/src/split-button/split-button-sizes.scss +28 -0
- package/src/split-button/split-button.scss +79 -0
- package/src/split-button/split-button.ts +236 -0
- package/src/table/table.ts +2 -2
- package/src/tabs/tab.ts +4 -3
- package/src/text/text.css-component.scss +7 -1
- package/src/time-picker/time-picker.ts +1 -1
- package/src/toolbar/toolbar.ts +10 -10
- package/src/tooltip/tooltip.scss +4 -3
- package/src/tooltip/tooltip.ts +64 -98
- package/src/url-field/index.ts +1 -0
- package/src/url-field/url-field.scss +50 -0
- package/src/url-field/url-field.ts +239 -0
- package/dist/button-DMN1dPAg.js.map +0 -1
- package/dist/button-group-CX9CUUXk.js +0 -435
- package/dist/button-group-CX9CUUXk.js.map +0 -1
- package/dist/fab-C5Nzxk0E.js +0 -497
- package/dist/fab-C5Nzxk0E.js.map +0 -1
- package/dist/is-dark-mode-DicqGkCJ.js.map +0 -1
- package/dist/select-4pl4XBj7.js.map +0 -1
- package/dist/spread-B5cgadZl.js +0 -32
- package/dist/spread-B5cgadZl.js.map +0 -1
- package/dist/src/__base_element/BaseHyperlink.d.ts +0 -20
- package/dist/src/menu/menu/MenuSurfaceController.d.ts +0 -18
- package/dist/src/tree-view/index.d.ts +0 -2
- package/dist/src/tree-view/tree-node.d.ts +0 -69
- package/dist/src/tree-view/tree-view.d.ts +0 -40
- package/dist/src/tree-view/wc-tree-view.d.ts +0 -6
- package/dist/test/tree-view.test.d.ts +0 -1
- package/dist/throttle-C7ZAPqtu.js +0 -24
- package/dist/throttle-C7ZAPqtu.js.map +0 -1
- package/src/__base_element/BaseHyperlink.ts +0 -42
- package/src/menu/menu/MenuSurfaceController.ts +0 -61
- package/src/tree-view/demo/index.html +0 -57
- package/src/tree-view/index.ts +0 -2
- package/src/tree-view/tree-node.scss +0 -101
- package/src/tree-view/tree-node.ts +0 -268
- package/src/tree-view/tree-view.ts +0 -182
- package/src/tree-view/wc-tree-view.ts +0 -9
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { html, LitElement } from 'lit';
|
|
2
|
+
import { property, query, state } from 'lit/decorators.js';
|
|
3
|
+
import { classMap } from 'lit/directives/class-map.js';
|
|
4
|
+
import IndividualComponent from '@/IndividualComponent.js';
|
|
5
|
+
import styles from './dropdown-button.scss';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @label Dropdown Button
|
|
9
|
+
* @tag wc-dropdown-button
|
|
10
|
+
* @rawTag dropdown-button
|
|
11
|
+
*
|
|
12
|
+
* @summary A button that opens a dropdown menu when clicked.
|
|
13
|
+
* @overview
|
|
14
|
+
* <p>The dropdown button combines a single button with a dropdown menu. Clicking the button toggles a menu of actions or options. It follows M3 Material Design, keeping a compact control while exposing related actions on demand.</p>
|
|
15
|
+
*
|
|
16
|
+
* @cssprop --dropdown-button-container-shape: Defines the border radius of the dropdown button container shape.
|
|
17
|
+
*
|
|
18
|
+
* @fires {CustomEvent} toggle-menu - Dispatched when the dropdown menu is opened or closed.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```html
|
|
22
|
+
* <wc-dropdown-button>
|
|
23
|
+
* Actions
|
|
24
|
+
* <wc-menu-item slot="menu">Edit</wc-menu-item>
|
|
25
|
+
* <wc-menu-item slot="menu">Delete</wc-menu-item>
|
|
26
|
+
* </wc-dropdown-button>
|
|
27
|
+
* ```
|
|
28
|
+
* @tags controls
|
|
29
|
+
*/
|
|
30
|
+
@IndividualComponent
|
|
31
|
+
export class DropdownButton extends LitElement {
|
|
32
|
+
static override styles = [styles];
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Button size.
|
|
36
|
+
* Possible values are `"xs"`, `"sm"`, `"md"`, `"lg"`, `"xl"`. Defaults to `"sm"`.
|
|
37
|
+
*/
|
|
38
|
+
@property({ reflect: true }) size: 'xs' | 'sm' | 'md' | 'lg' | 'xl' = 'sm';
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* The visual style of the dropdown button.
|
|
42
|
+
*
|
|
43
|
+
* Possible variant values:
|
|
44
|
+
* `"filled"` is a filled button.
|
|
45
|
+
* `"outlined"` is an outlined button.
|
|
46
|
+
* `"text"` is a transparent button.
|
|
47
|
+
* `"tonal"` is a light color button.
|
|
48
|
+
* `"elevated"` is an elevated button.
|
|
49
|
+
*/
|
|
50
|
+
@property({ reflect: true }) variant:
|
|
51
|
+
| 'elevated'
|
|
52
|
+
| 'filled'
|
|
53
|
+
| 'tonal'
|
|
54
|
+
| 'outlined'
|
|
55
|
+
| 'text' = 'filled';
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Defines the primary color of the dropdown button.
|
|
59
|
+
*/
|
|
60
|
+
@property({ reflect: true }) color:
|
|
61
|
+
| 'primary'
|
|
62
|
+
| 'secondary'
|
|
63
|
+
| 'tertiary'
|
|
64
|
+
| 'success'
|
|
65
|
+
| 'danger'
|
|
66
|
+
| 'warning'
|
|
67
|
+
| 'surface'
|
|
68
|
+
| 'on-surface' = 'primary';
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Whether the dropdown button is disabled.
|
|
72
|
+
*/
|
|
73
|
+
@property({ type: Boolean, reflect: true }) disabled = false;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Menu placement relative to the button.
|
|
77
|
+
* Possible values are `"bottom-start"`, `"bottom-end"`, `"top-start"`, `"top-end"`. Defaults to `"bottom-start"`.
|
|
78
|
+
*/
|
|
79
|
+
@property({ reflect: true }) placement:
|
|
80
|
+
| 'bottom-start'
|
|
81
|
+
| 'bottom-end'
|
|
82
|
+
| 'top-start'
|
|
83
|
+
| 'top-end' = 'bottom-start';
|
|
84
|
+
|
|
85
|
+
@state() private _menuOpen = false;
|
|
86
|
+
|
|
87
|
+
@query('.trigger-button') private readonly _triggerButton!: HTMLElement & {
|
|
88
|
+
focus: () => void;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
@query('wc-menu') private readonly _menu!: HTMLElement & {
|
|
92
|
+
open: boolean;
|
|
93
|
+
anchorElement: HTMLElement | null;
|
|
94
|
+
show: () => void;
|
|
95
|
+
close: () => void;
|
|
96
|
+
focus: () => void;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
private _menuId = `dropdown-menu-${Math.random().toString(36).slice(2, 9)}`;
|
|
100
|
+
|
|
101
|
+
override focus() {
|
|
102
|
+
this._triggerButton?.focus();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
private _onButtonClick(event: MouseEvent) {
|
|
106
|
+
event.stopPropagation();
|
|
107
|
+
if (this.disabled) return;
|
|
108
|
+
|
|
109
|
+
if (this._menuOpen) {
|
|
110
|
+
this._menu?.close();
|
|
111
|
+
} else {
|
|
112
|
+
this._menu.anchorElement = this;
|
|
113
|
+
this._menu?.show();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
private _onMenuOpened = () => {
|
|
118
|
+
this._menuOpen = true;
|
|
119
|
+
this.dispatchEvent(
|
|
120
|
+
new CustomEvent('toggle-menu', {
|
|
121
|
+
detail: { open: true },
|
|
122
|
+
bubbles: true,
|
|
123
|
+
composed: true,
|
|
124
|
+
}),
|
|
125
|
+
);
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
private _onMenuClosed = () => {
|
|
129
|
+
this._menuOpen = false;
|
|
130
|
+
this.dispatchEvent(
|
|
131
|
+
new CustomEvent('toggle-menu', {
|
|
132
|
+
detail: { open: false },
|
|
133
|
+
bubbles: true,
|
|
134
|
+
composed: true,
|
|
135
|
+
}),
|
|
136
|
+
);
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
private _onKeyDown = (event: KeyboardEvent) => {
|
|
140
|
+
if (this.disabled) return;
|
|
141
|
+
|
|
142
|
+
if (event.key === 'ArrowDown' && !this._menuOpen) {
|
|
143
|
+
event.preventDefault();
|
|
144
|
+
this._menu.anchorElement = this;
|
|
145
|
+
this._menu?.show();
|
|
146
|
+
requestAnimationFrame(() => this._menu?.focus());
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (event.key === 'Escape' && this._menuOpen) {
|
|
150
|
+
this._menu?.close();
|
|
151
|
+
this._triggerButton?.focus();
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
override connectedCallback() {
|
|
156
|
+
super.connectedCallback();
|
|
157
|
+
this.addEventListener('keydown', this._onKeyDown);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
override disconnectedCallback() {
|
|
161
|
+
this.removeEventListener('keydown', this._onKeyDown);
|
|
162
|
+
super.disconnectedCallback();
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
override render() {
|
|
166
|
+
const buttonClasses = {
|
|
167
|
+
'trigger-button': true,
|
|
168
|
+
active: this._menuOpen,
|
|
169
|
+
disabled: this.disabled,
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
return html`
|
|
173
|
+
<wc-button
|
|
174
|
+
class=${classMap(buttonClasses)}
|
|
175
|
+
size=${this.size}
|
|
176
|
+
variant=${this.variant}
|
|
177
|
+
color=${this.color}
|
|
178
|
+
icon-align="end"
|
|
179
|
+
?disabled=${this.disabled}
|
|
180
|
+
.configAria=${{
|
|
181
|
+
'aria-haspopup': 'menu',
|
|
182
|
+
'aria-expanded': String(this._menuOpen),
|
|
183
|
+
'aria-controls': this._menuId,
|
|
184
|
+
}}
|
|
185
|
+
@click=${this._onButtonClick}
|
|
186
|
+
>
|
|
187
|
+
<slot></slot>
|
|
188
|
+
<wc-icon
|
|
189
|
+
slot="icon"
|
|
190
|
+
name="arrow_drop_down"
|
|
191
|
+
class="dropdown-icon"
|
|
192
|
+
aria-hidden="true"
|
|
193
|
+
></wc-icon>
|
|
194
|
+
</wc-button>
|
|
195
|
+
|
|
196
|
+
<wc-menu
|
|
197
|
+
id=${this._menuId}
|
|
198
|
+
placement=${this.placement}
|
|
199
|
+
@opened=${this._onMenuOpened}
|
|
200
|
+
@closed=${this._onMenuClosed}
|
|
201
|
+
>
|
|
202
|
+
<slot name="menu"></slot>
|
|
203
|
+
</wc-menu>
|
|
204
|
+
`;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DropdownButton } from './dropdown-button.js';
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
@use '../../scss/mixin';
|
|
2
|
+
|
|
3
|
+
@include mixin.base-styles;
|
|
4
|
+
|
|
1
5
|
/**
|
|
2
6
|
* Derived from Material Design Elevation
|
|
3
7
|
* https://github.com/material-components/material-web/blob/main/elevation/internal/_elevation.scss
|
|
@@ -7,11 +11,7 @@
|
|
|
7
11
|
.shadow,
|
|
8
12
|
.shadow::before,
|
|
9
13
|
.shadow::after {
|
|
10
|
-
|
|
11
|
-
border-start-end-radius: var(--elevation-container-shape-start-end, var(--elevation-container-shape));
|
|
12
|
-
border-end-start-radius: var(--elevation-container-shape-end-start, var(--elevation-container-shape));
|
|
13
|
-
border-end-end-radius: var(--elevation-container-shape-end-end, var(--elevation-container-shape));
|
|
14
|
-
corner-shape: var(--elevation-container-shape-variant);
|
|
14
|
+
@include mixin.apply-container-shape(elevation);
|
|
15
15
|
|
|
16
16
|
inset: 0;
|
|
17
17
|
position: absolute;
|
package/src/fab/fab.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { html,
|
|
2
|
-
import { property,
|
|
1
|
+
import { html, nothing } from 'lit';
|
|
2
|
+
import { property, state } from 'lit/decorators.js';
|
|
3
3
|
import { classMap } from 'lit/directives/class-map.js';
|
|
4
4
|
import { ifDefined } from 'lit/directives/if-defined.js';
|
|
5
5
|
|
|
@@ -8,10 +8,10 @@ import { dispatchActivationClick, isActivationClick } from '@/__utils/dispatch-e
|
|
|
8
8
|
import { throttle } from '@/__utils/throttle.js';
|
|
9
9
|
import { spread } from '@/__directive/spread.js';
|
|
10
10
|
|
|
11
|
-
import { IconProvider } from '../icon/icon.js';
|
|
12
11
|
import styles from './fab.scss';
|
|
13
12
|
import colorStyles from './fab-colors.scss';
|
|
14
13
|
import sizeStyles from './fab-sizes.scss';
|
|
14
|
+
import { BaseButton } from '@/button/BaseButton.js';
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* @label FAB
|
|
@@ -31,32 +31,17 @@ import sizeStyles from './fab-sizes.scss';
|
|
|
31
31
|
*
|
|
32
32
|
* @example
|
|
33
33
|
* ```html
|
|
34
|
-
* <wc-fab name="add"></wc-fab>
|
|
34
|
+
* <wc-fab><wc-icon name="add"></wc-icon></wc-fab>
|
|
35
35
|
* ```
|
|
36
36
|
* @tags controls
|
|
37
37
|
*/
|
|
38
38
|
@IndividualComponent
|
|
39
|
-
export class Fab extends
|
|
39
|
+
export class Fab extends BaseButton {
|
|
40
40
|
static override styles = [styles, colorStyles, sizeStyles];
|
|
41
41
|
|
|
42
42
|
#id = crypto.randomUUID();
|
|
43
|
+
|
|
43
44
|
|
|
44
|
-
#tabindex?: number = 0;
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Name of the icon to display inside the FAB.
|
|
48
|
-
*/
|
|
49
|
-
@property({ type: String, reflect: true }) name?: string;
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Source URL for a custom icon.
|
|
53
|
-
*/
|
|
54
|
-
@property({ type: String, reflect: true }) src?: string;
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Icon provider. Defaults to `"material-symbols"`.
|
|
58
|
-
*/
|
|
59
|
-
@property({ type: String }) provider: IconProvider = 'material-symbols';
|
|
60
45
|
|
|
61
46
|
/**
|
|
62
47
|
* Optional label text for the extended FAB variant.
|
|
@@ -93,21 +78,6 @@ export class Fab extends LitElement {
|
|
|
93
78
|
*/
|
|
94
79
|
@property({ type: Boolean, reflect: true }) lowered: boolean = false;
|
|
95
80
|
|
|
96
|
-
/**
|
|
97
|
-
* If `true`, the user cannot interact with the FAB.
|
|
98
|
-
*/
|
|
99
|
-
@property({ type: Boolean, reflect: true }) disabled: boolean = false;
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Hyperlink to navigate to on click.
|
|
103
|
-
*/
|
|
104
|
-
@property({ reflect: true }) href?: string;
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Sets or retrieves the window or frame at which to target content.
|
|
108
|
-
*/
|
|
109
|
-
@property() target: string = '_self';
|
|
110
|
-
|
|
111
81
|
/**
|
|
112
82
|
* Additional ARIA attributes to pass to the inner button/anchor element.
|
|
113
83
|
*/
|
|
@@ -127,26 +97,12 @@ export class Fab extends LitElement {
|
|
|
127
97
|
@state()
|
|
128
98
|
isPressed = false;
|
|
129
99
|
|
|
130
|
-
@query('.fab') readonly fabElement!: HTMLElement | null;
|
|
131
|
-
|
|
132
100
|
override focus() {
|
|
133
|
-
this.
|
|
101
|
+
this.buttonElement?.focus();
|
|
134
102
|
}
|
|
135
103
|
|
|
136
104
|
override blur() {
|
|
137
|
-
this.
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
override connectedCallback() {
|
|
141
|
-
super.connectedCallback();
|
|
142
|
-
this.addEventListener('click', this.__dispatchClickWithThrottle);
|
|
143
|
-
window.addEventListener('mouseup', this.__handlePress);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
override disconnectedCallback() {
|
|
147
|
-
window.removeEventListener('mouseup', this.__handlePress);
|
|
148
|
-
this.removeEventListener('click', this.__dispatchClickWithThrottle);
|
|
149
|
-
super.disconnectedCallback();
|
|
105
|
+
this.buttonElement?.blur();
|
|
150
106
|
}
|
|
151
107
|
|
|
152
108
|
override firstUpdated() {
|
|
@@ -156,30 +112,6 @@ export class Fab extends LitElement {
|
|
|
156
112
|
);
|
|
157
113
|
}
|
|
158
114
|
|
|
159
|
-
__handlePress = (event: KeyboardEvent | MouseEvent) => {
|
|
160
|
-
if (this.disabled) return;
|
|
161
|
-
if (
|
|
162
|
-
event instanceof KeyboardEvent &&
|
|
163
|
-
event.type === 'keydown' &&
|
|
164
|
-
(event.key === 'Enter' || event.key === ' ')
|
|
165
|
-
) {
|
|
166
|
-
this.isPressed = true;
|
|
167
|
-
} else if (event.type === 'mousedown') {
|
|
168
|
-
this.isPressed = true;
|
|
169
|
-
} else {
|
|
170
|
-
this.isPressed = false;
|
|
171
|
-
}
|
|
172
|
-
};
|
|
173
|
-
|
|
174
|
-
__isLink() {
|
|
175
|
-
return !!this.href;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
__dispatchClickWithThrottle: (event: MouseEvent | KeyboardEvent) => void =
|
|
179
|
-
event => {
|
|
180
|
-
this.__dispatchClick(event);
|
|
181
|
-
};
|
|
182
|
-
|
|
183
115
|
__dispatchClick = (event: MouseEvent | KeyboardEvent) => {
|
|
184
116
|
if (this.disabled && this.href) {
|
|
185
117
|
event.stopImmediatePropagation();
|
|
@@ -187,12 +119,12 @@ export class Fab extends LitElement {
|
|
|
187
119
|
return;
|
|
188
120
|
}
|
|
189
121
|
|
|
190
|
-
if (!isActivationClick(event) || !this.
|
|
122
|
+
if (!isActivationClick(event) || !this.buttonElement) {
|
|
191
123
|
return;
|
|
192
124
|
}
|
|
193
125
|
|
|
194
126
|
this.focus();
|
|
195
|
-
dispatchActivationClick(this.
|
|
127
|
+
dispatchActivationClick(this.buttonElement);
|
|
196
128
|
};
|
|
197
129
|
|
|
198
130
|
__getDisabledReasonID() {
|
|
@@ -204,6 +136,7 @@ export class Fab extends LitElement {
|
|
|
204
136
|
const isExtended = !!this.label;
|
|
205
137
|
|
|
206
138
|
const cssClasses = {
|
|
139
|
+
button: true,
|
|
207
140
|
fab: true,
|
|
208
141
|
'fab-element': true,
|
|
209
142
|
[`size-${this.size}`]: true,
|
|
@@ -218,15 +151,16 @@ export class Fab extends LitElement {
|
|
|
218
151
|
if (!isLink) {
|
|
219
152
|
return html`<button
|
|
220
153
|
class=${classMap(cssClasses)}
|
|
221
|
-
id="
|
|
222
|
-
tabindex=${this.#tabindex}
|
|
154
|
+
id="button"
|
|
223
155
|
type="button"
|
|
224
156
|
@click=${this.__dispatchClickWithThrottle}
|
|
225
157
|
@mousedown=${this.__handlePress}
|
|
226
158
|
@keydown=${this.__handlePress}
|
|
227
159
|
@keyup=${this.__handlePress}
|
|
228
|
-
|
|
229
|
-
aria-
|
|
160
|
+
|
|
161
|
+
aria-describedby=${ifDefined(this.softDisabled ? BaseButton.DISABLED_REASON_ID : undefined)}
|
|
162
|
+
?aria-disabled=${this.softDisabled}
|
|
163
|
+
|
|
230
164
|
?disabled=${this.disabled}
|
|
231
165
|
${spread(this.configAria)}
|
|
232
166
|
>
|
|
@@ -237,17 +171,19 @@ export class Fab extends LitElement {
|
|
|
237
171
|
|
|
238
172
|
return html`<a
|
|
239
173
|
class=${classMap(cssClasses)}
|
|
240
|
-
id="
|
|
241
|
-
tabindex=${this
|
|
174
|
+
id="button"
|
|
175
|
+
tabindex=${this.disabled ? '-1' : '0'}
|
|
242
176
|
href=${ifDefined(this.href)}
|
|
243
177
|
target=${this.target}
|
|
244
|
-
@click=${this.
|
|
178
|
+
@click=${this.__dispatchClick}
|
|
245
179
|
@mousedown=${this.__handlePress}
|
|
246
180
|
@keydown=${this.__handlePress}
|
|
247
181
|
@keyup=${this.__handlePress}
|
|
248
182
|
role="button"
|
|
249
|
-
|
|
250
|
-
aria-
|
|
183
|
+
|
|
184
|
+
aria-describedby=${ifDefined(this.softDisabled ? BaseButton.DISABLED_REASON_ID : undefined)}
|
|
185
|
+
?aria-disabled=${this.softDisabled}
|
|
186
|
+
|
|
251
187
|
${spread(this.configAria)}
|
|
252
188
|
>
|
|
253
189
|
${this.__renderFabContent(isExtended)}
|
|
@@ -257,29 +193,22 @@ export class Fab extends LitElement {
|
|
|
257
193
|
|
|
258
194
|
__renderFabContent(isExtended: boolean) {
|
|
259
195
|
return html`
|
|
260
|
-
<wc-focus-ring class="focus-ring"
|
|
196
|
+
<wc-focus-ring class="focus-ring" for='button'></wc-focus-ring>
|
|
261
197
|
<wc-elevation class="elevation"></wc-elevation>
|
|
262
198
|
<div class="background"></div>
|
|
263
199
|
<wc-ripple class="ripple"></wc-ripple>
|
|
200
|
+
<wc-skeleton class="skeleton"></wc-skeleton>
|
|
264
201
|
|
|
265
202
|
<div class="fab-content">
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
name=${ifDefined(this.name)}
|
|
269
|
-
src=${ifDefined(this.src)}
|
|
270
|
-
provider=${this.provider}
|
|
271
|
-
></wc-icon>
|
|
203
|
+
|
|
204
|
+
<slot></slot>
|
|
272
205
|
${isExtended
|
|
273
206
|
? html`<span class="fab-label">${this.label}</span>`
|
|
274
207
|
: nothing}
|
|
275
208
|
</div>
|
|
209
|
+
|
|
210
|
+
${this.__renderDisabledReason(this.softDisabled)}
|
|
276
211
|
`;
|
|
277
212
|
}
|
|
278
213
|
|
|
279
|
-
__renderTooltip() {
|
|
280
|
-
if (this.tooltip) {
|
|
281
|
-
return html`<wc-tooltip for="fab">${this.tooltip}</wc-tooltip>`;
|
|
282
|
-
}
|
|
283
|
-
return nothing;
|
|
284
|
-
}
|
|
285
214
|
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
# Flow Designer Component Demo
|
|
2
|
+
|
|
3
|
+
## Basic Usage
|
|
4
|
+
|
|
5
|
+
```html
|
|
6
|
+
<wc-flow-designer id="designer"></wc-flow-designer>
|
|
7
|
+
|
|
8
|
+
<script type="module">
|
|
9
|
+
import { FlowDesigner, Workflow } from '@redvars/peacock';
|
|
10
|
+
|
|
11
|
+
// Define a workflow
|
|
12
|
+
const workflow = {
|
|
13
|
+
workflow_id: 'demo_workflow',
|
|
14
|
+
nodes: {
|
|
15
|
+
id: 'start',
|
|
16
|
+
type: 'trigger',
|
|
17
|
+
label: 'Start Process',
|
|
18
|
+
children: [
|
|
19
|
+
{
|
|
20
|
+
id: 'validate',
|
|
21
|
+
type: 'decision',
|
|
22
|
+
label: 'Data Valid?',
|
|
23
|
+
branches: {
|
|
24
|
+
yes: [
|
|
25
|
+
{
|
|
26
|
+
id: 'process',
|
|
27
|
+
type: 'action',
|
|
28
|
+
label: 'Process Data',
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
no: [
|
|
32
|
+
{
|
|
33
|
+
id: 'error',
|
|
34
|
+
type: 'action',
|
|
35
|
+
label: 'Log Error',
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// Set workflow on component
|
|
45
|
+
const designer = document.getElementById('designer');
|
|
46
|
+
designer.workflow = workflow;
|
|
47
|
+
|
|
48
|
+
// Listen for changes
|
|
49
|
+
designer.addEventListener('workflow-changed', (e) => {
|
|
50
|
+
console.log('Workflow changed:', e.detail.type);
|
|
51
|
+
console.log('Updated workflow:', e.detail.workflow);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// Add a new node
|
|
55
|
+
const newNode = {
|
|
56
|
+
id: 'new_action',
|
|
57
|
+
type: 'action',
|
|
58
|
+
label: 'New Action'
|
|
59
|
+
};
|
|
60
|
+
designer.addNode(newNode, 'start');
|
|
61
|
+
|
|
62
|
+
// Undo/Redo
|
|
63
|
+
if (designer.canUndo()) {
|
|
64
|
+
designer.undo();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (designer.canRedo()) {
|
|
68
|
+
designer.redo();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Validate
|
|
72
|
+
designer.validate();
|
|
73
|
+
|
|
74
|
+
// Export
|
|
75
|
+
const json = designer.exportWorkflow();
|
|
76
|
+
</script>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Customizing Node Templates
|
|
80
|
+
|
|
81
|
+
```html
|
|
82
|
+
<wc-flow-designer id="designer">
|
|
83
|
+
<!-- Custom trigger node template -->
|
|
84
|
+
<div slot="trigger-header" style="color: green; font-weight: bold;">
|
|
85
|
+
🚀 Custom Trigger
|
|
86
|
+
</div>
|
|
87
|
+
|
|
88
|
+
<!-- Custom action node template -->
|
|
89
|
+
<div slot="action-header" style="color: blue;">
|
|
90
|
+
⚙️ Custom Action
|
|
91
|
+
</div>
|
|
92
|
+
<p slot="action-body">Custom action content here</p>
|
|
93
|
+
|
|
94
|
+
<!-- Custom decision template -->
|
|
95
|
+
<div slot="decision-header" style="color: orange;">
|
|
96
|
+
❓ Custom Decision
|
|
97
|
+
</div>
|
|
98
|
+
</wc-flow-designer>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Workflow Structure
|
|
102
|
+
|
|
103
|
+
The component supports complex workflows:
|
|
104
|
+
|
|
105
|
+
```javascript
|
|
106
|
+
{
|
|
107
|
+
workflow_id: 'complex_workflow',
|
|
108
|
+
nodes: {
|
|
109
|
+
id: 'trigger_1',
|
|
110
|
+
type: 'trigger',
|
|
111
|
+
label: 'Input Received',
|
|
112
|
+
|
|
113
|
+
// Sequential flow
|
|
114
|
+
children: [
|
|
115
|
+
{
|
|
116
|
+
id: 'loop_1',
|
|
117
|
+
type: 'loop_start',
|
|
118
|
+
label: 'Begin Loop',
|
|
119
|
+
|
|
120
|
+
children: [
|
|
121
|
+
{
|
|
122
|
+
id: 'decision_1',
|
|
123
|
+
type: 'decision',
|
|
124
|
+
label: 'Check Condition',
|
|
125
|
+
|
|
126
|
+
// Conditional branching
|
|
127
|
+
branches: {
|
|
128
|
+
yes: [
|
|
129
|
+
{
|
|
130
|
+
id: 'fork_1',
|
|
131
|
+
type: 'fork',
|
|
132
|
+
label: 'Parallel Tasks',
|
|
133
|
+
|
|
134
|
+
// Parallel execution
|
|
135
|
+
tasks: [
|
|
136
|
+
{ id: 'task_1', type: 'action', label: 'Task A' },
|
|
137
|
+
{ id: 'task_2', type: 'action', label: 'Task B' }
|
|
138
|
+
],
|
|
139
|
+
|
|
140
|
+
// Join point
|
|
141
|
+
join: {
|
|
142
|
+
id: 'join_1',
|
|
143
|
+
type: 'join',
|
|
144
|
+
label: 'Merge',
|
|
145
|
+
children: [
|
|
146
|
+
{
|
|
147
|
+
id: 'loop_end_1',
|
|
148
|
+
type: 'loop_end',
|
|
149
|
+
label: 'Loop Back',
|
|
150
|
+
target_id: 'loop_1'
|
|
151
|
+
}
|
|
152
|
+
]
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
],
|
|
156
|
+
no: [
|
|
157
|
+
{ id: 'skip', type: 'action', label: 'Skip' }
|
|
158
|
+
]
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
]
|
|
162
|
+
}
|
|
163
|
+
]
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Available Node Types
|
|
169
|
+
|
|
170
|
+
- **trigger** - Start of workflow
|
|
171
|
+
- **action** - Perform an action
|
|
172
|
+
- **decision** - Branch on condition (yes/no)
|
|
173
|
+
- **loop_start** - Begin loop
|
|
174
|
+
- **loop_end** - End loop (loop_start target)
|
|
175
|
+
- **fork** - Parallel execution start
|
|
176
|
+
- **join** - Parallel execution end
|
|
177
|
+
|
|
178
|
+
## Events
|
|
179
|
+
|
|
180
|
+
- `workflow-changed` - Emitted when workflow is modified
|
|
181
|
+
- `node-selected` - Emitted when node is clicked
|
|
182
|
+
- `node-edited` - Emitted when node is edited
|
|
183
|
+
- `node-deleted` - Emitted when node is deleted
|
|
184
|
+
- `validation-result` - Emitted when validate() is called
|
|
185
|
+
|
|
186
|
+
## Properties
|
|
187
|
+
|
|
188
|
+
- `workflow: Workflow` - Current workflow definition
|
|
189
|
+
- `readonly: boolean` - Read-only mode (default: false)
|
|
190
|
+
- `disabled: boolean` - Disabled state (default: false)
|
|
191
|
+
- `showValidation: boolean` - Show validation errors (default: false)
|
|
192
|
+
|
|
193
|
+
## Methods
|
|
194
|
+
|
|
195
|
+
- `addNode(node, parentId, connectionType?, branchKey?)` - Add node
|
|
196
|
+
- `deleteNode(nodeId)` - Delete node
|
|
197
|
+
- `editNode(nodeId, updates)` - Edit node
|
|
198
|
+
- `moveNode(nodeId, newParentId, newIndex, connectionType?, branchKey?)` - Move node
|
|
199
|
+
- `undo()` - Undo last operation
|
|
200
|
+
- `redo()` - Redo last undone operation
|
|
201
|
+
- `canUndo()` - Check if undo available
|
|
202
|
+
- `canRedo()` - Check if redo available
|
|
203
|
+
- `validate()` - Validate workflow
|
|
204
|
+
- `exportWorkflow()` - Export as JSON
|
|
205
|
+
|
|
206
|
+
## Validation
|
|
207
|
+
|
|
208
|
+
The component automatically validates workflows after each change:
|
|
209
|
+
|
|
210
|
+
- ✅ Detects circular loops
|
|
211
|
+
- ✅ Detects orphaned nodes
|
|
212
|
+
- ✅ Validates decision branches (yes/no)
|
|
213
|
+
- ✅ Validates fork/join pairs
|
|
214
|
+
- ✅ Validates loop targets
|
|
215
|
+
|
|
216
|
+
Invalid workflows will prompt user confirmation before accepting changes.
|
|
217
|
+
|
|
218
|
+
## Styling
|
|
219
|
+
|
|
220
|
+
Custom CSS properties available:
|
|
221
|
+
|
|
222
|
+
```css
|
|
223
|
+
wc-flow-designer {
|
|
224
|
+
--flow-designer-height: 600px;
|
|
225
|
+
--flow-designer-border-color: var(--color-outline-variant);
|
|
226
|
+
--flow-designer-background: var(--color-surface);
|
|
227
|
+
--flow-designer-border-radius: var(--shape-corner-medium);
|
|
228
|
+
--flow-designer-action-bar-bg: var(--color-surface-container);
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## Keyboard Shortcuts
|
|
233
|
+
|
|
234
|
+
- **Ctrl+Z** / **Cmd+Z** - Undo
|
|
235
|
+
- **Ctrl+Y** / **Cmd+Y** - Redo
|
|
236
|
+
- **Delete** - Delete selected node
|
|
237
|
+
- **Enter** / **Space** - Select/activate node
|
|
238
|
+
- **Click + Drag** - Pan canvas
|
|
239
|
+
- **Scroll** - Zoom in/out (via toolbar)
|