@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
+ @use "../../scss/mixin";
2
+
3
+ @include mixin.base-styles;
4
+
5
+ :host {
6
+ display: contents;
7
+
8
+ --modal-container-color: var(--color-surface-container-high, #ece6f0);
9
+ --modal-scrim-color: rgba(0, 0, 0, 0.32);
10
+ --modal-shape: var(--shape-corner-extra-large, 28px);
11
+ --modal-min-width: 280px;
12
+ --modal-max-width: 560px;
13
+ --modal-max-height: 90dvh;
14
+ --modal-transition-duration: var(--duration-medium2, 300ms);
15
+ --modal-transition-easing: var(--easing-emphasized, cubic-bezier(0.2, 0, 0, 1));
16
+ --modal-heading-color: var(--color-on-surface, #1c1b1f);
17
+ --modal-subheading-color: var(--color-on-surface-variant, #49454f);
18
+ --modal-content-color: var(--color-on-surface-variant, #49454f);
19
+ --modal-divider-color: var(--color-outline-variant, #cac4d0);
20
+ --modal-elevation: var(--elevation-level3, 0 4px 8px 3px rgba(0, 0, 0, 0.15), 0 1px 3px rgba(0, 0, 0, 0.3));
21
+ }
22
+
23
+ /* Scrim backdrop */
24
+ .scrim {
25
+ background-color: var(--modal-scrim-color);
26
+ inset: 0;
27
+ opacity: 0;
28
+ pointer-events: none;
29
+ position: fixed;
30
+ transition: opacity var(--modal-transition-duration) var(--modal-transition-easing);
31
+ z-index: 1000;
32
+ }
33
+
34
+ .scrim.visible {
35
+ opacity: 1;
36
+ pointer-events: auto;
37
+ }
38
+
39
+ /* Dialog wrapper — centres the dialog on screen */
40
+ .dialog-wrapper {
41
+ align-items: center;
42
+ display: flex;
43
+ inset: 0;
44
+ justify-content: center;
45
+ overflow-y: auto;
46
+ padding: var(--spacing-400, 2rem) var(--spacing-200, 1rem);
47
+ position: fixed;
48
+ z-index: 1001;
49
+ }
50
+
51
+ /* Dialog container */
52
+ .dialog {
53
+ background-color: var(--modal-container-color);
54
+ border-radius: var(--modal-shape);
55
+ box-shadow: var(--modal-elevation);
56
+ display: flex;
57
+ flex-direction: column;
58
+ max-height: var(--modal-max-height);
59
+ max-width: var(--modal-max-width);
60
+ min-width: var(--modal-min-width);
61
+ opacity: 0;
62
+ outline: none;
63
+ overflow: hidden;
64
+ position: relative;
65
+ transform: scale(0.9);
66
+ width: 100%;
67
+
68
+ &.open {
69
+ animation: modal-enter var(--modal-transition-duration) var(--modal-transition-easing) forwards;
70
+ }
71
+
72
+ &:not(.open) {
73
+ animation: modal-exit var(--modal-transition-duration) var(--modal-transition-easing) forwards;
74
+ }
75
+ }
76
+
77
+ /* Sizes */
78
+ .dialog.size-xs {
79
+ --modal-max-width: 320px;
80
+ }
81
+
82
+ .dialog.size-sm {
83
+ --modal-max-width: 420px;
84
+ }
85
+
86
+ .dialog.size-md {
87
+ --modal-max-width: 560px;
88
+ }
89
+
90
+ .dialog.size-lg {
91
+ --modal-max-width: 800px;
92
+ }
93
+
94
+ .dialog.size-fullscreen {
95
+ --modal-max-width: 100%;
96
+ --modal-max-height: 100%;
97
+ border-radius: 0;
98
+ max-height: 100dvh;
99
+ max-width: 100vw;
100
+ }
101
+
102
+ .dialog-wrapper:has(.dialog.size-fullscreen) {
103
+ padding: 0;
104
+ }
105
+
106
+ /* Header */
107
+ .dialog-header {
108
+ align-items: flex-start;
109
+ display: flex;
110
+ gap: var(--spacing-200, 1rem);
111
+ padding: var(--spacing-300, 1.5rem) var(--spacing-300, 1.5rem) var(--spacing-200, 1rem);
112
+ }
113
+
114
+ .dialog-heading-section {
115
+ flex: 1;
116
+ min-width: 0;
117
+ }
118
+
119
+ .dialog-subheading {
120
+ color: var(--modal-subheading-color);
121
+ font-family: var(--typography-label-medium-font-family, sans-serif);
122
+ font-size: var(--typography-label-medium-font-size, 0.75rem);
123
+ font-weight: var(--typography-label-medium-font-weight, 500);
124
+ letter-spacing: var(--typography-label-medium-letter-spacing, 0.05em);
125
+ line-height: var(--typography-label-medium-line-height, 1.25rem);
126
+ margin: 0 0 var(--spacing-050, 0.25rem);
127
+ text-transform: uppercase;
128
+ }
129
+
130
+ .dialog-heading {
131
+ color: var(--modal-heading-color);
132
+ font-family: var(--typography-headline-small-font-family, sans-serif);
133
+ font-size: var(--typography-headline-small-font-size, 1.5rem);
134
+ font-weight: var(--typography-headline-small-font-weight, 400);
135
+ letter-spacing: var(--typography-headline-small-letter-spacing, 0);
136
+ line-height: var(--typography-headline-small-line-height, 2rem);
137
+ margin: 0;
138
+ }
139
+
140
+ .dialog-close {
141
+ flex-shrink: 0;
142
+ margin-block-start: -0.25rem;
143
+ margin-inline-end: -0.25rem;
144
+ }
145
+
146
+ /* Body content */
147
+ .dialog-content {
148
+ color: var(--modal-content-color);
149
+ flex: 1 1 auto;
150
+ overflow-y: auto;
151
+ padding: 0 var(--spacing-300, 1.5rem) var(--spacing-300, 1.5rem);
152
+ }
153
+
154
+ /* When there is no header */
155
+ .dialog:not(:has(.dialog-header)) .dialog-content {
156
+ padding-top: var(--spacing-300, 1.5rem);
157
+ }
158
+
159
+ /* Footer */
160
+ .dialog-footer {
161
+ border-top: 1px solid transparent;
162
+ }
163
+
164
+ .dialog-footer:has(slot:not(:empty)),
165
+ .dialog-footer slot::slotted(*) {
166
+ border-top-color: var(--modal-divider-color);
167
+ }
168
+
169
+ /* Loading overlay */
170
+ .dialog-loader {
171
+ align-items: center;
172
+ display: flex;
173
+ inset: 0;
174
+ justify-content: center;
175
+ position: absolute;
176
+ }
177
+
178
+ .dialog-loader-scrim {
179
+ background-color: var(--modal-container-color);
180
+ inset: 0;
181
+ opacity: 0.72;
182
+ position: absolute;
183
+ }
184
+
185
+ /* Animations */
186
+ @keyframes modal-enter {
187
+ from {
188
+ opacity: 0;
189
+ transform: scale(0.9);
190
+ }
191
+ to {
192
+ opacity: 1;
193
+ transform: scale(1);
194
+ }
195
+ }
196
+
197
+ @keyframes modal-exit {
198
+ from {
199
+ opacity: 1;
200
+ transform: scale(1);
201
+ }
202
+ to {
203
+ opacity: 0;
204
+ transform: scale(0.9);
205
+ }
206
+ }
@@ -0,0 +1,201 @@
1
+ import { LitElement, html, nothing } from 'lit';
2
+ import { property, state } from 'lit/decorators.js';
3
+ import { classMap } from 'lit/directives/class-map.js';
4
+ import IndividualComponent from '../IndividualComponent.js';
5
+ import styles from './modal.scss';
6
+
7
+ type ModalSize = 'xs' | 'sm' | 'md' | 'lg' | 'fullscreen';
8
+
9
+ /**
10
+ * @label Modal
11
+ * @tag wc-modal
12
+ * @rawTag modal-wc
13
+ * @summary A Material Design 3 dialog/modal for displaying content in a layer above the page, with optional header, body, and footer slots.
14
+ *
15
+ * @cssprop --modal-container-color - Background color of the dialog container.
16
+ * @cssprop --modal-scrim-color - Color of the scrim backdrop.
17
+ * @cssprop --modal-shape - Corner radius of the dialog container.
18
+ * @cssprop --modal-min-width - Minimum width of the dialog.
19
+ * @cssprop --modal-max-width - Maximum width of the dialog.
20
+ * @cssprop --modal-max-height - Maximum height of the dialog.
21
+ *
22
+ * @example
23
+ * ```html
24
+ * <wc-modal open heading="Confirm Action">
25
+ * <p>Are you sure you want to continue?</p>
26
+ * <div slot="footer">
27
+ * <wc-button variant="text">Cancel</wc-button>
28
+ * <wc-button>Confirm</wc-button>
29
+ * </div>
30
+ * </wc-modal>
31
+ * ```
32
+ * @tags overlay, dialog, feedback
33
+ */
34
+ @IndividualComponent
35
+ export class Modal extends LitElement {
36
+ static styles = [styles];
37
+
38
+ /** Whether the modal is open. */
39
+ @property({ type: Boolean, reflect: true }) open = false;
40
+
41
+ /** Heading text shown in the modal header. */
42
+ @property({ type: String, reflect: true }) heading = '';
43
+
44
+ /** Optional subheading / label text shown above the heading. */
45
+ @property({ type: String, reflect: true }) subheading = '';
46
+
47
+ /**
48
+ * Size of the modal dialog.
49
+ * - `"xs"`: Extra-small.
50
+ * - `"sm"`: Small.
51
+ * - `"md"`: Medium (default).
52
+ * - `"lg"`: Large.
53
+ * - `"fullscreen"`: Full-screen dialog.
54
+ */
55
+ @property({ type: String, reflect: true }) size: ModalSize = 'md';
56
+
57
+ /** When true, hides the close button in the header. */
58
+ @property({ type: Boolean, reflect: true, attribute: 'hide-close' })
59
+ hideClose = false;
60
+
61
+ /** When true, renders a loading overlay inside the modal. */
62
+ @property({ type: Boolean, reflect: true, attribute: 'show-loader' })
63
+ showLoader = false;
64
+
65
+ /** When true, clicking the scrim will not close the modal. */
66
+ @property({ type: Boolean, attribute: 'no-scrim-close' }) noScrimClose = false;
67
+
68
+ @state() private _visible = false;
69
+
70
+ show() {
71
+ this.open = true;
72
+ }
73
+
74
+ hide() {
75
+ this._close('programmatic');
76
+ }
77
+
78
+ private _close(reason: string) {
79
+ if (!this.open) return;
80
+ this.open = false;
81
+ this.dispatchEvent(
82
+ new CustomEvent('modal-close', {
83
+ detail: { reason },
84
+ bubbles: true,
85
+ composed: true,
86
+ }),
87
+ );
88
+ }
89
+
90
+ private _handleScrimClick() {
91
+ if (!this.noScrimClose) {
92
+ this._close('scrim');
93
+ }
94
+ }
95
+
96
+ private _handleCloseClick() {
97
+ this._close('close-button');
98
+ }
99
+
100
+ private readonly _handleKeydown = (e: KeyboardEvent) => {
101
+ if (e.key === 'Escape') {
102
+ this._close('escape');
103
+ }
104
+ };
105
+
106
+ protected updated(changedProperties: Map<string, unknown>) {
107
+ if (changedProperties.has('open')) {
108
+ if (this.open) {
109
+ this._visible = true;
110
+ document.body.style.overflow = 'hidden';
111
+ document.addEventListener('keydown', this._handleKeydown);
112
+ } else {
113
+ document.body.style.overflow = '';
114
+ document.removeEventListener('keydown', this._handleKeydown);
115
+ }
116
+ }
117
+ }
118
+
119
+ disconnectedCallback() {
120
+ super.disconnectedCallback();
121
+ document.body.style.overflow = '';
122
+ document.removeEventListener('keydown', this._handleKeydown);
123
+ }
124
+
125
+ private _handleAnimationEnd(e: AnimationEvent) {
126
+ if (e.animationName === 'modal-exit') {
127
+ this._visible = false;
128
+ }
129
+ }
130
+
131
+ render() {
132
+ if (!this.open && !this._visible) return nothing;
133
+
134
+ const hasHeader = this.heading || this.subheading || !this.hideClose;
135
+
136
+ return html`
137
+ <div
138
+ class=${classMap({ scrim: true, visible: this.open })}
139
+ @click=${this._handleScrimClick}
140
+ aria-hidden="true"
141
+ ></div>
142
+
143
+ <div class="dialog-wrapper" role="presentation">
144
+ <div
145
+ class=${classMap({
146
+ dialog: true,
147
+ open: this.open,
148
+ [`size-${this.size}`]: true,
149
+ 'show-loader': this.showLoader,
150
+ })}
151
+ role="dialog"
152
+ aria-modal="true"
153
+ aria-labelledby=${this.heading ? 'modal-heading' : nothing}
154
+ @animationend=${this._handleAnimationEnd}
155
+ >
156
+ ${hasHeader
157
+ ? html`
158
+ <div class="dialog-header">
159
+ <div class="dialog-heading-section">
160
+ ${this.subheading
161
+ ? html`<p class="dialog-subheading">${this.subheading}</p>`
162
+ : nothing}
163
+ ${this.heading
164
+ ? html`<h2 id="modal-heading" class="dialog-heading">
165
+ ${this.heading}
166
+ </h2>`
167
+ : nothing}
168
+ </div>
169
+ ${!this.hideClose
170
+ ? html`<wc-icon-button
171
+ class="dialog-close"
172
+ variant="text"
173
+ aria-label="Close dialog"
174
+ @click=${this._handleCloseClick}
175
+ >
176
+ <wc-icon name="close"></wc-icon>
177
+ </wc-icon-button>`
178
+ : nothing}
179
+ </div>
180
+ `
181
+ : nothing}
182
+
183
+ <div class="dialog-content">
184
+ <slot></slot>
185
+ </div>
186
+
187
+ <div class="dialog-footer">
188
+ <slot name="footer"></slot>
189
+ </div>
190
+
191
+ ${this.showLoader
192
+ ? html`<div class="dialog-loader" aria-hidden="true">
193
+ <div class="dialog-loader-scrim"></div>
194
+ <wc-spinner></wc-spinner>
195
+ </div>`
196
+ : nothing}
197
+ </div>
198
+ </div>
199
+ `;
200
+ }
201
+ }
@@ -0,0 +1,2 @@
1
+ export { NavigationRail } from './navigation-rail.js';
2
+ export { NavigationRailItem } from './navigation-rail-item.js';
@@ -0,0 +1,216 @@
1
+ @use '../../scss/mixin';
2
+
3
+ @include mixin.base-styles;
4
+
5
+ :host {
6
+ display: block;
7
+ }
8
+
9
+ /* Reset native button/link styles */
10
+ .item-element {
11
+ background: transparent;
12
+ border: none;
13
+ appearance: none;
14
+ margin: 0;
15
+ outline: none;
16
+ text-decoration: none;
17
+ text-align: unset;
18
+ color: inherit;
19
+ }
20
+
21
+ .item {
22
+ position: relative;
23
+ display: flex;
24
+ flex-direction: column;
25
+ align-items: center;
26
+ justify-content: center;
27
+ width: 100%;
28
+ min-height: 3.5rem; /* 56dp */
29
+ padding-block: 0.25rem; /* 4dp vertical padding */
30
+ cursor: pointer;
31
+ gap: 0.25rem; /* 4dp gap between indicator and label */
32
+ box-sizing: border-box;
33
+
34
+ /* Color tokens */
35
+ --_inactive-icon-color: var(--nav-rail-inactive-icon-color, var(--color-on-surface-variant));
36
+ --_active-icon-color: var(--nav-rail-active-icon-color, var(--color-on-secondary-container));
37
+ --_inactive-label-color: var(--nav-rail-inactive-label-color, var(--color-on-surface-variant));
38
+ --_active-label-color: var(--nav-rail-active-label-color, var(--color-on-surface));
39
+ --_indicator-color: var(--nav-rail-indicator-color, var(--color-secondary-container));
40
+ --_indicator-shape: var(--nav-rail-indicator-shape, var(--shape-corner-full));
41
+ --_indicator-width: var(--nav-rail-indicator-width, 3.5rem); /* 56dp */
42
+ --_indicator-height: var(--nav-rail-indicator-height, 2rem); /* 32dp */
43
+ --_state-color: var(--_inactive-icon-color);
44
+
45
+ /* Focus ring */
46
+ .focus-ring {
47
+ z-index: 3;
48
+ --focus-ring-container-shape-start-start: var(--shape-corner-small);
49
+ --focus-ring-container-shape-start-end: var(--shape-corner-small);
50
+ --focus-ring-container-shape-end-start: var(--shape-corner-small);
51
+ --focus-ring-container-shape-end-end: var(--shape-corner-small);
52
+ }
53
+
54
+ /* Active indicator (pill behind icon) */
55
+ .indicator {
56
+ position: relative;
57
+ display: flex;
58
+ align-items: center;
59
+ justify-content: center;
60
+ width: var(--_indicator-width);
61
+ height: var(--_indicator-height);
62
+ border-radius: var(--_indicator-shape);
63
+ overflow: hidden;
64
+ flex-shrink: 0;
65
+ transition: background-color var(--duration-short4, 200ms) var(--easing-standard, ease);
66
+
67
+ .icon-container {
68
+ display: flex;
69
+ align-items: center;
70
+ justify-content: center;
71
+ z-index: 1;
72
+ position: relative;
73
+ pointer-events: none;
74
+
75
+ ::slotted(*) {
76
+ --icon-size: 1.5rem; /* 24dp */
77
+ --icon-color: var(--_inactive-icon-color);
78
+ color: var(--_inactive-icon-color);
79
+ display: flex;
80
+ }
81
+ }
82
+ }
83
+
84
+ /* State layer for hover/press */
85
+ .state-layer {
86
+ position: absolute;
87
+ top: 0.25rem;
88
+ left: 50%;
89
+ transform: translateX(-50%);
90
+ width: var(--_indicator-width);
91
+ height: var(--_indicator-height);
92
+ pointer-events: none;
93
+ background-color: var(--_state-color);
94
+ opacity: 0;
95
+ z-index: 0;
96
+ border-radius: var(--_indicator-shape);
97
+ transition: opacity var(--duration-short4, 200ms) var(--easing-standard, ease);
98
+ }
99
+
100
+ .ripple {
101
+ z-index: 1;
102
+ --ripple-pressed-color: var(--_state-color);
103
+ --ripple-state-opacity: 0;
104
+ border-radius: var(--shape-corner-small, 4px);
105
+ }
106
+
107
+ /* Label */
108
+ .label {
109
+ @include mixin.get-typography('label-medium');
110
+ color: var(--_inactive-label-color);
111
+ text-align: center;
112
+ pointer-events: none;
113
+ z-index: 1;
114
+ transition: color var(--duration-short4, 200ms) var(--easing-standard, ease),
115
+ font-weight var(--duration-short4, 200ms) var(--easing-standard, ease);
116
+ }
117
+
118
+ /* Active icon slot: hidden by default */
119
+ .active-icon-slot {
120
+ display: none;
121
+ }
122
+
123
+ .hidden-slot {
124
+ display: none;
125
+ }
126
+
127
+ /* Item content layout */
128
+ .item-content {
129
+ display: flex;
130
+ flex-direction: column;
131
+ align-items: center;
132
+ gap: 0.25rem;
133
+ width: 100%;
134
+ z-index: 1;
135
+ }
136
+
137
+ /* Active state */
138
+ &.active {
139
+ --_state-color: var(--_active-icon-color);
140
+
141
+ .indicator {
142
+ background-color: var(--_indicator-color);
143
+
144
+ .icon-container {
145
+ ::slotted(*) {
146
+ --icon-color: var(--_active-icon-color);
147
+ color: var(--_active-icon-color);
148
+ }
149
+ }
150
+ }
151
+
152
+ .label {
153
+ color: var(--_active-label-color);
154
+ font-weight: var(--typography-label-medium-font-weight-bold, 700);
155
+ }
156
+ }
157
+
158
+ /* Active icon slot: show when active and slot has content */
159
+ &.active.has-active-icon {
160
+ .active-icon-slot {
161
+ display: flex;
162
+ }
163
+
164
+ .icon-slot {
165
+ display: none;
166
+ }
167
+ }
168
+
169
+ /* Hover state */
170
+ &:hover:not(.disabled) {
171
+ .state-layer {
172
+ opacity: 0.08;
173
+ }
174
+ }
175
+
176
+ /* Pressed state */
177
+ &.pressed:not(.disabled) {
178
+ .state-layer {
179
+ opacity: 0.12;
180
+ }
181
+ }
182
+
183
+ /* Disabled state */
184
+ &.disabled {
185
+ cursor: not-allowed;
186
+
187
+ .indicator {
188
+ .icon-container {
189
+ ::slotted(*) {
190
+ --icon-color: var(--color-on-surface);
191
+ color: var(--color-on-surface);
192
+ opacity: 0.38;
193
+ }
194
+ }
195
+ }
196
+
197
+ .label {
198
+ color: var(--color-on-surface);
199
+ opacity: 0.38;
200
+ }
201
+
202
+ .ripple {
203
+ display: none;
204
+ }
205
+ }
206
+ }
207
+
208
+ @media (prefers-reduced-motion: reduce) {
209
+ .item {
210
+ .indicator,
211
+ .state-layer,
212
+ .label {
213
+ transition: none;
214
+ }
215
+ }
216
+ }