From 218992cf6044a89f81bbdb5c970c767ff9265094 Mon Sep 17 00:00:00 2001 From: crib Date: Wed, 17 Dec 2025 20:51:57 +0100 Subject: [PATCH] Added color options --- styles.css | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ view.ts | 47 ++++++++++++++++++++++++++++++++++------- 2 files changed, 101 insertions(+), 8 deletions(-) diff --git a/styles.css b/styles.css index c479135..5224e0a 100644 --- a/styles.css +++ b/styles.css @@ -195,3 +195,65 @@ border-radius: var(--radius-s); border-left: 3px solid var(--text-error); } + +.taskweaver-color-picker-container { + display: flex; + flex-direction: column; + gap: var(--size-4-3); + margin-top: var(--size-4-2); +} + +.taskweaver-preset-colors { + display: grid; + grid-template-columns: repeat(6, 1fr); + gap: var(--size-4-2); +} + +.taskweaver-color-option { + width: 36px; + height: 36px; + border-radius: var(--radius-s); + cursor: pointer; + border: 2px solid transparent; + transition: all 0.2s; + position: relative; +} + +.taskweaver-color-option:hover { + transform: scale(1.1); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); +} + +.taskweaver-color-option.selected { + border-color: var(--text-normal); + box-shadow: 0 0 0 2px var(--background-primary); +} + +.taskweaver-custom-color { + display: flex; + align-items: center; + gap: var(--size-4-2); +} + +.taskweaver-custom-color label { + color: var(--text-muted); + font-size: var(--font-ui-small); +} + +.taskweaver-custom-color input[type="color"] { + width: 50px; + height: 36px; + border: 1px solid var(--background-modifier-border); + border-radius: var(--radius-s); + cursor: pointer; + background: transparent; +} + +.taskweaver-custom-color input[type="color"]::-webkit-color-swatch-wrapper { + padding: 2px; +} + +.taskweaver-custom-color input[type="color"]::-webkit-color-swatch { + border: none; + border-radius: var(--radius-s); +} diff --git a/view.ts b/view.ts index c757083..41d0699 100644 --- a/view.ts +++ b/view.ts @@ -306,14 +306,45 @@ class ManageCategoriesModal extends Modal { categoryName = value; })); - new Setting(contentEl) - .setName("Color") - .addText(text => text - .setValue(categoryColor) - .setPlaceholder("#4a9eff") - .onChange(value => { - categoryColor = value; - })); + const colorSetting = new Setting(contentEl) + .setName("Color"); + + const colorContainer = colorSetting.settingEl.createDiv({ cls: "taskweaver-color-picker-container" }); + + const presetColors = [ + "#4a9eff", "#ff6b6b", "#51cf66", "#ffd43b", + "#ff8787", "#cc5de8", "#339af0", "#ff922b", + "#20c997", "#e599f7", "#74c0fc", "#a9e34b" + ]; + + const presetContainer = colorContainer.createDiv({ cls: "taskweaver-preset-colors" }); + + presetColors.forEach(color => { + const colorOption = presetContainer.createDiv({ cls: "taskweaver-color-option" }); + colorOption.style.backgroundColor = color; + if (color === categoryColor) { + colorOption.addClass("selected"); + } + colorOption.onclick = () => { + categoryColor = color; + presetContainer.querySelectorAll(".taskweaver-color-option").forEach(el => + el.removeClass("selected") + ); + colorOption.addClass("selected"); + colorPicker.value = color; + }; + }); + + const customColorContainer = colorContainer.createDiv({ cls: "taskweaver-custom-color" }); + customColorContainer.createEl("label", { text: "Custom: " }); + const colorPicker = customColorContainer.createEl("input", { type: "color" }); + colorPicker.value = categoryColor; + colorPicker.oninput = () => { + categoryColor = colorPicker.value; + presetContainer.querySelectorAll(".taskweaver-color-option").forEach(el => + el.removeClass("selected") + ); + }; new Setting(contentEl) .setName("Emoji (optional)")