@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.
Files changed (314) hide show
  1. package/dist/BaseButton-BNFAYn-S.js +219 -0
  2. package/dist/BaseButton-BNFAYn-S.js.map +1 -0
  3. package/dist/BaseHyperlinkMixin-BNuwbiEf.js +65 -0
  4. package/dist/BaseHyperlinkMixin-BNuwbiEf.js.map +1 -0
  5. package/dist/BaseInput-14YmcfK7.js +27 -0
  6. package/dist/BaseInput-14YmcfK7.js.map +1 -0
  7. package/dist/assets/components.css +1 -1
  8. package/dist/assets/components.css.map +1 -1
  9. package/dist/assets/styles.css +1 -1
  10. package/dist/assets/styles.css.map +1 -1
  11. package/dist/banner.js +14 -30
  12. package/dist/banner.js.map +1 -1
  13. package/dist/{button-DMN1dPAg.js → button-colors-Ccys3hvS.js} +5 -468
  14. package/dist/button-colors-Ccys3hvS.js.map +1 -0
  15. package/dist/button-group.js +228 -8
  16. package/dist/button-group.js.map +1 -1
  17. package/dist/button.js +294 -8
  18. package/dist/button.js.map +1 -1
  19. package/dist/calendar-column-view.js +634 -0
  20. package/dist/calendar-column-view.js.map +1 -0
  21. package/dist/calendar-event-BrQ_SEKD.js +199 -0
  22. package/dist/calendar-event-BrQ_SEKD.js.map +1 -0
  23. package/dist/calendar-month-view.js +376 -0
  24. package/dist/calendar-month-view.js.map +1 -0
  25. package/dist/calendar.js +339 -0
  26. package/dist/calendar.js.map +1 -0
  27. package/dist/canvas.js +361 -0
  28. package/dist/canvas.js.map +1 -0
  29. package/dist/card.js +18 -73
  30. package/dist/card.js.map +1 -1
  31. package/dist/cb-compound-expression.js +125 -0
  32. package/dist/cb-compound-expression.js.map +1 -0
  33. package/dist/cb-divider.js +150 -0
  34. package/dist/cb-divider.js.map +1 -0
  35. package/dist/cb-expression.js +75 -0
  36. package/dist/cb-expression.js.map +1 -0
  37. package/dist/cb-predicate.js +137 -0
  38. package/dist/cb-predicate.js.map +1 -0
  39. package/dist/chart-bar.js.map +1 -1
  40. package/dist/chart-doughnut.js +2 -2
  41. package/dist/chart-doughnut.js.map +1 -1
  42. package/dist/chart-pie.js +2 -2
  43. package/dist/chart-pie.js.map +1 -1
  44. package/dist/chart-stacked-bar.js.map +1 -1
  45. package/dist/code-editor.js +2 -1
  46. package/dist/code-editor.js.map +1 -1
  47. package/dist/code-highlighter.js +2 -1
  48. package/dist/code-highlighter.js.map +1 -1
  49. package/dist/condition-builder.js +58 -0
  50. package/dist/condition-builder.js.map +1 -0
  51. package/dist/custom-elements-jsdocs.json +10860 -5567
  52. package/dist/custom-elements.json +16180 -7996
  53. package/dist/dropdown-button.js +216 -0
  54. package/dist/dropdown-button.js.map +1 -0
  55. package/dist/event-manager-D-QCmUgR.js +113 -0
  56. package/dist/event-manager-D-QCmUgR.js.map +1 -0
  57. package/dist/fab.js +421 -9
  58. package/dist/fab.js.map +1 -1
  59. package/dist/flow-designer-dZnLJOQT.js +1656 -0
  60. package/dist/flow-designer-dZnLJOQT.js.map +1 -0
  61. package/dist/flow-designer-node-XMe-jlKg.js +548 -0
  62. package/dist/flow-designer-node-XMe-jlKg.js.map +1 -0
  63. package/dist/flow-designer-node.js +4 -0
  64. package/dist/flow-designer-node.js.map +1 -0
  65. package/dist/flow-designer.js +16 -0
  66. package/dist/flow-designer.js.map +1 -0
  67. package/dist/html-editor.js +358 -0
  68. package/dist/html-editor.js.map +1 -0
  69. package/dist/icon-button-CK1ZuE-2.js +247 -0
  70. package/dist/icon-button-CK1ZuE-2.js.map +1 -0
  71. package/dist/index.js +31 -8
  72. package/dist/index.js.map +1 -1
  73. package/dist/{is-dark-mode-DicqGkCJ.js → is-dark-mode-DOcaw4Yq.js} +2 -27
  74. package/dist/is-dark-mode-DOcaw4Yq.js.map +1 -0
  75. package/dist/modal.js +418 -0
  76. package/dist/modal.js.map +1 -0
  77. package/dist/{select-4pl4XBj7.js → navigation-rail-DyO0oAZU.js} +2000 -2767
  78. package/dist/navigation-rail-DyO0oAZU.js.map +1 -0
  79. package/dist/notification-manager.js +268 -0
  80. package/dist/notification-manager.js.map +1 -0
  81. package/dist/notification.js +3 -2
  82. package/dist/notification.js.map +1 -1
  83. package/dist/peacock-loader.js +102 -14
  84. package/dist/peacock-loader.js.map +1 -1
  85. package/dist/popover-NC7b1lTq.js +1971 -0
  86. package/dist/popover-NC7b1lTq.js.map +1 -0
  87. package/dist/popover-content.js +125 -0
  88. package/dist/popover-content.js.map +1 -0
  89. package/dist/popover.js +4 -0
  90. package/dist/popover.js.map +1 -0
  91. package/dist/search.js +4 -0
  92. package/dist/search.js.map +1 -1
  93. package/dist/split-button.js +388 -0
  94. package/dist/split-button.js.map +1 -0
  95. package/dist/src/__controllers/floating-controller.d.ts +35 -0
  96. package/dist/src/__mixins/BaseButtonMixin.d.ts +20 -0
  97. package/dist/src/__mixins/BaseHyperlinkMixin.d.ts +18 -0
  98. package/dist/src/__mixins/MixinConstructor.d.ts +1 -0
  99. package/dist/src/banner/banner.d.ts +0 -4
  100. package/dist/src/button/BaseButton.d.ts +4 -47
  101. package/dist/src/button/button/button.d.ts +32 -3
  102. package/dist/src/button/button-group/button-group.d.ts +2 -2
  103. package/dist/src/button/icon-button/icon-button.d.ts +33 -8
  104. package/dist/src/calendar/base-event.d.ts +10 -0
  105. package/dist/src/calendar/calendar-column-view.d.ts +41 -0
  106. package/dist/src/calendar/calendar-event.d.ts +7 -0
  107. package/dist/src/calendar/calendar-month-view.d.ts +31 -0
  108. package/dist/src/calendar/calendar.d.ts +65 -0
  109. package/dist/src/calendar/event-manager.d.ts +17 -0
  110. package/dist/src/calendar/index.d.ts +4 -0
  111. package/dist/src/calendar/types.d.ts +13 -0
  112. package/dist/src/calendar/utils.d.ts +31 -0
  113. package/dist/src/canvas/canvas.d.ts +92 -0
  114. package/dist/src/canvas/index.d.ts +2 -0
  115. package/dist/src/card/card.d.ts +4 -15
  116. package/dist/src/condition-builder/cb-compound-expression.d.ts +31 -0
  117. package/dist/src/condition-builder/cb-divider.d.ts +26 -0
  118. package/dist/src/condition-builder/cb-expression.d.ts +31 -0
  119. package/dist/src/condition-builder/cb-predicate.d.ts +30 -0
  120. package/dist/src/condition-builder/condition-builder.d.ts +27 -0
  121. package/dist/src/condition-builder/index.d.ts +5 -0
  122. package/dist/src/dropdown-button/dropdown-button.d.ts +68 -0
  123. package/dist/src/dropdown-button/index.d.ts +1 -0
  124. package/dist/src/fab/fab.d.ts +4 -35
  125. package/dist/src/flow-designer/commands.d.ts +66 -0
  126. package/dist/src/flow-designer/flow-designer-node.d.ts +46 -0
  127. package/dist/src/flow-designer/flow-designer.d.ts +133 -0
  128. package/dist/src/flow-designer/index.d.ts +7 -0
  129. package/dist/src/flow-designer/layout.d.ts +30 -0
  130. package/dist/src/flow-designer/types.d.ts +142 -0
  131. package/dist/src/flow-designer/validation.d.ts +43 -0
  132. package/dist/src/flow-designer/workflow-utils.d.ts +40 -0
  133. package/dist/src/focus-ring/focus-ring.d.ts +11 -5
  134. package/dist/src/html-editor/html-editor.d.ts +56 -0
  135. package/dist/src/html-editor/index.d.ts +2 -0
  136. package/dist/src/index.d.ts +16 -1
  137. package/dist/src/link/link.d.ts +1 -1
  138. package/dist/src/menu/menu/menu.d.ts +5 -7
  139. package/dist/src/menu/menu-item/menu-item.d.ts +14 -13
  140. package/dist/src/modal/index.d.ts +1 -0
  141. package/dist/src/modal/modal.d.ts +63 -0
  142. package/dist/src/navigation-rail/index.d.ts +2 -0
  143. package/dist/src/navigation-rail/navigation-rail-item.d.ts +55 -0
  144. package/dist/src/navigation-rail/navigation-rail.d.ts +71 -0
  145. package/dist/src/notification-manager/index.d.ts +1 -0
  146. package/dist/src/notification-manager/notification-manager.d.ts +44 -0
  147. package/dist/src/popover/index.d.ts +2 -0
  148. package/dist/src/popover/popover-content.d.ts +29 -0
  149. package/dist/src/popover/popover.d.ts +62 -0
  150. package/dist/src/sidebar-menu/index.d.ts +3 -0
  151. package/dist/src/sidebar-menu/sidebar-menu-item.d.ts +58 -0
  152. package/dist/src/sidebar-menu/sidebar-menu.d.ts +38 -0
  153. package/dist/src/sidebar-menu/sidebar-sub-menu.d.ts +35 -0
  154. package/dist/src/split-button/index.d.ts +1 -0
  155. package/dist/src/split-button/split-button.d.ts +72 -0
  156. package/dist/src/toolbar/toolbar.d.ts +10 -10
  157. package/dist/src/tooltip/tooltip.d.ts +5 -15
  158. package/dist/src/url-field/index.d.ts +1 -0
  159. package/dist/src/url-field/url-field.d.ts +48 -0
  160. package/dist/test/flow-designer.test.d.ts +1 -0
  161. package/dist/test/sidebar-menu.test.d.ts +1 -0
  162. package/dist/toolbar.js +10 -10
  163. package/dist/toolbar.js.map +1 -1
  164. package/dist/tsconfig.tsbuildinfo +1 -1
  165. package/package.json +4 -2
  166. package/readme.md +73 -65
  167. package/scss/mixin.scss +16 -0
  168. package/src/__controllers/floating-controller.ts +237 -0
  169. package/src/__mixins/BaseButtonMixin.ts +83 -0
  170. package/src/__mixins/BaseHyperlinkMixin.ts +68 -0
  171. package/src/__mixins/MixinConstructor.ts +1 -0
  172. package/src/{__base_element → __mixins}/README.md +2 -2
  173. package/src/banner/banner.scss +20 -25
  174. package/src/banner/banner.ts +1 -7
  175. package/src/button/BaseButton.ts +11 -100
  176. package/src/button/button/button-sizes.scss +4 -2
  177. package/src/button/button/button.ts +77 -23
  178. package/src/button/button-group/button-group.ts +2 -2
  179. package/src/button/icon-button/icon-button.ts +75 -33
  180. package/src/calendar/base-event.ts +49 -0
  181. package/src/calendar/calendar-column-view.scss +326 -0
  182. package/src/calendar/calendar-column-view.ts +392 -0
  183. package/src/calendar/calendar-event.ts +20 -0
  184. package/src/calendar/calendar-month-view.scss +192 -0
  185. package/src/calendar/calendar-month-view.ts +244 -0
  186. package/src/calendar/calendar.scss +71 -0
  187. package/src/calendar/calendar.ts +298 -0
  188. package/src/calendar/event-manager.ts +117 -0
  189. package/src/calendar/index.ts +4 -0
  190. package/src/calendar/types.ts +14 -0
  191. package/src/calendar/utils.ts +180 -0
  192. package/src/canvas/canvas.scss +60 -0
  193. package/src/canvas/canvas.ts +391 -0
  194. package/src/canvas/index.ts +2 -0
  195. package/src/card/card.ts +11 -71
  196. package/src/chart-bar/chart-bar.ts +9 -14
  197. package/src/chart-bar/chart-stacked-bar.ts +12 -18
  198. package/src/chart-doughnut/chart-doughnut.ts +23 -27
  199. package/src/chart-pie/chart-pie.ts +19 -23
  200. package/src/checkbox/checkbox.scss +17 -34
  201. package/src/checkbox/checkbox.ts +3 -1
  202. package/src/code-highlighter/code-highlighter.scss +1 -0
  203. package/src/code-highlighter/code-highlighter.ts +1 -1
  204. package/src/condition-builder/cb-compound-expression.scss +37 -0
  205. package/src/condition-builder/cb-compound-expression.ts +80 -0
  206. package/src/condition-builder/cb-divider.scss +93 -0
  207. package/src/condition-builder/cb-divider.ts +56 -0
  208. package/src/condition-builder/cb-expression.scss +14 -0
  209. package/src/condition-builder/cb-expression.ts +49 -0
  210. package/src/condition-builder/cb-predicate.scss +35 -0
  211. package/src/condition-builder/cb-predicate.ts +102 -0
  212. package/src/condition-builder/condition-builder.scss +13 -0
  213. package/src/condition-builder/condition-builder.ts +38 -0
  214. package/src/condition-builder/index.ts +5 -0
  215. package/src/date-picker/date-picker.ts +1 -1
  216. package/src/dropdown-button/demo/index.html +110 -0
  217. package/src/dropdown-button/dropdown-button.scss +22 -0
  218. package/src/dropdown-button/dropdown-button.ts +206 -0
  219. package/src/dropdown-button/index.ts +1 -0
  220. package/src/elevation/elevation.scss +5 -5
  221. package/src/fab/fab.ts +29 -100
  222. package/src/flow-designer/DEMO.md +239 -0
  223. package/src/flow-designer/commands.ts +278 -0
  224. package/src/flow-designer/flow-designer-node.ts +172 -0
  225. package/src/flow-designer/flow-designer.scss +457 -0
  226. package/src/flow-designer/flow-designer.ts +611 -0
  227. package/src/flow-designer/index.ts +41 -0
  228. package/src/flow-designer/layout.ts +357 -0
  229. package/src/flow-designer/types.ts +166 -0
  230. package/src/flow-designer/validation.ts +284 -0
  231. package/src/flow-designer/workflow-utils.ts +282 -0
  232. package/src/focus-ring/focus-ring.ts +47 -40
  233. package/src/html-editor/html-editor.scss +146 -0
  234. package/src/html-editor/html-editor.ts +276 -0
  235. package/src/html-editor/index.ts +3 -0
  236. package/src/index.ts +28 -1
  237. package/src/input/input.ts +3 -1
  238. package/src/link/link.ts +2 -2
  239. package/src/menu/menu/menu.scss +2 -2
  240. package/src/menu/menu/menu.ts +91 -101
  241. package/src/menu/menu-item/menu-item.scss +4 -0
  242. package/src/menu/menu-item/menu-item.ts +85 -79
  243. package/src/modal/index.ts +1 -0
  244. package/src/modal/modal.scss +206 -0
  245. package/src/modal/modal.ts +201 -0
  246. package/src/navigation-rail/index.ts +2 -0
  247. package/src/navigation-rail/navigation-rail-item.scss +216 -0
  248. package/src/navigation-rail/navigation-rail-item.ts +223 -0
  249. package/src/navigation-rail/navigation-rail.scss +72 -0
  250. package/src/navigation-rail/navigation-rail.ts +149 -0
  251. package/src/notification/notification.ts +3 -2
  252. package/src/notification-manager/index.ts +1 -0
  253. package/src/notification-manager/notification-manager.scss +113 -0
  254. package/src/notification-manager/notification-manager.ts +199 -0
  255. package/src/number-field/number-field.ts +6 -4
  256. package/src/pagination/pagination.ts +6 -4
  257. package/src/peacock-loader.ts +93 -5
  258. package/src/popover/index.ts +2 -0
  259. package/src/popover/popover-content.scss +69 -0
  260. package/src/popover/popover-content.ts +51 -0
  261. package/src/popover/popover.scss +7 -0
  262. package/src/popover/popover.ts +170 -0
  263. package/src/search/search.ts +4 -0
  264. package/src/sidebar-menu/demo/index.html +68 -0
  265. package/src/sidebar-menu/index.ts +3 -0
  266. package/src/sidebar-menu/sidebar-menu-item.scss +102 -0
  267. package/src/sidebar-menu/sidebar-menu-item.ts +151 -0
  268. package/src/{tree-view/tree-view.scss → sidebar-menu/sidebar-menu.scss} +1 -1
  269. package/src/sidebar-menu/sidebar-menu.ts +182 -0
  270. package/src/sidebar-menu/sidebar-sub-menu.scss +130 -0
  271. package/src/sidebar-menu/sidebar-sub-menu.ts +160 -0
  272. package/src/skeleton/skeleton.scss +18 -24
  273. package/src/snackbar/snackbar.ts +1 -1
  274. package/src/split-button/index.ts +1 -0
  275. package/src/split-button/split-button-colors.scss +56 -0
  276. package/src/split-button/split-button-sizes.scss +28 -0
  277. package/src/split-button/split-button.scss +79 -0
  278. package/src/split-button/split-button.ts +236 -0
  279. package/src/table/table.ts +2 -2
  280. package/src/tabs/tab.ts +4 -3
  281. package/src/text/text.css-component.scss +7 -1
  282. package/src/time-picker/time-picker.ts +1 -1
  283. package/src/toolbar/toolbar.ts +10 -10
  284. package/src/tooltip/tooltip.scss +4 -3
  285. package/src/tooltip/tooltip.ts +64 -98
  286. package/src/url-field/index.ts +1 -0
  287. package/src/url-field/url-field.scss +50 -0
  288. package/src/url-field/url-field.ts +239 -0
  289. package/dist/button-DMN1dPAg.js.map +0 -1
  290. package/dist/button-group-CX9CUUXk.js +0 -435
  291. package/dist/button-group-CX9CUUXk.js.map +0 -1
  292. package/dist/fab-C5Nzxk0E.js +0 -497
  293. package/dist/fab-C5Nzxk0E.js.map +0 -1
  294. package/dist/is-dark-mode-DicqGkCJ.js.map +0 -1
  295. package/dist/select-4pl4XBj7.js.map +0 -1
  296. package/dist/spread-B5cgadZl.js +0 -32
  297. package/dist/spread-B5cgadZl.js.map +0 -1
  298. package/dist/src/__base_element/BaseHyperlink.d.ts +0 -20
  299. package/dist/src/menu/menu/MenuSurfaceController.d.ts +0 -18
  300. package/dist/src/tree-view/index.d.ts +0 -2
  301. package/dist/src/tree-view/tree-node.d.ts +0 -69
  302. package/dist/src/tree-view/tree-view.d.ts +0 -40
  303. package/dist/src/tree-view/wc-tree-view.d.ts +0 -6
  304. package/dist/test/tree-view.test.d.ts +0 -1
  305. package/dist/throttle-C7ZAPqtu.js +0 -24
  306. package/dist/throttle-C7ZAPqtu.js.map +0 -1
  307. package/src/__base_element/BaseHyperlink.ts +0 -42
  308. package/src/menu/menu/MenuSurfaceController.ts +0 -61
  309. package/src/tree-view/demo/index.html +0 -57
  310. package/src/tree-view/index.ts +0 -2
  311. package/src/tree-view/tree-node.scss +0 -101
  312. package/src/tree-view/tree-node.ts +0 -268
  313. package/src/tree-view/tree-view.ts +0 -182
  314. 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
