picocrank 1.25.1 → 1.26.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 (44) hide show
  1. package/eslint.config.js +68 -0
  2. package/package.json +13 -3
  3. package/router.js +74 -0
  4. package/styles/dark-theme.css +21 -9
  5. package/styles/picocrank-extensions.css +131 -2
  6. package/supplemental-themes/catppuccin-latte-frappe/theme.css +12 -22
  7. package/supplemental-themes/dracula-alucard/theme.css +12 -22
  8. package/supplemental-themes/gruvbox-dark-light/theme.css +12 -22
  9. package/supplemental-themes/waffles/theme.css +2 -12
  10. package/vue/components/Breadcrumbs.vue +192 -45
  11. package/vue/components/Calendar.vue +93 -180
  12. package/vue/components/DangerZone.vue +186 -0
  13. package/vue/components/Header.vue +22 -6
  14. package/vue/components/Login.vue +6 -7
  15. package/vue/components/NavigationGrid.vue +26 -204
  16. package/vue/components/NotificationBlock.vue +120 -0
  17. package/vue/components/NotificationPopup.vue +44 -41
  18. package/vue/components/QuickSearch.vue +21 -47
  19. package/vue/components/RadioGroup.vue +4 -4
  20. package/vue/components/ReadOnlyTextArea.vue +1 -1
  21. package/vue/components/SidebarNavLink.vue +3 -3
  22. package/vue/components/Table.vue +109 -81
  23. package/vue/components/TableColumnFilterPopover.vue +7 -17
  24. package/vue/components/TableColumnOptionsPopover.vue +22 -27
  25. package/vue/components/Tabs.vue +366 -82
  26. package/vue/components/TopBar.vue +2 -2
  27. package/vue/composables/tableColumnPriorities.js +33 -0
  28. package/vue/composables/tableFilters.js +1 -1
  29. package/vue/data/navSectionHubs.js +196 -0
  30. package/vue/data/routeBreadcrumbs.js +90 -0
  31. package/vue/examples/Admin.vue +12 -12
  32. package/vue/examples/App.vue +27 -36
  33. package/vue/examples/CalendarExample.vue +32 -22
  34. package/vue/examples/ExampleHeaderThemeSwitcher.vue +1 -1
  35. package/vue/examples/Login.vue +0 -3
  36. package/vue/examples/LoginExample.vue +2 -14
  37. package/vue/examples/NavSectionHub.vue +36 -0
  38. package/vue/examples/PageStructure.vue +6 -3
  39. package/vue/examples/StatusExample.vue +248 -129
  40. package/vue/examples/TableExample.vue +68 -67
  41. package/vue/examples/TabsExample.vue +200 -255
  42. package/vue/examples/ThemePreview.vue +21 -23
  43. package/vue/examples/ViewItem.vue +32 -5
  44. package/vue/examples/Welcome.vue +3 -112
@@ -12,6 +12,8 @@ export interface CalendarEvent {
12
12
  icon?: unknown
13
13
  /** Optional CSS color overriding the default event background. */
14
14
  color?: string
15
+ /** Optional CSS color for event title/time when using a custom background. */
16
+ foregroundColor?: string
15
17
  [key: string]: any
16
18
  }
17
19
 
@@ -23,7 +25,7 @@ export interface CalendarEventMoveRequest {
23
25
  /** Calendar cell where the event was dropped. */
24
26
  targetDate: Date
25
27
  /** Invoke exactly once with the outcome. If omitted until timeout, the move is treated as rejected. */
26
- respond: (accepted: boolean) => void
28
+ respond: (_accepted: boolean) => void
27
29
  }
28
30
 
