Compare commits

...

2 commits

7 changed files with 58 additions and 50 deletions

View file

@ -7,3 +7,5 @@ export const sanitizeMediaString = (input) => {
return slugified.replace(/^-+|-+$/g, ''); return slugified.replace(/^-+|-+$/g, '');
} }
export const removeUrlProtocol = (url) => url ? url.replace(/^https?:\/\//, '') : '';

View file

@ -1,6 +1,7 @@
import inquirer from 'inquirer'; import inquirer from 'inquirer';
import { loadConfig } from '../config.js'; import { loadConfig } from '../config.js';
import { initDirectusClient, searchItems, createItem } from '../directus/client.js'; import { initDirectusClient, searchItems, createItem } from '../directus/client.js';
import { removeUrlProtocol } from '../sanitize.js';
export const addLinkToShare = async () => { export const addLinkToShare = async () => {
const config = await loadConfig(); const config = await loadConfig();
@ -68,10 +69,15 @@ export const addLinkToShare = async () => {
type: 'list', type: 'list',
name: 'author', name: 'author',
message: 'Select an author:', message: 'Select an author:',
choices: authorMatches.map(a => ({ choices: authorMatches.map(a => {
name: a.name || a.id, const cleanUrl = removeUrlProtocol(a.url);
const display = cleanUrl ? `${a.name} (${cleanUrl})` : a.name;
return {
name: display,
value: a.id, value: a.id,
})) };
})
}); });
author = response.author; author = response.author;

4
cli/package-lock.json generated
View file