- border-start-start-radius: var(--elevation-container-shape-start-start, var(--elevation-container-shape));
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, LitElement, nothing } from 'lit';
2
- import { property, query, state } from 'lit/decorators.js';
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 LitElement {
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.fabElement?.focus();
101
+ this.buttonElement?.focus();
134
102
  }
135
103
 
136
104
  override blur() {
137
- this.fabElement?.blur();
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.fabElement) {
122
+ if (!isActivationClick(event) || !this.buttonElement) {
191
123
  return;
192
124
  }
193
125
 
194
126
  this.focus();
195
- dispatchActivationClick(this.fabElement);
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="fab"
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
- aria-label=${this.label ?? this.name ?? nothing}
229
- aria-disabled=${`${this.disabled}`}
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="fab"
241
- tabindex=${this.#tabindex}
174
+ id="button"
175
+ tabindex=${this.disabled ? '-1' : '0'}
242
176
  href=${ifDefined(this.href)}
243
177
  target=${this.target}
244
- @click=${this.__dispatchClickWithThrottle}
178
+ @click=${this.__dispatchClick}
245
179
  @mousedown=${this.__handlePress}
246
180
  @keydown=${this.__handlePress}
247
181
  @keyup=${this.__handlePress}
248
182
  role="button"
249
- aria-label=${this.label ?? this.name ?? nothing}
250
- aria-disabled=${`${this.disabled}`}
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" .control=${this} .forElement=${this.fabElement}></wc-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
- <wc-icon
267
- class="fab-icon"
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)