29
31
  export interface CalendarProps {
@@ -41,9 +43,9 @@ export interface CalendarProps {
41
43
  */
42
44
  eventMoveResponseTimeoutMs?: number
43
45
  // Formatter functions
44
- getEventDate?: (event: CalendarEvent) => Date | null
45
- getEventDateRange?: (event: CalendarEvent) => { start: Date | null; end: Date | null }
46
- formatEventTime?: (event: CalendarEvent, date: Date) => string
46
+ getEventDate?: (_event: CalendarEvent) => Date | null
47
+ getEventDateRange?: (_event: CalendarEvent) => { start: Date | null; end: Date | null }
48
+ formatEventTime?: (_event: CalendarEvent, _date: Date) => string
47
49
  // Customization
48
50
  showNavigation?: boolean
49
51
  /** When true, day titles show ordinal + full month name (e.g. "21st July") instead of the day number alone. */
@@ -87,8 +89,8 @@ const currentDate = computed(() => {
87
89
  return internalCurrentDate.value
88
90
  })
89
91
 
90
- const currentMonth = computed(() => currentDate.value.getMonth())
91
- const currentYear = computed(() => currentDate.value.getFullYear())
92
+ const viewMonth = computed(() => currentDate.value.getMonth())
93
+ const viewYear = computed(() => currentDate.value.getFullYear())
92
94
 
93
95
  // Compute the first visible day (Monday) for the current month view
94
96
  function getStartOfGrid(date: Date): Date {
@@ -130,7 +132,7 @@ function isPastDay(date: Date): boolean {
130
132
  }
131
133
 
132
134
  // Get event date range
133
- function getEventDateRange(event: CalendarEvent): { start: Date | null; end: Date | null } {
135
+ function resolveEventDateRange(event: CalendarEvent): { start: Date | null; end: Date | null } {
134
136
  if (props.getEventDateRange) {
135
137
  return props.getEventDateRange(event)
136
138
  }
@@ -158,7 +160,7 @@ function getEventsForDate(date: Date): CalendarEvent[] {
158
160
  targetDate.setHours(0, 0, 0, 0)
159
161
 
160
162
  return props.events.filter(event => {
161
- const { start, end } = getEventDateRange(event)
163
+ const { start, end } = resolveEventDateRange(event)
162
164
 
163
165
  if (!start) return false
164
166
 
@@ -177,7 +179,7 @@ function getEventsForDate(date: Date): CalendarEvent[] {
177
179
 
178
180
  // Check if an event is a multi-day event
179
181
  function isMultiDayEvent(event: CalendarEvent): boolean {
180
- const { start, end } = getEventDateRange(event)
182
+ const { start, end } = resolveEventDateRange(event)
181
183
 
182
184
  if (!start || !end) return false
183
185
 
@@ -192,7 +194,7 @@ function isMultiDayEvent(event: CalendarEvent): boolean {
192
194
 
193
195
  // Get the position of an event within a multi-day range for a specific date
194
196
  function getMultiDayPosition(event: CalendarEvent, date: Date): 'start' | 'middle' | 'end' | 'single' {
195
- const { start, end } = getEventDateRange(event)
197
+ const { start, end } = resolveEventDateRange(event)
196
198
 
197
199
  if (!start || !end) return 'single'
198
200
 
@@ -218,7 +220,7 @@ function formatEventTimeDefault(event: CalendarEvent, date: Date): string {
218
220
  return props.formatEventTime(event, date)
219
221
  }
220
222
 
221
- const { start, end } = getEventDateRange(event)
223
+ const { start, end } = resolveEventDateRange(event)
222
224
  const position = getMultiDayPosition(event, date)
223
225
 
224
226
  if (!start || !end) return 'No time'
@@ -237,8 +239,14 @@ function formatEventTimeDefault(event: CalendarEvent, date: Date): string {
237
239
  }
238
240
 
239
241
  function getEventStyle(event: CalendarEvent): Record<string, string> | undefined {
240
- if (!event.color) return undefined
241
- return { '--event-color': event.color }
242
+ const style: Record<string, string> = {}
243
+ if (event.color) {
244
+ style['--event-color'] = event.color
245
+ }
246
+ if (event.foregroundColor) {
247
+ style['--event-foreground-color'] = event.foregroundColor
248
+ }
249
+ return Object.keys(style).length > 0 ? style : undefined
242
250
  }
243
251
 
244
252
  // Get ordinal suffix for a number (1st, 2nd, 3rd, 4th, etc.)
@@ -275,25 +283,25 @@ const calendarDays = computed(() => {
275
283
  // Navigation functions
276
284
  function previousMonth() {
277
285
  if (props.currentMonth !== undefined && props.currentYear !== undefined) {
278
- const newMonth = currentMonth.value === 0 ? 11 : currentMonth.value - 1
279
- const newYear = currentMonth.value === 0 ? currentYear.value - 1 : currentYear.value
286
+ const newMonth = viewMonth.value === 0 ? 11 : viewMonth.value - 1
287
+ const newYear = viewMonth.value === 0 ? viewYear.value - 1 : viewYear.value
280
288
  emit('month-change', newMonth, newYear)
281
289
  // Optimistically update grid anchor for smooth transition
282
290
  gridStartDate.value = getStartOfGrid(new Date(newYear, newMonth, 1))
283
291
  } else {
284
- internalCurrentDate.value = new Date(currentYear.value, currentMonth.value - 1, 1)
292
+ internalCurrentDate.value = new Date(viewYear.value, viewMonth.value - 1, 1)
285
293
  gridStartDate.value = getStartOfGrid(internalCurrentDate.value)
286
294
  }
287
295
  }
288
296
 
289
297
  function nextMonth() {
290
298
  if (props.currentMonth !== undefined && props.currentYear !== undefined) {
291
- const newMonth = currentMonth.value === 11 ? 0 : currentMonth.value + 1
292
- const newYear = currentMonth.value === 11 ? currentYear.value + 1 : currentYear.value
299
+ const newMonth = viewMonth.value === 11 ? 0 : viewMonth.value + 1
300
+ const newYear = viewMonth.value === 11 ? viewYear.value + 1 : viewYear.value
293
301
  emit('month-change', newMonth, newYear)
294
302
  gridStartDate.value = getStartOfGrid(new Date(newYear, newMonth, 1))
295
303
  } else {
296
- internalCurrentDate.value = new Date(currentYear.value, currentMonth.value + 1, 1)
304
+ internalCurrentDate.value = new Date(viewYear.value, viewMonth.value + 1, 1)
297
305
  gridStartDate.value = getStartOfGrid(internalCurrentDate.value)
298
306
  }
299
307
  }
@@ -325,7 +333,7 @@ function adjustByWeeks(weeks: number): void {
325
333
 
326
334
  if (props.currentMonth !== undefined && props.currentYear !== undefined) {
327
335
  const { month, year } = getVisibleMonthYear(newStart)
328
- if (month !== currentMonth.value || year !== currentYear.value) {
336
+ if (month !== viewMonth.value || year !== viewYear.value) {
329
337
  emit('month-change', month, year)
330
338
  // Set flag to prevent watcher from resetting our scroll position
331
339
  isScrolling.value = true
@@ -589,9 +597,9 @@ function onDayDrop(dayDate: Date, ev: DragEvent): void {
589
597
  }
590
598
 
591
599
  // Sync grid start when controlled month/year props change (but not during scrolling)
592
- watch([currentMonth, currentYear], () => {
600
+ watch([viewMonth, viewYear], () => {
593
601
  if (isScrolling.value) return
594
- const anchor = new Date(currentYear.value, currentMonth.value, 1)
602
+ const anchor = new Date(viewYear.value, viewMonth.value, 1)
595
603
  gridStartDate.value = getStartOfGrid(anchor)
596
604
  })
597
605
 
@@ -600,7 +608,7 @@ watch([currentMonth, currentYear], () => {
600
608
  <template>
601
609
  <div class="calendar-wrapper">
602
610
  <div v-if="showNavigation" class="calendar-header-nav">
603
- <h2 class="calendar-title">{{ monthNames[currentMonth] }} {{ currentYear }}</h2>
611
+ <h2 class="calendar-title">{{ monthNames[viewMonth] }} {{ viewYear }}</h2>
604
612
  <div class="calendar-nav-buttons">
605
613
  <slot name="nav-buttons">
606
614
  <button @click="previousMonth" class="button neutral">‹</button>
@@ -638,8 +646,8 @@ watch([currentMonth, currentYear], () => {
638
646
  :class="{
639
647
  'today': day.date.toDateString() === new Date().toDateString(),
640
648
  'weekend': day.date.getDay() === 0 || day.date.getDay() === 6,
641
- 'prev-month': day.date.getMonth() !== currentMonth && day.date.getMonth() !== (currentMonth + 1) % 12,
642
- 'next-month': day.date.getMonth() !== currentMonth && day.date.getMonth() === (currentMonth + 1) % 12,
649
+ 'prev-month': day.date.getMonth() !== viewMonth && day.date.getMonth() !== (viewMonth + 1) % 12,
650
+ 'next-month': day.date.getMonth() !== viewMonth && day.date.getMonth() === (viewMonth + 1) % 12,
643
651
  'past': isPastDay(day.date),
644
652
  'range-single': rangeHighlightForDate(day.date) === 'single',
645
653
  'range-start': rangeHighlightForDate(day.date) === 'start',
@@ -731,7 +739,7 @@ watch([currentMonth, currentYear], () => {
731
739
  align-items: center;
732
740
  margin-bottom: 1rem;
733
741
  padding: 1rem;
734
- background: #f8f9fa;
742
+ background: var(--calendar-chrome-bg);
735
743
  border-radius: 8px;
736
744
  }
737
745
 
@@ -748,7 +756,7 @@ watch([currentMonth, currentYear], () => {
748
756
  }
749
757
 
750
758
  .calendar-error {
751
- color: #b00020;
759
+ color: var(--calendar-error-fg);
752
760
  padding: 1rem;
753
761
  }
754
762
 
@@ -763,14 +771,14 @@ watch([currentMonth, currentYear], () => {
763
771
  display: flex;
764
772
  align-items: center;
765
773
  justify-content: center;
766
- background: rgba(255, 255, 255, 0.6);
774
+ background: var(--calendar-loading-overlay-bg);
767
775
  z-index: 1;
768
776
  font-weight: 600;
769
777
  }
770
778
 
771
779
  .calendar-container {
772
- background: white;
773
- border: 1px solid #e0e0e0;
780
+ background: var(--calendar-surface-bg);
781
+ border: 1px solid var(--calendar-border);
774
782
  overflow: hidden;
775
783
  border-radius: 8px;
776
784
  position: relative;
@@ -788,36 +796,36 @@ watch([currentMonth, currentYear], () => {
788
796
  }
789
797
 
790
798
  .calendar-day.range-single {
791
- background-color: rgba(0, 123, 255, 0.22) !important;
792
- box-shadow: inset 0 0 0 2px #007bff;
799
+ background-color: var(--calendar-range-bg-strong) !important;
800
+ box-shadow: inset 0 0 0 2px var(--calendar-range-accent);
793
801
  }
794
802
 
795
803
  .calendar-day.range-start {
796
- background-color: rgba(0, 123, 255, 0.14) !important;
804
+ background-color: var(--calendar-range-bg) !important;
797
805
  box-shadow:
798
- inset 2px 0 0 0 #007bff,
799
- inset 0 2px 0 0 #007bff,
800
- inset 0 -2px 0 0 #007bff;
806
+ inset 2px 0 0 0 var(--calendar-range-accent),
807
+ inset 0 2px 0 0 var(--calendar-range-accent),
808
+ inset 0 -2px 0 0 var(--calendar-range-accent);
801
809
  }
802
810
 
803
811
  .calendar-day.range-end {
804
- background-color: rgba(0, 123, 255, 0.14) !important;
812
+ background-color: var(--calendar-range-bg) !important;
805
813
  box-shadow:
806
- inset -2px 0 0 0 #007bff,
807
- inset 0 2px 0 0 #007bff,
808
- inset 0 -2px 0 0 #007bff;
814
+ inset -2px 0 0 0 var(--calendar-range-accent),
815
+ inset 0 2px 0 0 var(--calendar-range-accent),
816
+ inset 0 -2px 0 0 var(--calendar-range-accent);
809
817
  }
810
818
 
811
819
  .calendar-day.range-middle {
812
- background-color: rgba(0, 123, 255, 0.14) !important;
820
+ background-color: var(--calendar-range-bg) !important;
813
821
  box-shadow:
814
- inset 0 2px 0 0 #007bff,
815
- inset 0 -2px 0 0 #007bff;
822
+ inset 0 2px 0 0 var(--calendar-range-accent),
823
+ inset 0 -2px 0 0 var(--calendar-range-accent);
816
824
  }
817
825
 
818
826
  .calendar-day.drag-over-target {
819
- background-color: rgba(0, 123, 255, 0.1) !important;
820
- outline: 2px dashed #007bff;
827
+ background-color: var(--calendar-range-bg-subtle) !important;
828
+ outline: 2px dashed var(--calendar-range-accent);
821
829
  outline-offset: -3px;
822
830
  }
823
831
 
@@ -825,10 +833,10 @@ watch([currentMonth, currentYear], () => {
825
833
  padding: 1rem;
826
834
  text-align: center;
827
835
  font-weight: 600;
828
- color: #666;
829
- border-right: 1px solid #e0e0e0;
830
- border-bottom: 1px solid #e0e0e0;
831
- background: #f8f9fa;
836
+ color: var(--calendar-muted-fg);
837
+ border-right: 1px solid var(--calendar-border);
838
+ border-bottom: 1px solid var(--calendar-border);
839
+ background: var(--calendar-chrome-bg);
832
840
  }
833
841
 
834
842
  .day-header:last-child {
@@ -836,8 +844,8 @@ watch([currentMonth, currentYear], () => {
836
844
  }
837
845
 
838
846
  .calendar-day {
839
- border-right: 1px solid #e0e0e0;
840
- border-bottom: 1px solid #e0e0e0;
847
+ border-right: 1px solid var(--calendar-border);
848
+ border-bottom: 1px solid var(--calendar-border);
841
849
  height: 160px;
842
850
  position: relative;
843
851
  transition: background-color 0.2s ease;
@@ -846,7 +854,7 @@ watch([currentMonth, currentYear], () => {
846
854
  }
847
855
 
848
856
  .calendar-day:hover {
849
- background-color: #f0f8ff;
857
+ background-color: var(--calendar-day-hover-bg);
850
858
  }
851
859
 
852
860
  .calendar-day:hover .day-number .day-month {
@@ -858,21 +866,21 @@ watch([currentMonth, currentYear], () => {
858
866
  }
859
867
 
860
868
  .calendar-day.weekend {
861
- background: #f8f9fa;
869
+ background: var(--calendar-day-muted-bg);
862
870
  }
863
871
 
864
872
  .calendar-day.weekend:hover {
865
- background: #e9ecef;
873
+ background: var(--calendar-day-muted-hover-bg);
866
874
  }
867
875
 
868
876
  .calendar-day.next-month,
869
877
  .calendar-day.prev-month {
870
- background: #f8f9fa;
878
+ background: var(--calendar-day-muted-bg);
871
879
  }
872
880
 
873
881
  .calendar-day.next-month:hover,
874
882
  .calendar-day.prev-month:hover {
875
- background: #e9ecef;
883
+ background: var(--calendar-day-muted-hover-bg);
876
884
  }
877
885
 
878
886
  .calendar-day.past {
@@ -884,12 +892,12 @@ watch([currentMonth, currentYear], () => {
884
892
  }
885
893
 
886
894
  .calendar-day.today {
887
- background: #f7f8d7;
895
+ background: var(--calendar-today-bg);
888
896
  font-weight: bold;
889
897
  }
890
898
 
891
899
  .calendar-day.today:hover {
892
- background: #bbdefb;
900
+ background: var(--calendar-today-hover-bg);
893
901
  }
894
902
 
895
903
 
@@ -902,7 +910,7 @@ watch([currentMonth, currentYear], () => {
902
910
  .day-number {
903
911
  font-size: 0.9rem;
904
912
  margin-bottom: 0.25rem;
905
- color: #333;
913
+ color: var(--calendar-day-fg);
906
914
  text-decoration: none;
907
915
  display: inline-block;
908
916
  padding: 0.1rem;
@@ -932,7 +940,7 @@ watch([currentMonth, currentYear], () => {
932
940
  }
933
941
 
934
942
  .day-content:hover .day-number.clickable {
935
- color: #007bff;
943
+ color: var(--calendar-accent-fg);
936
944
  }
937
945
 
938
946
  .day-events {
@@ -941,12 +949,12 @@ watch([currentMonth, currentYear], () => {
941
949
  }
942
950
 
943
951
  .calendar-event {
944
- background: #d6f1aa;
945
- border: 1px solid #c4db96;
952
+ background: var(--calendar-event-bg);
953
+ border: 1px solid var(--calendar-event-border);
946
954
  margin-bottom: 0.25rem;
947
955
  cursor: pointer;
948
956
  transition: all 0.2s;
949
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
957
+ box-shadow: var(--calendar-event-shadow);
950
958
  padding: 0.1rem 0.1rem;
951
959
  }
952
960
 
@@ -963,23 +971,35 @@ watch([currentMonth, currentYear], () => {
963
971
  }
964
972
 
965
973
  .calendar-event:hover {
966
- background: #b3de6e;
967
- border-color: #c4db96;
974
+ background: var(--calendar-event-hover-bg);
975
+ border-color: var(--calendar-event-border);
968
976
  transform: translateY(-1px);
969
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
977
+ box-shadow: var(--calendar-event-hover-shadow);
970
978
  }
971
979
 
972
980
  .calendar-event.has-custom-color {
973
981
  background: var(--event-color);
974
- border-color: color-mix(in srgb, var(--event-color) 75%, black);
982
+ border-color: color-mix(in srgb, var(--event-color) 75%, var(--calendar-event-custom-border-mix));
975
983
  }
976
984
 
977
985
  .calendar-event.has-custom-color:hover {
978
986
  background: var(--event-color);
979
- border-color: color-mix(in srgb, var(--event-color) 75%, black);
987
+ border-color: color-mix(in srgb, var(--event-color) 75%, var(--calendar-event-custom-border-mix));
980
988
  filter: brightness(0.92);
981
989
  }
982
990
 
991
+ .calendar-event.has-custom-color .event-title {
992
+ color: var(--event-foreground-color, var(--calendar-event-title-fg));
993
+ }
994
+
995
+ .calendar-event.has-custom-color .event-time {
996
+ color: var(--event-foreground-color, var(--calendar-muted-fg));
997
+ }
998
+
999
+ .calendar-event.has-custom-color .multi-day-indicator {
1000
+ color: var(--event-foreground-color, var(--calendar-accent-fg));
1001
+ }
1002
+
983
1003
  .event-icon {
984
1004
  flex-shrink: 0;
985
1005
  }
@@ -1005,7 +1025,7 @@ watch([currentMonth, currentYear], () => {
1005
1025
  .event-title {
1006
1026
  font-weight: bold;
1007
1027
  font-size: 0.85rem;
1008
- color: #333;
1028
+ color: var(--calendar-event-title-fg);
1009
1029
  white-space: normal;
1010
1030
  overflow: hidden;
1011
1031
  text-overflow: ellipsis;
@@ -1016,22 +1036,22 @@ watch([currentMonth, currentYear], () => {
1016
1036
 
1017
1037
  .multi-day-indicator {
1018
1038
  font-size: 0.7rem;
1019
- color: #007bff;
1039
+ color: var(--calendar-accent-fg);
1020
1040
  font-weight: bold;
1021
1041
  }
1022
1042
 
1023
1043
  .event-time {
1024
1044
  font-size: 0.75rem;
1025
- color: #666;
1045
+ color: var(--calendar-muted-fg);
1026
1046
  margin-top: 0.125rem;
1027
1047
  }
1028
1048
 
1029
1049
  .more-events {
1030
1050
  font-size: 0.75rem;
1031
- color: #666;
1051
+ color: var(--calendar-muted-fg);
1032
1052
  text-align: center;
1033
1053
  padding: 0.25rem;
1034
- background: #f8f9fa;
1054
+ background: var(--calendar-more-bg);
1035
1055
  border-radius: 4px;
1036
1056
  margin-top: 0.25rem;
1037
1057
  }
@@ -1085,111 +1105,4 @@ watch([currentMonth, currentYear], () => {
1085
1105
  padding: 0.25rem 0.5rem;
1086
1106
  }
1087
1107
  }
1088
-
1089
- html[data-theme="dark"] {
1090
- .calendar-container {
1091
- background: #565656;
1092
- border-color: #374151;
1093
- border: 1px solid #565656;
1094
- }
1095
-
1096
- .calendar-day.today {
1097
- background: #646c70;
1098
- }
1099
-
1100
- .calendar-day.weekend {
1101
- background: #444;
1102
- }
1103
-
1104
- .calendar-day.weekend:hover {
1105
- background: #1a1a1a;
1106
- }
1107
-
1108
- .calendar-day.next-month,
1109
- .calendar-day.prev-month {
1110
- background: #1a1a1a !important;
1111
- }
1112
-
1113
- .calendar-day.next-month:hover,
1114
- .calendar-day.prev-month:hover {
1115
- background: #374151;
1116
- }
1117
-
1118
- .calendar-day.today:hover {
1119
- background: #374151;
1120
- }
1121
-
1122
- .calendar-day {
1123
- border: 1px solid #3b3b3b;
1124
- }
1125
-
1126
- .day-number {
1127
- color: #f9fafb;
1128
- }
1129
-
1130
- .day-header {
1131
- color: #f9fafb;
1132
- background: #444 !important;
1133
- border: 1px solid #374151;
1134
- border-color: #374151;
1135
- }
1136
-
1137
- .day-content:hover .day-number.clickable {
1138
- color: #f9fafb;
1139
- }
1140
-
1141
- .calendar-day:hover {
1142
- background-color: #374151;
1143
- }
1144
-
1145
- .calendar-day.today:hover {
1146
- background: #374151;
1147
- }
1148
-
1149
- .calendar-day.weekend:hover {
1150
- background: #374151;
1151
- }
1152
-
1153
- .calendar-day.range-single {
1154
- background-color: rgba(96, 165, 250, 0.28) !important;
1155
- box-shadow: inset 0 0 0 2px #60a5fa;
1156
- }
1157
-
1158
- .calendar-day.range-start {
1159
- background-color: rgba(96, 165, 250, 0.18) !important;
1160
- box-shadow:
1161
- inset 2px 0 0 0 #60a5fa,
1162
- inset 0 2px 0 0 #60a5fa,
1163
- inset 0 -2px 0 0 #60a5fa;
1164
- }
1165
-
1166
- .calendar-day.range-end {
1167
- background-color: rgba(96, 165, 250, 0.18) !important;
1168
- box-shadow:
1169
- inset -2px 0 0 0 #60a5fa,
1170
- inset 0 2px 0 0 #60a5fa,
1171
- inset 0 -2px 0 0 #60a5fa;
1172
- }
1173
-
1174
- .calendar-day.range-middle {
1175
- background-color: rgba(96, 165, 250, 0.18) !important;
1176
- box-shadow:
1177
- inset 0 2px 0 0 #60a5fa,
1178
- inset 0 -2px 0 0 #60a5fa;
1179
- }
1180
-
1181
- .calendar-day.drag-over-target {
1182
- background-color: rgba(96, 165, 250, 0.12) !important;
1183
- outline: 2px dashed #60a5fa;
1184
- outline-offset: -3px;
1185
- }
1186
-
1187
- .calendar-day.past {
1188
- opacity: 0.6;
1189
- }
1190
-
1191
- .calendar-day.past:hover {
1192
- opacity: 0.8;
1193
- }
1194
- }
1195
1108
  </style>