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.
- package/eslint.config.js +68 -0
- package/package.json +13 -3
- package/router.js +74 -0
- package/styles/dark-theme.css +21 -9
- package/styles/picocrank-extensions.css +131 -2
- package/supplemental-themes/catppuccin-latte-frappe/theme.css +12 -22
- package/supplemental-themes/dracula-alucard/theme.css +12 -22
- package/supplemental-themes/gruvbox-dark-light/theme.css +12 -22
- package/supplemental-themes/waffles/theme.css +2 -12
- package/vue/components/Breadcrumbs.vue +192 -45
- package/vue/components/Calendar.vue +93 -180
- package/vue/components/DangerZone.vue +186 -0
- package/vue/components/Header.vue +22 -6
- package/vue/components/Login.vue +6 -7
- package/vue/components/NavigationGrid.vue +26 -204
- package/vue/components/NotificationBlock.vue +120 -0
- package/vue/components/NotificationPopup.vue +44 -41
- package/vue/components/QuickSearch.vue +21 -47
- package/vue/components/RadioGroup.vue +4 -4
- package/vue/components/ReadOnlyTextArea.vue +1 -1
- package/vue/components/SidebarNavLink.vue +3 -3
- package/vue/components/Table.vue +109 -81
- package/vue/components/TableColumnFilterPopover.vue +7 -17
- package/vue/components/TableColumnOptionsPopover.vue +22 -27
- package/vue/components/Tabs.vue +366 -82
- package/vue/components/TopBar.vue +2 -2
- package/vue/composables/tableColumnPriorities.js +33 -0
- package/vue/composables/tableFilters.js +1 -1
- package/vue/data/navSectionHubs.js +196 -0
- package/vue/data/routeBreadcrumbs.js +90 -0
- package/vue/examples/Admin.vue +12 -12
- package/vue/examples/App.vue +27 -36
- package/vue/examples/CalendarExample.vue +32 -22
- package/vue/examples/ExampleHeaderThemeSwitcher.vue +1 -1
- package/vue/examples/Login.vue +0 -3
- package/vue/examples/LoginExample.vue +2 -14
- package/vue/examples/NavSectionHub.vue +36 -0
- package/vue/examples/PageStructure.vue +6 -3
- package/vue/examples/StatusExample.vue +248 -129
- package/vue/examples/TableExample.vue +68 -67
- package/vue/examples/TabsExample.vue +200 -255
- package/vue/examples/ThemePreview.vue +21 -23
- package/vue/examples/ViewItem.vue +32 -5
- 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: (
|
|
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?: (
|
|
45
|
-
getEventDateRange?: (
|
|
46
|
-
formatEventTime?: (
|
|
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
|
|
91
|
-
const
|
|
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
|
|
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 } =
|
|
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 } =
|
|
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 } =
|
|
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 } =
|
|
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
|
-
|
|
241
|
-
|
|
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 =
|
|
279
|
-
const newYear =
|
|
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(
|
|
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 =
|
|
292
|
-
const newYear =
|
|
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(
|
|
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 !==
|
|
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([
|
|
600
|
+
watch([viewMonth, viewYear], () => {
|
|
593
601
|
if (isScrolling.value) return
|
|
594
|
-
const anchor = new Date(
|
|
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[
|
|
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() !==
|
|
642
|
-
'next-month': day.date.getMonth() !==
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
773
|
-
border: 1px solid
|
|
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:
|
|
792
|
-
box-shadow: inset 0 0 0 2px
|
|
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:
|
|
804
|
+
background-color: var(--calendar-range-bg) !important;
|
|
797
805
|
box-shadow:
|
|
798
|
-
inset 2px 0 0 0
|
|
799
|
-
inset 0 2px 0 0
|
|
800
|
-
inset 0 -2px 0 0
|
|
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:
|
|
812
|
+
background-color: var(--calendar-range-bg) !important;
|
|
805
813
|
box-shadow:
|
|
806
|
-
inset -2px 0 0 0
|
|
807
|
-
inset 0 2px 0 0
|
|
808
|
-
inset 0 -2px 0 0
|
|
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:
|
|
820
|
+
background-color: var(--calendar-range-bg) !important;
|
|
813
821
|
box-shadow:
|
|
814
|
-
inset 0 2px 0 0
|
|
815
|
-
inset 0 -2px 0 0
|
|
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:
|
|
820
|
-
outline: 2px dashed
|
|
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:
|
|
829
|
-
border-right: 1px solid
|
|
830
|
-
border-bottom: 1px solid
|
|
831
|
-
background:
|
|
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
|
|
840
|
-
border-bottom: 1px solid
|
|
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:
|
|
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:
|
|
869
|
+
background: var(--calendar-day-muted-bg);
|
|
862
870
|
}
|
|
863
871
|
|
|
864
872
|
.calendar-day.weekend:hover {
|
|
865
|
-
background:
|
|
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:
|
|
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:
|
|
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:
|
|
895
|
+
background: var(--calendar-today-bg);
|
|
888
896
|
font-weight: bold;
|
|
889
897
|
}
|
|
890
898
|
|
|
891
899
|
.calendar-day.today:hover {
|
|
892
|
-
background:
|
|
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:
|
|
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:
|
|
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:
|
|
945
|
-
border: 1px solid
|
|
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:
|
|
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:
|
|
967
|
-
border-color:
|
|
974
|
+
background: var(--calendar-event-hover-bg);
|
|
975
|
+
border-color: var(--calendar-event-border);
|
|
968
976
|
transform: translateY(-1px);
|
|
969
|
-
box-shadow:
|
|
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%,
|
|
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%,
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
1051
|
+
color: var(--calendar-muted-fg);
|
|
1032
1052
|
text-align: center;
|
|
1033
1053
|
padding: 0.25rem;
|
|
1034
|
-
background:
|
|
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>
|