// ==UserScript==
// @name P.A.N. Fenestra
// @namespace Violentmonkey Scripts
// @match https://www.dreadcast.net/Forum
// @match https://www.dreadcast.net/Forum*
// @version 1.0.0
// @author Pelagia/IsilinBN
// @description 13/11/2023 02:55:01
// @license http://creativecommons.org/licenses/by-nc-nd/4.0/
// @require https://update.greasyfork.icu/scripts/507382/Dreadcast%20Development%20Kit.user.js?version=1533476
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_deleteValue
// @grant GM_listValues
// @grant GM_xmlhttpRequest
// @grant GM_addStyle
// @connect update.greasyfork.org
// @connect docs.google.com
// @connect googleusercontent.com
// @connect sheets.googleapis.com
// @downloadURL https://update.greasyfork.icu/scripts/530381/PAN%20Fenestra.user.js
// @updateURL https://update.greasyfork.icu/scripts/530381/PAN%20Fenestra.meta.js
// ==/UserScript==
$(() => {
const syncParams = () => {};
const initPersistence = () => {
syncParams();
};
const loadUI = () => {};
const loadStyle = () => {
const style = `
#liste_sujets {
display: flex;
flex-flow: row wrap;
gap: 2rem 1rem;
justify-content: center;
}
#liste_sujets .sujet {
display: flex;
width: 8rem;
height: 10rem;
overflow: hidden;
clip-path: polygon(0% 0%, /*left top */
calc(100% - 2rem) -1px, /** right top start fold 40px = 2 times border width**/
100% 2rem, /** right top end fold 40px = 2 times border width **/
100% calc(2rem + 5px), /** right top move down 5px for box shadow offset down **/
calc(100% + 5px) calc(2rem + 10px), /** right top move 6 right for clipping(shadow offset + spread), add 5 to 44 from top offset to follow fold angle **/
calc(100% + 5px) calc(100% + 5px), /** right bottom **/
0% calc(100% + 5px) /** left bottom **/
);
box-shadow: 4px 4px 7px rgba(0, 0, 0, 0.59);
}
#liste_sujets .sujet:before {
content: '';
position: absolute;
top: 0;
right: 0;
border-width: 0 2rem 2rem 0;
border-style: solid;
border-color: #e5e5e5 #e5e5e5 #444 #444;
-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.3), -1px 1px 1px rgba(0,0,0,0.2);
-moz-box-shadow: 0 1px 1px rgba(0,0,0,0.3), -1px 1px 1px rgba(0,0,0,0.2);
box-shadow: 0 1px 1px rgba(0,0,0,0.3), -1px 1px 1px rgba(0,0,0,0.2);
}
#liste_sujets .sujet .icon {
top: unset !important;
bottom: 0.5rem !important;
left: 0.5rem !important;
}
#liste_sujets .sujet .info_vu {
top: 0.5rem !important;
left: 0.5rem !important;
}
.info_nb_messages {
text-align: right;
}
#liste_sujets .sujet h3,
#liste_sujets .folder h3 {
left: unset !important;
margin: 3rem 0.5rem 0 0.5rem;
display: flex;
flex-direction: column;
gap: 0.25rem;
text-wrap: auto;
line-break: auto;
}
#liste_sujets .folder h3 {
font-size: 12px;
color: #444;
text-align: center;
}
.folder {
width: 10rem;
height: 7rem;
margin-top: 2rem;
position: relative;
background-color: #d3d3d3;
border-radius: 0 6px 6px 6px;
box-shadow: 4px 4px 7px rgba(0, 0, 0, 0.59);
}
.folder:before {
content: '';
width: 50%;
height: 12px;
border-radius: 0 20px 0 0;
background-color: #d3d3d3;
position: absolute;
top: -12px;
left: 0px;
}
.folder:hover,
.folder:hover::before {
background-color: #cacaca !important;
}
#list_labels {
display: none;
}
#pan_actions {
display: flex;
justify-content: flex-end;
gap: 0.25rem;
position: absolute;
top: 2rem;
right: 0;
}
#pan_actions .tooltip #pan_add_file {
text-transform: uppercase;
font-weight: 400;
font-size: 12px;
}
#pan_actions .tooltip .tooltiptext {
font-size: 11px;
}
`;
DC.Style.apply(style);
};
const getFolders = () => {
const labels = $('#list_labels ul li a');
const res = [];
for (let i = labels.length - 1; i >= 0; --i) {
res.push({
tag: labels[i].text,
levels: labels[i].text.split(':'),
});
}
return res;
};
const addFolders = (folders, level) => {
folders.forEach((folder) => {
$('#liste_sujets').prepend(
$(`
${folder.levels[level]}
`),
);
});
};
const removeFiles = (folders) => {
$('#liste_sujets a.sujet').each(function () {
let sorted = false;
$('.tag', $(this)).each(function () {
sorted =
sorted ||
folders.find((folder) =>
folder.tag.includes($(this).text().split(':')[0]),
);
});
if (sorted) {
$(this).hide();
}
});
};
const getCurrentUrl = () => {
return $(location).attr('href').match('.*Forum/1-([0-9]*).*')?.[1];
};
const getCurrentTag = () => {
return $(location).attr('href').match('.*Forum/Tag/(.*)')?.[1];
};
const removeDupes = (arr, level, map = new Map()) => {
arr.forEach((o) => map.set(o.levels.slice(0, level + 1).join(':'), o));
return [...map.values()];
};
const addActions = () => {
$('#list_actions li:first').hide();
$('#header_forum').append($('