mirror of https://gitlab.crans.org/nounous/nixos
mise à jour mw et extension FullCalendar
parent
ffda38b4f1
commit
924f92ad00
|
|
@ -0,0 +1,9 @@
|
||||||
|
<?php
|
||||||
|
$magicWords = [];
|
||||||
|
$magicWords['en'] = [
|
||||||
|
'calendar' => [ 0, 'calendar' ],
|
||||||
|
];
|
||||||
|
$magicWords['fr'] = [
|
||||||
|
'calendar' => [ 0, 'calendrier' ],
|
||||||
|
];
|
||||||
|
?>
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
{
|
||||||
|
"name": "FullCalendar",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"author": [
|
||||||
|
"Crans"
|
||||||
|
],
|
||||||
|
"url": "",
|
||||||
|
"license-name": "GPL-3.0+",
|
||||||
|
"description": "",
|
||||||
|
"type": "parserhook",
|
||||||
|
"requires": {
|
||||||
|
"MediaWiki": ">= 1.39.0"
|
||||||
|
},
|
||||||
|
"ResourceModules": {
|
||||||
|
"ext.fullcalendar": {
|
||||||
|
"scripts": [
|
||||||
|
"ical.es5.cjs",
|
||||||
|
"fullcalendar7/fullcalendar.global.js",
|
||||||
|
"fullcalendar7/themes/breezy/global.js",
|
||||||
|
"fullcalendar7/locales-all/global.js",
|
||||||
|
"fullcalendar7/fullcalendar-ical.js",
|
||||||
|
"init.js"
|
||||||
|
],
|
||||||
|
"styles": [
|
||||||
|
"fullcalendar7/skeleton.css",
|
||||||
|
"fullcalendar7/themes/breezy/theme.css",
|
||||||
|
"fullcalendar7/themes/breezy/palettes/rose.css"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ResourceFileModulePaths": {
|
||||||
|
"localBasePath": "resources",
|
||||||
|
"remoteExtPath": "fullcalendar/resources"
|
||||||
|
},
|
||||||
|
"AutoloadClasses": {
|
||||||
|
"FullCalendar": "includes/FullCalendar.php"
|
||||||
|
},
|
||||||
|
"ExtensionMessagesFiles": {
|
||||||
|
"FullCalendarMagic": "FullCalendarMagic.i18n.php"
|
||||||
|
},
|
||||||
|
"Hooks": {
|
||||||
|
"ParserFirstCallInit": "FullCalendar::onParserFirstCallInit"
|
||||||
|
},
|
||||||
|
"manifest_version": 2
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use MediaWiki\Html\Html;
|
||||||
|
|
||||||
|
class FullCalendar {
|
||||||
|
|
||||||
|
// Register any render callbacks with the parser
|
||||||
|
public static function onParserFirstCallInit( Parser $parser ) {
|
||||||
|
// Create a function hook associating the <code>example</code> magic word with renderExample()
|
||||||
|
$parser->setFunctionHook( 'calendar', [ self::class, 'renderCalendar' ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function renderCalendar( Parser $parser, $param1 = '', ) {
|
||||||
|
$parser->getOutput()->addModules( [ 'ext.fullcalendar' ] );
|
||||||
|
|
||||||
|
$resultHtml = Html::element( 'div', [ 'class' => 'mw-crans-fullcalendar', 'data-ics' => $param1 ] );
|
||||||
|
return [ $resultHtml, 'noparse' => true, 'isHTML' => true ];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2026 Adam Shaw
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
@ -0,0 +1,237 @@
|
||||||
|
/*!
|
||||||
|
FullCalendar iCalendar Plugin v7.0.1
|
||||||
|
Docs & License: https://fullcalendar.io/docs/icalendar
|
||||||
|
(c) 2026 Adam Shaw
|
||||||
|
*/
|
||||||
|
(function (ICAL) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
||||||
|
|
||||||
|
var ICAL__default = /*#__PURE__*/_interopDefaultLegacy(ICAL);
|
||||||
|
|
||||||
|
function addDays(m, n) {
|
||||||
|
let a = dateToUtcArray(m);
|
||||||
|
a[2] += n;
|
||||||
|
return arrayToUtcDate(a);
|
||||||
|
}
|
||||||
|
function dateToUtcArray(date) {
|
||||||
|
return [
|
||||||
|
date.getUTCFullYear(),
|
||||||
|
date.getUTCMonth(),
|
||||||
|
date.getUTCDate(),
|
||||||
|
date.getUTCHours(),
|
||||||
|
date.getUTCMinutes(),
|
||||||
|
date.getUTCSeconds(),
|
||||||
|
date.getUTCMilliseconds(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
function arrayToUtcDate(a) {
|
||||||
|
// according to web standards (and Safari), a month index is required.
|
||||||
|
// massage if only given a year.
|
||||||
|
if (a.length === 1) {
|
||||||
|
a = a.concat([0]);
|
||||||
|
}
|
||||||
|
return new Date(Date.UTC(...a));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* eslint-disable */
|
||||||
|
class IcalExpander {
|
||||||
|
constructor(opts) {
|
||||||
|
this.maxIterations = opts.maxIterations != null ? opts.maxIterations : 1000;
|
||||||
|
this.skipInvalidDates = opts.skipInvalidDates != null ? opts.skipInvalidDates : false;
|
||||||
|
this.jCalData = ICAL__default["default"].parse(opts.ics);
|
||||||
|
this.component = new ICAL__default["default"].Component(this.jCalData);
|
||||||
|
this.events = this.component.getAllSubcomponents('vevent').map(vevent => new ICAL__default["default"].Event(vevent));
|
||||||
|
if (this.skipInvalidDates) {
|
||||||
|
this.events = this.events.filter((evt) => {
|
||||||
|
try {
|
||||||
|
evt.startDate.toJSDate();
|
||||||
|
evt.endDate.toJSDate();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
// skipping events with invalid time
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
between(after, before) {
|
||||||
|
function isEventWithinRange(startTime, endTime) {
|
||||||
|
return (!after || endTime >= after.getTime()) &&
|
||||||
|
(!before || startTime <= before.getTime());
|
||||||
|
}
|
||||||
|
function getTimes(eventOrOccurrence) {
|
||||||
|
const startTime = eventOrOccurrence.startDate.toJSDate().getTime();
|
||||||
|
let endTime = eventOrOccurrence.endDate.toJSDate().getTime();
|
||||||
|
// If it is an all day event, the end date is set to 00:00 of the next day
|
||||||
|
// So we need to make it be 23:59:59 to compare correctly with the given range
|
||||||
|
if (eventOrOccurrence.endDate.isDate && (endTime > startTime)) {
|
||||||
|
endTime -= 1;
|
||||||
|
}
|
||||||
|
return { startTime, endTime };
|
||||||
|
}
|
||||||
|
const exceptions = [];
|
||||||
|
this.events.forEach((event) => {
|
||||||
|
if (event.isRecurrenceException())
|
||||||
|
exceptions.push(event);
|
||||||
|
});
|
||||||
|
const ret = {
|
||||||
|
events: [],
|
||||||
|
occurrences: [],
|
||||||
|
};
|
||||||
|
this.events.filter(e => !e.isRecurrenceException()).forEach((event) => {
|
||||||
|
const exdates = [];
|
||||||
|
event.component.getAllProperties('exdate').forEach((exdateProp) => {
|
||||||
|
const exdate = exdateProp.getFirstValue();
|
||||||
|
exdates.push(exdate.toJSDate().getTime());
|
||||||
|
});
|
||||||
|
// Recurring event is handled differently
|
||||||
|
if (event.isRecurring()) {
|
||||||
|
const iterator = event.iterator();
|
||||||
|
let next;
|
||||||
|
let i = 0;
|
||||||
|
do {
|
||||||
|
i += 1;
|
||||||
|
next = iterator.next();
|
||||||
|
if (next) {
|
||||||
|
const occurrence = event.getOccurrenceDetails(next);
|
||||||
|
const { startTime, endTime } = getTimes(occurrence);
|
||||||
|
const isOccurrenceExcluded = exdates.indexOf(startTime) !== -1;
|
||||||
|
// TODO check that within same day?
|
||||||
|
const exception = exceptions.find(ex => ex.uid === event.uid && ex.recurrenceId.toJSDate().getTime() === occurrence.startDate.toJSDate().getTime());
|
||||||
|
// We have passed the max date, stop
|
||||||
|
if (before && startTime > before.getTime())
|
||||||
|
break;
|
||||||
|
// Check that we are within our range
|
||||||
|
if (isEventWithinRange(startTime, endTime)) {
|
||||||
|
if (exception) {
|
||||||
|
ret.events.push(exception);
|
||||||
|
}
|
||||||
|
else if (!isOccurrenceExcluded) {
|
||||||
|
ret.occurrences.push(occurrence);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (next && (!this.maxIterations || i < this.maxIterations));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Non-recurring event:
|
||||||
|
const { startTime, endTime } = getTimes(event);
|
||||||
|
if (isEventWithinRange(startTime, endTime))
|
||||||
|
ret.events.push(event);
|
||||||
|
});
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
before(before) {
|
||||||
|
return this.between(undefined, before);
|
||||||
|
}
|
||||||
|
after(after) {
|
||||||
|
return this.between(after);
|
||||||
|
}
|
||||||
|
all() {
|
||||||
|
return this.between();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const eventSourceDef = {
|
||||||
|
parseMeta(refined) {
|
||||||
|
if (refined.url && refined.format === 'ics') {
|
||||||
|
return {
|
||||||
|
url: refined.url,
|
||||||
|
format: 'ics',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
fetch(arg, successCallback, // any
|
||||||
|
errorCallback) {
|
||||||
|
let meta = arg.eventSource.meta;
|
||||||
|
let { internalState } = meta;
|
||||||
|
/*
|
||||||
|
NOTE: isRefetch is a HACK. we would do the recurring-expanding in a separate plugin hook,
|
||||||
|
but we couldn't leverage built-in allDay-guessing, among other things.
|
||||||
|
*/
|
||||||
|
if (!internalState || arg.isRefetch) {
|
||||||
|
internalState = meta.internalState = {
|
||||||
|
response: null,
|
||||||
|
iCalExpanderPromise: fetch(meta.url, { method: 'GET' }).then((response) => {
|
||||||
|
return response.text().then((icsText) => {
|
||||||
|
internalState.response = response;
|
||||||
|
return new IcalExpander({
|
||||||
|
ics: icsText,
|
||||||
|
skipInvalidDates: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
internalState.iCalExpanderPromise.then((iCalExpander) => {
|
||||||
|
successCallback({
|
||||||
|
rawEvents: expandICalEvents(iCalExpander, arg.range),
|
||||||
|
response: internalState.response,
|
||||||
|
});
|
||||||
|
}, errorCallback);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
function expandICalEvents(iCalExpander, range) {
|
||||||
|
// expand the range. because our `range` is timeZone-agnostic UTC
|
||||||
|
// or maybe because ical.js always produces dates in local time? i forget
|
||||||
|
let rangeStart = addDays(range.start, -1);
|
||||||
|
let rangeEnd = addDays(range.end, 1);
|
||||||
|
let iCalRes = iCalExpander.between(rangeStart, rangeEnd); // end inclusive. will give extra results
|
||||||
|
let expanded = [];
|
||||||
|
// TODO: instead of using startDate/endDate.toString to communicate allDay,
|
||||||
|
// we can query startDate/endDate.isDate. More efficient to avoid formatting/reparsing.
|
||||||
|
// single events
|
||||||
|
for (let iCalEvent of iCalRes.events) {
|
||||||
|
expanded.push({
|
||||||
|
...buildNonDateProps(iCalEvent),
|
||||||
|
start: iCalEvent.startDate.toString(),
|
||||||
|
end: (specifiesEnd(iCalEvent) && iCalEvent.endDate)
|
||||||
|
? iCalEvent.endDate.toString()
|
||||||
|
: null,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// recurring event instances
|
||||||
|
for (let iCalOccurence of iCalRes.occurrences) {
|
||||||
|
let iCalEvent = iCalOccurence.item;
|
||||||
|
expanded.push({
|
||||||
|
...buildNonDateProps(iCalEvent),
|
||||||
|
start: iCalOccurence.startDate.toString(),
|
||||||
|
end: (specifiesEnd(iCalEvent) && iCalOccurence.endDate)
|
||||||
|
? iCalOccurence.endDate.toString()
|
||||||
|
: null,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return expanded;
|
||||||
|
}
|
||||||
|
function buildNonDateProps(iCalEvent) {
|
||||||
|
return {
|
||||||
|
title: iCalEvent.summary,
|
||||||
|
url: extractEventUrl(iCalEvent),
|
||||||
|
extendedProps: {
|
||||||
|
location: iCalEvent.location,
|
||||||
|
organizer: iCalEvent.organizer,
|
||||||
|
description: iCalEvent.description,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
function extractEventUrl(iCalEvent) {
|
||||||
|
let urlProp = iCalEvent.component.getFirstProperty('url');
|
||||||
|
return urlProp ? urlProp.getFirstValue() : '';
|
||||||
|
}
|
||||||
|
function specifiesEnd(iCalEvent) {
|
||||||
|
return Boolean(iCalEvent.component.getFirstProperty('dtend')) ||
|
||||||
|
Boolean(iCalEvent.component.getFirstProperty('duration'));
|
||||||
|
}
|
||||||
|
|
||||||
|
var plugin = {
|
||||||
|
name: 'icalendar',
|
||||||
|
eventSourceDefs: [eventSourceDef],
|
||||||
|
};
|
||||||
|
|
||||||
|
FullCalendar.globalPlugins.push(plugin);
|
||||||
|
|
||||||
|
})(ICAL);
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,469 @@
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--fc-sticky-header-footer-z: 3;
|
||||||
|
--fc-popover-z: 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-11 {
|
||||||
|
z-index: var(--fc-popover-z) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-HY {
|
||||||
|
isolation: isolate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
This will prevent all ancestors from customizing their box size unless they use .contentBox
|
||||||
|
*/
|
||||||
|
.fc-jz,
|
||||||
|
.fc-jz *,
|
||||||
|
.fc-jz *:before,
|
||||||
|
.fc-jz *:after {
|
||||||
|
box-sizing: border-box !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* classes attached to <body> */
|
||||||
|
.fc-j2,
|
||||||
|
.fc-j2 * {
|
||||||
|
cursor: not-allowed !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-Ki {
|
||||||
|
-ms-overflow-style: none !important; /* IE and Edge */
|
||||||
|
scrollbar-width: none !important; /* Firefox */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hide scrollbar for Chrome, Safari and Opera */
|
||||||
|
.fc-Ki::-webkit-scrollbar {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-ST {
|
||||||
|
flex-shrink: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-Z9 .fc-1g {
|
||||||
|
display: flex !important;
|
||||||
|
flex-direction: row !important;
|
||||||
|
flex-wrap: wrap !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* HACK for Safari. Can't do break-inside:avoid with flexbox items, likely b/c it's not standard:
|
||||||
|
https://stackoverflow.com/a/60256345 */
|
||||||
|
.fc-HC .fc-1g > * {
|
||||||
|
float: left !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
[dir=rtl] .fc-HC .fc-1g > *,
|
||||||
|
.fc-HC[dir=rtl] .fc-1g > * {
|
||||||
|
float: right !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-HC .fc-1g::after {
|
||||||
|
content: "" !important;
|
||||||
|
display: block !important;
|
||||||
|
clear: both !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-ZB {
|
||||||
|
cursor: pointer !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-Ld {
|
||||||
|
cursor: n-resize !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-lJ {
|
||||||
|
cursor: s-resize !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-Zm {
|
||||||
|
cursor: w-resize !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
[dir=rtl] .fc-Zm {
|
||||||
|
cursor: e-resize !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-n5 {
|
||||||
|
cursor: e-resize !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
[dir=rtl] .fc-n5 {
|
||||||
|
cursor: w-resize !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-Px {
|
||||||
|
cursor: col-resize !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-QK,
|
||||||
|
.fc-eh,
|
||||||
|
.fc-M9 {
|
||||||
|
position: absolute !important;
|
||||||
|
box-sizing: content-box !important;
|
||||||
|
width: 100% !important;
|
||||||
|
height: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-QK {
|
||||||
|
padding: 10px !important;
|
||||||
|
margin: -10px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-eh {
|
||||||
|
padding-left: 10px !important;
|
||||||
|
padding-right: 10px !important;
|
||||||
|
margin-left: -10px !important;
|
||||||
|
margin-right: -10px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-M9 {
|
||||||
|
padding-top: 10px !important;
|
||||||
|
padding-bottom: 10px !important;
|
||||||
|
margin-top: -10px !important;
|
||||||
|
margin-bottom: -10px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* QUESTION: why not use -left -right instead of negative margins/padding for ALL? */
|
||||||
|
.fc-SC {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: -5px;
|
||||||
|
right: -5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-hi {
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-F0 {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Border Utils */
|
||||||
|
/* ------------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* TODO: break-out to x and y. don't have "only" all */
|
||||||
|
/* TODO: instead of "border" utils, call them "borderless" to subtract? */
|
||||||
|
|
||||||
|
.fc-6s {
|
||||||
|
border: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-8B {
|
||||||
|
border-left: 0 !important;
|
||||||
|
border-right: 0 !important;
|
||||||
|
border-bottom: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-RJ {
|
||||||
|
border-top: 0 !important;
|
||||||
|
border-left: 0 !important;
|
||||||
|
border-right: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-Hm,
|
||||||
|
.fc-ge {
|
||||||
|
border-top: 0 !important;
|
||||||
|
border-bottom: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-Hm {
|
||||||
|
border-inline-end: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-ge {
|
||||||
|
border-inline-start: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-KC {
|
||||||
|
border-left: 0 !important;
|
||||||
|
border-right: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-mE {
|
||||||
|
border-top: 0 !important;
|
||||||
|
border-bottom: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* for matching cell start-border, assumed to be 1px, which can't be guaranteed */
|
||||||
|
.fc-FA {
|
||||||
|
border-inline-start: 1px solid transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Flexbox Utils */
|
||||||
|
/* ------------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
.fc-5g {
|
||||||
|
display: flex !important;
|
||||||
|
flex-direction: row !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-Fa {
|
||||||
|
display: flex !important;
|
||||||
|
flex-direction: column !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-16 {
|
||||||
|
flex-grow: 1 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-Im {
|
||||||
|
flex-grow: 1 !important;
|
||||||
|
flex-basis: 0 !important;
|
||||||
|
min-width: 0 !important;
|
||||||
|
min-height: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-tZ {
|
||||||
|
min-height: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
TODO: use liquidX/Y elsewhere because frees up min other dimension; less collisions
|
||||||
|
*/
|
||||||
|
.fc-Pw {
|
||||||
|
flex-grow: 1 !important;
|
||||||
|
flex-basis: 0 !important;
|
||||||
|
min-width: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print-Safe Utils (media:screen ONLY) */
|
||||||
|
/* ------------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
.fc-Z9 .fc-kE,
|
||||||
|
.fc-Z9 .fc-Xg {
|
||||||
|
display: flex !important;
|
||||||
|
flex-direction: column !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Table Utils */
|
||||||
|
/* ------------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
.fc-np {
|
||||||
|
padding: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-gd {
|
||||||
|
margin: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-hB {
|
||||||
|
margin-top: 0 !important;
|
||||||
|
margin-bottom: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-uk {
|
||||||
|
margin-left: 0 !important;
|
||||||
|
margin-right: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-he {
|
||||||
|
white-space: nowrap !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-Bv {
|
||||||
|
white-space: pre !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Misc Utils */
|
||||||
|
/* ------------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
.fc-U2 {
|
||||||
|
overflow-anchor: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-bB {
|
||||||
|
overflow: hidden !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
TODO: eventually use this on daygrid/timegrid events' inner, time, and title, FOR PRINT
|
||||||
|
Needed to prevent wrapping to multiple lines, increasing height, throwing off print-positioning,
|
||||||
|
which can't rely on dynamic height detection after print-flag activated.
|
||||||
|
*/
|
||||||
|
.fc-pp {
|
||||||
|
white-space: nowrap !important;
|
||||||
|
overflow: hidden !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-8A {
|
||||||
|
position: relative !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-7t {
|
||||||
|
position: absolute !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-pK {
|
||||||
|
inset-inline-start: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-wP {
|
||||||
|
position: absolute !important;
|
||||||
|
top: 0 !important;
|
||||||
|
left: 0 !important;
|
||||||
|
right: 0 !important;
|
||||||
|
bottom: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-yW,
|
||||||
|
.fc-5j {
|
||||||
|
position: absolute !important;
|
||||||
|
left: 0 !important;
|
||||||
|
right: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-1K,
|
||||||
|
.fc-bH {
|
||||||
|
position: absolute !important;
|
||||||
|
top: 0 !important;
|
||||||
|
bottom: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-yW {
|
||||||
|
top: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-bH {
|
||||||
|
left: 0 !important;
|
||||||
|
right: 0 !important;
|
||||||
|
width: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media not print {
|
||||||
|
.fc-dY {
|
||||||
|
position: sticky !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-aX {
|
||||||
|
position: sticky !important;
|
||||||
|
top: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sticks to either left or right (the flex "start") depending on ltr/rtl */
|
||||||
|
.fc-pZ {
|
||||||
|
position: sticky !important;
|
||||||
|
inset-inline-start: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-Mw {
|
||||||
|
position: sticky !important;
|
||||||
|
top: 0 !important;
|
||||||
|
z-index: var(--fc-sticky-header-footer-z) !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Only needed when padding/border must be separate from width/height */
|
||||||
|
.fc-CU {
|
||||||
|
box-sizing: content-box !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-jm {
|
||||||
|
position: absolute !important;
|
||||||
|
left: -10000px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-oO {
|
||||||
|
align-items: center !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-MM {
|
||||||
|
align-items: flex-start !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-Qk {
|
||||||
|
align-items: flex-end !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Footer Scrollbar */
|
||||||
|
/* ------------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
.fc-Q6 {
|
||||||
|
position: sticky !important;
|
||||||
|
bottom: 0 !important;
|
||||||
|
z-index: var(--fc-sticky-header-footer-z) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-bD > * {
|
||||||
|
margin-top: -1px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-bD > * > * {
|
||||||
|
height: 1px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print-Safe Utils */
|
||||||
|
/* ------------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
.fc-HC .fc-lF {
|
||||||
|
-moz-column-break-inside: avoid !important;
|
||||||
|
break-inside: avoid !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-HC .fc-kE {
|
||||||
|
display: table !important;
|
||||||
|
table-layout: fixed !important;
|
||||||
|
width: 100% !important;
|
||||||
|
border-spacing: 0 !important;
|
||||||
|
border-collapse: separate !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-HC .fc-Xg {
|
||||||
|
display: table-header-group !important;
|
||||||
|
-moz-column-break-inside: avoid !important;
|
||||||
|
break-inside: avoid !important;
|
||||||
|
background: #fff !important;
|
||||||
|
z-index: 9999 !important;
|
||||||
|
position: relative !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-Vf {
|
||||||
|
/* min-height when multiple rows coexist, provides sane aspect-ratio for cells */
|
||||||
|
min-height: 6em !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Z-index */
|
||||||
|
/* ------------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
.fc-BP {
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-XV {
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-Ah:focus-visible {
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* INTERNAL MARKER -- used to mark an element for internal significance */
|
||||||
|
/* ------------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
.fc-vz {}
|
||||||
|
|
||||||
|
.fc-4B {}
|
||||||
|
.fc-D7 {}
|
||||||
|
.fc-wp {}
|
||||||
|
.fc-Ex {}
|
||||||
|
.fc-wl {}
|
||||||
|
.fc-yM {}
|
||||||
|
.fc-2f {}
|
||||||
|
.fc-zR {}
|
||||||
|
|
||||||
|
.fc-0j {}
|
||||||
|
|
||||||
|
.fc-M7 {}
|
||||||
|
|
||||||
|
.fc-tb {}
|
||||||
|
|
||||||
|
.fc-ew {}
|
||||||
|
|
||||||
|
.fc-IZ {}
|
||||||
|
|
||||||
|
.fc-UH {}
|
||||||
|
|
@ -0,0 +1,387 @@
|
||||||
|
/*!
|
||||||
|
FullCalendar (Vanilla JS) v7.0.1
|
||||||
|
Docs & License: https://fullcalendar.io
|
||||||
|
(c) 2026 Adam Shaw
|
||||||
|
*/
|
||||||
|
(function ({ H: joinClassNames, u, S, G: globalPlugins }) {
|
||||||
|
|
||||||
|
|
||||||
|
// usually 11px font / 12px line-height
|
||||||
|
const xxsTextClass = "fc-breezy-vQz";
|
||||||
|
// outline
|
||||||
|
const outlineWidthClass = "fc-breezy-0Bj";
|
||||||
|
const outlineWidthFocusClass = "fc-breezy-uqo";
|
||||||
|
const outlineWidthGroupFocusClass = "fc-breezy-nPR";
|
||||||
|
const outlineOffsetClass = "fc-breezy-3Xj";
|
||||||
|
const primaryOutlineColorClass = "fc-breezy-yg7";
|
||||||
|
const primaryOutlineFocusClass = `${outlineWidthFocusClass} ${primaryOutlineColorClass}`;
|
||||||
|
// neutral buttons
|
||||||
|
const strongSolidPressableClass = joinClassNames("fc-breezy-hJa", "fc-breezy-AT7", "fc-breezy-b3B");
|
||||||
|
const mutedHoverClass = "fc-breezy-qiG";
|
||||||
|
const mutedHoverPressableClass = `${mutedHoverClass} fc-breezy-WfX`;
|
||||||
|
const faintHoverClass = "fc-breezy-1EL";
|
||||||
|
const faintHoverPressableClass = `${faintHoverClass} fc-breezy-qWF fc-breezy-UTk`;
|
||||||
|
// controls
|
||||||
|
const selectedClass = `fc-breezy-GfU fc-breezy-Oiq ${primaryOutlineFocusClass}`;
|
||||||
|
const unselectedClass = `fc-breezy-t4l fc-breezy-hnE ${primaryOutlineFocusClass}`;
|
||||||
|
// primary
|
||||||
|
const primaryClass = "fc-breezy-Anp fc-breezy-ECg";
|
||||||
|
const primaryPressableClass = `${primaryClass} fc-breezy-8mf`;
|
||||||
|
const primaryPressableGroupClass = `${primaryClass} fc-breezy-t8l`;
|
||||||
|
const primaryButtonClass = `${primaryPressableClass} fc-breezy-d0j ${primaryOutlineFocusClass} ${outlineOffsetClass}`;
|
||||||
|
// secondary
|
||||||
|
const secondaryClass = "fc-breezy-nyY fc-breezy-NK3";
|
||||||
|
const secondaryPressableClass = `${secondaryClass} fc-breezy-StK`;
|
||||||
|
const secondaryButtonClass = `${secondaryPressableClass} fc-breezy-nuP ${primaryOutlineFocusClass} fc-breezy-07j`;
|
||||||
|
const secondaryButtonIconClass = "fc-breezy-XUJ fc-breezy-J7Y fc-breezy-b7A fc-breezy-tRE";
|
||||||
|
// event content
|
||||||
|
const eventMutedFgClass = "fc-breezy-WLU";
|
||||||
|
const eventFaintBgClass = "fc-breezy-GjO";
|
||||||
|
const eventFaintPressableClass = joinClassNames(eventFaintBgClass, "fc-breezy-yE8", "fc-breezy-x2T");
|
||||||
|
// interactive neutral foregrounds
|
||||||
|
const mutedFgPressableGroupClass = "fc-breezy-t4l fc-breezy-Wxh fc-breezy-x7E";
|
||||||
|
// transparent resizer for mouse
|
||||||
|
const blockPointerResizerClass = "fc-breezy-1EY fc-breezy-pps fc-breezy-vs6";
|
||||||
|
const rowPointerResizerClass = `${blockPointerResizerClass} fc-breezy-AWB fc-breezy-hza`;
|
||||||
|
const columnPointerResizerClass = `${blockPointerResizerClass} fc-breezy-MaV fc-breezy-uuA`;
|
||||||
|
// circle resizer for touch
|
||||||
|
const blockTouchResizerClass = "fc-breezy-1EY fc-breezy-3wQ fc-breezy-wsy fc-breezy-lNM fc-breezy-gmc fc-breezy-AAA";
|
||||||
|
const rowTouchResizerClass = `${blockTouchResizerClass} fc-breezy-ERR fc-breezy-Dq8`;
|
||||||
|
const columnTouchResizerClass = `${blockTouchResizerClass} fc-breezy-1V6 fc-breezy-F99`;
|
||||||
|
const getNormalDayHeaderBorderClass = (info) => joinClassNames(!info.inPopover && (info.isMajor ? "fc-breezy-wsy fc-breezy-OFc" :
|
||||||
|
!info.isNarrow && "fc-breezy-wsy fc-breezy-EAo"));
|
||||||
|
const getMutedDayHeaderBorderClass = (info) => joinClassNames(!info.inPopover && (info.isMajor ? "fc-breezy-wsy fc-breezy-OFc" :
|
||||||
|
!info.isNarrow && "fc-breezy-wsy fc-breezy-tTN"));
|
||||||
|
const getNormalDayCellBorderColorClass = (info) => (info.isMajor ? "fc-breezy-OFc" : "fc-breezy-EAo");
|
||||||
|
const getMutedDayCellBorderColorClass = (info) => (info.isMajor ? "fc-breezy-OFc" : "fc-breezy-tTN");
|
||||||
|
const tallDayCellBottomClass = "fc-breezy-mhE";
|
||||||
|
const getShortDayCellBottomClass = (info) => joinClassNames(!info.isNarrow && "fc-breezy-toR");
|
||||||
|
const mutedHoverButtonClass = joinClassNames(mutedHoverPressableClass, outlineWidthFocusClass, primaryOutlineColorClass);
|
||||||
|
const dayRowCommonClasses = {
|
||||||
|
/* Day Row > List-Item Event
|
||||||
|
----------------------------------------------------------------------------------------------- */
|
||||||
|
listItemEventClass: (info) => joinClassNames("fc-breezy-Ika fc-breezy-7A6", info.isNarrow
|
||||||
|
? "fc-breezy-148 fc-breezy-Fvv"
|
||||||
|
: "fc-breezy-rVY fc-breezy-KzJ", info.isSelected
|
||||||
|
? "fc-breezy-pZQ"
|
||||||
|
: info.isInteractive
|
||||||
|
? mutedHoverPressableClass
|
||||||
|
: mutedHoverClass),
|
||||||
|
listItemEventInnerClass: (info) => joinClassNames("fc-breezy-dl1 fc-breezy-1sP fc-breezy-XpK fc-breezy-N2M", info.isNarrow
|
||||||
|
? `fc-breezy-z5u ${xxsTextClass}`
|
||||||
|
: "fc-breezy-2rx fc-breezy-a3B"),
|
||||||
|
listItemEventTimeClass: (info) => joinClassNames(info.isNarrow ? "fc-breezy-F1o" : "fc-breezy-oQ2", "fc-breezy-t4l fc-breezy-NPw fc-breezy-TZ4 fc-breezy-pKG fc-breezy-1Zl"),
|
||||||
|
listItemEventTitleClass: (info) => joinClassNames(info.isNarrow ? "fc-breezy-F1o" : "fc-breezy-oQ2", "fc-breezy-Oiq fc-breezy-1OT fc-breezy-TZ4 fc-breezy-pKG fc-breezy-OLq", info.timeText && "fc-breezy-IPx"),
|
||||||
|
/* Day Row > Row Event
|
||||||
|
----------------------------------------------------------------------------------------------- */
|
||||||
|
rowEventClass: (info) => joinClassNames(info.isStart && (info.isNarrow ? "fc-breezy-Jzj" : "fc-breezy-Wga"), info.isEnd && (info.isNarrow ? "fc-breezy-3e1" : "fc-breezy-KYn")),
|
||||||
|
rowEventInnerClass: (info) => info.isNarrow ? "fc-breezy-z5u" : "fc-breezy-2rx",
|
||||||
|
/* Day Row > More-Link
|
||||||
|
----------------------------------------------------------------------------------------------- */
|
||||||
|
rowMoreLinkClass: (info) => joinClassNames("fc-breezy-Ika fc-breezy-wsy", info.isNarrow
|
||||||
|
? "fc-breezy-148 fc-breezy-UIT fc-breezy-Fvv"
|
||||||
|
: "fc-breezy-sI7 fc-breezy-rVY fc-breezy-d0j fc-breezy-KzJ", mutedHoverPressableClass),
|
||||||
|
rowMoreLinkInnerClass: (info) => joinClassNames(info.isNarrow
|
||||||
|
? `fc-breezy-7A6 ${xxsTextClass}`
|
||||||
|
: "fc-breezy-KUX fc-breezy-a3B", "fc-breezy-Oiq"),
|
||||||
|
};
|
||||||
|
var index = {
|
||||||
|
name: "theme-breezy",
|
||||||
|
optionDefaults: {
|
||||||
|
className: (info) => joinClassNames("fc-breezy-gmc fc-breezy-n5m", !(info.borderlessTop || info.borderlessBottom || info.borderlessX) && "fc-breezy-hny"),
|
||||||
|
viewClass: (info) => {
|
||||||
|
const hasBorderTop = !info.options.headerToolbar && !info.borderlessTop;
|
||||||
|
const hasBorderBottom = !info.options.footerToolbar && !info.borderlessBottom;
|
||||||
|
const hasBorderX = !info.borderlessX;
|
||||||
|
return joinClassNames("fc-breezy-EAo", hasBorderTop && "fc-breezy-ku3", hasBorderBottom && "fc-breezy-zi1", hasBorderX && "fc-breezy-1Wx", (hasBorderTop && hasBorderX) && "fc-breezy-wko", (hasBorderBottom && hasBorderX) && "fc-breezy-L2o", !info.isHeightAuto && "fc-breezy-pKG");
|
||||||
|
},
|
||||||
|
/* Toolbar
|
||||||
|
--------------------------------------------------------------------------------------------- */
|
||||||
|
toolbarClass: (info) => joinClassNames("fc-breezy-KRz fc-breezy-OEz fc-breezy-nYK fc-breezy-dl1 fc-breezy-1sP fc-breezy-dNl fc-breezy-XpK fc-breezy-N2M fc-breezy-Pms fc-breezy-pKG fc-breezy-EAo", !info.borderlessX && "fc-breezy-1Wx"),
|
||||||
|
headerToolbarClass: (info) => joinClassNames("fc-breezy-zi1", !info.borderlessTop && "fc-breezy-ku3", !(info.borderlessTop || info.borderlessX) && "fc-breezy-wko"),
|
||||||
|
footerToolbarClass: (info) => joinClassNames("fc-breezy-ku3", !info.borderlessBottom && "fc-breezy-zi1", !(info.borderlessBottom || info.borderlessX) && "fc-breezy-L2o"),
|
||||||
|
toolbarSectionClass: "fc-breezy-yi0 fc-breezy-dl1 fc-breezy-1sP fc-breezy-XpK fc-breezy-Pms",
|
||||||
|
toolbarTitleClass: "fc-breezy-9ZS fc-breezy-C8a fc-breezy-Oiq",
|
||||||
|
buttonGroupClass: (info) => joinClassNames("fc-breezy-dl1 fc-breezy-1sP fc-breezy-XpK", !info.hasSelection && "fc-breezy-KzJ fc-breezy-eSM"),
|
||||||
|
buttonClass: (info) => joinClassNames("fc-breezy-bCs fc-breezy-dl6 fc-breezy-dl1 fc-breezy-1sP fc-breezy-XpK fc-breezy-9yp fc-breezy-Z9U", info.isIconOnly ? "fc-breezy-Nca" : "fc-breezy-Apf", info.buttonGroup?.hasSelection ? joinClassNames("fc-breezy-KzJ fc-breezy-1OT", info.isSelected
|
||||||
|
? selectedClass
|
||||||
|
: unselectedClass) : joinClassNames("fc-breezy-C8a", info.isPrimary
|
||||||
|
? primaryButtonClass
|
||||||
|
: secondaryButtonClass, info.buttonGroup
|
||||||
|
? "fc-breezy-Ps8 fc-breezy-H1W fc-breezy-g3A fc-breezy-7ss fc-breezy-JIC"
|
||||||
|
: "fc-breezy-KzJ fc-breezy-eSM fc-breezy-wsy")),
|
||||||
|
buttons: {
|
||||||
|
prev: {
|
||||||
|
iconContent: () => chevronDown(joinClassNames(secondaryButtonIconClass, "fc-breezy-z44 fc-breezy-keW")),
|
||||||
|
},
|
||||||
|
next: {
|
||||||
|
iconContent: () => chevronDown(joinClassNames(secondaryButtonIconClass, "fc-breezy-KxI fc-breezy-ZW3")),
|
||||||
|
},
|
||||||
|
prevYear: {
|
||||||
|
iconContent: () => chevronDoubleLeft(joinClassNames(secondaryButtonIconClass, "fc-breezy-asP"))
|
||||||
|
},
|
||||||
|
nextYear: {
|
||||||
|
iconContent: () => chevronDoubleLeft(joinClassNames(secondaryButtonIconClass, "fc-breezy-jmT fc-breezy-jY6"))
|
||||||
|
},
|
||||||
|
},
|
||||||
|
/* Abstract Event
|
||||||
|
--------------------------------------------------------------------------------------------- */
|
||||||
|
eventShortHeight: 50,
|
||||||
|
eventColor: "var(--fc-breezy-event)",
|
||||||
|
eventContrastColor: "var(--fc-breezy-event-contrast)",
|
||||||
|
eventClass: (info) => joinClassNames(info.isDragging && "fc-breezy-n5m", info.event.url && "fc-breezy-JiE", info.isSelected
|
||||||
|
? joinClassNames(outlineWidthClass, info.isDragging && "fc-breezy-tkw")
|
||||||
|
: outlineWidthFocusClass, primaryOutlineColorClass),
|
||||||
|
/* Background Event
|
||||||
|
--------------------------------------------------------------------------------------------- */
|
||||||
|
backgroundEventColor: "var(--fc-breezy-background-event)",
|
||||||
|
backgroundEventClass: "fc-breezy-aPk fc-breezy-jsy fc-breezy-DO7",
|
||||||
|
backgroundEventTitleClass: (info) => joinClassNames("fc-breezy-lMo fc-breezy-L1Y", info.isNarrow
|
||||||
|
? `fc-breezy-iS4 ${xxsTextClass}`
|
||||||
|
: "fc-breezy-3N5 fc-breezy-a3B", "fc-breezy-sI1"),
|
||||||
|
/* Block Event
|
||||||
|
--------------------------------------------------------------------------------------------- */
|
||||||
|
blockEventClass: (info) => joinClassNames("fc-breezy-bCs fc-breezy-eYX fc-breezy-vwH fc-breezy-d0j fc-breezy-DO7", info.isInteractive ? eventFaintPressableClass : eventFaintBgClass, (info.isDragging && !info.isSelected) && "fc-breezy-iTG"),
|
||||||
|
blockEventInnerClass: eventMutedFgClass,
|
||||||
|
blockEventTimeClass: "fc-breezy-TZ4 fc-breezy-pKG fc-breezy-1Zl",
|
||||||
|
blockEventTitleClass: "fc-breezy-TZ4 fc-breezy-pKG fc-breezy-OLq",
|
||||||
|
/* Row Event
|
||||||
|
--------------------------------------------------------------------------------------------- */
|
||||||
|
rowEventClass: (info) => joinClassNames("fc-breezy-Ika fc-breezy-JIC", info.isStart && joinClassNames("fc-breezy-3J4", info.isNarrow ? "fc-breezy-kmj" : "fc-breezy-QUg"), info.isEnd && joinClassNames("fc-breezy-USt", info.isNarrow ? "fc-breezy-Skl" : "fc-breezy-RNO")),
|
||||||
|
rowEventBeforeClass: (info) => joinClassNames(info.isStartResizable && joinClassNames(info.isSelected ? rowTouchResizerClass : rowPointerResizerClass, "fc-breezy-11a")),
|
||||||
|
rowEventAfterClass: (info) => joinClassNames(info.isEndResizable && joinClassNames(info.isSelected ? rowTouchResizerClass : rowPointerResizerClass, "fc-breezy-Tuc")),
|
||||||
|
rowEventInnerClass: (info) => joinClassNames("fc-breezy-dl1 fc-breezy-1sP fc-breezy-XpK", info.isNarrow ? xxsTextClass : "fc-breezy-a3B"),
|
||||||
|
rowEventTimeClass: (info) => joinClassNames(info.isNarrow ? "fc-breezy-a7i" : "fc-breezy-C2j", "fc-breezy-1OT"),
|
||||||
|
rowEventTitleClass: (info) => (info.isNarrow ? "fc-breezy-oQ2" : "fc-breezy-aCI"),
|
||||||
|
/* Column Event
|
||||||
|
--------------------------------------------------------------------------------------------- */
|
||||||
|
columnEventClass: (info) => joinClassNames("fc-breezy-1Wx fc-breezy-A3h fc-breezy-9Iz", info.isStart && joinClassNames("fc-breezy-ku3 fc-breezy-wko", info.isNarrow ? "fc-breezy-sEX" : "fc-breezy-zZM"), info.isEnd && joinClassNames("fc-breezy-zi1 fc-breezy-L2o", info.isNarrow ? "fc-breezy-Ika" : "fc-breezy-vUo")),
|
||||||
|
columnEventBeforeClass: (info) => joinClassNames(info.isStartResizable && joinClassNames(info.isSelected ? columnTouchResizerClass : columnPointerResizerClass, "fc-breezy-YDC")),
|
||||||
|
columnEventAfterClass: (info) => joinClassNames(info.isEndResizable && joinClassNames(info.isSelected ? columnTouchResizerClass : columnPointerResizerClass, "fc-breezy-fJL")),
|
||||||
|
columnEventInnerClass: (info) => joinClassNames("fc-breezy-dl1", info.isShort
|
||||||
|
? "fc-breezy-1sP fc-breezy-XpK fc-breezy-NWN fc-breezy-iS4"
|
||||||
|
: joinClassNames("fc-breezy-sgX", info.isNarrow ? "fc-breezy-aCI fc-breezy-2rx" : "fc-breezy-Nca fc-breezy-Jhn"), (info.isShort || info.isNarrow) ? xxsTextClass : "fc-breezy-a3B"),
|
||||||
|
columnEventTimeClass: (info) => (!info.isShort && (info.isNarrow ? "fc-breezy-166" : "fc-breezy-4dx")),
|
||||||
|
columnEventTitleClass: (info) => joinClassNames(!info.isShort && (info.isNarrow ? "fc-breezy-2rx" : "fc-breezy-Jhn"), "fc-breezy-C8a"),
|
||||||
|
/* More-Link
|
||||||
|
--------------------------------------------------------------------------------------------- */
|
||||||
|
moreLinkClass: `${outlineWidthFocusClass} ${primaryOutlineColorClass}`,
|
||||||
|
moreLinkInnerClass: "fc-breezy-TZ4 fc-breezy-pKG",
|
||||||
|
columnMoreLinkClass: (info) => joinClassNames(info.isNarrow ? "fc-breezy-SEP" : "fc-breezy-V9v", `fc-breezy-wsy fc-breezy-d0j fc-breezy-4MR fc-breezy-KzJ ${strongSolidPressableClass} fc-breezy-vwH fc-breezy-A3h fc-breezy-9Iz`),
|
||||||
|
columnMoreLinkInnerClass: (info) => joinClassNames(info.isNarrow
|
||||||
|
? `fc-breezy-KUX ${xxsTextClass}`
|
||||||
|
: "fc-breezy-iS4 fc-breezy-a3B", "fc-breezy-sI1"),
|
||||||
|
/* Day Header
|
||||||
|
--------------------------------------------------------------------------------------------- */
|
||||||
|
dayHeaderAlign: (info) => info.inPopover ? "start" : "center",
|
||||||
|
dayHeaderClass: (info) => joinClassNames("fc-breezy-E9P", info.inPopover && "fc-breezy-zi1 fc-breezy-EAo fc-breezy-nYK"),
|
||||||
|
dayHeaderInnerClass: (info) => joinClassNames("fc-breezy-dl1 fc-breezy-1sP fc-breezy-XpK", (!info.dayNumberText && !info.inPopover)
|
||||||
|
? joinClassNames("fc-breezy-Jhn fc-breezy-Fvv fc-breezy-a3B", info.isNarrow
|
||||||
|
? "fc-breezy-aCI fc-breezy-gMS fc-breezy-t4l"
|
||||||
|
: "fc-breezy-ZrE fc-breezy-bvX fc-breezy-C8a fc-breezy-sI1", info.hasNavLink && mutedHoverButtonClass)
|
||||||
|
: (info.isToday && info.dayNumberText && !info.inPopover)
|
||||||
|
? joinClassNames("fc-breezy-bCs fc-breezy-bvX fc-breezy-hS8", info.isNarrow ? "fc-breezy-TFV" : "fc-breezy-I1A")
|
||||||
|
: joinClassNames("fc-breezy-Fvv", info.inPopover
|
||||||
|
? "fc-breezy-bvX fc-breezy-aCI fc-breezy-2rx"
|
||||||
|
: joinClassNames("fc-breezy-fn8 fc-breezy-TFV fc-breezy-ZrE", info.isNarrow ? "fc-breezy-2tF" : "fc-breezy-X6C"), info.hasNavLink && mutedHoverButtonClass)),
|
||||||
|
dayHeaderContent: (info) => ((!info.dayNumberText && !info.inPopover) ? (u(S, { children: info.text })) : (u(S, { children: info.textParts.map((textPart, i) => (u("span", { className: joinClassNames("fc-breezy-jm6", info.isNarrow ? "fc-breezy-a3B" : "fc-breezy-9yp", textPart.type === "day"
|
||||||
|
? joinClassNames("fc-breezy-dl1 fc-breezy-1sP fc-breezy-XpK", !info.isNarrow && "fc-breezy-C8a", (info.isToday && !info.inPopover)
|
||||||
|
? joinClassNames("fc-breezy-cKZ fc-breezy-AAA fc-breezy-E9P", info.isNarrow ? "fc-breezy-MSG" : "fc-breezy-n6w", info.hasNavLink
|
||||||
|
? `${primaryPressableGroupClass} ${outlineWidthGroupFocusClass} ${outlineOffsetClass} ${primaryOutlineColorClass}`
|
||||||
|
: primaryClass)
|
||||||
|
: "fc-breezy-Oiq")
|
||||||
|
: "fc-breezy-t4l"), children: textPart.value }, i))) }))),
|
||||||
|
/* Day Cell
|
||||||
|
--------------------------------------------------------------------------------------------- */
|
||||||
|
dayCellClass: (info) => joinClassNames("fc-breezy-wsy", ((info.isOther || info.isDisabled) && !info.options.businessHours) && "fc-breezy-nYK"),
|
||||||
|
dayCellTopClass: (info) => joinClassNames(info.isNarrow ? "fc-breezy-84e" : "fc-breezy-p7s", "fc-breezy-dl1 fc-breezy-1sP"),
|
||||||
|
dayCellTopInnerClass: (info) => joinClassNames("fc-breezy-dl1 fc-breezy-1sP fc-breezy-XpK fc-breezy-E9P fc-breezy-TZ4", info.isNarrow
|
||||||
|
? `fc-breezy-SEP fc-breezy-oM6 ${xxsTextClass}`
|
||||||
|
: "fc-breezy-V9v fc-breezy-TFV fc-breezy-a3B", info.isToday
|
||||||
|
? joinClassNames("fc-breezy-AAA fc-breezy-C8a", info.isNarrow ? "fc-breezy-qvL" : "fc-breezy-Wga", info.text === info.dayNumberText
|
||||||
|
? (info.isNarrow ? "fc-breezy-79F" : "fc-breezy-ilz")
|
||||||
|
: (info.isNarrow ? "fc-breezy-aCI" : "fc-breezy-Nca"), info.hasNavLink
|
||||||
|
? `${primaryPressableClass} ${outlineOffsetClass}`
|
||||||
|
: primaryClass)
|
||||||
|
: joinClassNames("fc-breezy-Skl", info.isNarrow ? "fc-breezy-aCI" : "fc-breezy-Nca", info.hasNavLink && mutedHoverPressableClass, info.isOther
|
||||||
|
? "fc-breezy-mNS"
|
||||||
|
: (info.monthText ? "fc-breezy-sI1" : "fc-breezy-t4l"), info.monthText && "fc-breezy-DIS")),
|
||||||
|
dayCellInnerClass: (info) => joinClassNames(info.inPopover && "fc-breezy-3N5"),
|
||||||
|
/* Popover
|
||||||
|
--------------------------------------------------------------------------------------------- */
|
||||||
|
popoverClass: "fc-breezy-uhF fc-breezy-wsy fc-breezy-LDJ fc-breezy-hny fc-breezy-pKG fc-breezy-1kP fc-breezy-gMS fc-breezy-aNc fc-breezy-n5m",
|
||||||
|
popoverCloseClass: `fc-breezy-bCs fc-breezy-1EY fc-breezy-SKv fc-breezy-aYN fc-breezy-KUX fc-breezy-Fvv ${mutedHoverButtonClass} fc-breezy-Z9U`,
|
||||||
|
popoverCloseContent: () => x(`fc-breezy-XUJ ${mutedFgPressableGroupClass}`),
|
||||||
|
/* Lane
|
||||||
|
--------------------------------------------------------------------------------------------- */
|
||||||
|
dayLaneClass: (info) => joinClassNames("fc-breezy-wsy", info.isMajor ? "fc-breezy-OFc" : "fc-breezy-tTN", info.isDisabled && "fc-breezy-nYK"),
|
||||||
|
dayLaneInnerClass: (info) => (info.isStack
|
||||||
|
? "fc-breezy-gMS"
|
||||||
|
: info.isNarrow ? "fc-breezy-148" : "fc-breezy-rVY"),
|
||||||
|
slotLaneClass: (info) => joinClassNames("fc-breezy-wsy fc-breezy-tTN", info.isMinor && "fc-breezy-TN2"),
|
||||||
|
/* List Day
|
||||||
|
--------------------------------------------------------------------------------------------- */
|
||||||
|
listDaysClass: "fc-breezy-8T7 fc-breezy-g0K fc-breezy-6u7 fc-breezy-E7b fc-breezy-KRz",
|
||||||
|
listDayClass: (info) => joinClassNames(!info.isLast && "fc-breezy-zi1 fc-breezy-tTN", "fc-breezy-dl1 fc-breezy-1sP fc-breezy-EF4 fc-breezy-tgZ"),
|
||||||
|
listDayHeaderClass: "fc-breezy-SEP fc-breezy-yi0 fc-breezy-vVE fc-breezy-kMV fc-breezy-MKw fc-breezy-dl1 fc-breezy-sgX fc-breezy-EF4",
|
||||||
|
listDayHeaderInnerClass: (info) => joinClassNames("fc-breezy-cJ3 fc-breezy-2rx fc-breezy-Nca fc-breezy-PtF fc-breezy-AAA fc-breezy-9yp", !info.level
|
||||||
|
? joinClassNames(info.isToday
|
||||||
|
? joinClassNames("fc-breezy-C8a", info.hasNavLink ? primaryPressableClass : primaryClass)
|
||||||
|
: joinClassNames("fc-breezy-1OT fc-breezy-Oiq", info.hasNavLink && mutedHoverPressableClass))
|
||||||
|
: joinClassNames("fc-breezy-mNS", info.hasNavLink && `${mutedHoverPressableClass} fc-breezy-i3P`)),
|
||||||
|
listDayBodyClass: "fc-breezy-9Qs fc-breezy-1El fc-breezy-2KU fc-breezy-wsy fc-breezy-EAo fc-breezy-KzJ",
|
||||||
|
/* Single Month (in Multi-Month)
|
||||||
|
--------------------------------------------------------------------------------------------- */
|
||||||
|
singleMonthClass: (info) => joinClassNames(info.multiMonthColumns > 1 && "fc-breezy-jD5", (info.multiMonthColumns === 1 && !info.isLast) && "fc-breezy-zi1 fc-breezy-EAo"),
|
||||||
|
singleMonthHeaderClass: (info) => joinClassNames(info.multiMonthColumns > 1
|
||||||
|
? "fc-breezy-x96"
|
||||||
|
: "fc-breezy-End fc-breezy-gmc fc-breezy-zi1 fc-breezy-EAo", "fc-breezy-XpK"),
|
||||||
|
singleMonthHeaderInnerClass: (info) => joinClassNames("fc-breezy-Jhn fc-breezy-Nca fc-breezy-KzJ fc-breezy-9yp fc-breezy-Oiq fc-breezy-C8a", info.hasNavLink && mutedHoverPressableClass),
|
||||||
|
/* Misc Table
|
||||||
|
--------------------------------------------------------------------------------------------- */
|
||||||
|
tableHeaderClass: "fc-breezy-gmc",
|
||||||
|
fillerClass: "fc-breezy-wsy fc-breezy-tTN",
|
||||||
|
dayNarrowWidth: 100,
|
||||||
|
dayHeaderRowClass: "fc-breezy-wsy fc-breezy-tTN",
|
||||||
|
dayRowClass: "fc-breezy-wsy fc-breezy-EAo",
|
||||||
|
slotHeaderRowClass: "fc-breezy-wsy fc-breezy-EAo",
|
||||||
|
slotHeaderInnerClass: "fc-breezy-mNS fc-breezy-XHd",
|
||||||
|
/* Misc Content
|
||||||
|
--------------------------------------------------------------------------------------------- */
|
||||||
|
navLinkClass: `${outlineWidthFocusClass} ${primaryOutlineColorClass}`,
|
||||||
|
inlineWeekNumberClass: (info) => joinClassNames("fc-breezy-1EY fc-breezy-n9G fc-breezy-iD1 fc-breezy-gmc fc-breezy-t4l fc-breezy-TZ4 fc-breezy-4In fc-breezy-zi1 fc-breezy-k8g fc-breezy-3J4 fc-breezy-Hhp", info.isNarrow
|
||||||
|
? `fc-breezy-KUX ${xxsTextClass}`
|
||||||
|
: "fc-breezy-XJa fc-breezy-a3B", info.hasNavLink
|
||||||
|
? `${mutedHoverPressableClass} fc-breezy-07j`
|
||||||
|
: mutedHoverClass),
|
||||||
|
highlightClass: "fc-breezy-xAy",
|
||||||
|
nonBusinessHoursClass: "fc-breezy-nYK",
|
||||||
|
nowIndicatorLineClass: "fc-breezy-CH7 fc-breezy-qQW fc-breezy-D9l",
|
||||||
|
nowIndicatorDotClass: "fc-breezy-aAW fc-breezy-Vpk fc-breezy-D9l fc-breezy-63n fc-breezy-AAA fc-breezy-GBJ fc-breezy-9Iz",
|
||||||
|
/* Resource Day Header
|
||||||
|
--------------------------------------------------------------------------------------------- */
|
||||||
|
resourceDayHeaderAlign: "center",
|
||||||
|
resourceDayHeaderClass: "fc-breezy-wsy",
|
||||||
|
resourceDayHeaderInnerClass: (info) => joinClassNames("fc-breezy-bvX fc-breezy-sI1 fc-breezy-C8a", info.isNarrow ? "fc-breezy-a3B" : "fc-breezy-9yp"),
|
||||||
|
/* Resource Data Grid
|
||||||
|
--------------------------------------------------------------------------------------------- */
|
||||||
|
resourceColumnHeaderClass: "fc-breezy-wsy fc-breezy-tTN fc-breezy-E9P",
|
||||||
|
resourceColumnHeaderInnerClass: "fc-breezy-bvX fc-breezy-sI1 fc-breezy-9yp",
|
||||||
|
resourceColumnResizerClass: "fc-breezy-1EY fc-breezy-AWB fc-breezy-4Tv fc-breezy-dnf",
|
||||||
|
resourceGroupHeaderClass: "fc-breezy-wsy fc-breezy-EAo fc-breezy-pZQ",
|
||||||
|
resourceGroupHeaderInnerClass: "fc-breezy-bvX fc-breezy-sI1 fc-breezy-9yp",
|
||||||
|
resourceCellClass: "fc-breezy-wsy fc-breezy-tTN",
|
||||||
|
resourceCellInnerClass: "fc-breezy-bvX fc-breezy-sI1 fc-breezy-9yp",
|
||||||
|
resourceIndentClass: "fc-breezy-Wga fc-breezy-p9t fc-breezy-E9P",
|
||||||
|
resourceExpanderClass: `fc-breezy-bCs fc-breezy-KUX fc-breezy-AAA ${mutedHoverPressableClass} ${outlineWidthFocusClass} ${primaryOutlineColorClass}`,
|
||||||
|
resourceExpanderContent: (info) => chevronDown(joinClassNames(`fc-breezy-XUJ ${mutedFgPressableGroupClass}`, !info.isExpanded && "fc-breezy-KxI fc-breezy-ZW3")),
|
||||||
|
resourceHeaderRowClass: "fc-breezy-wsy fc-breezy-EAo",
|
||||||
|
resourceRowClass: "fc-breezy-wsy fc-breezy-EAo",
|
||||||
|
resourceColumnDividerClass: "fc-breezy-USt fc-breezy-OFc",
|
||||||
|
/* Timeline Lane
|
||||||
|
--------------------------------------------------------------------------------------------- */
|
||||||
|
resourceGroupLaneClass: "fc-breezy-wsy fc-breezy-EAo fc-breezy-pZQ",
|
||||||
|
resourceLaneClass: "fc-breezy-wsy fc-breezy-EAo",
|
||||||
|
resourceLaneBottomClass: (info) => joinClassNames(info.options.eventOverlap && "fc-breezy-uuA"),
|
||||||
|
timelineBottomClass: "fc-breezy-uuA",
|
||||||
|
},
|
||||||
|
views: {
|
||||||
|
dayGrid: {
|
||||||
|
...dayRowCommonClasses,
|
||||||
|
dayHeaderClass: getNormalDayHeaderBorderClass,
|
||||||
|
dayHeaderDividerClass: "fc-breezy-zi1 fc-breezy-OFc",
|
||||||
|
dayCellClass: getNormalDayCellBorderColorClass,
|
||||||
|
dayCellBottomClass: getShortDayCellBottomClass,
|
||||||
|
backgroundEventInnerClass: "fc-breezy-dl1 fc-breezy-1sP fc-breezy-LMv",
|
||||||
|
},
|
||||||
|
multiMonth: {
|
||||||
|
...dayRowCommonClasses,
|
||||||
|
dayHeaderClass: getNormalDayHeaderBorderClass,
|
||||||
|
dayHeaderDividerClass: (info) => joinClassNames(info.multiMonthColumns === 1 && "fc-breezy-zi1 fc-breezy-OFc fc-breezy-qNs"),
|
||||||
|
dayCellClass: getNormalDayCellBorderColorClass,
|
||||||
|
dayCellBottomClass: getShortDayCellBottomClass,
|
||||||
|
tableBodyClass: (info) => joinClassNames(info.multiMonthColumns > 1 && "fc-breezy-wsy fc-breezy-EAo fc-breezy-KzJ fc-breezy-eSM fc-breezy-pKG"),
|
||||||
|
},
|
||||||
|
timeGrid: {
|
||||||
|
...dayRowCommonClasses,
|
||||||
|
dayHeaderClass: getMutedDayHeaderBorderClass,
|
||||||
|
dayHeaderDividerClass: (info) => joinClassNames("fc-breezy-zi1", info.options.allDaySlot
|
||||||
|
? "fc-breezy-EAo"
|
||||||
|
: "fc-breezy-OFc fc-breezy-rf6"),
|
||||||
|
dayCellClass: getMutedDayCellBorderColorClass,
|
||||||
|
dayCellBottomClass: tallDayCellBottomClass,
|
||||||
|
/* TimeGrid > Week Number Header
|
||||||
|
------------------------------------------------------------------------------------------- */
|
||||||
|
weekNumberHeaderClass: "fc-breezy-XpK fc-breezy-LMv",
|
||||||
|
weekNumberHeaderInnerClass: (info) => joinClassNames("fc-breezy-cGD fc-breezy-TFV fc-breezy-ZrE fc-breezy-t4l fc-breezy-Fvv fc-breezy-dl1 fc-breezy-1sP fc-breezy-XpK", info.hasNavLink && mutedHoverPressableClass, info.isNarrow ? "fc-breezy-a3B" : "fc-breezy-9yp"),
|
||||||
|
/* TimeGrid > All-Day Header
|
||||||
|
------------------------------------------------------------------------------------------- */
|
||||||
|
allDayHeaderClass: "fc-breezy-XpK",
|
||||||
|
allDayHeaderInnerClass: (info) => joinClassNames("fc-breezy-rUb fc-breezy-mNS", info.isNarrow ? xxsTextClass : "fc-breezy-a3B"),
|
||||||
|
allDayDividerClass: "fc-breezy-zi1 fc-breezy-OFc fc-breezy-rf6",
|
||||||
|
/* TimeGrid > Slot Header
|
||||||
|
------------------------------------------------------------------------------------------- */
|
||||||
|
slotHeaderClass: "fc-breezy-LMv",
|
||||||
|
slotHeaderInnerClass: (info) => joinClassNames("fc-breezy-eYX fc-breezy-GFf fc-breezy-2tF", info.isNarrow
|
||||||
|
? `fc-breezy-Cy2 ${xxsTextClass}`
|
||||||
|
: "fc-breezy-uqG fc-breezy-a3B", info.isFirst && "fc-breezy-pps"),
|
||||||
|
slotHeaderDividerClass: "fc-breezy-USt fc-breezy-tTN",
|
||||||
|
},
|
||||||
|
list: {
|
||||||
|
/* List-View > List-Item Event
|
||||||
|
------------------------------------------------------------------------------------------- */
|
||||||
|
listItemEventClass: (info) => joinClassNames("fc-breezy-bCs fc-breezy-lqx fc-breezy-XpK fc-breezy-wwb", !info.isLast && "fc-breezy-zi1 fc-breezy-tTN", info.isInteractive
|
||||||
|
? faintHoverPressableClass
|
||||||
|
: faintHoverClass),
|
||||||
|
listItemEventBeforeClass: "fc-breezy-5JF fc-breezy-lNM fc-breezy-AAA",
|
||||||
|
listItemEventInnerClass: "fc-breezy-dl1 fc-breezy-1sP fc-breezy-XpK fc-breezy-wwb fc-breezy-9yp",
|
||||||
|
listItemEventTimeClass: "fc-breezy-yi0 fc-breezy-roZ fc-breezy-kMV fc-breezy-TZ4 fc-breezy-pKG fc-breezy-IPx fc-breezy-t4l",
|
||||||
|
listItemEventTitleClass: (info) => joinClassNames("fc-breezy-1El fc-breezy-2KU fc-breezy-1OT fc-breezy-TZ4 fc-breezy-pKG fc-breezy-sI1", info.event.url && "fc-breezy-Ogp"),
|
||||||
|
/* No-Events Screen
|
||||||
|
------------------------------------------------------------------------------------------- */
|
||||||
|
noEventsClass: "fc-breezy-1El fc-breezy-dl1 fc-breezy-sgX fc-breezy-XpK fc-breezy-E9P",
|
||||||
|
noEventsInnerClass: "fc-breezy-P9h fc-breezy-t4l",
|
||||||
|
},
|
||||||
|
resourceDayGrid: {
|
||||||
|
resourceDayHeaderClass: (info) => (info.isMajor
|
||||||
|
? "fc-breezy-OFc"
|
||||||
|
: "fc-breezy-EAo"),
|
||||||
|
},
|
||||||
|
resourceTimeGrid: {
|
||||||
|
resourceDayHeaderClass: (info) => (info.isMajor
|
||||||
|
? "fc-breezy-OFc"
|
||||||
|
: "fc-breezy-tTN"),
|
||||||
|
},
|
||||||
|
timeline: {
|
||||||
|
/* Timeline > Row Event
|
||||||
|
------------------------------------------------------------------------------------------- */
|
||||||
|
rowEventClass: (info) => info.isEnd && "fc-breezy-9hC",
|
||||||
|
rowEventInnerClass: (info) => info.options.eventOverlap ? "fc-breezy-Jhn" : "fc-breezy-dl6",
|
||||||
|
/* Timeline > More-Link
|
||||||
|
------------------------------------------------------------------------------------------- */
|
||||||
|
rowMoreLinkClass: `fc-breezy-9hC fc-breezy-Ika fc-breezy-wsy fc-breezy-d0j fc-breezy-4MR fc-breezy-KzJ ${strongSolidPressableClass} fc-breezy-vwH`,
|
||||||
|
rowMoreLinkInnerClass: "fc-breezy-iS4 fc-breezy-sI1 fc-breezy-a3B",
|
||||||
|
/* Timeline > Slot Header
|
||||||
|
------------------------------------------------------------------------------------------- */
|
||||||
|
slotHeaderAlign: (info) => info.isTime ? "start" : "center",
|
||||||
|
slotHeaderClass: (info) => joinClassNames(info.level > 0 && "fc-breezy-wsy fc-breezy-tTN", "fc-breezy-LMv"),
|
||||||
|
slotHeaderInnerClass: (info) => joinClassNames("fc-breezy-GFf fc-breezy-2tF fc-breezy-a3B", info.isTime && joinClassNames("fc-breezy-eYX fc-breezy-OAt", info.isFirst && "fc-breezy-pps"), info.hasNavLink && "fc-breezy-Eu0"),
|
||||||
|
slotHeaderDividerClass: "fc-breezy-zi1 fc-breezy-OFc fc-breezy-qNs",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
/* SVGs
|
||||||
|
------------------------------------------------------------------------------------------------- */
|
||||||
|
function chevronDown(className) {
|
||||||
|
return u("svg", { className: className, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", children: u("path", { fillRule: "evenodd", d: "M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z", clipRule: "evenodd" }) });
|
||||||
|
}
|
||||||
|
function chevronDoubleLeft(className) {
|
||||||
|
return u("svg", { className: className, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", children: u("path", { fillRule: "evenodd", d: "M4.72 9.47a.75.75 0 0 0 0 1.06l4.25 4.25a.75.75 0 1 0 1.06-1.06L6.31 10l3.72-3.72a.75.75 0 1 0-1.06-1.06L4.72 9.47Zm9.25-4.25L9.72 9.47a.75.75 0 0 0 0 1.06l4.25 4.25a.75.75 0 1 0 1.06-1.06L11.31 10l3.72-3.72a.75.75 0 0 0-1.06-1.06Z", clipRule: "evenodd" }) });
|
||||||
|
}
|
||||||
|
function x(className) {
|
||||||
|
return u("svg", { className: className, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", children: u("path", { d: "M6.28 5.22a.75.75 0 0 0-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 1 0 1.06 1.06L10 11.06l3.72 3.72a.75.75 0 1 0 1.06-1.06L11.06 10l3.72-3.72a.75.75 0 0 0-1.06-1.06L10 8.94 6.28 5.22Z" }) });
|
||||||
|
}
|
||||||
|
|
||||||
|
globalPlugins.push(index);
|
||||||
|
|
||||||
|
})(FullCalendar.Shared);
|
||||||
|
|
@ -0,0 +1,90 @@
|
||||||
|
|
||||||
|
:root {
|
||||||
|
/* primary */
|
||||||
|
--fc-breezy-primary: #e11d48;
|
||||||
|
--fc-breezy-primary-over: #f43f5e;
|
||||||
|
--fc-breezy-primary-foreground: #ffffff;
|
||||||
|
|
||||||
|
/* secondary */
|
||||||
|
--fc-breezy-secondary: var(--fc-breezy-background);
|
||||||
|
--fc-breezy-secondary-over: var(--fc-breezy-faint);
|
||||||
|
--fc-breezy-secondary-border: var(--fc-breezy-strong-border);
|
||||||
|
--fc-breezy-secondary-foreground: var(--fc-breezy-strong-foreground);
|
||||||
|
--fc-breezy-secondary-icon: var(--fc-breezy-faint-foreground);
|
||||||
|
--fc-breezy-secondary-icon-over: var(--fc-breezy-muted-foreground);
|
||||||
|
|
||||||
|
/* calendar content */
|
||||||
|
--fc-breezy-event: #ec4899;
|
||||||
|
--fc-breezy-event-contrast: #fff;
|
||||||
|
--fc-breezy-background-event: #f97316;
|
||||||
|
--fc-breezy-highlight: #ef444414;
|
||||||
|
--fc-breezy-now: #ef4444;
|
||||||
|
|
||||||
|
/* controls */
|
||||||
|
--fc-breezy-selected: var(--fc-breezy-strong);
|
||||||
|
|
||||||
|
/* popover */
|
||||||
|
--fc-breezy-popover: var(--fc-breezy-background);
|
||||||
|
--fc-breezy-popover-border: var(--fc-breezy-strong-border);
|
||||||
|
|
||||||
|
/* neutral backgrounds */
|
||||||
|
--fc-breezy-background: #ffffff;
|
||||||
|
--fc-breezy-faint: #00000005;
|
||||||
|
--fc-breezy-muted: #0000000D;
|
||||||
|
--fc-breezy-strong: #0000001A;
|
||||||
|
--fc-breezy-stronger: #00000024;
|
||||||
|
--fc-breezy-strongest: #0000002E;
|
||||||
|
|
||||||
|
/* neutral foregrounds */
|
||||||
|
--fc-breezy-foreground: #374151;
|
||||||
|
--fc-breezy-faint-foreground: #9ca3af;
|
||||||
|
--fc-breezy-muted-foreground: #6b7280;
|
||||||
|
--fc-breezy-strong-foreground: #111827;
|
||||||
|
|
||||||
|
/* neutral borders */
|
||||||
|
--fc-breezy-border: #e5e7eb;
|
||||||
|
--fc-breezy-muted-border: #f3f4f6;
|
||||||
|
--fc-breezy-strong-border: #d1d5db;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media not print {
|
||||||
|
[data-color-scheme=dark] {
|
||||||
|
/* secondary */
|
||||||
|
--fc-breezy-secondary: var(--fc-breezy-muted);
|
||||||
|
--fc-breezy-secondary-over: var(--fc-breezy-strong);
|
||||||
|
--fc-breezy-secondary-border: var(--fc-breezy-muted-border);
|
||||||
|
--fc-breezy-secondary-foreground: var(--fc-breezy-strong-foreground);
|
||||||
|
--fc-breezy-secondary-icon: var(--fc-breezy-muted-foreground);
|
||||||
|
--fc-breezy-secondary-icon-over: var(--fc-breezy-foreground);
|
||||||
|
|
||||||
|
/* calendar content */
|
||||||
|
--fc-breezy-highlight: #f8717114;
|
||||||
|
|
||||||
|
/* controls */
|
||||||
|
--fc-breezy-selected: var(--fc-breezy-muted);
|
||||||
|
|
||||||
|
/* popovers */
|
||||||
|
--fc-breezy-popover: #1f2937;
|
||||||
|
--fc-breezy-popover-border: var(--fc-breezy-border);
|
||||||
|
|
||||||
|
/* neutral backgrounds */
|
||||||
|
--fc-breezy-background: #111827;
|
||||||
|
--fc-breezy-faint: #ffffff08;
|
||||||
|
--fc-breezy-muted: #ffffff12;
|
||||||
|
--fc-breezy-strong: #ffffff1F;
|
||||||
|
--fc-breezy-stronger: #ffffff29;
|
||||||
|
--fc-breezy-strongest: #ffffff33;
|
||||||
|
|
||||||
|
/* neutral foregrounds */
|
||||||
|
--fc-breezy-foreground: #d1d5db;
|
||||||
|
--fc-breezy-muted-foreground: #9ca3af;
|
||||||
|
--fc-breezy-faint-foreground: #6b7280;
|
||||||
|
--fc-breezy-strong-foreground: #ffffff;
|
||||||
|
|
||||||
|
/* neutral borders */
|
||||||
|
--fc-breezy-border: #ffffff1A;
|
||||||
|
--fc-breezy-muted-border: #ffffff0D;
|
||||||
|
--fc-breezy-strong-border: #ffffff26;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,24 @@
|
||||||
|
console.log("Youpi Calendar !");
|
||||||
|
|
||||||
|
mw.hook('wikipage.content').add(function() {
|
||||||
|
console.log("Content loaded ?");
|
||||||
|
console.log(FullCalendar);
|
||||||
|
var elems = document.getElementsByClassName('mw-crans-fullcalendar');
|
||||||
|
for (let el of elems) {
|
||||||
|
try {
|
||||||
|
const url = new URL(el.dataset.ics);
|
||||||
|
let calendar = new FullCalendar.Calendar(el, {
|
||||||
|
events: {
|
||||||
|
url: url.href,
|
||||||
|
format: 'ics'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
calendar.render();
|
||||||
|
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(elems);
|
||||||
|
});
|
||||||
|
|
@ -2,14 +2,6 @@ diff --git a/CategoryLockdown.php b/CategoryLockdown.php
|
||||||
index 3309c52..c4f4cb0 100644
|
index 3309c52..c4f4cb0 100644
|
||||||
--- a/CategoryLockdown.php
|
--- a/CategoryLockdown.php
|
||||||
+++ b/CategoryLockdown.php
|
+++ b/CategoryLockdown.php
|
||||||
@@ -1,6 +1,7 @@
|
|
||||||
<?php
|
|
||||||
|
|
||||||
use MediaWiki\MediaWikiServices;
|
|
||||||
+use MediaWiki\Title\Title; // To remove at the next upade
|
|
||||||
|
|
||||||
class CategoryLockdown {
|
|
||||||
|
|
||||||
@@ -15,6 +16,8 @@ class CategoryLockdown {
|
@@ -15,6 +16,8 @@ class CategoryLockdown {
|
||||||
*/
|
*/
|
||||||
public static function onGetUserPermissionsErrors( $title, $user, $action, &$result ) {
|
public static function onGetUserPermissionsErrors( $title, $user, $action, &$result ) {
|
||||||
|
|
|
||||||
|
|
@ -234,7 +234,7 @@ in
|
||||||
rev = "REL" + major + "_" + minor;
|
rev = "REL" + major + "_" + minor;
|
||||||
# Le SHA doit être changé à chaque nouveau commit de traduction.
|
# Le SHA doit être changé à chaque nouveau commit de traduction.
|
||||||
# Pas de meilleure solution à ma connaissance pour suivre les releases.
|
# Pas de meilleure solution à ma connaissance pour suivre les releases.
|
||||||
sha256 = "sha256-lrBhevfXs1Eyi69uvF/+qs/+wzOsKm0SLbnY8lD6pp4=";
|
sha256 = "sha256-KrqGAvw0/cJdPijF8aOU58l8ZlCunzkGYjDjwyAQpzI=";
|
||||||
};
|
};
|
||||||
patches = [
|
patches = [
|
||||||
# Cette extension s’occupe des du contrôle d’accès du Wiki
|
# Cette extension s’occupe des du contrôle d’accès du Wiki
|
||||||
|
|
@ -244,6 +244,9 @@ in
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# FullCalendar
|
||||||
|
FullCalendar = ./FullCalendar;
|
||||||
|
|
||||||
# Popups
|
# Popups
|
||||||
Popups = pkgs.fetchFromGitHub {
|
Popups = pkgs.fetchFromGitHub {
|
||||||
name = "Popups";
|
name = "Popups";
|
||||||
|
|
@ -252,7 +255,7 @@ in
|
||||||
rev = "REL" + major + "_" + minor;
|
rev = "REL" + major + "_" + minor;
|
||||||
# Le SHA doit être changé à chaque nouveau commit de traduction.
|
# Le SHA doit être changé à chaque nouveau commit de traduction.
|
||||||
# Pas de meilleure solution à ma connaissance pour suivre les releases.
|
# Pas de meilleure solution à ma connaissance pour suivre les releases.
|
||||||
sha256 = "sha256-wNI6LnpGrpUA96Nr+4+KbuislKXTGyyua2F3N+t2O1s=";
|
sha256 = "sha256-4lsh6b2Xyg7B6W7ZKkH3BhdzFpWrU5gDDZRwXAfcjIw=";
|
||||||
};
|
};
|
||||||
|
|
||||||
# Auth
|
# Auth
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue