DistroHopper/docs/CODE_OF_CONDUCT.html
2026-02-19 15:00:19 +01:00

409 lines
16 KiB
HTML

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<title>CODE OF CONDUCT</title>
<style>
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
div.columns{display: flex; gap: min(4vw, 1.5em);}
div.column{flex: auto; overflow-x: auto;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
/* The extra [class] is a hack that increases specificity enough to
override a similar rule in reveal.js */
ul.task-list[class]{list-style: none;}
ul.task-list li input[type="checkbox"] {
font-size: inherit;
width: 0.8em;
margin: 0 0.8em 0.2em -1.6em;
vertical-align: middle;
}
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
</style>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<button class="theme-toggle" onclick="toggleTheme()">🌓</button>
<script>
function toggleTheme(){
const html=document.documentElement;
const current=html.getAttribute("data-theme")||"dark";
const next=current==="dark"?"light":"dark";
html.setAttribute("data-theme",next);
localStorage.setItem("theme",next)
}
(function(){
const saved=localStorage.getItem("theme")||"dark";
document.documentElement.setAttribute("data-theme",saved)
})();
</script>
<script>
document.addEventListener("DOMContentLoaded", function () {
const toc = document.getElementById("TOC");
if (!toc) return;
// Add toc-title with toggle button
const titleEl = document.createElement("div");
titleEl.id = "toc-title";
titleEl.innerHTML = '<span>Contents</span><span id="toc-toggle-icon">◀</span>';
toc.insertBefore(titleEl, toc.firstChild);
// Wrap TOC + the rest of the content in .page-wrapper
const body = document.body;
const wrapper = document.createElement("div");
wrapper.className = "page-wrapper";
// Find all elements after <nav> (main nav menu)
const topNav = document.querySelector("body > nav");
const siblings = [];
let el = topNav ? topNav.nextElementSibling : body.firstElementChild;
while (el) {
siblings.push(el);
el = el.nextElementSibling;
}
siblings.forEach((s) => wrapper.appendChild(s));
body.appendChild(wrapper);
// Wrap main content (everything except TOC) in .main-content
const mainContent = document.createElement("div");
mainContent.className = "main-content";
Array.from(wrapper.children).forEach((child) => {
if (child.id !== "TOC") mainContent.appendChild(child);
});
wrapper.appendChild(mainContent);
// Collapsible toggle
const icon = document.getElementById("toc-toggle-icon");
const saved = localStorage.getItem("toc-collapsed");
if (saved === "true") {
toc.classList.add("collapsed");
icon.textContent = "▶";
}
titleEl.addEventListener("click", function () {
toc.classList.toggle("collapsed");
const isCollapsed = toc.classList.contains("collapsed");
icon.textContent = isCollapsed ? "▶" : "◀";
localStorage.setItem("toc-collapsed", isCollapsed);
});
});
</script>
<nav><ul>
<li><a href="https://osowoso.org">oSoWoSo</a></li>
<li><a href="index.html">Home</a></li>
<li><a href="https://github.com/oSoWoSo/DistroHopper/releases/latest">⏬ release</a></li>
<li><a href="https://github.com/oSoWoSo/DistroHopper/archive/refs/heads/main.zip">📦repo zip</a></li>
<li><a href="https://github.com/oSoWoSo/DistroHopper">🔗git</a></li>
<li>⏭️</a></li>
<li><a href="CODE OF CONDUCT.html">CODE OF CONDUCT</a></li>
<li><a href="CONTRIBUTING.html">CONTRIBUTING</a></li>
<li><a href="README-web.html">README-web</a></li>
<li><a href="SECURITY.html">SECURITY</a></li>
<li><a href="stars.html">stars</a></li>
</ul></nav>
<header id="title-block-header">
<h1 class="title">CODE OF CONDUCT</h1>
</header>
<nav id="TOC" role="doc-toc">
<ul>
<li><a href="#contributor-covenant-code-of-conduct"
id="toc-contributor-covenant-code-of-conduct">Contributor Covenant Code
of Conduct</a>
<ul>
<li><a href="#our-pledge" id="toc-our-pledge">Our Pledge</a></li>
<li><a href="#our-standards" id="toc-our-standards">Our
Standards</a></li>
<li><a href="#enforcement-responsibilities"
id="toc-enforcement-responsibilities">Enforcement
Responsibilities</a></li>
<li><a href="#scope" id="toc-scope">Scope</a></li>
<li><a href="#enforcement" id="toc-enforcement">Enforcement</a></li>
<li><a href="#enforcement-guidelines"
id="toc-enforcement-guidelines">Enforcement Guidelines</a>
<ul>
<li><a href="#1-correction" id="toc-1-correction">1. Correction</a></li>
<li><a href="#2-warning" id="toc-2-warning">2. Warning</a></li>
<li><a href="#3-temporary-ban" id="toc-3-temporary-ban">3. Temporary
Ban</a></li>
<li><a href="#4-permanent-ban" id="toc-4-permanent-ban">4. Permanent
Ban</a></li>
</ul></li>
<li><a href="#attribution" id="toc-attribution">Attribution</a></li>
</ul></li>
</ul>
</nav>
<h1 id="contributor-covenant-code-of-conduct">Contributor Covenant Code
of Conduct</h1>
<h2 id="our-pledge">Our Pledge</h2>
<p>We as members, contributors, and leaders pledge to make participation
in our community a harassment-free experience for everyone, regardless
of age, body size, visible or invisible disability, ethnicity, sex
characteristics, gender identity and expression, level of experience,
education, socio-economic status, nationality, personal appearance,
race, religion, or sexual identity and orientation.</p>
<p>We pledge to act and interact in ways that contribute to an open,
welcoming, diverse, inclusive, and healthy community.</p>
<h2 id="our-standards">Our Standards</h2>
<p>Examples of behaviour that contributes to a positive environment for
our community include:</p>
<ul>
<li>Demonstrating empathy and kindness toward other people</li>
<li>Being respectful of differing opinions, viewpoints, and
experiences</li>
<li>Giving and gracefully accepting constructive feedback</li>
<li>Accepting responsibility and apologizing to those affected by our
mistakes, and learning from the experience</li>
<li>Focusing on what is best not just for us as individuals, but for the
overall community</li>
</ul>
<p>Examples of unacceptable behaviour include:</p>
<ul>
<li>The use of sexualized language or imagery, and sexual attention or
advances of any kind</li>
<li>Trolling, insulting or derogatory comments, and personal or
political attacks</li>
<li>Public or private harassment</li>
<li>Publishing others' private information, such as a physical or email
address, without their explicit permission</li>
<li>Other conduct which could reasonably be considered inappropriate in
a professional setting</li>
</ul>
<h2 id="enforcement-responsibilities">Enforcement Responsibilities</h2>
<p>Community leaders are responsible for clarifying and enforcing our
standards of acceptable behaviour and will take appropriate and fair
corrective action in response to any behaviour that they deem
inappropriate, threatening, offensive, or harmful.</p>
<p>Community leaders have the right and responsibility to remove, edit,
or reject comments, commits, code, wiki edits, issues, and other
contributions that are not aligned to this Code of Conduct, and will
communicate reasons for moderation decisions when appropriate.</p>
<h2 id="scope">Scope</h2>
<p>This Code of Conduct applies within all community spaces, and also
applies when an individual is officially representing the community in
public spaces. Examples of representing our community include using an
official e-mail address, posting via an official social media account,
or acting as an appointed representative at an online or offline
event.</p>
<h2 id="enforcement">Enforcement</h2>
<p>Instances of abusive, harassing, or otherwise unacceptable behaviour
may be reported to the community leaders responsible for enforcement at
#quickemu channel on Discord. All complaints will be reviewed and
investigated promptly and fairly.</p>
<p>All community leaders are obligated to respect the privacy and
security of the reporter of any incident.</p>
<h2 id="enforcement-guidelines">Enforcement Guidelines</h2>
<p>Community leaders will follow these Community Impact Guidelines in
determining the consequences for any action they deem in violation of
this Code of Conduct:</p>
<h3 id="1-correction">1. Correction</h3>
<p><strong>Community Impact</strong>: Use of inappropriate language or
other behaviour deemed unprofessional or unwelcome in the community.</p>
<p><strong>Consequence</strong>: A private, written warning from
community leaders, providing clarity around the nature of the violation
and an explanation of why the behaviour was inappropriate. A public
apology may be requested.</p>
<h3 id="2-warning">2. Warning</h3>
<p><strong>Community Impact</strong>: A violation through a single
incident or series of actions.</p>
<p><strong>Consequence</strong>: A warning with consequences for
continued behaviour. No interaction with the people involved, including
unsolicited interaction with those enforcing the Code of Conduct, for a
specified period of time. This includes avoiding interactions in
community spaces as well as external channels like social media.
Violating these terms may lead to a temporary or permanent ban.</p>
<h3 id="3-temporary-ban">3. Temporary Ban</h3>
<p><strong>Community Impact</strong>: A serious violation of community
standards, including sustained inappropriate behaviour.</p>
<p><strong>Consequence</strong>: A temporary ban from any sort of
interaction or public communication with the community for a specified
period of time. No public or private interaction with the people
involved, including unsolicited interaction with those enforcing the
Code of Conduct, is allowed during this period. Violating these terms
may lead to a permanent ban.</p>
<h3 id="4-permanent-ban">4. Permanent Ban</h3>
<p><strong>Community Impact</strong>: Demonstrating a pattern of
violation of community standards, including sustained inappropriate
behaviour, harassment of an individual, or aggression toward or
disparagement of classes of individuals.</p>
<p><strong>Consequence</strong>: A permanent ban from any sort of public
interaction within the community.</p>
<h2 id="attribution">Attribution</h2>
<p>This Code of Conduct is adapted from the <a
href="https://www.contributor-covenant.org">Contributor Covenant</a>,
version 2.0, available at <a
href="https://www.contributor-covenant.org/version/2/0/code_of_conduct.html">https://www.contributor-covenant.org/version/2/0/code_of_conduct.html</a>.</p>
<p>Community Impact Guidelines were inspired by <a
href="https://github.com/mozilla/diversity">Mozilla's code of conduct
enforcement ladder</a>.</p>
<p>For answers to common questions about this code of conduct, see the
FAQ at <a
href="https://www.contributor-covenant.org/faq">https://www.contributor-covenant.org/faq</a>.
Translations are available at <a
href="https://www.contributor-covenant.org/translations">https://www.contributor-covenant.org/translations</a>.</p>
<script>
(function () {
function hexToRgb(hex) {
hex = hex.trim().replace(/^#/, '');
if (hex.length === 3) hex = hex.split('').map(c => c + c).join('');
const n = parseInt(hex, 16);
return [n >> 16 & 255, n >> 8 & 255, n & 255];
}
function clamp(v, min, max) {
return Math.min(Math.max(v, min), max);
}
function Color(r, g, b) {
this.r = r / 255;
this.g = g / 255;
this.b = b / 255;
}
Color.prototype.applyFilter = function (funcs) {
let [r, g, b] = [this.r * 255, this.g * 255, this.b * 255];
function multiply(matrix) {
const nr = clamp(r * matrix[0] + g * matrix[1] + b * matrix[2], 0, 255);
const ng = clamp(r * matrix[3] + g * matrix[4] + b * matrix[5], 0, 255);
const nb = clamp(r * matrix[6] + g * matrix[7] + b * matrix[8], 0, 255);
r = nr; g = ng; b = nb;
}
function hueRotate(angle) {
const a = angle / 180 * Math.PI;
const sin = Math.sin(a), cos = Math.cos(a);
multiply([
0.213 + cos*0.787 - sin*0.213, 0.715 - cos*0.715 - sin*0.715, 0.072 - cos*0.072 + sin*0.928,
0.213 - cos*0.213 + sin*0.143, 0.715 + cos*0.285 + sin*0.140, 0.072 - cos*0.072 - sin*0.283,
0.213 - cos*0.213 - sin*0.787, 0.715 - cos*0.715 + sin*0.715, 0.072 + cos*0.928 + sin*0.072,
]);
}
function sepia(v) {
multiply([
0.393 + 0.607*(1-v), 0.769 - 0.769*(1-v), 0.189 - 0.189*(1-v),
0.349 - 0.349*(1-v), 0.686 + 0.314*(1-v), 0.168 - 0.168*(1-v),
0.272 - 0.272*(1-v), 0.534 - 0.534*(1-v), 0.131 + 0.869*(1-v),
]);
}
function saturate(v) {
multiply([
0.213 + 0.787*v, 0.715 - 0.715*v, 0.072 - 0.072*v,
0.213 - 0.213*v, 0.715 + 0.285*v, 0.072 - 0.072*v,
0.213 - 0.213*v, 0.715 - 0.715*v, 0.072 + 0.928*v,
]);
}
for (const [fn, val] of funcs) {
if (fn === 'invert') { r = clamp((1-r/255)*255*val + r/255*255*(1-val),0,255); g = clamp((1-g/255)*255*val + g/255*255*(1-val),0,255); b = clamp((1-b/255)*255*val + b/255*255*(1-val),0,255); }
if (fn === 'sepia') sepia(val);
if (fn === 'saturate') saturate(val);
if (fn === 'hueRotate') hueRotate(val);
if (fn === 'brightness'){ r = clamp(r*val,0,255); g = clamp(g*val,0,255); b = clamp(b*val,0,255); }
}
return new Color(r, g, b);
};
function loss(result, target) {
return (
Math.pow(result.r*255 - target.r*255, 2) +
Math.pow(result.g*255 - target.g*255, 2) +
Math.pow(result.b*255 - target.b*255, 2)
);
}
function solve(target) {
function css(v) {
return [
['invert', clamp(v[0], 0, 1)],
['sepia', clamp(v[1], 0, 1)],
['saturate', clamp(v[2], 0, 20)],
['hueRotate', clamp(v[3], 0, 360)],
['brightness',clamp(v[4], 0, 10)],
['brightness',clamp(v[5], 0, 10)],
];
}
function score(v) {
return loss(new Color(0,0,0).applyFilter(css(v)), target);
}
let best = null, bestScore = Infinity;
for (let i = 0; i < 30; i++) {
let v = [Math.random(), Math.random(), Math.random()*10, Math.random()*360, Math.random()*2, Math.random()*2];
for (let step = 1; step > 0.0001; step *= 0.9) {
for (let j = 0; j < v.length; j++) {
const orig = v[j];
v[j] += step * (Math.random() > 0.5 ? 1 : -1);
const s = score(v);
if (s < bestScore) { bestScore = s; best = [...v]; }
else v[j] = orig;
}
}
}
const f = css(best);
return [
`invert(${(clamp(f[0][1],0,1)*100).toFixed(0)}%)`,
`sepia(${(clamp(f[1][1],0,1)*100).toFixed(0)}%)`,
`saturate(${(clamp(f[2][1],0,20)*100).toFixed(0)}%)`,
`hue-rotate(${clamp(f[3][1],0,360).toFixed(0)}deg)`,
`brightness(${(clamp(f[4][1],0,10)*100).toFixed(0)}%)`,
`brightness(${(clamp(f[5][1],0,10)*100).toFixed(0)}%)`,
].join(' ');
}
// Cache solved filters per color so theme switching is instant
const cache = {};
function applyIconColor() {
const raw = getComputedStyle(document.documentElement)
.getPropertyValue('--color-icon').trim();
if (!raw) return false;
let rgb;
if (raw.startsWith('#')) {
rgb = hexToRgb(raw);
} else if (raw.startsWith('rgb')) {
rgb = raw.match(/\d+/g).map(Number).slice(0, 3);
} else {
return false;
}
const key = rgb.join(',');
if (!cache[key]) {
cache[key] = solve(new Color(...rgb));
}
document.documentElement.style.setProperty('--filter-icon', cache[key]);
return true;
}
function init() {
if (!applyIconColor()) return;
// Watch for data-theme attribute changes on <html> — re-apply immediately
new MutationObserver(function(mutations) {
for (const m of mutations) {
if (m.attributeName === 'data-theme') {
applyIconColor();
break;
}
}
}).observe(document.documentElement, { attributes: true });
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();
</script>
</body>
</html>