207 lines
5.9 KiB
JavaScript
207 lines
5.9 KiB
JavaScript
import { settings } from "../settings.js";
|
|
import { isValidPlacement, placements } from "../ui-library/window.js";
|
|
import {
|
|
closeOnOutsideClick,
|
|
createWindowElement,
|
|
synchronizePlacementOnUpdate
|
|
} from "./utils/window.js";
|
|
const settingsRows = [
|
|
{
|
|
name: "Disable notifications",
|
|
description: "Hide notification badges in the toolbar.",
|
|
input: "checkbox",
|
|
settingKey: "disableAppNotification",
|
|
changeEvent: (evt) => {
|
|
if (evt.currentTarget instanceof HTMLInputElement) {
|
|
const devToolbar = document.querySelector("astro-dev-toolbar");
|
|
if (devToolbar) {
|
|
devToolbar.setNotificationVisible(!evt.currentTarget.checked);
|
|
}
|
|
settings.updateSetting("disableAppNotification", evt.currentTarget.checked);
|
|
const action = evt.currentTarget.checked ? "disabled" : "enabled";
|
|
settings.logger.verboseLog(`App notification badges ${action}`);
|
|
}
|
|
}
|
|
},
|
|
{
|
|
name: "Verbose logging",
|
|
description: "Logs dev toolbar events in the browser console.",
|
|
input: "checkbox",
|
|
settingKey: "verbose",
|
|
changeEvent: (evt) => {
|
|
if (evt.currentTarget instanceof HTMLInputElement) {
|
|
settings.updateSetting("verbose", evt.currentTarget.checked);
|
|
const action = evt.currentTarget.checked ? "enabled" : "disabled";
|
|
settings.logger.verboseLog(`Verbose logging ${action}`);
|
|
}
|
|
}
|
|
},
|
|
{
|
|
name: "Placement",
|
|
description: "Adjust the placement of the dev toolbar.",
|
|
input: "select",
|
|
settingKey: "placement",
|
|
changeEvent: (evt) => {
|
|
if (evt.currentTarget instanceof HTMLSelectElement) {
|
|
const placement = evt.currentTarget.value;
|
|
if (isValidPlacement(placement)) {
|
|
document.querySelector("astro-dev-toolbar")?.setToolbarPlacement(placement);
|
|
settings.updateSetting("placement", placement);
|
|
settings.logger.verboseLog(`Placement set to ${placement}`);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
];
|
|
var settings_default = {
|
|
id: "astro:settings",
|
|
name: "Settings",
|
|
icon: "gear",
|
|
init(canvas, eventTarget) {
|
|
createSettingsWindow();
|
|
document.addEventListener("astro:after-swap", createSettingsWindow);
|
|
closeOnOutsideClick(eventTarget);
|
|
synchronizePlacementOnUpdate(eventTarget, canvas);
|
|
function createSettingsWindow() {
|
|
const windowElement = createWindowElement(
|
|
`<style>
|
|
:host astro-dev-toolbar-window {
|
|
height: 480px;
|
|
overflow-y: auto;
|
|
color-scheme: dark;
|
|
|
|
--color-purple: rgba(224, 204, 250, 1);
|
|
}
|
|
header {
|
|
display: flex;
|
|
}
|
|
|
|
h2, h3 {
|
|
margin-top: 0;
|
|
}
|
|
|
|
.setting-row {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
}
|
|
|
|
h3 {
|
|
font-size: 16px;
|
|
font-weight: 400;
|
|
color: white;
|
|
margin-bottom: 4px;
|
|
}
|
|
|
|
label {
|
|
font-size: 14px;
|
|
line-height: 1.5rem;
|
|
}
|
|
|
|
h1 {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
font-weight: 600;
|
|
color: #fff;
|
|
margin: 0;
|
|
font-size: 22px;
|
|
}
|
|
|
|
astro-dev-toolbar-icon {
|
|
width: 1em;
|
|
height: 1em;
|
|
display: block;
|
|
}
|
|
|
|
code {
|
|
color: var(--color-purple);
|
|
border-color: #343841;
|
|
border-style: solid;
|
|
border-width: 1px;
|
|
border-radius: .4em;
|
|
background-color: #24262D;
|
|
padding: .3em;
|
|
}
|
|
|
|
label > section {
|
|
max-width: 67%;
|
|
}
|
|
label > section.full-width {
|
|
max-width: 100%;
|
|
}
|
|
p {
|
|
line-height: 1.5em;
|
|
}
|
|
a, a:visited {
|
|
color: var(--color-purple);
|
|
}
|
|
a:hover {
|
|
color: #f4ecfd;
|
|
}
|
|
</style>
|
|
<header>
|
|
<h1><astro-dev-toolbar-icon icon="gear"></astro-dev-toolbar-icon> Settings</h1>
|
|
</header>
|
|
|
|
<hr id="general"/>
|
|
|
|
<label class="setting-row">
|
|
<section class="full-width">
|
|
<h3>Hide toolbar</h3>
|
|
Run <code>astro preferences disable devToolbar</code> in your terminal to disable the toolbar. <a href="https://docs.astro.build/en/reference/cli-reference/#astro-preferences" target="_blank">Learn more</a>.
|
|
</section>
|
|
</label>
|
|
`
|
|
);
|
|
const general = windowElement.querySelector("#general");
|
|
for (const settingsRow of settingsRows) {
|
|
general.after(document.createElement("hr"));
|
|
general.after(getElementForSettingAsString(settingsRow));
|
|
}
|
|
canvas.append(windowElement);
|
|
function getElementForSettingAsString(setting) {
|
|
const label = document.createElement("label");
|
|
label.classList.add("setting-row");
|
|
const section = document.createElement("section");
|
|
section.innerHTML = `<h3>${setting.name}</h3>${setting.description}`;
|
|
label.append(section);
|
|
switch (setting.input) {
|
|
case "checkbox": {
|
|
const astroToggle = document.createElement("astro-dev-toolbar-toggle");
|
|
astroToggle.input.addEventListener("change", setting.changeEvent);
|
|
astroToggle.input.checked = settings.config[setting.settingKey];
|
|
label.append(astroToggle);
|
|
break;
|
|
}
|
|
case "select": {
|
|
const astroSelect = document.createElement("astro-dev-toolbar-select");
|
|
placements.forEach((placement) => {
|
|
const option = document.createElement("option");
|
|
option.setAttribute("value", placement);
|
|
if (placement === settings.config[setting.settingKey]) {
|
|
option.selected = true;
|
|
}
|
|
option.textContent = `${placement.slice(0, 1).toUpperCase()}${placement.slice(
|
|
1
|
|
)}`.replace("-", " ");
|
|
astroSelect.append(option);
|
|
});
|
|
astroSelect.element.addEventListener("change", setting.changeEvent);
|
|
label.append(astroSelect);
|
|
break;
|
|
}
|
|
case "number":
|
|
case "text":
|
|
default:
|
|
break;
|
|
}
|
|
return label;
|
|
}
|
|
}
|
|
}
|
|
};
|
|
export {
|
|
settings_default as default
|
|
};
|