mise à jour mw et extension FullCalendar

wiki
Pyjacpp 2026-07-25 19:11:05 +02:00
parent ffda38b4f1
commit 924f92ad00
No known key found for this signature in database
GPG Key ID: ED479A5A26930939
15 changed files with 31326 additions and 10 deletions

View File

@ -0,0 +1,9 @@
<?php
$magicWords = [];
$magicWords['en'] = [
'calendar' => [ 0, 'calendar' ],
];
$magicWords['fr'] = [
'calendar' => [ 0, 'calendrier' ],
];
?>

View File

@ -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
}

View File

@ -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 ];
}
}
?>

View File

@ -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.

View File

@ -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

View File

@ -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 {}

View File

@ -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);

View File

@ -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

View File

@ -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);
});

View File

@ -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 ) {

View File

@ -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 soccupe des du contrôle daccès du Wiki # Cette extension soccupe des du contrôle daccè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