@ -1,12 +1,12 @@
{ {
"name": "coryd", "name": "coryd",
"version": "3.2.0", "version": "3.2.1",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "coryd", "name": "coryd",
"version": "3.2.0", "version": "3.2.1",
"dependencies": { "dependencies": {
"@directus/sdk": "^19.1.0", "@directus/sdk": "^19.1.0",
"chalk": "^5.4.1", "chalk": "^5.4.1",

View file

@ -1,6 +1,6 @@
{ {
"name": "coryd", "name": "coryd",
"version": "3.2.0", "version": "3.2.1",
"description": "The CLI for my site to run scripts, manage and download assets.", "description": "The CLI for my site to run scripts, manage and download assets.",
"type": "module", "type": "module",
"bin": { "bin": {

18
package-lock.json generated
View file

@ -1,12 +1,12 @@
{ {
"name": "coryd.dev", "name": "coryd.dev",
"version": "9.1.7", "version": "9.1.8",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "coryd.dev", "name": "coryd.dev",
"version": "9.1.7", "version": "9.1.8",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"minisearch": "^7.1.2", "minisearch": "^7.1.2",
@ -31,7 +31,7 @@
"postcss-import": "^16.1.0", "postcss-import": "^16.1.0",
"postcss-import-ext-glob": "^2.1.1", "postcss-import-ext-glob": "^2.1.1",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"terser": "^5.41.0", "terser": "^5.42.0",
"truncate-html": "^1.2.1" "truncate-html": "^1.2.1"
}, },
"engines": { "engines": {
@ -1385,9 +1385,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/electron-to-chromium": { "node_modules/electron-to-chromium": {
"version": "1.5.165", "version": "1.5.166",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.165.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.166.tgz",
"integrity": "sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==", "integrity": "sha512-QPWqHL0BglzPYyJJ1zSSmwFFL6MFXhbACOCcsCdUMCkzPdS9/OIBVxg516X/Ado2qwAq8k0nJJ7phQPCqiaFAw==",
"dev": true, "dev": true,
"license": "ISC" "license": "ISC"
}, },
@ -4091,9 +4091,9 @@
} }
}, },
"node_modules/terser": { "node_modules/terser": {
"version": "5.41.0", "version": "5.42.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.41.0.tgz", "resolved": "https://registry.npmjs.org/terser/-/terser-5.42.0.tgz",
"integrity": "sha512-H406eLPXpZbAX14+B8psIuvIr8+3c+2hkuYzpMkoE0ij+NdsVATbA78vb8neA/eqrj7rywa2pIkdmWRsXW6wmw==", "integrity": "sha512-UYCvU9YQW2f/Vwl+P0GfhxJxbUGLwd+5QrrGgLajzWAtC/23AX0vcise32kkP7Eu0Wu9VlzzHAXkLObgjQfFlQ==",
"dev": true, "dev": true,
"license": "BSD-2-Clause", "license": "BSD-2-Clause",
"dependencies": { "dependencies": {

View file

@ -1,6 +1,6 @@
{ {
"name": "coryd.dev", "name": "coryd.dev",
"version": "9.1.7", "version": "9.1.8",
"description": "The source for my personal site. Built using 11ty (and other tools).", "description": "The source for my personal site. Built using 11ty (and other tools).",
"type": "module", "type": "module",
"engines": { "engines": {
@ -51,7 +51,7 @@
"postcss-import": "^16.1.0", "postcss-import": "^16.1.0",
"postcss-import-ext-glob": "^2.1.1", "postcss-import-ext-glob": "^2.1.1",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"terser": "^5.41.0", "terser": "^5.42.0",
"truncate-html": "^1.2.1" "truncate-html": "^1.2.1"
} }
} }

View file

@ -1,64 +1,64 @@
window.addEventListener("load", () => { window.addEventListener('load', () => {
// service worker // service worker
if ('serviceWorker' in navigator) navigator.serviceWorker.register('/assets/scripts/sw.js'); if ('serviceWorker' in navigator) navigator.serviceWorker.register('/assets/scripts/sw.js');
// dialog controls // dialog controls
(() => { (() => {
const dialogButtons = document.querySelectorAll(".dialog-open"); const dialogButtons = document.querySelectorAll('.dialog-open');
if (!dialogButtons.length) return; if (!dialogButtons.length) return;
dialogButtons.forEach((button) => { dialogButtons.forEach((button) => {
const dialogId = button.getAttribute("data-dialog-trigger"); const dialogId = button.getAttribute('data-dialog-trigger');
const dialog = document.getElementById(`dialog-${dialogId}`); const dialog = document.getElementById(`dialog-${dialogId}`);
if (!dialog) return; if (!dialog) return;
const closeButton = dialog.querySelector(".dialog-close"); const closeButton = dialog.querySelector('.dialog-close');
button.addEventListener("click", async () => { button.addEventListener('click', async () => {
const isDynamic = dialog.dataset.dynamic; const isDynamic = dialog.dataset.dynamic;
const isLoaded = dialog.dataset.loaded; const isLoaded = dialog.dataset.loaded;
if (isDynamic && !isLoaded) { if (isDynamic && !isLoaded) {
const markdownFields = dialog.dataset.markdown || ""; const markdownFields = dialog.dataset.markdown || '';
try { try {
const res = await fetch(`/api/query.php?data=${isDynamic}&id=${dialogId}&markdown=${encodeURIComponent(markdownFields)}`); const res = await fetch(`/api/query.php?data=${isDynamic}&id=${dialogId}&markdown=${encodeURIComponent(markdownFields)}`);
const [data] = await res.json(); const [data] = await res.json();
const firstField = markdownFields.split(",")[0]?.trim(); const firstField = markdownFields.split(',')[0]?.trim();
const html = data?.[`${firstField}_html`] || "<p>No notes available.</p>"; const html = data?.[`${firstField}_html`] || '<p>No notes available.</p>';
dialog.querySelectorAll(".dialog-dynamic").forEach((el) => el.remove()); dialog.querySelectorAll('.dialog-dynamic').forEach((el) => el.remove());
const container = document.createElement("div"); const container = document.createElement('div');
container.classList.add("dialog-dynamic"); container.classList.add('dialog-dynamic');
container.innerHTML = html; container.innerHTML = html;
dialog.appendChild(container); dialog.appendChild(container);
dialog.dataset.loaded = "true"; dialog.dataset.loaded = 'true';
} catch (err) { } catch (err) {
dialog.querySelectorAll(".dialog-dynamic").forEach((el) => el.remove()); dialog.querySelectorAll('.dialog-dynamic').forEach((el) => el.remove());
const errorNode = document.createElement("div"); const errorNode = document.createElement('div');
errorNode.classList.add("dialog-dynamic"); errorNode.classList.add('dialog-dynamic');
errorNode.textContent = "Failed to load content."; errorNode.textContent = 'Failed to load content.';
dialog.appendChild(errorNode); dialog.appendChild(errorNode);
console.warn("Dialog content load error:", err); console.warn('Dialog content load error:', err);
} }
} }
dialog.showModal(); dialog.showModal();
dialog.classList.remove("closing"); dialog.classList.remove('closing');
}); });
if (closeButton) { if (closeButton) {
closeButton.addEventListener("click", () => { closeButton.addEventListener('click', () => {
dialog.classList.add("closing"); dialog.classList.add('closing');
setTimeout(() => dialog.close(), 200); setTimeout(() => dialog.close(), 200);
}); });
} }
dialog.addEventListener("click", (event) => { dialog.addEventListener('click', (event) => {
const rect = dialog.getBoundingClientRect(); const rect = dialog.getBoundingClientRect();
const outsideClick = const outsideClick =
event.clientX < rect.left || event.clientX < rect.left ||
@ -67,14 +67,14 @@ window.addEventListener("load", () => {
event.clientY > rect.bottom; event.clientY > rect.bottom;
if (outsideClick) { if (outsideClick) {
dialog.classList.add("closing"); dialog.classList.add('closing');
setTimeout(() => dialog.close(), 200); setTimeout(() => dialog.close(), 200);
} }
}); });
dialog.addEventListener("cancel", (event) => { dialog.addEventListener('cancel', (event) => {
event.preventDefault(); event.preventDefault();
dialog.classList.add("closing"); dialog.classList.add('closing');
setTimeout(() => dialog.close(), 200); setTimeout(() => dialog.close(), 200);
}); });
}); });
@ -82,23 +82,23 @@ window.addEventListener("load", () => {
// text toggle for media pages // text toggle for media pages
(() => { (() => {
const button = document.querySelector("[data-toggle-button]"); const button = document.querySelector('[data-toggle-button]');
const content = document.querySelector("[data-toggle-content]"); const content = document.querySelector('[data-toggle-content]');
const text = document.querySelectorAll("[data-toggle-content] p"); const text = document.querySelectorAll('[data-toggle-content] p');
const minHeight = 500; // this needs to match the height set on [data-toggle-content].text-toggle-hidden in text-toggle.css const minHeight = 500; // this needs to match the height set on [data-toggle-content].text-toggle-hidden in text-toggle.css
const interiorHeight = Array.from(text).reduce((acc, node) => acc + node.scrollHeight, 0); const interiorHeight = Array.from(text).reduce((acc, node) => acc + node.scrollHeight, 0);
if (!button || !content || !text.length) return; if (!button || !content || !text.length) return;
if (interiorHeight < minHeight) { if (interiorHeight < minHeight) {
content.classList.remove("text-toggle-hidden"); content.classList.remove('text-toggle-hidden');
button.style.display = "none"; button.style.display = 'none';
return; return;
} }
button.addEventListener("click", () => { button.addEventListener('click', () => {
const isHidden = content.classList.toggle("text-toggle-hidden"); const isHidden = content.classList.toggle('text-toggle-hidden');
button.textContent = isHidden ? "Show more" : "Show less"; button.textContent = isHidden ? 'Show more' : 'Show less';
}); });
})(); })();
}); });