@progressive-development/pd-calendar 0.6.8 → 1.0.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 (141) hide show
  1. package/LICENSE +21 -2
  2. package/README.md +32 -57
  3. package/dist/generated/locales/be.d.ts +7 -0
  4. package/dist/generated/locales/be.d.ts.map +1 -1
  5. package/dist/generated/locales/de.d.ts +7 -0
  6. package/dist/generated/locales/de.d.ts.map +1 -1
  7. package/dist/generated/locales/en.d.ts +7 -0
  8. package/dist/generated/locales/en.d.ts.map +1 -1
  9. package/dist/index.d.ts +12 -2
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +23 -10
  12. package/dist/locales/be.js +10 -4
  13. package/dist/locales/de.js +10 -4
  14. package/dist/locales/en.js +10 -4
  15. package/dist/pd-calendar/PdCalendar.d.ts +133 -0
  16. package/dist/pd-calendar/PdCalendar.d.ts.map +1 -0
  17. package/dist/pd-calendar/PdCalendar.js +550 -0
  18. package/dist/pd-calendar/pd-calendar-cell/PdCalendarCell.d.ts +56 -0
  19. package/dist/pd-calendar/pd-calendar-cell/PdCalendarCell.d.ts.map +1 -0
  20. package/dist/pd-calendar/pd-calendar-cell/PdCalendarCell.js +337 -0
  21. package/dist/pd-calendar/pd-calendar-cell/pd-calendar-cell.d.ts +3 -0
  22. package/dist/pd-calendar/pd-calendar-cell/pd-calendar-cell.d.ts.map +1 -0
  23. package/dist/pd-calendar/pd-calendar-cell/pd-calendar-cell.js +8 -0
  24. package/dist/pd-calendar/pd-calendar-day-events-panel/PdCalendarDayEventsPanel.d.ts +27 -0
  25. package/dist/pd-calendar/pd-calendar-day-events-panel/PdCalendarDayEventsPanel.d.ts.map +1 -0
  26. package/dist/pd-calendar/pd-calendar-day-events-panel/PdCalendarDayEventsPanel.js +160 -0
  27. package/dist/pd-calendar/pd-calendar-day-events-panel/pd-calendar-day-events-panel.d.ts +3 -0
  28. package/dist/pd-calendar/pd-calendar-day-events-panel/pd-calendar-day-events-panel.d.ts.map +1 -0
  29. package/dist/pd-calendar/pd-calendar-day-events-panel/pd-calendar-day-events-panel.js +8 -0
  30. package/dist/pd-calendar/pd-calendar-event-cell/PdCalendarEventCell.d.ts +55 -0
  31. package/dist/pd-calendar/pd-calendar-event-cell/PdCalendarEventCell.d.ts.map +1 -0
  32. package/dist/pd-calendar/pd-calendar-event-cell/PdCalendarEventCell.js +341 -0
  33. package/dist/pd-calendar/pd-calendar-event-cell/pd-calendar-event-cell.d.ts +3 -0
  34. package/dist/pd-calendar/pd-calendar-event-cell/pd-calendar-event-cell.d.ts.map +1 -0
  35. package/dist/pd-calendar/pd-calendar-event-cell/pd-calendar-event-cell.js +8 -0
  36. package/dist/pd-calendar/pd-calendar-event-info-panel/PdCalendarEventInfoPanel.d.ts +29 -0
  37. package/dist/pd-calendar/pd-calendar-event-info-panel/PdCalendarEventInfoPanel.d.ts.map +1 -0
  38. package/dist/pd-calendar/pd-calendar-event-info-panel/PdCalendarEventInfoPanel.js +211 -0
  39. package/dist/pd-calendar/pd-calendar-event-info-panel/pd-calendar-event-info-panel.d.ts +3 -0
  40. package/dist/pd-calendar/pd-calendar-event-info-panel/pd-calendar-event-info-panel.d.ts.map +1 -0
  41. package/dist/pd-calendar/pd-calendar-event-info-panel/pd-calendar-event-info-panel.js +8 -0
  42. package/dist/pd-calendar/pd-calendar-list-cell/PdCalendarListCell.d.ts +28 -0
  43. package/dist/pd-calendar/pd-calendar-list-cell/PdCalendarListCell.d.ts.map +1 -0
  44. package/dist/pd-calendar/pd-calendar-list-cell/PdCalendarListCell.js +252 -0
  45. package/dist/pd-calendar/pd-calendar-list-cell/pd-calendar-list-cell.d.ts +3 -0
  46. package/dist/pd-calendar/pd-calendar-list-cell/pd-calendar-list-cell.d.ts.map +1 -0
  47. package/dist/pd-calendar/pd-calendar-list-cell/pd-calendar-list-cell.js +8 -0
  48. package/dist/pd-calendar/pd-calendar-list-view/PdCalendarListView.d.ts +26 -0
  49. package/dist/pd-calendar/pd-calendar-list-view/PdCalendarListView.d.ts.map +1 -0
  50. package/dist/pd-calendar/pd-calendar-list-view/PdCalendarListView.js +165 -0
  51. package/dist/pd-calendar/pd-calendar-list-view/pd-calendar-list-view.d.ts +3 -0
  52. package/dist/pd-calendar/pd-calendar-list-view/pd-calendar-list-view.d.ts.map +1 -0
  53. package/dist/pd-calendar/pd-calendar-list-view/pd-calendar-list-view.js +8 -0
  54. package/dist/pd-calendar/pd-calendar-month-view/PdCalendarMonthView.d.ts +55 -0
  55. package/dist/pd-calendar/pd-calendar-month-view/PdCalendarMonthView.d.ts.map +1 -0
  56. package/dist/pd-calendar/pd-calendar-month-view/PdCalendarMonthView.js +461 -0
  57. package/dist/pd-calendar/pd-calendar-month-view/pd-calendar-month-view.d.ts +3 -0
  58. package/dist/pd-calendar/pd-calendar-month-view/pd-calendar-month-view.d.ts.map +1 -0
  59. package/dist/pd-calendar/pd-calendar-month-view/pd-calendar-month-view.js +8 -0
  60. package/dist/pd-calendar/pd-calendar-time-grid-view/PdCalendarTimeGridView.d.ts +32 -0
  61. package/dist/pd-calendar/pd-calendar-time-grid-view/PdCalendarTimeGridView.d.ts.map +1 -0
  62. package/dist/pd-calendar/pd-calendar-time-grid-view/PdCalendarTimeGridView.js +468 -0
  63. package/dist/pd-calendar/pd-calendar-time-grid-view/pd-calendar-time-grid-view.d.ts +3 -0
  64. package/dist/pd-calendar/pd-calendar-time-grid-view/pd-calendar-time-grid-view.d.ts.map +1 -0
  65. package/dist/pd-calendar/pd-calendar-time-grid-view/pd-calendar-time-grid-view.js +8 -0
  66. package/dist/pd-calendar/pd-calendar-week-cell/PdCalendarWeekCell.d.ts +31 -0
  67. package/dist/pd-calendar/pd-calendar-week-cell/PdCalendarWeekCell.d.ts.map +1 -0
  68. package/dist/pd-calendar/pd-calendar-week-cell/PdCalendarWeekCell.js +134 -0
  69. package/dist/pd-calendar/pd-calendar-week-cell/pd-calendar-week-cell.d.ts +3 -0
  70. package/dist/pd-calendar/pd-calendar-week-cell/pd-calendar-week-cell.d.ts.map +1 -0
  71. package/dist/pd-calendar/pd-calendar-week-cell/pd-calendar-week-cell.js +8 -0
  72. package/dist/pd-calendar/pd-calendar.d.ts +3 -0
  73. package/dist/pd-calendar/pd-calendar.d.ts.map +1 -0
  74. package/dist/pd-calendar/pd-calendar.stories.d.ts +83 -0
  75. package/dist/pd-calendar/pd-calendar.stories.d.ts.map +1 -0
  76. package/dist/pd-calendar/pd-year-popup/PdYearPopup.d.ts +38 -0
  77. package/dist/pd-calendar/pd-year-popup/PdYearPopup.d.ts.map +1 -0
  78. package/dist/pd-calendar/pd-year-popup/PdYearPopup.js +249 -0
  79. package/dist/pd-calendar/pd-year-popup/pd-year-popup.d.ts +3 -0
  80. package/dist/pd-calendar/pd-year-popup/pd-year-popup.d.ts.map +1 -0
  81. package/dist/pd-calendar/pd-year-popup/pd-year-popup.js +8 -0
  82. package/dist/pd-calendar.d.ts +2 -48
  83. package/dist/pd-calendar.js +6 -437
  84. package/dist/pd-datepicker/PdDatepicker.d.ts +181 -0
  85. package/dist/pd-datepicker/PdDatepicker.d.ts.map +1 -0
  86. package/dist/pd-datepicker/PdDatepicker.js +701 -0
  87. package/dist/pd-datepicker/pd-date-picker.stories.d.ts +81 -0
  88. package/dist/pd-datepicker/pd-date-picker.stories.d.ts.map +1 -0
  89. package/dist/pd-datepicker/pd-datepicker.d.ts +3 -0
  90. package/dist/pd-datepicker/pd-datepicker.d.ts.map +1 -0
  91. package/dist/pd-datepicker.d.ts +2 -0
  92. package/dist/pd-datepicker.js +8 -0
  93. package/dist/pd-slot-picker/PdSlotPicker.d.ts +102 -0
  94. package/dist/pd-slot-picker/PdSlotPicker.d.ts.map +1 -0
  95. package/dist/pd-slot-picker/PdSlotPicker.js +339 -0
  96. package/dist/pd-slot-picker/pd-slot-cell/PdSlotCell.d.ts +35 -0
  97. package/dist/pd-slot-picker/pd-slot-cell/PdSlotCell.d.ts.map +1 -0
  98. package/dist/pd-slot-picker/pd-slot-cell/PdSlotCell.js +188 -0
  99. package/dist/pd-slot-picker/pd-slot-cell/pd-slot-cell.d.ts +3 -0
  100. package/dist/pd-slot-picker/pd-slot-cell/pd-slot-cell.d.ts.map +1 -0
  101. package/dist/pd-slot-picker/pd-slot-cell/pd-slot-cell.js +8 -0
  102. package/dist/pd-slot-picker/pd-slot-picker.d.ts +3 -0
  103. package/dist/pd-slot-picker/pd-slot-picker.d.ts.map +1 -0
  104. package/dist/pd-slot-picker/pd-slot-picker.stories.d.ts +67 -0
  105. package/dist/pd-slot-picker/pd-slot-picker.stories.d.ts.map +1 -0
  106. package/dist/pd-slot-picker.d.ts +2 -0
  107. package/dist/pd-slot-picker.js +8 -0
  108. package/dist/shared/PdBaseCell.d.ts +68 -0
  109. package/dist/shared/PdBaseCell.d.ts.map +1 -0
  110. package/dist/shared/PdBaseCell.js +120 -0
  111. package/dist/shared/PdBaseView.d.ts +22 -0
  112. package/dist/shared/PdBaseView.d.ts.map +1 -0
  113. package/dist/shared/PdBaseView.js +46 -0
  114. package/dist/shared/PdCalendarPanelBase.d.ts +34 -0
  115. package/dist/shared/PdCalendarPanelBase.d.ts.map +1 -0
  116. package/dist/shared/PdCalendarPanelBase.js +169 -0
  117. package/dist/shared/calendar-button-bar/calendar-button-bar.d.ts +41 -0
  118. package/dist/shared/calendar-button-bar/calendar-button-bar.d.ts.map +1 -0
  119. package/dist/shared/calendar-button-bar/calendar-button-bar.js +435 -0
  120. package/dist/shared/calendar-locales.d.ts +9 -0
  121. package/dist/shared/calendar-locales.d.ts.map +1 -0
  122. package/dist/shared/calendar-locales.js +30 -0
  123. package/dist/shared/calendar-utils.d.ts +34 -0
  124. package/dist/shared/calendar-utils.d.ts.map +1 -0
  125. package/dist/shared/calendar-utils.js +99 -0
  126. package/dist/shared/calendar-utils.test.d.ts +2 -0
  127. package/dist/shared/calendar-utils.test.d.ts.map +1 -0
  128. package/dist/types.d.ts +102 -1
  129. package/dist/types.d.ts.map +1 -1
  130. package/package.json +35 -47
  131. package/dist/pd-calendar-cell.d.ts +0 -47
  132. package/dist/pd-calendar-cell.d.ts.map +0 -1
  133. package/dist/pd-calendar-cell.js +0 -282
  134. package/dist/pd-calendar.d.ts.map +0 -1
  135. package/dist/pd-year-popup.d.ts +0 -25
  136. package/dist/pd-year-popup.d.ts.map +0 -1
  137. package/dist/pd-year-popup.js +0 -136
  138. package/dist/stories/cell.stories.d.ts +0 -15
  139. package/dist/stories/cell.stories.d.ts.map +0 -1
  140. package/dist/stories/index.stories.d.ts +0 -23
  141. package/dist/stories/index.stories.d.ts.map +0 -1
@@ -0,0 +1,550 @@
1
+ import { css, LitElement, nothing, html } from 'lit';
2
+ import { property, state } from 'lit/decorators.js';
3
+ import { localized } from '@lit/localize';
4
+ import '@progressive-development/pd-icon/pd-icon';
5
+ import { LOCALES } from '../shared/calendar-locales.js';
6
+ import './pd-calendar-month-view/pd-calendar-month-view.js';
7
+ import './pd-calendar-list-view/pd-calendar-list-view.js';
8
+ import './pd-calendar-time-grid-view/pd-calendar-time-grid-view.js';
9
+ import './pd-calendar-event-info-panel/pd-calendar-event-info-panel.js';
10
+ import './pd-calendar-day-events-panel/pd-calendar-day-events-panel.js';
11
+ import '../shared/calendar-button-bar/calendar-button-bar.js';
12
+
13
+ var __defProp = Object.defineProperty;
14
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
15
+ var __decorateClass = (decorators, target, key, kind) => {
16
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
17
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
18
+ if (decorator = decorators[i])
19
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
20
+ if (kind && result) __defProp(target, key, result);
21
+ return result;
22
+ };
23
+ let PdCalendar = class extends LitElement {
24
+ constructor() {
25
+ super(...arguments);
26
+ this.selectableDates = false;
27
+ this.withYearPopup = [];
28
+ this.withWheelNavigation = false;
29
+ this.withTouchNavigation = false;
30
+ this.showSelection = false;
31
+ this.hideWeekend = false;
32
+ this.prevMonthConstraint = -1;
33
+ this.nextMonthConstraint = -1;
34
+ this.data = {};
35
+ this.numberClass = "top-left";
36
+ this.cellType = "simple";
37
+ this._infoPanelDateKey = "";
38
+ this._dayEventsPanelDateKey = "";
39
+ this._currentViewType = "dayGrid";
40
+ this._currentDate = /* @__PURE__ */ new Date();
41
+ this._monthName = "";
42
+ this._year = 0;
43
+ this._numberOfDays = 0;
44
+ this._currentMonthNavNr = 0;
45
+ }
46
+ connectedCallback() {
47
+ super.connectedCallback();
48
+ const initDate = this.refDate ?? /* @__PURE__ */ new Date();
49
+ this._initFromDate(initDate);
50
+ this._currentWeekStart = this._getMonday(initDate);
51
+ }
52
+ update(changedProperties) {
53
+ if (changedProperties.has("refDate") && this.refDate) {
54
+ this._initFromDate(this.refDate);
55
+ this._currentWeekStart = this._getMonday(this.refDate);
56
+ }
57
+ if (changedProperties.has("availableViewTypes") && this.availableViewTypes) {
58
+ const defaultIndex = this.availableViewTypes.default ?? 0;
59
+ const defaultViewType = this.availableViewTypes.viewTypes[defaultIndex];
60
+ if (defaultViewType) {
61
+ this._currentViewType = defaultViewType;
62
+ }
63
+ }
64
+ super.update(changedProperties);
65
+ }
66
+ render() {
67
+ const hideButtonBar = !this.availableViewTypes || this.availableViewTypes.viewTypes.length <= 1;
68
+ const isRangeMode = this._currentViewType === "list" && !!this.listRange;
69
+ const isWeekView = this._currentViewType === "timeGrid";
70
+ const title = isRangeMode ? this._formatRangeTitle() : isWeekView ? this._formatWeekTitle() : this._monthName;
71
+ const year = isRangeMode || isWeekView ? 0 : this._year;
72
+ const hidePrev = isWeekView ? false : !this._checkPrevMonthConstraint();
73
+ const hideNext = isWeekView ? false : !this._checkNextMonthConstraint();
74
+ return html`
75
+ <div
76
+ class="layout-container"
77
+ @select-event="${this._handleSelectEvent}"
78
+ @show-day-events="${this._handleShowDayEvents}"
79
+ >
80
+ <div class="header">
81
+ <div class="header-main">
82
+ <calendar-button-bar
83
+ ?hideButtonBar="${hideButtonBar}"
84
+ year="${year}"
85
+ currentTitle="${title}"
86
+ .currentDate="${this._currentDate}"
87
+ .withYearPopup="${isRangeMode || isWeekView ? [] : this.withYearPopup}"
88
+ .availableViewTypes="${this.availableViewTypes ?? {
89
+ viewTypes: ["dayGrid"],
90
+ default: 0
91
+ }}"
92
+ .availablePeriods="${{
93
+ periods: ["Month"],
94
+ default: 0
95
+ }}"
96
+ ?hideNavigation="${isRangeMode}"
97
+ ?hidePrev="${hidePrev}"
98
+ ?hideNext="${hideNext}"
99
+ @pd-calendar-navigation="${this._handleNavigationEvent}"
100
+ @pd-calendar-change-view="${this._handleViewChange}"
101
+ ></calendar-button-bar>
102
+ </div>
103
+ </div>
104
+
105
+ ${this._currentViewType === "list" ? html`
106
+ <pd-calendar-list-view
107
+ .data="${this.data}"
108
+ .config="${this.config}"
109
+ .refDate="${this.refDate}"
110
+ .currentDate="${this._currentDate}"
111
+ .listRange="${this.listRange}"
112
+ ?showSelection="${this.showSelection}"
113
+ ></pd-calendar-list-view>
114
+ ` : this._currentViewType === "timeGrid" ? html`
115
+ <pd-calendar-time-grid-view
116
+ .data="${this.data}"
117
+ .config="${this.config}"
118
+ .currentWeekStart="${this._currentWeekStart}"
119
+ .weekViewConfig="${this.weekViewConfig}"
120
+ ?hideWeekend="${this.hideWeekend}"
121
+ ></pd-calendar-time-grid-view>
122
+ ` : html`
123
+ <pd-calendar-month-view
124
+ .data="${this.data}"
125
+ .config="${this.config}"
126
+ .refDate="${this.refDate}"
127
+ .currentDate="${this._currentDate}"
128
+ ?hideWeekend="${this.hideWeekend}"
129
+ ?selectableDates="${this.selectableDates}"
130
+ ?showSelection="${this.showSelection}"
131
+ .numberClass="${this.numberClass}"
132
+ .cellType="${this.cellType}"
133
+ ?withWheelNavigation="${this.withWheelNavigation}"
134
+ ?withTouchNavigation="${this.withTouchNavigation}"
135
+ @pd-navigate="${this._handleViewNavigate}"
136
+ ></pd-calendar-month-view>
137
+ `}
138
+ ${this._infoPanelEntry ? html`<pd-calendar-event-info-panel
139
+ .entry="${this._infoPanelEntry}"
140
+ .dateKey="${this._infoPanelDateKey}"
141
+ .actions="${this.eventActions ?? {
142
+ detail: true,
143
+ edit: true,
144
+ delete: true
145
+ }}"
146
+ .config="${this.config}"
147
+ .anchorRect="${this._infoPanelAnchorRect}"
148
+ @close-panel="${this._closeInfoPanel}"
149
+ @event-action="${this._reDispatchEventAction}"
150
+ ></pd-calendar-event-info-panel>` : nothing}
151
+ ${this._dayEventsPanelEntries ? html`<pd-calendar-day-events-panel
152
+ .entries="${this._dayEventsPanelEntries}"
153
+ .dateKey="${this._dayEventsPanelDateKey}"
154
+ .config="${this.config}"
155
+ .anchorRect="${this._dayEventsPanelAnchorRect}"
156
+ @close-panel="${this._closeDayEventsPanel}"
157
+ @select-event="${this._handleDayEventsSelectEvent}"
158
+ ></pd-calendar-day-events-panel>` : nothing}
159
+ </div>
160
+ <slot name="calFooter"></slot>
161
+ `;
162
+ }
163
+ // ===========================================================================
164
+ // Event Handlers
165
+ // ===========================================================================
166
+ /** Handles navigation from the month view (wheel/touch/keyboard). */
167
+ _handleViewNavigate(e) {
168
+ if (e.detail.direction === "next") {
169
+ this._nextMonth();
170
+ } else {
171
+ this._previousMonth();
172
+ }
173
+ e.stopPropagation();
174
+ }
175
+ /** Handles view type change from the button bar. */
176
+ _handleViewChange(e) {
177
+ const viewType = e.detail.viewType;
178
+ if (viewType) {
179
+ this._currentViewType = viewType;
180
+ }
181
+ e.stopPropagation();
182
+ }
183
+ _handleNavigationEvent(e) {
184
+ if (this._currentViewType === "timeGrid") {
185
+ if (e.detail.previous) {
186
+ this._previousWeek();
187
+ }
188
+ if (e.detail.next) {
189
+ this._nextWeek();
190
+ }
191
+ } else {
192
+ if (e.detail.previous) {
193
+ this._previousMonth();
194
+ }
195
+ if (e.detail.next) {
196
+ this._nextMonth();
197
+ }
198
+ if (e.detail.newDate) {
199
+ this._initFromDate(e.detail.newDate);
200
+ }
201
+ }
202
+ e.stopPropagation();
203
+ }
204
+ // ===========================================================================
205
+ // Event Info Panel
206
+ // ===========================================================================
207
+ /** Opens the event info panel. Closes the day-events panel if open. */
208
+ _handleSelectEvent(e) {
209
+ const { dateKey, entry, anchorRect } = e.detail;
210
+ this._closeDayEventsPanel();
211
+ this._infoPanelEntry = entry;
212
+ this._infoPanelDateKey = dateKey;
213
+ this._infoPanelAnchorRect = anchorRect;
214
+ }
215
+ /** Opens the day-events panel. Closes the event info panel if open. */
216
+ _handleShowDayEvents(e) {
217
+ const { dateKey, entries, anchorRect } = e.detail;
218
+ this._closeInfoPanel();
219
+ this._dayEventsPanelEntries = entries;
220
+ this._dayEventsPanelDateKey = dateKey;
221
+ this._dayEventsPanelAnchorRect = anchorRect;
222
+ }
223
+ /** Handles select-event from within the day-events panel. */
224
+ _handleDayEventsSelectEvent(e) {
225
+ e.stopPropagation();
226
+ const { dateKey, entry, anchorRect } = e.detail;
227
+ this._closeDayEventsPanel();
228
+ this._infoPanelEntry = entry;
229
+ this._infoPanelDateKey = dateKey;
230
+ this._infoPanelAnchorRect = anchorRect;
231
+ }
232
+ _closeInfoPanel() {
233
+ this._infoPanelEntry = void 0;
234
+ this._infoPanelDateKey = "";
235
+ this._infoPanelAnchorRect = void 0;
236
+ }
237
+ _closeDayEventsPanel() {
238
+ this._dayEventsPanelEntries = void 0;
239
+ this._dayEventsPanelDateKey = "";
240
+ this._dayEventsPanelAnchorRect = void 0;
241
+ }
242
+ /** Re-dispatches event-action from the info panel. */
243
+ _reDispatchEventAction(e) {
244
+ this.dispatchEvent(
245
+ new CustomEvent("event-action", {
246
+ detail: e.detail,
247
+ bubbles: true,
248
+ composed: true
249
+ })
250
+ );
251
+ }
252
+ // ===========================================================================
253
+ // Month Navigation
254
+ // ===========================================================================
255
+ _nextMonth() {
256
+ if (this._checkNextMonthConstraint()) {
257
+ const next = new Date(
258
+ this._currentDate.getFullYear(),
259
+ this._currentDate.getMonth() + 1,
260
+ 1
261
+ );
262
+ this.dispatchEvent(
263
+ new CustomEvent("change-month", {
264
+ detail: { newDate: next, next: true },
265
+ bubbles: true,
266
+ composed: true
267
+ })
268
+ );
269
+ this._currentMonthNavNr += 1;
270
+ this._initFromDate(next);
271
+ }
272
+ }
273
+ _previousMonth() {
274
+ if (this._checkPrevMonthConstraint()) {
275
+ const prev = new Date(
276
+ this._currentDate.getFullYear(),
277
+ this._currentDate.getMonth() - 1,
278
+ 1
279
+ );
280
+ this.dispatchEvent(
281
+ new CustomEvent("change-month", {
282
+ detail: { newDate: prev, prev: true },
283
+ bubbles: true,
284
+ composed: true
285
+ })
286
+ );
287
+ this._currentMonthNavNr -= 1;
288
+ this._initFromDate(prev);
289
+ }
290
+ }
291
+ _checkNextMonthConstraint() {
292
+ return this.nextMonthConstraint === -1 || this.nextMonthConstraint > this._currentMonthNavNr;
293
+ }
294
+ _checkPrevMonthConstraint() {
295
+ return this.prevMonthConstraint === -1 || this._currentMonthNavNr > 0 || this.prevMonthConstraint > this._currentMonthNavNr * -1;
296
+ }
297
+ // ===========================================================================
298
+ // Week Navigation
299
+ // ===========================================================================
300
+ _nextWeek() {
301
+ if (!this._currentWeekStart) return;
302
+ const next = new Date(this._currentWeekStart);
303
+ next.setDate(next.getDate() + 7);
304
+ this._currentWeekStart = next;
305
+ }
306
+ _previousWeek() {
307
+ if (!this._currentWeekStart) return;
308
+ const prev = new Date(this._currentWeekStart);
309
+ prev.setDate(prev.getDate() - 7);
310
+ this._currentWeekStart = prev;
311
+ }
312
+ // ===========================================================================
313
+ // Helpers
314
+ // ===========================================================================
315
+ _initFromDate(date) {
316
+ this._monthName = LOCALES.monthNames[date.getMonth()];
317
+ this._year = date.getFullYear();
318
+ this._currentDate = date;
319
+ this._numberOfDays = new Date(
320
+ date.getFullYear(),
321
+ date.getMonth() + 1,
322
+ 0
323
+ ).getDate();
324
+ }
325
+ /** Returns the Monday of the week that contains `date`. */
326
+ _getMonday(date) {
327
+ const d = new Date(date);
328
+ const day = d.getDay();
329
+ const diff = day === 0 ? -6 : 1 - day;
330
+ d.setDate(d.getDate() + diff);
331
+ d.setHours(0, 0, 0, 0);
332
+ return d;
333
+ }
334
+ // ===========================================================================
335
+ // Title Formatting
336
+ // ===========================================================================
337
+ /**
338
+ * Formats the range title based on the listRange dates.
339
+ */
340
+ _formatRangeTitle() {
341
+ if (!this.listRange) return "";
342
+ const start = this._parseDate(this.listRange.start);
343
+ const end = this._parseDate(this.listRange.end);
344
+ const startDay = start.getDate().toString().padStart(2, "0");
345
+ const startMonth = (start.getMonth() + 1).toString().padStart(2, "0");
346
+ const startYear = start.getFullYear().toString().slice(-2);
347
+ const endDay = end.getDate().toString().padStart(2, "0");
348
+ const endMonth = (end.getMonth() + 1).toString().padStart(2, "0");
349
+ const endYear = end.getFullYear().toString().slice(-2);
350
+ const sameYear = start.getFullYear() === end.getFullYear();
351
+ const sameMonth = sameYear && start.getMonth() === end.getMonth();
352
+ if (sameMonth) {
353
+ return `${startDay}-${endDay}.${startMonth}.${startYear}`;
354
+ } else if (sameYear) {
355
+ return `${startDay}.${startMonth} - ${endDay}.${endMonth}.${endYear}`;
356
+ } else {
357
+ return `${startDay}.${startMonth}.${startYear} - ${endDay}.${endMonth}.${endYear}`;
358
+ }
359
+ }
360
+ /**
361
+ * Formats the week title, e.g. "10. - 16. Feb" or "28. Jan - 03. Feb".
362
+ */
363
+ _formatWeekTitle() {
364
+ if (!this._currentWeekStart) return "";
365
+ const visibleDays = this._getVisibleDays();
366
+ const firstDay = this._getDateForDayIndex(visibleDays[0]);
367
+ const lastDay = this._getDateForDayIndex(
368
+ visibleDays[visibleDays.length - 1]
369
+ );
370
+ if (!firstDay || !lastDay) return "";
371
+ const months = LOCALES.monthNames;
372
+ const fDay = firstDay.getDate().toString().padStart(2, "0");
373
+ const lDay = lastDay.getDate().toString().padStart(2, "0");
374
+ const fMonthShort = months[firstDay.getMonth()].slice(0, 3);
375
+ const lMonthShort = months[lastDay.getMonth()].slice(0, 3);
376
+ const lYear = lastDay.getFullYear();
377
+ if (firstDay.getMonth() === lastDay.getMonth() && firstDay.getFullYear() === lastDay.getFullYear()) {
378
+ return `${fDay}. - ${lDay}. ${fMonthShort} ${lYear}`;
379
+ }
380
+ if (firstDay.getFullYear() === lastDay.getFullYear()) {
381
+ return `${fDay}. ${fMonthShort} - ${lDay}. ${lMonthShort} ${lYear}`;
382
+ }
383
+ return `${fDay}. ${fMonthShort} ${firstDay.getFullYear()} - ${lDay}. ${lMonthShort} ${lYear}`;
384
+ }
385
+ _parseDate(value) {
386
+ if (value instanceof Date) return value;
387
+ const [year, month, day] = value.split("-").map(Number);
388
+ return new Date(year, month - 1, day);
389
+ }
390
+ /** Returns effective visible day indices for week title calculation. */
391
+ _getVisibleDays() {
392
+ if (this.weekViewConfig?.visibleDays) {
393
+ return this.weekViewConfig.visibleDays;
394
+ }
395
+ if (this.hideWeekend) {
396
+ return [0, 1, 2, 3, 4];
397
+ }
398
+ return [0, 1, 2, 3, 4, 5, 6];
399
+ }
400
+ /** Calculates the actual Date for a given monday-based day index. */
401
+ _getDateForDayIndex(dayIndex) {
402
+ if (!this._currentWeekStart) return void 0;
403
+ const d = new Date(this._currentWeekStart);
404
+ d.setDate(d.getDate() + dayIndex);
405
+ return d;
406
+ }
407
+ };
408
+ PdCalendar.styles = [
409
+ css`
410
+ :host {
411
+ display: block;
412
+ container-type: inline-size;
413
+ font-family: var(--pd-default-font-content-family);
414
+ width: var(--pd-calendar-width, 100%);
415
+ min-width: var(--pd-calendar-min-width, 310px);
416
+ }
417
+
418
+ .layout-container {
419
+ width: 100%;
420
+ min-width: 220px;
421
+ height: 100%;
422
+ display: flex;
423
+ flex-direction: column;
424
+ gap: var(--pd-spacing-sm);
425
+ background-color: var(--pd-default-bg-col);
426
+ border-radius: var(--pd-radius-lg);
427
+ padding: var(--pd-calendar-padding, var(--pd-spacing-sm));
428
+ }
429
+
430
+ .header {
431
+ position: relative;
432
+ font-family: var(--pd-default-font-title-family);
433
+ }
434
+
435
+ .header-main {
436
+ display: flex;
437
+ align-items: center;
438
+ justify-content: space-between;
439
+ width: 100%;
440
+ }
441
+
442
+ .header-main calendar-button-bar {
443
+ width: 100%;
444
+ --pd-cbar-title-align: right;
445
+ --pd-cbar-title-col: var(--pd-default-font-title-col);
446
+ --pd-cbar-title-size: 1.2em;
447
+ --pd-cbar-title-weight: 600;
448
+ }
449
+
450
+ @container (max-width: 500px) {
451
+ .header-main calendar-button-bar {
452
+ --pd-cbar-title-button-size: 36px;
453
+ }
454
+
455
+ .layout-container {
456
+ padding: var(--pd-spacing-xs, 0.25rem);
457
+ gap: var(--pd-spacing-xs, 0.25rem);
458
+ }
459
+ }
460
+
461
+ @container (max-width: 300px) {
462
+ .layout-container {
463
+ padding: 2px;
464
+ }
465
+ }
466
+ `
467
+ ];
468
+ __decorateClass([
469
+ property({ type: Object })
470
+ ], PdCalendar.prototype, "refDate", 2);
471
+ __decorateClass([
472
+ property({ type: Boolean })
473
+ ], PdCalendar.prototype, "selectableDates", 2);
474
+ __decorateClass([
475
+ property({ type: Array })
476
+ ], PdCalendar.prototype, "withYearPopup", 2);
477
+ __decorateClass([
478
+ property({ type: Boolean })
479
+ ], PdCalendar.prototype, "withWheelNavigation", 2);
480
+ __decorateClass([
481
+ property({ type: Boolean })
482
+ ], PdCalendar.prototype, "withTouchNavigation", 2);
483
+ __decorateClass([
484
+ property({ type: Boolean })
485
+ ], PdCalendar.prototype, "showSelection", 2);
486
+ __decorateClass([
487
+ property({ type: Boolean, reflect: true })
488
+ ], PdCalendar.prototype, "hideWeekend", 2);
489
+ __decorateClass([
490
+ property({ type: Number })
491
+ ], PdCalendar.prototype, "prevMonthConstraint", 2);
492
+ __decorateClass([
493
+ property({ type: Number })
494
+ ], PdCalendar.prototype, "nextMonthConstraint", 2);
495
+ __decorateClass([
496
+ property({ type: Object })
497
+ ], PdCalendar.prototype, "data", 2);
498
+ __decorateClass([
499
+ property({ type: String })
500
+ ], PdCalendar.prototype, "numberClass", 2);
501
+ __decorateClass([
502
+ property({ type: Object })
503
+ ], PdCalendar.prototype, "availableViewTypes", 2);
504
+ __decorateClass([
505
+ property({ type: Object })
506
+ ], PdCalendar.prototype, "config", 2);
507
+ __decorateClass([
508
+ property({ type: Object })
509
+ ], PdCalendar.prototype, "listRange", 2);
510
+ __decorateClass([
511
+ property({ type: Object })
512
+ ], PdCalendar.prototype, "weekViewConfig", 2);
513
+ __decorateClass([
514
+ property({ type: String })
515
+ ], PdCalendar.prototype, "cellType", 2);
516
+ __decorateClass([
517
+ property({ type: Object })
518
+ ], PdCalendar.prototype, "eventActions", 2);
519
+ __decorateClass([
520
+ state()
521
+ ], PdCalendar.prototype, "_infoPanelEntry", 2);
522
+ __decorateClass([
523
+ state()
524
+ ], PdCalendar.prototype, "_infoPanelDateKey", 2);
525
+ __decorateClass([
526
+ state()
527
+ ], PdCalendar.prototype, "_infoPanelAnchorRect", 2);
528
+ __decorateClass([
529
+ state()
530
+ ], PdCalendar.prototype, "_dayEventsPanelEntries", 2);
531
+ __decorateClass([
532
+ state()
533
+ ], PdCalendar.prototype, "_dayEventsPanelDateKey", 2);
534
+ __decorateClass([
535
+ state()
536
+ ], PdCalendar.prototype, "_dayEventsPanelAnchorRect", 2);
537
+ __decorateClass([
538
+ state()
539
+ ], PdCalendar.prototype, "_currentViewType", 2);
540
+ __decorateClass([
541
+ state()
542
+ ], PdCalendar.prototype, "_currentDate", 2);
543
+ __decorateClass([
544
+ state()
545
+ ], PdCalendar.prototype, "_currentWeekStart", 2);
546
+ PdCalendar = __decorateClass([
547
+ localized()
548
+ ], PdCalendar);
549
+
550
+ export { PdCalendar };
@@ -0,0 +1,56 @@
1
+ import { CSSResultGroup } from 'lit';
2
+ import { PdBaseCell } from '../../shared/PdBaseCell.js';
3
+ /**
4
+ * A single calendar day cell component for use within monthly calendar views.
5
+ *
6
+ * @tagname pd-calendar-cell
7
+ * @summary Single day cell with info text, selection, hover, and focus states.
8
+ *
9
+ * @event select-date - Fired when a selectable cell is clicked. Detail: `{ dateKey: string, date: Date }`.
10
+ * @event mouse-enter-date - Fired when hovering over a selectable cell. Detail: `{ dateKey: string, date: Date }`.
11
+ * @event mouse-leave-date - Fired when leaving a cell.
12
+ *
13
+ * @cssprop --pd-calendar-cell-day-bg-col - Background color for day cells. Default: `var(--pd-default-light-col)`.
14
+ * @cssprop --pd-calendar-cell-day-we-bg-col - Background color for weekend cells. Default: `var(--pd-default-bg-light-col)`.
15
+ * @cssprop --pd-calendar-cell-day-free-bg-col - Background color for selectable cells. Default: `var(--pd-default-col)`.
16
+ * @cssprop --pd-calendar-cell-day-category-bg-col - Background color for categorized cells. Set dynamically via categoryColor.
17
+ * @cssprop --pd-calendar-cell-day-category-text-col - Text color for categorized cells. Set dynamically via categoryTextColor.
18
+ * @cssprop --pd-calendar-cell-day-bg-col-hover - Background color on hover. Default: `var(--pd-default-hover-col)`.
19
+ * @cssprop --pd-calendar-cell-day-info-col - Text color for info text. Default: `var(--pd-on-primary-col)`.
20
+ * @cssprop --pd-calendar-cell-day-number-col - Text color for day numbers. Default: `var(--pd-default-dark-col)`.
21
+ * @cssprop --pd-calendar-cell-day-info-free-col - Text color for selectable cells. Default: `var(--pd-on-primary-col)`.
22
+ * @cssprop --pd-calendar-cell-selectable-shadow - Box shadow for selectable cells. Default: `var(--pd-shadow-sm)`.
23
+ * @cssprop --pd-calendar-cell-focus-outline-col - Focus outline color for keyboard navigation. Default: `var(--pd-default-info-col)`.
24
+ * @cssprop --pd-calendar-cell-today-border-col - Border color for today's date. Default: `var(--pd-default-error-col)`.
25
+ * @cssprop --pd-calendar-cell-selected-bg-col - Background color for selected date. Default: `var(--pd-default-col)`.
26
+ * @cssprop --pd-calendar-info-font-size - Font size for info text. Default: `1.5em`.
27
+ * @cssprop --pd-calendar-number-font-size - Font size for day number. Default: `0.9em`.
28
+ * @cssprop --pd-calendar-cell-day-info-selection-col - Text color for day number when the cell is selected. Default: `var(--pd-on-primary-col)`.
29
+ */
30
+ export declare class PdCalendarCell extends PdBaseCell {
31
+ /** Whether the cell can be selected by the user. */
32
+ selectEnabled: boolean;
33
+ /** Highlight as today's date. */
34
+ today: boolean;
35
+ /** Whether this cell has keyboard focus. */
36
+ focused: boolean;
37
+ /** CSS class for day number positioning ('top-left' or 'center'). */
38
+ numberClass: string;
39
+ static styles: CSSResultGroup;
40
+ render(): import('lit').TemplateResult<1>;
41
+ protected _handleSelect(): void;
42
+ /**
43
+ * Determines if this is a weekend day.
44
+ */
45
+ private _isWeekend;
46
+ /**
47
+ * Builds CSS class string for the cell.
48
+ */
49
+ private _getCellClasses;
50
+ private _renderSelectableCell;
51
+ private _renderNonSelectableCell;
52
+ private _selectableCellClicked;
53
+ private _mouseEnter;
54
+ private _mouseLeave;
55
+ }
56
+ //# sourceMappingURL=PdCalendarCell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PdCalendarCell.d.ts","sourceRoot":"","sources":["../../../src/pd-calendar/pd-calendar-cell/PdCalendarCell.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAa,cAAc,EAAW,MAAM,KAAK,CAAC;AAKzD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,cAAe,SAAQ,UAAU;IAC5C,oDAAoD;IAEpD,aAAa,UAAS;IAEtB,iCAAiC;IAEjC,KAAK,UAAS;IAEd,4CAA4C;IAE5C,OAAO,UAAS;IAEhB,qEAAqE;IAErE,WAAW,SAAc;IAEzB,OAAgB,MAAM,EAAE,cAAc,CA4MpC;IAEO,MAAM;cAOI,aAAa,IAAI,IAAI;IAaxC;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,qBAAqB;IA8B7B,OAAO,CAAC,wBAAwB;IAWhC,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,WAAW;CAQpB"}