@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,326 @@
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: 4rem;
11
+ }
12
+
13
+ .scale {
14
+ width: var(--scale-size);
15
+ flex-shrink: 0;
16
+ }
17
+
18
+ .calendar-column-view {
19
+ display: flex;
20
+ flex-direction: column;
21
+ height: 100%;
22
+ }
23
+
24
+ /* ── Header ── */
25
+ .view-header {
26
+ display: flex;
27
+ background: var(--color-surface-container);
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;
46
+ gap: 0.5rem;
47
+ border-top: 3px solid transparent;
48
+ }
49
+
50
+ &.today .column-content {
51
+ border-top-color: var(--color-primary);
52
+
53
+ .date {
54
+ color: var(--color-on-primary);
55
+ background: var(--color-primary);
56
+ }
57
+ }
58
+
59
+ .date {
60
+ font-size: 1.5rem;
61
+ font-weight: 500;
62
+ cursor: pointer;
63
+ border-radius: 50%;
64
+ width: 2.5rem;
65
+ height: 2.5rem;
66
+ display: flex;
67
+ align-items: center;
68
+ justify-content: center;
69
+ color: var(--color-on-surface);
70
+ transition: background 200ms ease;
71
+
72
+ &:hover {
73
+ background: var(--color-primary-90);
74
+ }
75
+ }
76
+
77
+ .day {
78
+ font-size: 0.875rem;
79
+ font-weight: 500;
80
+ color: var(--color-on-surface-variant);
81
+ }
82
+ }
83
+ }
84
+
85
+ .scrollbar-placeholder {
86
+ width: var(--scrollbar-width, 0px);
87
+ }
88
+ }
89
+
90
+ /* ── Multi-day section ── */
91
+ .multi-day-section-wrapper {
92
+ background: var(--color-surface-container);
93
+ border-bottom: 1px solid var(--calendar-border-color);
94
+
95
+ .multi-day-section-scroll {
96
+ overflow-y: auto;
97
+ max-height: 6rem;
98
+ }
99
+
100
+ .multi-day-section {
101
+ position: relative;
102
+ }
103
+
104
+ .multi-day-background {
105
+ display: flex;
106
+ height: 100%;
107
+ position: absolute;
108
+ width: 100%;
109
+
110
+ .columns {
111
+ display: flex;
112
+ flex: 1;
113
+
114
+ .column {
115
+ flex: 1;
116
+ border-inline-start: 1px solid var(--calendar-border-color);
117
+
118
+ &:first-child {
119
+ border-inline-start: 0;
120
+ }
121
+ }
122
+ }
123
+ }
124
+
125
+ .multi-events {
126
+ padding: 0 0 0 var(--scale-size);
127
+
128
+ .row {
129
+ height: 1.8rem;
130
+ box-sizing: content-box;
131
+ position: relative;
132
+ padding-bottom: 0.25rem;
133
+
134
+ &:last-child {
135
+ padding-bottom: 0;
136
+ }
137
+ }
138
+
139
+ .row-spacer {
140
+ height: 0.75rem;
141
+ }
142
+
143
+ .event {
144
+ position: absolute;
145
+ height: 1.8rem;
146
+ text-overflow: ellipsis;
147
+ overflow: hidden;
148
+ }
149
+ }
150
+ }
151
+
152
+ /* ── View body ── */
153
+ .view-body {
154
+ height: 100%;
155
+ border-bottom: 1px solid var(--calendar-border-color);
156
+ overflow-y: auto;
157
+
158
+ .view-body-scroll {
159
+ display: flex;
160
+ position: relative;
161
+
162
+ .scale {
163
+ border-right: 1px solid var(--calendar-scale-color);
164
+
165
+ .background {
166
+ border-inline-start: 1rem;
167
+ }
168
+
169
+ .row {
170
+ width: 0;
171
+ position: relative;
172
+ height: 2rem;
173
+ border-bottom: 1px dashed var(--calendar-scale-color);
174
+
175
+ &.hour {
176
+ border-bottom: 1px solid var(--calendar-scale-color);
177
+ width: 50%;
178
+ margin-inline-start: 50%;
179
+ }
180
+
181
+ &:last-child {
182
+ border-bottom: 0;
183
+ }
184
+
185
+ .time {
186
+ position: absolute;
187
+ top: -0.5rem;
188
+ font-size: 0.75rem;
189
+ color: var(--color-on-surface-variant);
190
+ }
191
+ }
192
+ }
193
+
194
+ .drawing-area {
195
+ flex: 1;
196
+ position: relative;
197
+
198
+ .background {
199
+ position: relative;
200
+ width: 100%;
201
+ height: 100%;
202
+
203
+ .row {
204
+ height: 2rem;
205
+ border-bottom: 1px dashed var(--calendar-scale-color);
206
+ display: flex;
207
+
208
+ &.hour {
209
+ border-bottom: 1px solid var(--calendar-scale-color);
210
+ }
211
+
212
+ &:last-child {
213
+ border-bottom: 0;
214
+ }
215
+
216
+ .column {
217
+ flex: 1;
218
+ border-inline-start: 1px solid var(--calendar-border-color);
219
+
220
+ &:first-child {
221
+ border-inline-start: 0;
222
+ }
223
+
224
+ &.today {
225
+ background: color-mix(in srgb, var(--color-primary) 4%, transparent);
226
+ }
227
+ }
228
+ }
229
+ }
230
+
231
+ .events-container {
232
+ position: absolute;
233
+ top: 0;
234
+ left: 0;
235
+ width: 100%;
236
+ height: 100%;
237
+ display: flex;
238
+
239
+ .column {
240
+ flex: 1;
241
+ padding: 0 0.5rem 0 1px;
242
+
243
+ .column-content {
244
+ position: relative;
245
+ height: 100%;
246
+ }
247
+
248
+ .event {
249
+ position: absolute;
250
+ }
251
+ }
252
+ }
253
+ }
254
+
255
+ /* ── Current time line ── */
256
+ .current-time-line {
257
+ position: absolute;
258
+ z-index: 100;
259
+ pointer-events: none;
260
+ width: calc(100% - var(--scale-size));
261
+ margin-inline-start: var(--scale-size);
262
+
263
+ .time {
264
+ position: absolute;
265
+ @include mixin.get-typography(label-small);
266
+ color: var(--color-on-primary-container);
267
+ transform: translate(calc(-100% - 2px), -50%);
268
+ background: var(--color-primary-container);
269
+ padding: 2px 4px;
270
+ border-radius: var(--shape-corner-extra-small);
271
+ }
272
+
273
+ .dash-line {
274
+ position: absolute;
275
+ left: 0;
276
+ border-bottom: 1px dashed var(--color-primary);
277
+ }
278
+
279
+ .dot {
280
+ border-radius: 50%;
281
+ width: 0.5rem;
282
+ height: 0.5rem;
283
+ background: var(--color-primary);
284
+ display: block;
285
+ position: absolute;
286
+ top: -0.25rem;
287
+ }
288
+
289
+ .line {
290
+ border-bottom: 2px solid var(--color-primary);
291
+ position: absolute;
292
+ top: -1px;
293
+ }
294
+ }
295
+ }
296
+ }
297
+
298
+ /* ── Event styles ── */
299
+ .event {
300
+ background: var(--calendar-event-bg-color);
301
+ border-inline-start: 0.25rem solid var(--calendar-event-border-color);
302
+ border-radius: var(--shape-corner-extra-small);
303
+ transition: background 150ms ease;
304
+
305
+ .event-title {
306
+ padding: 0.25rem 0.375rem;
307
+ font-size: 0.75rem;
308
+ font-weight: 500;
309
+ color: var(--calendar-event-text-color);
310
+ white-space: nowrap;
311
+ overflow: hidden;
312
+ text-overflow: ellipsis;
313
+ }
314
+
315
+ &.clickable {
316
+ cursor: pointer;
317
+
318
+ &:hover {
319
+ background: var(--calendar-event-bg-color--hover);
320
+
321
+ .event-title {
322
+ color: var(--calendar-event-text-color--hover);
323
+ }
324
+ }
325
+ }
326
+ }
@@ -0,0 +1,392 @@
1
+ import { LitElement, html, nothing } from 'lit';
2
+ import { property, state } from 'lit/decorators.js';
3
+ import {
4
+ addDays,
5
+ addHours,
6
+ differenceInDays,
7
+ startOfDay,
8
+ endOfDay,
9
+ calculateDateRange,
10
+ formatDate,
11
+ getTimePercent,
12
+ LONG_EVENT_PADDING,
13
+ } from './utils.js';
14
+ import { BaseEvent } from './base-event.js';
15
+ import { CalendarEvent } from './calendar-event.js';
16
+ import { EventManager } from './event-manager.js';
17
+ import type { ColumnEvent } from './event-manager.js';
18
+ import IndividualComponent from '@/IndividualComponent.js';
19
+ import styles from './calendar-column-view.scss';
20
+
21
+ /**
22
+ * @label Calendar Column View
23
+ * @tag wc-calendar-column-view
24
+ * @rawTag calendar-column-view
25
+ * @parentRawTag calendar
26
+ * @summary Internal column view component for the calendar (day/week views).
27
+ */
28
+ @IndividualComponent
29
+ export class CalendarColumnView extends LitElement {
30
+ static styles = [styles];
31
+
32
+ @property({ type: Array })
33
+ events: CalendarEvent[] = [];
34
+
35
+ @property({ type: String })
36
+ view: string = 'week';
37
+
38
+ @property({ type: Number })
39
+ days: number = 7;
40
+
41
+ @property({ type: Boolean, attribute: 'event-clickable' })
42
+ eventClickable: boolean = true;
43
+
44
+ @property({ type: Object, attribute: false })
45
+ currentTime: Date = new Date();
46
+
47
+ @property({ type: Object, attribute: false })
48
+ contextDate: Date = new Date();
49
+
50
+ @state()
51
+ private dateRange: any = {};
52
+
53
+ @state()
54
+ private singleDayEvents: Record<string, ColumnEvent[][]> = {};
55
+
56
+ @state()
57
+ private multiDayEvents: ColumnEvent[][] = [];
58
+
59
+ override connectedCallback() {
60
+ super.connectedCallback();
61
+ this._processEvents();
62
+ }
63
+
64
+ override willUpdate(changedProperties: Map<string, unknown>) {
65
+ if (
66
+ changedProperties.has('events') ||
67
+ changedProperties.has('contextDate') ||
68
+ changedProperties.has('view') ||
69
+ changedProperties.has('days')
70
+ ) {
71
+ this._processEvents();
72
+ }
73
+ }
74
+
75
+ override firstUpdated() {
76
+ const viewBody = this.renderRoot.querySelector('.view-body');
77
+ if (viewBody) {
78
+ const viewBodyHeight = viewBody.scrollHeight;
79
+ viewBody.scrollTo({
80
+ top:
81
+ (getTimePercent(this.currentTime) / 100) * viewBodyHeight - 150,
82
+ });
83
+ }
84
+ }
85
+
86
+ private _processEvents() {
87
+ this.dateRange = calculateDateRange(this.view, this.contextDate, this.days);
88
+ this.singleDayEvents = {};
89
+
90
+ this._forEachDayInRange(i => {
91
+ const manager = new EventManager();
92
+ manager.addEvents(
93
+ this.events.filter(
94
+ event =>
95
+ event.isOverlapping(new BaseEvent(startOfDay(i), endOfDay(i))) &&
96
+ event.length() < 86400000,
97
+ ),
98
+ );
99
+ manager.process();
100
+ this.singleDayEvents[this._getDateOnly(i)] = manager.columns;
101
+ });
102
+
103
+ const multiManager = new EventManager();
104
+ multiManager.addEvents(
105
+ this.events.filter(
106
+ event =>
107
+ event.isOverlapping(
108
+ new BaseEvent(this.dateRange.startDate, this.dateRange.endDate),
109
+ ) && event.length() >= 86400000,
110
+ ),
111
+ );
112
+ multiManager.process();
113
+ this.multiDayEvents = multiManager.columns;
114
+ }
115
+
116
+ private _forEachDayInRange(callback: (d: Date) => void) {
117
+ for (
118
+ let i = new Date(this.dateRange.startDate);
119
+ differenceInDays(startOfDay(this.dateRange.endDate), i) >= 0;
120
+ i = addDays(i, 1)
121
+ ) {
122
+ callback(i);
123
+ }
124
+ }
125
+
126
+ private _getDateOnly(date: Date): string {
127
+ return formatDate(date, 'dd-MM-yyyy');
128
+ }
129
+
130
+ private _getDatePercent(date: Date): number {
131
+ const currentDay = differenceInDays(
132
+ startOfDay(date),
133
+ this.dateRange.startDate,
134
+ );
135
+ const percent = (currentDay / this.dateRange.totalDays) * 100;
136
+ if (percent < 0) return 0;
137
+ if (percent > 100) return 100;
138
+ return percent;
139
+ }
140
+
141
+ private _getDayClass(date: Date): string {
142
+ const diff = differenceInDays(startOfDay(date), startOfDay(this.currentTime));
143
+ if (diff === 0) return 'column today';
144
+ if (diff < 0) return 'column past';
145
+ return 'column future';
146
+ }
147
+
148
+ private _populateColorVars(
149
+ styles: Record<string, string>,
150
+ color: string,
151
+ ) {
152
+ styles['--calendar-event-bg-color'] = `var(--color-${color}-container)`;
153
+ styles['--calendar-event-bg-color--hover'] = `var(--color-inverse-${color})`;
154
+ styles['--calendar-event-border-color'] = `var(--color-${color})`;
155
+ styles['--calendar-event-text-color'] = `var(--color-on-${color}-container)`;
156
+ styles['--calendar-event-text-color--hover'] = `var(--color-on-${color})`;
157
+ }
158
+
159
+ private _emitDateClick(date: Date) {
160
+ this.dispatchEvent(
161
+ new CustomEvent('column-view-date-click', {
162
+ detail: { date },
163
+ bubbles: true,
164
+ composed: true,
165
+ }),
166
+ );
167
+ }
168
+
169
+ private _emitEventClick(event: any) {
170
+ this.dispatchEvent(
171
+ new CustomEvent('column-view-event-click', {
172
+ detail: { event },
173
+ bubbles: true,
174
+ composed: true,
175
+ }),
176
+ );
177
+ }
178
+
179
+ private _renderHeader() {
180
+ const columns: any[] = [];
181
+ this._forEachDayInRange(i => {
182
+ columns.push(html`
183
+ <div class=${this._getDayClass(i)}>
184
+ <div class="column-content">
185
+ <div
186
+ class="date"
187
+ @click=${() => this._emitDateClick(i)}
188
+ >
189
+ ${formatDate(i, 'dd')}
190
+ </div>
191
+ <div class="day">${formatDate(i, 'E')}</div>
192
+ </div>
193
+ </div>
194
+ `);
195
+ });
196
+ return columns;
197
+ }
198
+
199
+ private _renderMultiDayBackground() {
200
+ const columns: any[] = [];
201
+ this._forEachDayInRange(i => {
202
+ columns.push(html`<div class=${this._getDayClass(i)}></div>`);
203
+ });
204
+ return columns;
205
+ }
206
+
207
+ private _renderScale() {
208
+ const rows: any[] = [];
209
+ for (let i = 0; i < 48; i++) {
210
+ const cls = i % 2 ? 'row hour' : 'row';
211
+ const sd = startOfDay(new Date());
212
+ rows.push(html`
213
+ <div class=${cls}>
214
+ ${i % 2 === 0 && i
215
+ ? html`<div class="time">${formatDate(addHours(sd, i / 2), 'hh a')}</div>`
216
+ : nothing}
217
+ </div>
218
+ `);
219
+ }
220
+ return html`<div class="background">${rows}</div>`;
221
+ }
222
+
223
+ private _renderBackgroundGrid() {
224
+ const rows: any[] = [];
225
+ for (let i = 0; i < 48; i++) {
226
+ const cls = i % 2 ? 'row hour' : 'row';
227
+ const columns: any[] = [];
228
+ this._forEachDayInRange(d => {
229
+ columns.push(html`<div class=${this._getDayClass(d)}></div>`);
230
+ });
231
+ rows.push(html`<div class=${cls}>${columns}</div>`);
232
+ }
233
+ return html`<div class="background">${rows}</div>`;
234
+ }
235
+
236
+ private _renderEvents() {
237
+ const columns: any[] = [];
238
+ this._forEachDayInRange(i => {
239
+ const cls = this._getDayClass(i);
240
+ const eventDay = this.singleDayEvents[this._getDateOnly(i)];
241
+ columns.push(html`
242
+ <div class=${cls}>
243
+ <div class="column-content">
244
+ ${eventDay
245
+ ? eventDay.map((nodes, columnIndex) =>
246
+ nodes.map(node => {
247
+ const evtCls = this.eventClickable
248
+ ? 'event clickable'
249
+ : 'event';
250
+ const evtStyles: Record<string, string> = {
251
+ top: `${getTimePercent(node.start, startOfDay(i))}%`,
252
+ height: `${getTimePercent(node.end, startOfDay(i)) - getTimePercent(node.start, startOfDay(i))}%`,
253
+ left: `${(columnIndex / eventDay.length) * 100}%`,
254
+ width: `calc(${((1 * node.width) / eventDay.length) * 100}% - 1px)`,
255
+ };
256
+ if (node.color) {
257
+ this._populateColorVars(evtStyles, node.color);
258
+ }
259
+ return html`
260
+ <div
261
+ class=${evtCls}
262
+ style=${this._styleMap(evtStyles)}
263
+ @click=${() => {
264
+ if (this.eventClickable) this._emitEventClick(node.data);
265
+ }}
266
+ >
267
+ <div class="event-title">
268
+ ${node.title || '(no title)'}
269
+ </div>
270
+ </div>
271
+ `;
272
+ }),
273
+ )
274
+ : nothing}
275
+ </div>
276
+ </div>
277
+ `);
278
+ });
279
+ return html`<div class="events-container">${columns}</div>`;
280
+ }
281
+
282
+ private _renderMultiDayEvents() {
283
+ if (!this.multiDayEvents || !this.multiDayEvents.length) return nothing;
284
+ return html`
285
+ <div class="row-content">
286
+ ${this.multiDayEvents.map(
287
+ nodes => html`
288
+ <div class="row">
289
+ ${nodes.map(node => {
290
+ const evtCls = this.eventClickable
291
+ ? 'event clickable'
292
+ : 'event';
293
+ const evtStyles: Record<string, string> = {
294
+ left: `${this._getDatePercent(node.start) + LONG_EVENT_PADDING}%`,
295
+ width: `${this._getDatePercent(addDays(node.end, 1)) - this._getDatePercent(node.start) - 2 * LONG_EVENT_PADDING}%`,
296
+ };
297
+ if (node.color) {
298
+ this._populateColorVars(evtStyles, node.color);
299
+ }
300
+ return html`
301
+ <div
302
+ class=${evtCls}
303
+ style=${this._styleMap(evtStyles)}
304
+ @click=${() => {
305
+ if (this.eventClickable) this._emitEventClick(node.data);
306
+ }}
307
+ >
308
+ <div class="event-title">
309
+ ${node.title || '(no title)'}
310
+ </div>
311
+ </div>
312
+ `;
313
+ })}
314
+ </div>
315
+ `,
316
+ )}
317
+ <div class="row-spacer"></div>
318
+ </div>
319
+ `;
320
+ }
321
+
322
+ private _renderCurrentTime() {
323
+ if (
324
+ this.currentTime.valueOf() < this.dateRange.startDate?.valueOf() - 1 ||
325
+ this.currentTime.valueOf() > this.dateRange.endDate?.valueOf() + 1
326
+ ) {
327
+ return nothing;
328
+ }
329
+ return html`
330
+ <div
331
+ class="current-time-line"
332
+ style="top: calc(${getTimePercent(this.currentTime)}% - 1px)"
333
+ >
334
+ <div class="time">${formatDate(this.currentTime, 'hh:mm a')}</div>
335
+ <div
336
+ class="dash-line"
337
+ style="width: ${this._getDatePercent(this.currentTime)}%"
338
+ ></div>
339
+ <div
340
+ class="dot"
341
+ style="left: calc(${this._getDatePercent(this.currentTime)}% - 0.25rem)"
342
+ ></div>
343
+ <div
344
+ class="line"
345
+ style="left: ${this._getDatePercent(this.currentTime)}%; width: ${(1 / this.dateRange.totalDays) * 100}%"
346
+ ></div>
347
+ </div>
348
+ `;
349
+ }
350
+
351
+ private _styleMap(styles: Record<string, string>): string {
352
+ return Object.entries(styles)
353
+ .map(([k, v]) => `${k}:${v}`)
354
+ .join(';');
355
+ }
356
+
357
+ render() {
358
+ return html`
359
+ <div class="calendar-column-view">
360
+ <div class="view-header">
361
+ <div class="scale"></div>
362
+ <div class="columns">${this._renderHeader()}</div>
363
+ <div class="scrollbar-placeholder"></div>
364
+ </div>
365
+ <div class="multi-day-section-wrapper">
366
+ <div class="multi-day-section-scroll">
367
+ <div class="multi-day-section">
368
+ <div class="multi-day-background">
369
+ <div class="scale"></div>
370
+ <div class="columns">
371
+ ${this._renderMultiDayBackground()}
372
+ </div>
373
+ </div>
374
+ <div class="multi-events">
375
+ ${this._renderMultiDayEvents()}
376
+ </div>
377
+ </div>
378
+ </div>
379
+ </div>
380
+ <div class="view-body">
381
+ <div class="view-body-scroll">
382
+ <div class="scale">${this._renderScale()}</div>
383
+ <div class="drawing-area">
384
+ ${this._renderBackgroundGrid()} ${this._renderEvents()}
385
+ </div>
386
+ ${this._renderCurrentTime()}
387
+ </div>
388
+ </div>
389
+ </div>
390
+ `;
391
+ }
392
+ }