@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,20 @@
1
+ import { BaseEvent } from './base-event.js';
2
+
3
+ export class CalendarEvent extends BaseEvent {
4
+ data: any;
5
+ title: string;
6
+ color?: string;
7
+
8
+ constructor(
9
+ start: Date,
10
+ end: Date,
11
+ title: string,
12
+ color: string | undefined,
13
+ data: any,
14
+ ) {
15
+ super(start, end);
16
+ this.data = data;
17
+ if (color) this.color = color;
18
+ this.title = title;
19
+ }
20
+ }
@@ -0,0 +1,192 @@
1
+ @use '../../scss/mixin';
2
+
3
+ @include mixin.base-styles;
4
+
5
+ :host {
6
+ display: block;
7
+ height: 100%;
8
+ --calendar-border-color: var(--color-outline-variant);
9
+ --calendar-scale-color: var(--color-outline-variant);
10
+ --scale-size: 3rem;
11
+ }
12
+
13
+ .scale {
14
+ width: var(--scale-size);
15
+ flex-shrink: 0;
16
+ }
17
+
18
+ .calendar-month-view {
19
+ display: flex;
20
+ flex-direction: column;
21
+ height: 100%;
22
+ }
23
+
24
+ /* ── Header ── */
25
+ .view-header {
26
+ background: var(--color-surface-container);
27
+ display: flex;
28
+ border-bottom: 1px solid var(--calendar-border-color);
29
+
30
+ .columns {
31
+ display: flex;
32
+ flex: 1;
33
+
34
+ .column {
35
+ flex: 1;
36
+ border-inline-start: 1px solid var(--calendar-border-color);
37
+
38
+ &:first-child {
39
+ border-inline-start: 0;
40
+ }
41
+
42
+ .column-content {
43
+ display: flex;
44
+ align-items: center;
45
+ padding: 0.5rem 0.75rem;
46
+ gap: 0.5rem;
47
+ }
48
+
49
+ .day {
50
+ font-size: 0.875rem;
51
+ font-weight: 500;
52
+ color: var(--color-on-surface-variant);
53
+ }
54
+ }
55
+ }
56
+
57
+ .scrollbar-placeholder {
58
+ width: var(--scrollbar-width, 0px);
59
+ }
60
+ }
61
+
62
+ /* ── View body ── */
63
+ .view-body {
64
+ height: 100%;
65
+ overflow-y: auto;
66
+
67
+ .view-body-scroll {
68
+ display: flex;
69
+ position: relative;
70
+ min-height: 100%;
71
+
72
+ .drawing-area {
73
+ flex: 1;
74
+
75
+ .multi-day-section {
76
+ border-bottom: 1px solid var(--calendar-scale-color);
77
+ min-height: 8rem;
78
+
79
+ .multi-day-body-scroll {
80
+ position: relative;
81
+ height: 100%;
82
+ }
83
+
84
+ .multi-day-background {
85
+ display: flex;
86
+ height: 100%;
87
+ position: absolute;
88
+ width: 100%;
89
+
90
+ .columns {
91
+ display: flex;
92
+ flex: 1;
93
+
94
+ .column {
95
+ min-height: 8rem;
96
+ flex: 1;
97
+ border-inline-start: 1px solid var(--calendar-scale-color);
98
+
99
+ &:first-child {
100
+ border-inline-start: 0;
101
+ }
102
+
103
+ .column-header {
104
+ font-size: 0.75rem;
105
+ color: var(--color-on-surface-variant);
106
+ padding-inline-start: 0.5rem;
107
+ padding-top: 0.375rem;
108
+ border-top: 3px solid transparent;
109
+ }
110
+
111
+ &.today {
112
+ background: color-mix(in srgb, var(--color-primary) 6%, transparent);
113
+
114
+ .column-header {
115
+ border-top-color: var(--color-primary);
116
+ }
117
+ }
118
+ }
119
+ }
120
+ }
121
+
122
+ .multi-events {
123
+ min-height: 4rem;
124
+ padding-top: 2rem;
125
+ height: 100%;
126
+
127
+ .row {
128
+ height: 1.8rem;
129
+ box-sizing: content-box;
130
+ position: relative;
131
+ padding-bottom: 0.25rem;
132
+
133
+ &:last-child {
134
+ padding-bottom: 0;
135
+ }
136
+ }
137
+
138
+ .row-spacer {
139
+ height: 0.75rem;
140
+ }
141
+
142
+ .event {
143
+ position: absolute;
144
+ height: 1.8rem;
145
+ text-overflow: ellipsis;
146
+ overflow: hidden;
147
+
148
+ .event-title {
149
+ padding: 0.25rem 0.375rem;
150
+ font-size: 0.75rem;
151
+ font-weight: 500;
152
+ white-space: nowrap;
153
+ overflow: hidden;
154
+ text-overflow: ellipsis;
155
+ }
156
+
157
+ &.clickable {
158
+ cursor: pointer;
159
+ }
160
+ }
161
+ }
162
+ }
163
+ }
164
+ }
165
+ }
166
+
167
+ /* ── Event styles ── */
168
+ .event {
169
+ background: var(--calendar-event-bg-color);
170
+ border-inline-start: 0.25rem solid var(--calendar-event-border-color);
171
+ border-radius: var(--shape-corner-extra-small);
172
+ color: var(--calendar-event-text-color);
173
+ transition: background 150ms ease;
174
+
175
+ &.clickable {
176
+ &:hover {
177
+ background: var(--calendar-event-bg-color--hover);
178
+ color: var(--calendar-event-text-color--hover);
179
+ }
180
+ }
181
+ }
182
+
183
+ /* ── Today highlighting ── */
184
+ .calendar-month-view .view-body .view-body-scroll .drawing-area .multi-day-section .multi-day-background .columns .column {
185
+ &.today {
186
+ background: color-mix(in srgb, var(--color-primary) 6%, transparent);
187
+
188
+ .column-header {
189
+ border-top-color: var(--color-primary);
190
+ }
191
+ }
192
+ }
@@ -0,0 +1,244 @@
1
+ import { LitElement, html, nothing } from 'lit';
2
+ import { property, state } from 'lit/decorators.js';
3
+ import {
4
+ addDays,
5
+ differenceInDays,
6
+ startOfDay,
7
+ endOfDay,
8
+ calculateMonthRange,
9
+ formatDate,
10
+ getTimePercent,
11
+ LONG_EVENT_PADDING,
12
+ } from './utils.js';
13
+ import { BaseEvent } from './base-event.js';
14
+ import { CalendarEvent } from './calendar-event.js';
15
+ import { MonthEventManager } from './event-manager.js';
16
+ import type { ColumnEvent } from './event-manager.js';
17
+ import IndividualComponent from '@/IndividualComponent.js';
18
+ import styles from './calendar-month-view.scss';
19
+
20
+ /**
21
+ * @label Calendar Month View
22
+ * @tag wc-calendar-month-view
23
+ * @rawTag calendar-month-view
24
+ * @parentRawTag calendar
25
+ * @summary Internal month view component for the calendar.
26
+ */
27
+ @IndividualComponent
28
+ export class CalendarMonthView extends LitElement {
29
+ static styles = [styles];
30
+
31
+ @property({ type: Array })
32
+ events: CalendarEvent[] = [];
33
+
34
+ @property({ type: Boolean, attribute: 'event-clickable' })
35
+ eventClickable: boolean = true;
36
+
37
+ @property({ type: Object, attribute: false })
38
+ currentTime: Date = new Date();
39
+
40
+ @property({ type: Object, attribute: false })
41
+ contextDate: Date = new Date();
42
+
43
+ @state()
44
+ private dateRange: any = {};
45
+
46
+ @state()
47
+ private weekDayEvents: ColumnEvent[][][] = [];
48
+
49
+ override connectedCallback() {
50
+ super.connectedCallback();
51
+ this._processEvents();
52
+ }
53
+
54
+ override willUpdate(changedProperties: Map<string, unknown>) {
55
+ if (
56
+ changedProperties.has('events') ||
57
+ changedProperties.has('contextDate')
58
+ ) {
59
+ this._processEvents();
60
+ }
61
+ }
62
+
63
+ override firstUpdated() {
64
+ const viewBody = this.renderRoot.querySelector('.view-body');
65
+ if (viewBody) {
66
+ const viewBodyHeight = viewBody.scrollHeight;
67
+ viewBody.scrollTo({
68
+ top:
69
+ (getTimePercent(this.currentTime) / 100) * viewBodyHeight - 150,
70
+ });
71
+ }
72
+ }
73
+
74
+ private _processEvents() {
75
+ this.dateRange = calculateMonthRange(this.contextDate, 1);
76
+ this.weekDayEvents = [];
77
+
78
+ for (
79
+ let i = new Date(this.dateRange.startDate), j = 0;
80
+ j < 6;
81
+ i = addDays(i, 7), j++
82
+ ) {
83
+ const manager = new MonthEventManager();
84
+ manager.addEvents(
85
+ this.events.filter(event =>
86
+ event.isOverlapping(
87
+ new BaseEvent(startOfDay(i), endOfDay(addDays(i, 6))),
88
+ ),
89
+ ),
90
+ );
91
+ manager.process();
92
+ this.weekDayEvents.push(manager.columns);
93
+ }
94
+ }
95
+
96
+ private _getDatePercent(date: Date, dateRangeStartDate: Date): number {
97
+ const currentDay = differenceInDays(startOfDay(date), dateRangeStartDate);
98
+ const percent = (currentDay / 7) * 100;
99
+ if (percent < 0) return 0;
100
+ if (percent > 100) return 100;
101
+ return percent;
102
+ }
103
+
104
+ private _getDayClass(date: Date): string {
105
+ const diff = differenceInDays(
106
+ startOfDay(date),
107
+ startOfDay(this.currentTime),
108
+ );
109
+ if (diff === 0) return 'column today';
110
+ if (diff < 0) return 'column past';
111
+ return 'column future';
112
+ }
113
+
114
+ private _populateColorVars(
115
+ styles: Record<string, string>,
116
+ color: string,
117
+ ) {
118
+ styles['--calendar-event-bg-color'] = `var(--color-${color}-container)`;
119
+ styles['--calendar-event-bg-color--hover'] = `var(--color-inverse-${color})`;
120
+ styles['--calendar-event-border-color'] = `var(--color-${color})`;
121
+ styles['--calendar-event-text-color'] = `var(--color-on-${color}-container)`;
122
+ styles['--calendar-event-text-color--hover'] = `var(--color-on-${color})`;
123
+ }
124
+
125
+ private _emitEventClick(event: any) {
126
+ this.dispatchEvent(
127
+ new CustomEvent('month-view-event-click', {
128
+ detail: { event },
129
+ bubbles: true,
130
+ composed: true,
131
+ }),
132
+ );
133
+ }
134
+
135
+ private _renderHeader() {
136
+ const columns: any[] = [];
137
+ for (
138
+ let i = new Date(this.dateRange.startDate), j = 0;
139
+ j < 7;
140
+ i = addDays(i, 1), j++
141
+ ) {
142
+ columns.push(html`
143
+ <div class="column">
144
+ <div class="column-content">
145
+ <div class="day">${formatDate(i, 'EEEE')}</div>
146
+ </div>
147
+ </div>
148
+ `);
149
+ }
150
+ return columns;
151
+ }
152
+
153
+ private _renderMultiDayBackground(sd: Date) {
154
+ const columns: any[] = [];
155
+ for (let i = new Date(sd), j = 0; j < 7; i = addDays(i, 1), j++) {
156
+ columns.push(html`
157
+ <div class=${this._getDayClass(i)}>
158
+ <div class="column-content">
159
+ <div class="column-header">
160
+ <div class="day">${formatDate(i, 'd')}</div>
161
+ </div>
162
+ </div>
163
+ </div>
164
+ `);
165
+ }
166
+ return columns;
167
+ }
168
+
169
+ private _renderEvents() {
170
+ return this.weekDayEvents.map((eventDay, index) => {
171
+ const weekStartDate = addDays(this.dateRange.startDate, index * 7);
172
+ return html`
173
+ <div class="multi-day-section">
174
+ <div class="multi-day-body-scroll">
175
+ <div class="multi-day-background">
176
+ <div class="columns">
177
+ ${this._renderMultiDayBackground(weekStartDate)}
178
+ </div>
179
+ </div>
180
+ <div class="multi-events">
181
+ <div class="row-content">
182
+ ${eventDay.map(
183
+ nodes => html`
184
+ <div class="row">
185
+ ${nodes.map(node => {
186
+ const evtCls = this.eventClickable
187
+ ? 'event clickable'
188
+ : 'event';
189
+ const evtStyles: Record<string, string> = {
190
+ left: `${this._getDatePercent(node.start, weekStartDate) + LONG_EVENT_PADDING}%`,
191
+ width: `${this._getDatePercent(addDays(node.end, 1), weekStartDate) - this._getDatePercent(node.start, weekStartDate) - 2 * LONG_EVENT_PADDING}%`,
192
+ };
193
+ if (node.color) {
194
+ this._populateColorVars(evtStyles, node.color);
195
+ }
196
+ return html`
197
+ <div
198
+ class=${evtCls}
199
+ style=${this._styleMap(evtStyles)}
200
+ @click=${() => {
201
+ if (this.eventClickable)
202
+ this._emitEventClick(node.data);
203
+ }}
204
+ >
205
+ <div class="event-title">
206
+ ${node.title || '(no title)'}
207
+ </div>
208
+ </div>
209
+ `;
210
+ })}
211
+ </div>
212
+ `,
213
+ )}
214
+ <div class="row-spacer"></div>
215
+ </div>
216
+ </div>
217
+ </div>
218
+ </div>
219
+ `;
220
+ });
221
+ }
222
+
223
+ private _styleMap(styles: Record<string, string>): string {
224
+ return Object.entries(styles)
225
+ .map(([k, v]) => `${k}:${v}`)
226
+ .join(';');
227
+ }
228
+
229
+ render() {
230
+ return html`
231
+ <div class="calendar-month-view">
232
+ <div class="view-header">
233
+ <div class="columns">${this._renderHeader()}</div>
234
+ <div class="scrollbar-placeholder"></div>
235
+ </div>
236
+ <div class="view-body">
237
+ <div class="view-body-scroll">
238
+ <div class="drawing-area">${this._renderEvents()}</div>
239
+ </div>
240
+ </div>
241
+ </div>
242
+ `;
243
+ }
244
+ }
@@ -0,0 +1,71 @@
1
+ @use '../../scss/mixin';
2
+
3
+ @include mixin.base-styles;
4
+
5
+ :host {
6
+ display: block;
7
+ height: 100%;
8
+ min-height: 20em;
9
+
10
+ --calendar-border-color: var(--color-outline-variant);
11
+ --calendar-scale-color: var(--color-outline-variant);
12
+
13
+ --calendar-event-bg-color: var(--color-primary-container);
14
+ --calendar-event-bg-color--hover: var(--color-inverse-primary);
15
+ --calendar-event-border-color: var(--color-primary);
16
+ --calendar-event-text-color: var(--color-on-primary-container);
17
+ --calendar-event-text-color--hover: var(--color-on-primary);
18
+
19
+ --calendar-surface: var(--color-surface);
20
+ --calendar-surface-variant: var(--color-surface-variant);
21
+ --calendar-on-surface: var(--color-on-surface);
22
+ --calendar-on-surface-variant: var(--color-on-surface-variant);
23
+ }
24
+
25
+ .calendar {
26
+ height: 100%;
27
+ display: flex;
28
+ flex-direction: column;
29
+ background: var(--calendar-surface);
30
+ border-radius: var(--shape-corner-large);
31
+ overflow: hidden;
32
+ }
33
+
34
+ .calendar-header {
35
+ .calendar-header-classic {
36
+ display: flex;
37
+ align-items: center;
38
+ padding: 0.75rem 1rem;
39
+ gap: 0.5rem;
40
+
41
+ .header-left {
42
+ display: flex;
43
+ gap: 0.5rem;
44
+ align-items: center;
45
+ flex: 1;
46
+
47
+ .title {
48
+ display: flex;
49
+ align-items: center;
50
+ font-weight: 500;
51
+ font-size: 1rem;
52
+ color: var(--calendar-on-surface);
53
+ padding-inline-start: 0.5rem;
54
+ }
55
+ }
56
+
57
+ .header-right {
58
+ display: flex;
59
+ align-items: center;
60
+ }
61
+ }
62
+ }
63
+
64
+ .calendar-body {
65
+ flex: 1;
66
+ overflow: auto;
67
+
68
+ .view-container {
69
+ height: 100%;
70
+ }
71
+ }