mirror of
https://github.com/shoelace-style/webawesome.git
synced 2026-01-12 04:09:12 +00:00
* Basic scaffolding * Generate theme & palette data.js that other JS can import * Make it possible to include page-card without links * WIP * Add `appearance` to details, closes #569 Except `accent` as that's a) far less useful and b) trickier due to the icon color * Fix broken link * WIP * WIP * Icons icon * Unify styles for interactive cards * Prevent focusing inside theme icons * Fixes * Action page cards * Panel scrollables * scrollable * Scroll shadows * Add renaming UI * UI * Move styling of heading icons to `ui.css` * Support permalinks & CRUD * Make clickable cards more accessible * Style cards a little better * Default to styles panel if theme is selected * Update theme-icons.css * Custom themes should be saved under Custom * Get theme code * Bigger title * Fixes * Use theme Vue app for remixing too * Fix preview jank and make preview script more flexible * Make radio groups scrollable * Add affordance to button cards * Sticky * `<color-select>` * Fix theme remixing * Improve previewing logic * Fix preview * Move `domChange()` to separate module `theme-picker.js` includes side-effects, which may not always be desirable everywhere we may want to import `domChange()` * Update preview.js * Panel animation * Hide Save button if no changes and not saved * Do not show blank code when no selection has been made * Use theme slug in filename * Remove unused component * Better UI for editing title (and any other text) * Tweak UI of renaming * Better indicate default selection * Fix preview reverting bug * Fill out app preview with more examples * Remove `zoom` from theme showcase (yields unexpected/painful results Safari), improve display in wider viewports * Pending delete * Make styles panel cards scrollable * Fix some of the Safari issues * Update search.css * Update panel.css * Select preview UI * Fix typo * Frame colors setting as color contrast * Show dark mode in color mappings * Brand color * Swatch styling * Fix caret icon * Move Starting theme to the same level as other controls * Rename typography to Fonts * Fix bug: Swatch select should show swatches from the selected palette * Move capitalize to shared utils * Add utils for handling nested objects * Icons panel * Update code.js * Move utils around * Add fit and finish to sidebar panels * Theme card: Move icons to separate data structure * Move data to dedicated folder since we now have a lot more of it * Add default icon families and variants to themes * Data * Add `deepEntries()` * Add Duotone * Spruce up icons preview * Use theme's icon family in showcase * Font cards * Font cards * Add `max-inline-size` to preview container * Remove alternate preview options * Remove theme subtitle * Support FA kit codes * Remove Pro badges from theme cards * Use panagram preview for Fonts * Consistent heading and label capitalization * Classes for different icons-card types * Update data.js.njk * Variable style on icon family cards * Fix Sharp Duotone * Clean up FA kit code hint * Hide non-functional Icon Library field * Fix theme icon heights * icon variant -> style in theme metadata * Fix bug with icons defaults not being shown * More convenient theme defaults * Fix bug with non updating URL * Fix bug * Fix multiplying badges * Custom docs pages * Add Duotone icons to Mellow theme * Fix 404 * Remove "Create" from sidebar * Fix bug * Move vue components to `/assets/`, move their CSS with them * Safari/FF compatibility * Make panels scrollable again * Fix extra spacing --------- Co-authored-by: lindsaym-fa <dev@lindsaym.design>
121 lines
3.1 KiB
JavaScript
121 lines
3.1 KiB
JavaScript
import my from '/assets/scripts/my.js';
|
|
|
|
const sidebar = {
|
|
addChild(a, parentA) {
|
|
let parentLi = parentA.closest('li');
|
|
let ul = parentLi.querySelector(':scope > ul');
|
|
ul ??= parentLi.appendChild(document.createElement('ul'));
|
|
let li = document.createElement('li');
|
|
li.append(a);
|
|
ul.appendChild(li);
|
|
|
|
// If we are on the same page, update the current link
|
|
let url = location.href.replace(/#.+$/, '');
|
|
if (url.startsWith(a.href)) {
|
|
// Remove existing current
|
|
for (let current of document.querySelectorAll('#sidebar a.current')) {
|
|
current.classList.remove('current');
|
|
}
|
|
|
|
a.classList.add('current');
|
|
}
|
|
|
|
return a;
|
|
},
|
|
|
|
removeLink(a) {
|
|
if (!a || !a.isConnected) {
|
|
// Link doesn't exist or is already removed
|
|
return;
|
|
}
|
|
|
|
let li = a?.closest('li');
|
|
let ul = li?.closest('ul');
|
|
let parentA = ul?.closest('li')?.querySelector(':scope > a');
|
|
|
|
li?.remove();
|
|
if (ul?.children.length === 0) {
|
|
ul.remove();
|
|
}
|
|
|
|
if (a.classList.contains('current')) {
|
|
// If the deleted palette was the current one, the current one is now the parent
|
|
parentA.classList.add('current');
|
|
}
|
|
},
|
|
|
|
findEntity(entity) {
|
|
return document.querySelector(`#sidebar a[href^="${entity.baseUrl}"][data-uid="${entity.uid}"]`);
|
|
},
|
|
|
|
renderEntity(entity) {
|
|
let { url, parentUrl } = entity;
|
|
|
|
// Find parent
|
|
let parentA = document.querySelector(`#sidebar a[href="${parentUrl}"]`);
|
|
let parentLi = parentA?.closest('li');
|
|
|
|
if (!parentLi) {
|
|
throw new Error(`Cannot find parent url ${parentUrl}`);
|
|
}
|
|
|
|
// Find existing
|
|
let a = this.findEntity(entity);
|
|
let alreadyExisted = !!a;
|
|
|
|
a ??= document.createElement('a');
|
|
|
|
a.textContent = entity.title;
|
|
a.href = url;
|
|
|
|
if (!alreadyExisted) {
|
|
a.dataset.uid = entity.uid;
|
|
|
|
a = sidebar.addChild(a, parentA);
|
|
|
|
// This is mainly to port Pro badges
|
|
let badges = Array.from(parentLi.querySelectorAll(':scope > wa-badge'), badge => badge.cloneNode(true));
|
|
|
|
let append = [...badges];
|
|
|
|
if (entity.delete) {
|
|
let deleteButton = Object.assign(document.createElement('wa-icon-button'), {
|
|
name: 'trash',
|
|
label: 'Delete',
|
|
className: 'delete',
|
|
});
|
|
deleteButton.addEventListener('click', () => entity.delete());
|
|
append.push(deleteButton);
|
|
}
|
|
|
|
if (append.length > 0) {
|
|
a.closest('li').append(' ', ...append);
|
|
}
|
|
}
|
|
},
|
|
|
|
render() {
|
|
for (let type in my) {
|
|
let controller = my[type];
|
|
|
|
if (!controller.saved) {
|
|
continue;
|
|
}
|
|
|
|
for (let entity of controller.saved) {
|
|
let object = controller.getObject(entity);
|
|
this.renderEntity(object);
|
|
}
|
|
}
|
|
},
|
|
};
|
|
|
|
globalThis.sidebar = sidebar;
|
|
|
|
// Update sidebar when my saved stuff changes
|
|
my.addEventListener('delete', e => sidebar.removeLink(sidebar.findEntity(e.detail)));
|
|
my.addEventListener('save', e => sidebar.renderEntity(e.detail));
|
|
|
|
sidebar.render();
|
|
window.addEventListener('turbo:render', () => sidebar.render());
|