Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b7f1d800ef | ||
|
|
b0649d838e | ||
|
|
9f3fcbdaf2 | ||
|
|
31b10e6fd1 |
+4
-6
@@ -1,6 +1,4 @@
|
||||
node_modules
|
||||
npm-debug.log
|
||||
uploads
|
||||
.git
|
||||
.gitignore
|
||||
*.tmp
|
||||
*
|
||||
!package.json
|
||||
!src/
|
||||
!src/**
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@ FROM node:24-alpine
|
||||
WORKDIR /app
|
||||
|
||||
COPY package*.json ./
|
||||
RUN npm ci --omit=dev
|
||||
RUN npm install --omit=dev --no-audit --no-fund
|
||||
|
||||
COPY src ./src
|
||||
|
||||
|
||||
Generated
-1604
File diff suppressed because it is too large
Load Diff
+7
-7
@@ -1,19 +1,19 @@
|
||||
{
|
||||
"name": "pulse-signage",
|
||||
"version": "1.0.0",
|
||||
"private": true,
|
||||
"version": "1.1.3",
|
||||
"private": false,
|
||||
"description": "Pulse Signage application with MySQL and media uploads",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://git.lzstealth.com/LZStealth/pulse-signage.git"
|
||||
},
|
||||
"main": "src/common.js",
|
||||
"scripts": {
|
||||
"start": "node -r dotenv/config src/web.js",
|
||||
"start:web": "node -r dotenv/config src/web.js",
|
||||
"start:player": "node -r dotenv/config src/player.js",
|
||||
"dev:web": "nodemon -r dotenv/config src/web.js",
|
||||
"dev:player": "nodemon -r dotenv/config src/player.js",
|
||||
"docker:build": "docker build -t pulse-signage:test .",
|
||||
"docker:up": "docker-compose up -d",
|
||||
"docker:down": "docker-compose down",
|
||||
"docker:logs": "docker-compose logs -f --tail=100"
|
||||
"dev:player": "nodemon -r dotenv/config src/player.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"dotenv": "^17.4.2",
|
||||
|
||||
@@ -628,26 +628,87 @@
|
||||
};
|
||||
}
|
||||
|
||||
// Remove unsafe markup while preserving simple formatting tags.
|
||||
const ALLOWED_RICH_TEXT_TAGS = ['a', 'b', 'blockquote', 'br', 'code', 'div', 'em', 'figure', 'figcaption', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'li', 'ol', 'p', 'pre', 'span', 'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'th', 'thead', 'tr', 'u', 'ul'];
|
||||
|
||||
function sanitizeRichTextAttributes(tagName, attrText) {
|
||||
const allowedAttributes = {
|
||||
a: ['href', 'title', 'target', 'rel', 'class', 'style'],
|
||||
blockquote: ['class', 'style'],
|
||||
div: ['class', 'style'],
|
||||
figure: ['class', 'style'],
|
||||
figcaption: ['class', 'style'],
|
||||
h1: ['class', 'style'],
|
||||
h2: ['class', 'style'],
|
||||
h3: ['class', 'style'],
|
||||
h4: ['class', 'style'],
|
||||
h5: ['class', 'style'],
|
||||
h6: ['class', 'style'],
|
||||
li: ['class', 'style'],
|
||||
ol: ['class', 'style', 'start'],
|
||||
p: ['class', 'style'],
|
||||
pre: ['class', 'style'],
|
||||
span: ['class', 'style'],
|
||||
table: ['class', 'style'],
|
||||
td: ['class', 'style', 'colspan', 'rowspan'],
|
||||
th: ['class', 'style', 'colspan', 'rowspan', 'scope'],
|
||||
tr: ['class', 'style'],
|
||||
ul: ['class', 'style']
|
||||
};
|
||||
const allowed = allowedAttributes[tagName] || [];
|
||||
if (!allowed.length) {
|
||||
return '';
|
||||
}
|
||||
|
||||
const attrs = [];
|
||||
String(attrText || '').replace(/([a-zA-Z0-9:-]+)(?:\s*=\s*("([^"]*)"|'([^']*)'|([^\s"'>/=`]+)))?/g, (_full, key, _valuePart, doubleQuoted, singleQuoted, bareValue) => {
|
||||
const lowerKey = String(key || '').toLowerCase();
|
||||
if (!allowed.includes(lowerKey)) {
|
||||
return '';
|
||||
}
|
||||
const value = doubleQuoted !== undefined ? doubleQuoted : singleQuoted !== undefined ? singleQuoted : bareValue !== undefined ? bareValue : '';
|
||||
if (lowerKey === 'href' && /^(?:\s*javascript:|\s*data:)/i.test(String(value || ''))) {
|
||||
return '';
|
||||
}
|
||||
if (lowerKey === 'style' && /(?:expression\s*\(|javascript:|url\s*\()/i.test(String(value || ''))) {
|
||||
return '';
|
||||
}
|
||||
if (lowerKey === 'target') {
|
||||
const targetValue = String(value || '').trim();
|
||||
if (targetValue === '_blank') {
|
||||
attrs.push(' target="_blank"');
|
||||
if (!attrs.includes(' rel="noreferrer noopener"')) {
|
||||
attrs.push(' rel="noreferrer noopener"');
|
||||
}
|
||||
return '';
|
||||
}
|
||||
}
|
||||
attrs.push(' ' + lowerKey + '="' + escapeHtml(value) + '"');
|
||||
return '';
|
||||
});
|
||||
|
||||
return attrs.join('');
|
||||
}
|
||||
|
||||
// Remove unsafe markup while preserving richer CKEditor formatting.
|
||||
function sanitizeRichText(html) {
|
||||
var output = String(html || '');
|
||||
output = output.replace(/<script[\s\S]*?<\/script>/gi, '');
|
||||
output = output.replace(/<style[\s\S]*?<\/style>/gi, '');
|
||||
return output.replace(/<[^>]+>/g, function (tag) {
|
||||
var match = tag.match(/^<\s*(\/?)\s*([a-z0-9]+)(?:\s[^>]*)?>$/i);
|
||||
var match = tag.match(/^<\s*(\/?)\s*([a-z0-9]+)([\s\S]*?)(\/?)>$/i);
|
||||
if (!match) {
|
||||
return '';
|
||||
}
|
||||
var closing = Boolean(match[1]);
|
||||
var name = String(match[2] || '').toLowerCase();
|
||||
var allowed = ['b', 'strong', 'i', 'em', 'u', 'br', 'p', 'div', 'ul', 'ol', 'li'];
|
||||
if (allowed.indexOf(name) === -1) {
|
||||
var attrText = String(match[3] || '');
|
||||
if (ALLOWED_RICH_TEXT_TAGS.indexOf(name) === -1) {
|
||||
return '';
|
||||
}
|
||||
if (name === 'br') {
|
||||
return '<br>';
|
||||
if (closing) {
|
||||
return '</' + name + '>';
|
||||
}
|
||||
return closing ? '</' + name + '>' : '<' + name + '>';
|
||||
return '<' + name + sanitizeRichTextAttributes(name, attrText) + '>';
|
||||
});
|
||||
}
|
||||
|
||||
@@ -713,7 +774,7 @@
|
||||
return '<' + cellTag + cellAttrs + '>' + sanitizeRichText(cell || '') + '</' + cellTag + '>';
|
||||
}).join('') + '</tr>';
|
||||
}).join('');
|
||||
return '<table class="editorjs-table">' + tableRows + '</table>';
|
||||
return '<table class="ck-content-table">' + tableRows + '</table>';
|
||||
}
|
||||
|
||||
// Render Editor.js JSON or plain content safely.
|
||||
@@ -956,12 +1017,16 @@
|
||||
var width = (Number(region.width) / templateCanvas.width) * 100;
|
||||
var height = (Number(region.height) / templateCanvas.height) * 100;
|
||||
var baseStyle = 'left:' + left + '%;top:' + top + '%;width:' + width + '%;height:' + height + '%;z-index:' + Number(region.z_index || 0) + ';';
|
||||
var pixelWidth = Math.max(1, Math.round(Number(region.width || 0) || 1));
|
||||
var pixelHeight = Math.max(1, Math.round(Number(region.height || 0) || 1));
|
||||
|
||||
return {
|
||||
regionKey: region.region_key,
|
||||
regionType: region.region_type,
|
||||
label: region.label,
|
||||
baseStyle: baseStyle,
|
||||
pixelWidth: pixelWidth,
|
||||
pixelHeight: pixelHeight,
|
||||
fontFamily: region.font_family || null,
|
||||
fontSize: region.font_size || null,
|
||||
fontColor: region.font_color || null,
|
||||
@@ -1015,11 +1080,10 @@
|
||||
return '<div class="template-region html" style="' + region.baseStyle + '">' + renderHtmlRegionContent(regionContent.value || '') + '</div>';
|
||||
}
|
||||
var fontFamily = sanitizeFontFamily(regionContent.font_family || region.fontFamily);
|
||||
var fontSize = sanitizeFontSize(regionContent.font_size);
|
||||
var fontSize = sanitizeFontSize(regionContent.font_size || region.fontSize);
|
||||
var fontColor = sanitizeTextColor(regionContent.font_color || region.fontColor);
|
||||
var scaledFontSize = Math.max(1, Math.round(fontSize * region.canvasScale));
|
||||
var style = region.baseStyle + (fontFamily ? 'font-family:' + escapeHtml(fontFamily) + ';' : '') + 'font-size:' + scaledFontSize + 'px;color:' + escapeHtml(fontColor) + ';';
|
||||
return '<div class="template-region text" style="' + style + '">' + renderEditorJsContent(regionContent.value || '') + '</div>';
|
||||
var contentStyle = 'width:' + region.pixelWidth + 'px;height:' + region.pixelHeight + 'px;transform:scale(' + region.canvasScale + ');transform-origin:top left;' + (fontFamily ? 'font-family:' + escapeHtml(fontFamily) + ';' : '') + 'font-size:' + fontSize + 'px;color:' + escapeHtml(fontColor) + ';';
|
||||
return '<div class="template-region text" style="' + region.baseStyle + '"><div class="template-region-text-scale" style="' + contentStyle + '">' + renderEditorJsContent(regionContent.value || '') + '</div></div>';
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>{{TITLE}}</title>
|
||||
<link rel="icon" type="image/png" href="/assets/favicon.png" />
|
||||
<link rel="stylesheet" href="/assets/css/player.css" />
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -4,7 +4,7 @@ body {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
background: #000;
|
||||
background: #111;
|
||||
color: #fff;
|
||||
font-family: Arial, sans-serif;
|
||||
}
|
||||
@@ -15,7 +15,7 @@ body {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background: #000;
|
||||
background: #111;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
@@ -121,7 +121,6 @@ body.screen-blackout #app {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: #111;
|
||||
}
|
||||
|
||||
.template-stage .template-background {
|
||||
@@ -150,6 +149,28 @@ body.screen-blackout #app {
|
||||
line-height: 1.35;
|
||||
}
|
||||
|
||||
.template-region.text .template-region-text-scale {
|
||||
display: block;
|
||||
transform-origin: top left;
|
||||
}
|
||||
|
||||
.template-region.text .template-region-text-scale > * {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.template-region.text .template-region-text-scale > * + * {
|
||||
margin-top: 0.5em;
|
||||
}
|
||||
|
||||
.template-region.text .template-region-text-scale ul,
|
||||
.template-region.text .template-region-text-scale ol {
|
||||
padding-left: 1.2em;
|
||||
}
|
||||
|
||||
.template-region.text .template-region-text-scale code {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
.template-region.text > * {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 332 KiB |
+66
-6
@@ -41,7 +41,66 @@ function sanitizeTextColor(value, fallback) {
|
||||
return fallback || '#000000';
|
||||
}
|
||||
|
||||
const ALLOWED_RICH_TEXT_TAGS = ['b', 'strong', 'i', 'em', 'u', 'br', 'p', 'div', 'ul', 'ol', 'li'];
|
||||
const ALLOWED_RICH_TEXT_TAGS = ['a', 'b', 'blockquote', 'br', 'code', 'div', 'em', 'figure', 'figcaption', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'li', 'ol', 'p', 'pre', 'span', 'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'th', 'thead', 'tr', 'u', 'ul'];
|
||||
|
||||
function sanitizeRichTextAttributes(tagName, attrText) {
|
||||
const allowedAttributes = {
|
||||
a: ['href', 'title', 'target', 'rel', 'class', 'style'],
|
||||
blockquote: ['class', 'style'],
|
||||
div: ['class', 'style'],
|
||||
figure: ['class', 'style'],
|
||||
figcaption: ['class', 'style'],
|
||||
h1: ['class', 'style'],
|
||||
h2: ['class', 'style'],
|
||||
h3: ['class', 'style'],
|
||||
h4: ['class', 'style'],
|
||||
h5: ['class', 'style'],
|
||||
h6: ['class', 'style'],
|
||||
li: ['class', 'style'],
|
||||
ol: ['class', 'style', 'start'],
|
||||
p: ['class', 'style'],
|
||||
pre: ['class', 'style'],
|
||||
span: ['class', 'style'],
|
||||
table: ['class', 'style'],
|
||||
td: ['class', 'style', 'colspan', 'rowspan'],
|
||||
th: ['class', 'style', 'colspan', 'rowspan', 'scope'],
|
||||
tr: ['class', 'style'],
|
||||
ul: ['class', 'style']
|
||||
};
|
||||
const allowed = allowedAttributes[tagName] || [];
|
||||
if (!allowed.length) {
|
||||
return '';
|
||||
}
|
||||
|
||||
const attrs = [];
|
||||
String(attrText || '').replace(/([a-zA-Z0-9:-]+)(?:\s*=\s*("([^"]*)"|'([^']*)'|([^\s"'>/=`]+)))?/g, (_full, key, _valuePart, doubleQuoted, singleQuoted, bareValue) => {
|
||||
const lowerKey = String(key || '').toLowerCase();
|
||||
if (!allowed.includes(lowerKey)) {
|
||||
return '';
|
||||
}
|
||||
const value = doubleQuoted !== undefined ? doubleQuoted : singleQuoted !== undefined ? singleQuoted : bareValue !== undefined ? bareValue : '';
|
||||
if (lowerKey === 'href' && /^(?:\s*javascript:|\s*data:)/i.test(String(value || ''))) {
|
||||
return '';
|
||||
}
|
||||
if (lowerKey === 'style' && /(?:expression\s*\(|javascript:|url\s*\()/i.test(String(value || ''))) {
|
||||
return '';
|
||||
}
|
||||
if (lowerKey === 'target') {
|
||||
const targetValue = String(value || '').trim();
|
||||
if (targetValue === '_blank') {
|
||||
attrs.push(' target="_blank"');
|
||||
if (!attrs.includes(' rel="noreferrer noopener"')) {
|
||||
attrs.push(' rel="noreferrer noopener"');
|
||||
}
|
||||
return '';
|
||||
}
|
||||
}
|
||||
attrs.push(' ' + lowerKey + '="' + escapeHtml(value) + '"');
|
||||
return '';
|
||||
});
|
||||
|
||||
return attrs.join('');
|
||||
}
|
||||
|
||||
function safeJsonForScript(value) {
|
||||
return JSON.stringify(value === undefined ? null : value).replace(/</g, '\\u003c');
|
||||
@@ -108,19 +167,20 @@ function sanitizeRichText(html) {
|
||||
output = output.replace(/<script[\s\S]*?<\/script>/gi, '');
|
||||
output = output.replace(/<style[\s\S]*?<\/style>/gi, '');
|
||||
return output.replace(/<[^>]+>/g, (tag) => {
|
||||
const match = tag.match(/^<\s*(\/?)\s*([a-z0-9]+)(?:\s[^>]*)?>$/i);
|
||||
const match = tag.match(/^<\s*(\/?)\s*([a-z0-9]+)([\s\S]*?)(\/?)>$/i);
|
||||
if (!match) {
|
||||
return '';
|
||||
}
|
||||
const closing = Boolean(match[1]);
|
||||
const name = String(match[2] || '').toLowerCase();
|
||||
const attrText = String(match[3] || '');
|
||||
if (!ALLOWED_RICH_TEXT_TAGS.includes(name)) {
|
||||
return '';
|
||||
}
|
||||
if (name === 'br') {
|
||||
return '<br>';
|
||||
if (closing) {
|
||||
return `</${name}>`;
|
||||
}
|
||||
return closing ? `</${name}>` : `<${name}>`;
|
||||
return `<${name}${sanitizeRichTextAttributes(name, attrText)}>`;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -173,7 +233,7 @@ function renderEditorJsTable(data) {
|
||||
return '<' + cellTag + cellAttrs + '>' + sanitizeRichText(cell || '') + '</' + cellTag + '>';
|
||||
}).join('') + '</tr>';
|
||||
}).join('');
|
||||
return '<table class="editorjs-table">' + tableRows + '</table>';
|
||||
return '<table class="ck-content-table">' + tableRows + '</table>';
|
||||
}
|
||||
|
||||
function renderEditorJsContent(value) {
|
||||
|
||||
+298
-116
@@ -126,7 +126,9 @@ a {
|
||||
top: 0;
|
||||
align-self: start;
|
||||
min-height: 100vh;
|
||||
padding: 22px 18px 18px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: 16px 12px 12px;
|
||||
color: var(--sidebar-text);
|
||||
background: var(--sidebar-background);
|
||||
border-right: 1px solid var(--sidebar-border);
|
||||
@@ -220,7 +222,6 @@ a {
|
||||
}
|
||||
|
||||
.sidebar-footer {
|
||||
margin-top: auto;
|
||||
padding: 16px 14px 8px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -228,8 +229,16 @@ a {
|
||||
color: var(--sidebar-text);
|
||||
}
|
||||
|
||||
.sidebar-footer--bottom {
|
||||
margin-top: auto;
|
||||
padding: 0;
|
||||
justify-content: space-between;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.sidebar-footer strong,
|
||||
.sidebar-footer span {
|
||||
.sidebar-footer > div > span,
|
||||
.sidebar-footer > .sidebar-version {
|
||||
display: block;
|
||||
}
|
||||
|
||||
@@ -244,7 +253,7 @@ a {
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
.sidebar-footer span {
|
||||
.sidebar-footer > div > span {
|
||||
color: var(--sidebar-muted);
|
||||
font-size: 12px;
|
||||
line-height: 1.35;
|
||||
@@ -301,6 +310,14 @@ a {
|
||||
color: var(--sidebar-text-strong);
|
||||
}
|
||||
|
||||
.sidebar-version {
|
||||
color: var(--sidebar-muted);
|
||||
font-size: 12px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.04em;
|
||||
text-transform: lowercase;
|
||||
}
|
||||
|
||||
.theme-toggle {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
@@ -359,7 +376,7 @@ a {
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
border-radius: 50%;
|
||||
background: currentColor;
|
||||
background: var(--sidebar-background);
|
||||
}
|
||||
|
||||
.login-page-body .theme-toggle__icon--moon::after {
|
||||
@@ -408,14 +425,16 @@ html[data-theme='dark'] .theme-toggle__icon--sun {
|
||||
}
|
||||
|
||||
.theme-toggle--sidebar {
|
||||
position: absolute;
|
||||
right: 18px;
|
||||
bottom: 18px;
|
||||
width: auto;
|
||||
padding: 0;
|
||||
justify-content: center;
|
||||
margin: 0;
|
||||
z-index: 2;
|
||||
color: var(--sidebar-text-strong);
|
||||
}
|
||||
|
||||
.theme-toggle--sidebar .theme-toggle__icon--moon,
|
||||
.theme-toggle--sidebar .theme-toggle__icon--sun {
|
||||
color: var(--sidebar-text-strong);
|
||||
}
|
||||
|
||||
.theme-toggle--sidebar .theme-toggle__label {
|
||||
@@ -431,6 +450,10 @@ html[data-theme='dark'] .theme-toggle__icon--sun {
|
||||
width: auto;
|
||||
padding: 0;
|
||||
justify-content: center;
|
||||
position: fixed;
|
||||
top: 16px;
|
||||
right: 16px;
|
||||
z-index: 90;
|
||||
}
|
||||
|
||||
.theme-toggle--floating .theme-toggle__label {
|
||||
@@ -442,13 +465,6 @@ html[data-theme='dark'] .theme-toggle__icon--sun {
|
||||
height: 18px;
|
||||
}
|
||||
|
||||
.theme-toggle--floating {
|
||||
position: fixed;
|
||||
top: 16px;
|
||||
right: 16px;
|
||||
z-index: 90;
|
||||
}
|
||||
|
||||
.auth-shell-body .theme-toggle--floating {
|
||||
top: auto;
|
||||
bottom: 16px;
|
||||
@@ -507,9 +523,6 @@ html[data-theme='dark'] .theme-toggle__icon--sun {
|
||||
font-size: 13px;
|
||||
font-weight: 700;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.status-pill {
|
||||
color: #0f5132;
|
||||
background: rgba(16, 185, 129, 0.14);
|
||||
}
|
||||
@@ -769,8 +782,6 @@ html[data-theme='dark'] .theme-toggle__icon--sun {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* Text region controls. */
|
||||
|
||||
.template-field-head {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
@@ -779,16 +790,6 @@ html[data-theme='dark'] .theme-toggle__icon--sun {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.template-text-style-row {
|
||||
margin-top: 0;
|
||||
align-items: flex-end;
|
||||
}
|
||||
|
||||
.template-text-style-row input[type="color"] {
|
||||
height: 44px;
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
.users-table th:last-child {
|
||||
width: 220px;
|
||||
}
|
||||
@@ -915,8 +916,9 @@ html[data-theme='dark'] .theme-toggle__icon--sun {
|
||||
|
||||
.stats {
|
||||
display: grid;
|
||||
gap: 16px;
|
||||
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
|
||||
gap: 12px;
|
||||
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.stat {
|
||||
@@ -924,9 +926,10 @@ html[data-theme='dark'] .theme-toggle__icon--sun {
|
||||
overflow: hidden;
|
||||
background: var(--stat-background);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 20px;
|
||||
padding: 18px;
|
||||
border-radius: 12px;
|
||||
padding: 16px;
|
||||
box-shadow: var(--shadow-sm);
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.stat::after {
|
||||
@@ -975,6 +978,15 @@ html[data-theme='dark'] .theme-toggle__icon--sun {
|
||||
letter-spacing: 0.08em;
|
||||
}
|
||||
|
||||
.stat span {
|
||||
position: relative;
|
||||
color: var(--muted);
|
||||
font-size: 13px;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.08em;
|
||||
}
|
||||
|
||||
.row {
|
||||
display: flex;
|
||||
gap: 12px;
|
||||
@@ -1170,6 +1182,19 @@ button.is-blackout {
|
||||
background: linear-gradient(180deg, #f59e0b, #d97706);
|
||||
}
|
||||
|
||||
.ce-inline-toolbar__buttons button,
|
||||
.ce-inline-toolbar__actions button {
|
||||
background: transparent;
|
||||
color: inherit;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.ce-inline-toolbar__buttons button:hover,
|
||||
.ce-inline-toolbar__actions button:hover {
|
||||
background: rgba(255, 255, 255, 0.08);
|
||||
filter: none;
|
||||
}
|
||||
|
||||
a.button-link {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
@@ -1280,7 +1305,7 @@ thead th {
|
||||
}
|
||||
|
||||
tbody tr:hover {
|
||||
background: var(--table-hover);
|
||||
background: rgba(37, 99, 235, 0.07);
|
||||
}
|
||||
|
||||
tbody tr:last-child td {
|
||||
@@ -1718,10 +1743,6 @@ tbody tr:nth-child(even) {
|
||||
background: var(--table-row-even);
|
||||
}
|
||||
|
||||
tbody tr:hover {
|
||||
background: rgba(37, 99, 235, 0.07);
|
||||
}
|
||||
|
||||
table input,
|
||||
table select,
|
||||
table textarea,
|
||||
@@ -1850,33 +1871,112 @@ table td .actions form {
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
.stats {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
|
||||
gap: 12px;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.stat {
|
||||
background: var(--stat-background);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 12px;
|
||||
padding: 16px;
|
||||
box-shadow: var(--shadow-sm);
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.stat strong {
|
||||
display: block;
|
||||
font-size: 28px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.playlist-item-actions {
|
||||
flex-wrap: nowrap;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.playlist-order-cell {
|
||||
width: 88px;
|
||||
min-width: 88px;
|
||||
white-space: nowrap;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.playlist-order-cell-inner {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
min-height: 100%;
|
||||
}
|
||||
|
||||
.playlist-order-number {
|
||||
min-width: 1.5em;
|
||||
font-weight: 800;
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
.playlist-drag-handle {
|
||||
flex: 0 0 auto;
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
border-radius: 0;
|
||||
color: var(--muted);
|
||||
background: currentColor;
|
||||
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='black'%3E%3Cpath d='M12 4L8 8H16L12 4Z'/%3E%3Cpath d='M4 11H20V13H4V11Z'/%3E%3Cpath d='M4 15H20V17H4V15Z'/%3E%3Cpath d='M4 7H20V9H4V7Z'/%3E%3Cpath d='M12 20L8 16H16L12 20Z'/%3E%3C/svg%3E") center / contain no-repeat;
|
||||
mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='black'%3E%3Cpath d='M12 4L8 8H16L12 4Z'/%3E%3Cpath d='M4 11H20V13H4V11Z'/%3E%3Cpath d='M4 15H20V17H4V15Z'/%3E%3Cpath d='M4 7H20V9H4V7Z'/%3E%3Cpath d='M12 20L8 16H16L12 20Z'/%3E%3C/svg%3E") center / contain no-repeat;
|
||||
cursor: grab;
|
||||
transition: color 160ms ease;
|
||||
}
|
||||
|
||||
.playlist-drag-handle {
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
.playlist-drag-handle:hover,
|
||||
.playlist-drag-handle:focus-visible {
|
||||
color: var(--primary);
|
||||
}
|
||||
|
||||
html[data-theme='dark'] .playlist-drag-handle {
|
||||
color: var(--sidebar-text);
|
||||
}
|
||||
|
||||
html[data-theme='dark'] .playlist-drag-handle:hover,
|
||||
html[data-theme='dark'] .playlist-drag-handle:focus-visible {
|
||||
color: var(--primary);
|
||||
}
|
||||
|
||||
.playlist-drag-handle:active,
|
||||
tr.is-dragging .playlist-drag-handle {
|
||||
cursor: grabbing;
|
||||
}
|
||||
|
||||
tr.sortable-chosen {
|
||||
opacity: 0.55;
|
||||
}
|
||||
|
||||
tr.sortable-ghost {
|
||||
opacity: 0.32;
|
||||
background: var(--primary-soft);
|
||||
}
|
||||
|
||||
tr.sortable-drag {
|
||||
box-shadow: var(--shadow-md);
|
||||
background: var(--surface);
|
||||
}
|
||||
|
||||
@media (min-width: 721px) {
|
||||
table.table-cards tr > td:nth-child(1),
|
||||
table.table-cards tr > th:nth-child(1) {
|
||||
width: 1%;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
table.table-cards tr > td:nth-child(2),
|
||||
table.table-cards tr > th:nth-child(2) {
|
||||
width: 36%;
|
||||
}
|
||||
|
||||
table.table-cards tr > td:nth-child(3),
|
||||
table.table-cards tr > th:nth-child(3) {
|
||||
width: 36%;
|
||||
}
|
||||
|
||||
table.table-cards tr > td:nth-child(4),
|
||||
table.table-cards tr > th:nth-child(4) {
|
||||
width: 10%;
|
||||
}
|
||||
|
||||
table.table-cards tr > td:nth-child(5),
|
||||
table.table-cards tr > th:nth-child(5) {
|
||||
width: 1%;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
|
||||
.actions form {
|
||||
display: inline;
|
||||
}
|
||||
@@ -1899,7 +1999,7 @@ table td .actions form {
|
||||
|
||||
.empty {
|
||||
color: var(--muted);
|
||||
padding: 12px 0;
|
||||
padding: 12px 0 12px 24px;
|
||||
}
|
||||
|
||||
.chip {
|
||||
@@ -1912,7 +2012,11 @@ table td .actions form {
|
||||
margin-left: 6px;
|
||||
}
|
||||
|
||||
/* Slide editor pages. */
|
||||
html[data-theme='dark'] .chip {
|
||||
background: rgba(148, 163, 184, 0.16);
|
||||
color: var(--sidebar-text);
|
||||
}
|
||||
|
||||
.slide-editor-top {
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
|
||||
@@ -1995,7 +2099,6 @@ table td .actions form {
|
||||
color: #fff;
|
||||
border: 1px solid rgba(255, 255, 255, 0.25);
|
||||
background: rgba(15, 23, 42, 0.2);
|
||||
backdrop-filter: blur(1px);
|
||||
}
|
||||
|
||||
.slide-preview-region h1,
|
||||
@@ -2022,8 +2125,8 @@ table td .actions form {
|
||||
}
|
||||
|
||||
.slide-preview-text-content {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
transform-origin: top left;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.slide-preview-image-region {
|
||||
@@ -2099,6 +2202,13 @@ table td .actions form {
|
||||
.slide-schedule-dialog button {
|
||||
width: auto;
|
||||
margin: 0;
|
||||
.theme-toggle--floating .theme-toggle__label {
|
||||
display: none;
|
||||
}
|
||||
.theme-toggle--floating .theme-toggle__icon {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
}
|
||||
}
|
||||
|
||||
.slide-schedule-dialog button.secondary {
|
||||
@@ -2201,66 +2311,138 @@ table td .actions form {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.rich-editor {
|
||||
display: grid;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.rich-toolbar {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.rich-toolbar button {
|
||||
width: auto;
|
||||
margin-top: 0;
|
||||
padding: 8px 10px;
|
||||
}
|
||||
|
||||
.rich-surface {
|
||||
min-height: 240px;
|
||||
padding: 12px;
|
||||
border: 1px solid #d1d5db;
|
||||
border-radius: 8px;
|
||||
background: #fff;
|
||||
color: var(--text);
|
||||
line-height: 1.4;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.rich-surface:focus {
|
||||
outline: 2px solid rgba(37, 99, 235, 0.3);
|
||||
border-color: var(--primary);
|
||||
}
|
||||
|
||||
.editorjs-holder {
|
||||
min-height: 240px;
|
||||
border: 1px solid var(--border-strong);
|
||||
border-radius: 8px;
|
||||
padding: 16px 12px 12px;
|
||||
.ckeditor-holder {
|
||||
min-height: 360px;
|
||||
background: var(--editor-paper);
|
||||
color: var(--editor-text);
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.editorjs-holder .codex-editor,
|
||||
.editorjs-holder .codex-editor__redactor,
|
||||
.editorjs-holder .ce-block,
|
||||
.editorjs-holder .ce-paragraph,
|
||||
.editorjs-holder .ce-header,
|
||||
.editorjs-holder .ce-list,
|
||||
.editorjs-holder .ce-list__item,
|
||||
.editorjs-holder [contenteditable],
|
||||
.editorjs-holder [contenteditable] * {
|
||||
html[data-theme='dark'] .ckeditor-holder {
|
||||
color-scheme: dark;
|
||||
--editor-paper: #111b2d;
|
||||
--editor-text: #e6eefb;
|
||||
--ck-color-base-foreground: #111b2d;
|
||||
--ck-color-base-background: #111b2d;
|
||||
--ck-color-base-border: rgba(148, 163, 184, 0.22);
|
||||
--ck-color-base-text: #e6eefb;
|
||||
--ck-color-text: #e6eefb;
|
||||
--ck-color-base-active: #60a5fa;
|
||||
--ck-color-base-active-focus: #93c5fd;
|
||||
--ck-color-base-focus: #60a5fa;
|
||||
--ck-color-focus-border: rgba(96, 165, 250, 0.92);
|
||||
--ck-color-focus-outer-shadow: rgba(96, 165, 250, 0.28);
|
||||
--ck-color-toolbar-background: #111b2d;
|
||||
--ck-color-toolbar-border: rgba(148, 163, 184, 0.2);
|
||||
--ck-color-dropdown-panel-background: #111b2d;
|
||||
--ck-color-dropdown-panel-border: rgba(148, 163, 184, 0.22);
|
||||
--ck-color-panel-background: #111b2d;
|
||||
--ck-color-panel-border: rgba(148, 163, 184, 0.22);
|
||||
--ck-color-dialog-background: #111b2d;
|
||||
--ck-color-dialog-form-header-border: rgba(148, 163, 184, 0.18);
|
||||
--ck-color-input-background: #0e1728;
|
||||
--ck-color-input-border: rgba(148, 163, 184, 0.22);
|
||||
--ck-color-input-text: #e6eefb;
|
||||
--ck-color-list-background: #111b2d;
|
||||
--ck-color-list-button-hover-background: #162235;
|
||||
--ck-color-list-button-on-background: #1b2a41;
|
||||
--ck-color-list-button-on-background-focus: #22324a;
|
||||
--ck-color-list-button-on-text: #e6eefb;
|
||||
--ck-color-button-default-hover-background: #162235;
|
||||
--ck-color-button-default-active-background: #1b2a41;
|
||||
--ck-color-button-on-background: #1b2a41;
|
||||
--ck-color-button-on-hover-background: #22324a;
|
||||
--ck-color-button-on-active-background: #22324a;
|
||||
--ck-color-button-on-color: #93c5fd;
|
||||
--ck-color-button-on-disabled-background: #162235;
|
||||
--ck-color-button-action-background: #2563eb;
|
||||
--ck-color-button-action-hover-background: #1d4ed8;
|
||||
--ck-color-button-action-active-background: #1d4ed8;
|
||||
--ck-color-button-action-disabled-background: #3b82f6;
|
||||
--ck-color-button-action-text: #ffffff;
|
||||
--ck-color-switch-button-off-background: #475569;
|
||||
--ck-color-switch-button-off-hover-background: #64748b;
|
||||
--ck-color-switch-button-inner-background: #111b2d;
|
||||
--ck-color-switch-button-inner-shadow: rgba(2, 6, 23, 0.45);
|
||||
--ck-color-engine-placeholder-text: #94a3b8;
|
||||
--ck-powered-by-background: #111b2d;
|
||||
--ck-powered-by-text-color: #cbd5e1;
|
||||
--ck-evaluation-badge-background: #111b2d;
|
||||
--ck-evaluation-badge-text-color: #cbd5e1;
|
||||
}
|
||||
|
||||
.ckeditor-holder .ckeditor-source {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.ckeditor-holder .ck-editor,
|
||||
.ckeditor-holder .ck-editor__main,
|
||||
.ckeditor-holder .ck-editor__editable,
|
||||
.ckeditor-holder .ck-content,
|
||||
.ckeditor-holder .ck-editor__editable * {
|
||||
color: var(--editor-text);
|
||||
}
|
||||
|
||||
.editorjs-holder [contenteditable] {
|
||||
.ckeditor-holder .ck button,
|
||||
.ckeditor-holder .ck button:hover,
|
||||
.ckeditor-holder .ck button:active,
|
||||
.ckeditor-holder .ck button:focus,
|
||||
.ckeditor-holder .ck button:focus-visible {
|
||||
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.ckeditor-holder .ck-font-size-input,
|
||||
.ckeditor-holder .ck-font-size-input.ck-input-text,
|
||||
.ckeditor-holder .ck-font-size-input.ck-input-number,
|
||||
.ckeditor-holder .ck-font-size-input .ck-input__field,
|
||||
.ckeditor-holder .ck-font-size-input input {
|
||||
width: 72px !important;
|
||||
min-width: 72px !important;
|
||||
max-width: 72px !important;
|
||||
flex: 0 0 72px !important;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.ckeditor-holder .ck-font-size-input,
|
||||
.ckeditor-holder .ck-font-size-input .ck-input__field,
|
||||
.ckeditor-holder .ck-font-size-input input {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.ckeditor-holder .ck-font-size-input input::-webkit-outer-spin-button,
|
||||
.ckeditor-holder .ck-font-size-input input::-webkit-inner-spin-button {
|
||||
-webkit-appearance: none;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.ckeditor-holder .ck-font-size-input input[type='number'] {
|
||||
appearance: textfield;
|
||||
-moz-appearance: textfield;
|
||||
}
|
||||
|
||||
.ckeditor-holder .ck-content {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 1.5;
|
||||
letter-spacing: normal;
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
.ckeditor-holder .ck-editor__editable {
|
||||
caret-color: var(--editor-text);
|
||||
}
|
||||
|
||||
.editorjs-holder .codex-editor__redactor [contenteditable]:empty:after {
|
||||
.ckeditor-holder .ck-editor__editable.ck-focused {
|
||||
border-color: var(--primary);
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.ckeditor-holder .ck-editor__editable:not(.ck-editor__nested-editable) {
|
||||
min-height: 360px;
|
||||
}
|
||||
|
||||
.ckeditor-holder .ck-placeholder:before {
|
||||
color: rgba(0, 0, 0, 0.45);
|
||||
}
|
||||
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 332 KiB |
@@ -0,0 +1,55 @@
|
||||
Software License Agreement
|
||||
==========================
|
||||
|
||||
**CKEditor 5** (https://github.com/ckeditor/ckeditor5)<br>
|
||||
Copyright (c) 2003–2026, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved.
|
||||
|
||||
Licensed under a dual-license model, this software is available under:
|
||||
|
||||
* the [GNU General Public License Version 2 or later](https://www.gnu.org/licenses/gpl.html) (see COPYING.GPL),
|
||||
* or commercial license terms from CKSource Holding sp. z o.o.
|
||||
|
||||
For more information, see: [https://ckeditor.com/legal/ckeditor-licensing-options](https://ckeditor.com/legal/ckeditor-licensing-options).
|
||||
|
||||
If you are using CKEditor under commercial terms, you are free to remove the COPYING.GPL file with the full copy of a GPL license.
|
||||
|
||||
Sources of Intellectual Property Included in CKEditor 5
|
||||
------------------------------------------------------------
|
||||
|
||||
Where not otherwise indicated, all CKEditor 5 content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor 5 will incorporate work done by developers outside of CKSource with their express permission.
|
||||
|
||||
The following libraries are included in CKEditor 5 under the [ISC license](https://opensource.org/licenses/ISC):
|
||||
|
||||
* hast-util-from-dom - Copyright (c) Keith McKnight <keith@mcknig.ht>.
|
||||
* rehype-dom-parse - Copyright (c) 2018 Keith McKnight <keith@mcknig.ht>.
|
||||
* rehype-dom-stringify - Copyright (c) 2018 Keith McKnight <keith@mcknig.ht>.
|
||||
|
||||
The following libraries are included in CKEditor 5 under the [MIT license](https://opensource.org/licenses/MIT):
|
||||
|
||||
* @types/color-convert - Copyright (c) Microsoft Corporation.
|
||||
* @types/hast - Copyright (c) Microsoft Corporation.
|
||||
* blurhash - Copyright (c) 2018 Wolt Enterprises.
|
||||
* color-convert - Copyright (c) 2011-2016 Heather Arthur <fayearthur@gmail.com> and Copyright (c) 2016-2021 Josh Junon <josh@junon.me>.
|
||||
* color-parse - Copyright (c) 2015 Dmitry Ivanov.
|
||||
* emojibase-data - Copyright (c) 2017-2019 Miles Johnson.
|
||||
* es-toolkit - Copyright (c) 2024 Viva Republica, Inc and Copyright OpenJS Foundation and other contributors.
|
||||
* fuzzysort - Copyright (c) 2018 Stephen Kamenar.
|
||||
* hast-util-to-html - Copyright (c) Titus Wormer <tituswormer@gmail.com>.
|
||||
* hast-util-to-mdast - Copyright (c) Titus Wormer <tituswormer@gmail.com> and Copyright (c) Seth Vincent <sethvincent@gmail.com>.
|
||||
* hastscript - Copyright (c) Titus Wormer <tituswormer@gmail.com>.
|
||||
* is-emoji-supported - Copyright (c) 2016-2020 Koala Interactive, Inc.
|
||||
* Regular expression for URL validation - Copyright (c) 2010-2018 Diego Perini.
|
||||
* rehype-remark - Copyright (c) Titus Wormer <tituswormer@gmail.com>.
|
||||
* remark-breaks - Copyright (c) 2017 Titus Wormer <tituswormer@gmail.com>.
|
||||
* remark-gfm - Copyright (c) Titus Wormer <tituswormer@gmail.com>.
|
||||
* remark-parse - Copyright (c) 2014 Titus Wormer <tituswormer@gmail.com>.
|
||||
* remark-rehype - Copyright (c) Titus Wormer <tituswormer@gmail.com>.
|
||||
* remark-stringify - Copyright (c) 2014 Titus Wormer <tituswormer@gmail.com>.
|
||||
* unified - Copyright (c) 2015 Titus Wormer <tituswormer@gmail.com>.
|
||||
* unist-util-visit - Copyright (c) 2015 Titus Wormer <tituswormer@gmail.com>.
|
||||
* vanilla-colorful - Copyright (c) 2020 Serhii Kulykov <iamkulykov@gmail.com>.
|
||||
|
||||
Trademarks
|
||||
----------
|
||||
|
||||
**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks or service marks of their respective holders.
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
|
||||
*/
|
||||
|
||||
import type { Translations } from '@ckeditor/ckeditor5-utils';
|
||||
declare const translations: Translations;
|
||||
export default translations;
|
||||
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user