From 55eb04b393d7253d3451477e3ad14e4432982b87 Mon Sep 17 00:00:00 2001 From: Vic Date: Sat, 13 Dec 2025 21:52:02 -0600 Subject: [PATCH 1/4] Moved AdvList.ts to archive. Implemented settings for future use. Changed handleCardEditClick to handleCardClick for future use. --- .../components => archive}/AdvList.ts | 3 +- src/data/DataManager.ts | 33 +++++++++++-------- src/features/cardEditor.ts | 12 +++---- src/main.ts | 7 ++-- src/settings.ts | 31 +++++++++++++++++ 5 files changed, 64 insertions(+), 22 deletions(-) rename {src/features/adversaries/components => archive}/AdvList.ts (99%) create mode 100644 src/settings.ts diff --git a/src/features/adversaries/components/AdvList.ts b/archive/AdvList.ts similarity index 99% rename from src/features/adversaries/components/AdvList.ts rename to archive/AdvList.ts index 51e39e9..8d0f0a6 100644 --- a/src/features/adversaries/components/AdvList.ts +++ b/archive/AdvList.ts @@ -1,3 +1,4 @@ +/* import { Editor, Notice } from "obsidian"; import { ADVERSARIES } from "../../../data/index"; import { filterByTier } from "../../../utils/index"; @@ -124,4 +125,4 @@ function buildCardHTML( `; return cardHTML.trim().replace(/\s+$/, ""); -} +}*/ \ No newline at end of file diff --git a/src/data/DataManager.ts b/src/data/DataManager.ts index 341053a..968757d 100644 --- a/src/data/DataManager.ts +++ b/src/data/DataManager.ts @@ -1,5 +1,6 @@ import { Plugin } from 'obsidian'; -import { CardData ,EnvironmentData} from '../types/index'; +import { DaggerForgeSettings, DEFAULT } from '../settings'; +import { CardData ,EnvironmentData } from '../types/index'; import { generateEnvUniqueId, generateAdvUniqueId } from '../utils/index'; export interface StoredData { @@ -7,6 +8,7 @@ export interface StoredData { adversaries: CardData[]; environments: EnvironmentData[]; lastUpdated: number; + settings: DaggerForgeSettings; } /** @@ -16,11 +18,13 @@ export interface StoredData { */ export class DataManager { private plugin: Plugin; + public settings: DaggerForgeSettings; private data: StoredData = { version: '2.0', adversaries: [], environments: [], - lastUpdated: Date.now() + lastUpdated: Date.now(), + settings: Object.assign({},DEFAULT) }; constructor(plugin: Plugin) { @@ -35,7 +39,8 @@ export class DataManager { const saved = await this.plugin.loadData(); if (!saved) return; - this.data = { ...this.data, ...saved }; + this.data.settings = (saved as any).settings; + this.settings = this.data.settings; const allAdversaries: CardData[] = []; const allEnvironments: EnvironmentData[] = []; @@ -83,6 +88,16 @@ export class DataManager { this.data.lastUpdated = Date.now(); await this.plugin.saveData(this.data); } + + // ==================== SETTINGS ==================== + + async changeSetting( + setting: key, + value: DaggerForgeSettings[key], + ): Promise { + this.data.settings[setting] = value; + await this.save(); + } // ==================== ADVERSARIES ==================== @@ -234,15 +249,6 @@ export class DataManager { await this.save(); } - async clearAllData(): Promise { - this.data = { - version: '2.0', - adversaries: [], - environments: [], - lastUpdated: Date.now() - }; - await this.save(); - } /** * Delete the data.json file completely @@ -254,7 +260,8 @@ export class DataManager { version: '2.0', adversaries: [], environments: [], - lastUpdated: Date.now() + lastUpdated: Date.now(), + settings: Object.assign({},DEFAULT) }; await this.plugin.saveData(null); diff --git a/src/features/cardEditor.ts b/src/features/cardEditor.ts index 2f7faee..a83b503 100644 --- a/src/features/cardEditor.ts +++ b/src/features/cardEditor.ts @@ -300,9 +300,14 @@ export const onEditClick = ( } }; -export async function handleCardEditClick(evt: MouseEvent, app: App, plugin?: DaggerForgePlugin) { +export async function handleCardClick(evt: MouseEvent, app: App, plugin?: DaggerForgePlugin) { const target = evt.target as HTMLElement; if (!target) return; + + if (!plugin) { + new Notice("Plugin instance not available for editing."); + return; + } let cardType: "env" | "adv" | null = null; if (target.matches(".df-env-edit-button")) cardType = "env"; @@ -310,11 +315,6 @@ export async function handleCardEditClick(evt: MouseEvent, app: App, plugin?: Da if (!cardType) return; - if (!plugin) { - new Notice("Plugin instance not available for editing."); - return; - } - // Check if we're on a canvas const activeLeaf = app.workspace.activeLeaf; const isCanvas = activeLeaf?.view?.getViewType?.() === "canvas"; diff --git a/src/main.ts b/src/main.ts index 85a15b3..f401176 100644 --- a/src/main.ts +++ b/src/main.ts @@ -10,7 +10,7 @@ import { environmentToHTML, openDiceRoller, openEncounterCalculator, - handleCardEditClick, + handleCardClick, } from "./features/index"; import { @@ -21,6 +21,7 @@ import { } from "./ui/index"; import { DataManager } from "./data/index"; +import { DaggerForgeSettingTab } from "./settings"; export default class DaggerForgePlugin extends Plugin { updateCardData() { @@ -34,7 +35,7 @@ export default class DaggerForgePlugin extends Plugin { this.dataManager = new DataManager(this); await this.dataManager.load(); this.addStatusBarItem().setText("DaggerForge Active"); - this.registerDomEvent(document, "click", (evt) => handleCardEditClick(evt, this.app, this)); + this.registerDomEvent(document, "click", (evt) => handleCardClick(evt, this.app, this)); this.registerView( ADVERSARY_VIEW_TYPE, (leaf) => new AdversaryView(leaf), @@ -44,6 +45,8 @@ export default class DaggerForgePlugin extends Plugin { (leaf) => new EnvironmentView(leaf), ); + this.addSettingTab(new DaggerForgeSettingTab(this.app, this)); + this.addRibbonIcon( "scroll-text", "DaggerForge menu", diff --git a/src/settings.ts b/src/settings.ts new file mode 100644 index 0000000..4e9d49b --- /dev/null +++ b/src/settings.ts @@ -0,0 +1,31 @@ +import DaggerForgePlugin from '@/main'; +import { App, PluginSettingTab, Setting } from 'obsidian'; + +export interface DaggerForgeSettings { + collapseButtonHidden: boolean; +} + +export const DEFAULT: DaggerForgeSettings = { + collapseButtonHidden: true, +} + +export function collapseButtonToggle(value: boolean) { + document.documentElement.style.setProperty('--df-collapse-button-display', (value ? 'none' : 'flex')); +} + +export class DaggerForgeSettingTab extends PluginSettingTab { + plugin: DaggerForgePlugin; + + constructor(app: App, plugin: DaggerForgePlugin) { + super(app, plugin); + this.plugin = plugin; + } + + display(): void { + let { containerEl } = this; + + containerEl.empty(); + + + } +} \ No newline at end of file From 7d0461dab46f68f41bc6dd80af93709d49418be8 Mon Sep 17 00:00:00 2001 From: Vic Date: Sat, 13 Dec 2025 22:09:06 -0600 Subject: [PATCH 2/4] Created chevron that will collapse adversary cards. --- src/docs/API.md | 4 +- .../adversaries/creator/CardBuilder.ts | 5 +- src/features/cardCollapse.ts | 47 +++++++++++++++++++ src/features/cardEditor.ts | 6 ++- src/features/index.ts | 1 + styles.css | 21 +++++++++ 6 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 src/features/cardCollapse.ts diff --git a/src/docs/API.md b/src/docs/API.md index 6b1ba16..682f057 100644 --- a/src/docs/API.md +++ b/src/docs/API.md @@ -16,7 +16,7 @@ **TextInputModal** - Creates adversary cards with stats, weapons, features, and damage values. -**DataManager** - Persistence layer. Methods: `addAdversary()`, `addEnvironment()`, `getAdversaries()`, `getEnvironments()`, `deleteAdversary()`, `deleteEnvironment()`. +**DataManager** - Persistence layer. Methods: `changeSetting()`, `addAdversary()`, `addEnvironment()`, `getAdversaries()`, `getEnvironments()`, `deleteAdversary()`, `deleteEnvironment()`. ## Form Utilities @@ -41,3 +41,5 @@ **openEncounterCalculator** - Battle difficulty calculator. **onEditClick** - Routes edit operations for both card types. + +**onCollapseClick** - Routes card collapse operations for both card types. \ No newline at end of file diff --git a/src/features/adversaries/creator/CardBuilder.ts b/src/features/adversaries/creator/CardBuilder.ts index 7f8ae7a..3f9befb 100644 --- a/src/features/adversaries/creator/CardBuilder.ts +++ b/src/features/adversaries/creator/CardBuilder.ts @@ -77,7 +77,10 @@ export const buildCardHTML = (
${hpStressRepeat} +
+

${name}

+
Tier ${tier} ${type} ${sourceBadge}
${desc}
Motives & Tactics: @@ -93,7 +96,7 @@ export const buildCardHTML = (
Experience: ${xp}
FEATURES
- ${featuresHTML} + ${featuresHTML}
`.trim(); diff --git a/src/features/cardCollapse.ts b/src/features/cardCollapse.ts new file mode 100644 index 0000000..ea6d592 --- /dev/null +++ b/src/features/cardCollapse.ts @@ -0,0 +1,47 @@ +import { Notice, App } from "obsidian"; +import type DaggerForgePlugin from "../main"; +import { getActiveCanvas } from "@/utils"; + +export const onCollapseClick = ( + evt: Event, + cardType: string, +) => { + evt.stopPropagation(); + + const button = evt.target as HTMLElement; + let cardElement: HTMLElement | null = null; + + if (cardType === "adv") { + cardElement = button.closest(".df-card-outer"); + } + + if (!cardElement) { + new Notice("Could not find card element!"); + return; + } + + const toggleElement = (element: HTMLElement | string): void => { + if (typeof element === 'string'){ + new Notice(`Could not find ${element}!`); + return; + } + element.hidden = !element.hidden; + return; + } + + let hiddenElementClasses: string[] = []; + //Temporary, meant to symbolize settings chosen. + hiddenElementClasses.push(".df-adv-edit-button",".df-subtitle",".df-desc",".df-motives", ".df-section", ".df-feature"); + // + hiddenElementClasses.forEach(elementClass => { + if (elementClass === ".df-feature"){ + Array.from(cardElement?.querySelectorAll(elementClass)).forEach(element => { + toggleElement(element ?? elementClass); + }); + } else { + toggleElement(cardElement?.querySelector(elementClass) ?? elementClass); + } + }); + + button.style.rotate = (button.style.rotate === "-90deg" ? "0deg" : "-90deg"); +} \ No newline at end of file diff --git a/src/features/cardEditor.ts b/src/features/cardEditor.ts index a83b503..aa72a74 100644 --- a/src/features/cardEditor.ts +++ b/src/features/cardEditor.ts @@ -1,6 +1,6 @@ import { MarkdownView, Notice, App } from "obsidian"; import type DaggerForgePlugin from "../main"; -import { EnvironmentEditorModal } from "."; +import { EnvironmentEditorModal, onCollapseClick } from "."; import { extractCardData, TextInputModal } from "./adversaries/index"; import type { EnvironmentData, EnvSavedFeatureState } from "../types/index"; @@ -311,7 +311,9 @@ export async function handleCardClick(evt: MouseEvent, app: App, plugin?: Dagger let cardType: "env" | "adv" | null = null; if (target.matches(".df-env-edit-button")) cardType = "env"; - else if (target.closest(".df-adv-edit-button")) cardType = "adv"; + else if (target.matches(".df-adv-edit-button")) cardType = "adv"; + // With the way the clicks are currently handled, I am not aware of a better way to check than this. + else if (target.matches(".df-adv-collapse-button")) onCollapseClick(evt, "adv"); if (!cardType) return; diff --git a/src/features/index.ts b/src/features/index.ts index 784775a..60e613e 100644 --- a/src/features/index.ts +++ b/src/features/index.ts @@ -3,3 +3,4 @@ export * from './adversaries/index'; export * from './environments/index'; export * from './extra'; export * from './cardEditor'; +export * from './cardCollapse' diff --git a/styles.css b/styles.css index 4c58d69..1be2db4 100644 --- a/styles.css +++ b/styles.css @@ -1,4 +1,5 @@ :root { + --df-collapse-button-display: none; --df-corner: 10px; --df-font: "Myriad Pro"; --df-color-primary: #000; @@ -186,6 +187,26 @@ font-weight: 400; } +.df-name-container { + display: flex; + justify-content: left; +} + +.df-name-container:hover .df-adv-collapse-button { + display: flex; +} + +.df-adv-collapse-button { + display: var(--df-collapse-button-display); + width: 1px; /*Without these the button crops weird, but the size does not actually do anything. I do not know enough CS to understand whats happening.*/ + height: 1px; + padding-bottom: 20px; + margin-right: 5px; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M8 13.1l-8-8 2.1-2.2 5.9 5.9 5.9-5.9 2.1 2.2z'/%3E%3C/svg%3E"); + background-color: var(--df-color-bg-inner) !important; + box-shadow: none !important; +} + .df-stats .df-experience-line { border-top: 1px dotted black; margin-top: 1px; From 6df9e931bd141e30bbb17a73a1034daf3cb83e82 Mon Sep 17 00:00:00 2001 From: Vic Date: Sat, 13 Dec 2025 22:10:02 -0600 Subject: [PATCH 3/4] Collapse Button Settings --- src/settings.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/settings.ts b/src/settings.ts index 4e9d49b..cdcd266 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -26,6 +26,15 @@ export class DaggerForgeSettingTab extends PluginSettingTab { containerEl.empty(); - + new Setting(containerEl) + .setName('Hide collapse arrow') + .setDesc('On cards, the collapse arrow will be hidden unless the name is hovered over.') + .addToggle(toggle => toggle + .setValue(this.plugin.dataManager.settings.collapseButtonHidden) + .onChange(async (value) => { + await this.plugin.dataManager.changeSetting('collapseButtonHidden', value); + collapseButtonToggle(value); + }) + ); } } \ No newline at end of file From d7006dda87faae75fbeb6058cac0591eb2738e23 Mon Sep 17 00:00:00 2001 From: Vic Date: Sat, 13 Dec 2025 22:10:46 -0600 Subject: [PATCH 4/4] Adding index references. --- src/features/adversaries/index.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/features/adversaries/index.ts b/src/features/adversaries/index.ts index 60b1df9..eb9f676 100644 --- a/src/features/adversaries/index.ts +++ b/src/features/adversaries/index.ts @@ -1,8 +1,7 @@ -export * from './components/AdvList'; export * from './components/AdvSearch'; export * from './components/AdvCounter'; export * from './creator/CardBuilder'; export * from './creator/FeatureManager'; export * from './creator/TextInputModal'; export * from './editor/AdvEditorModal'; -export * from './editor/CardDataHelpers'; +export * from './editor/CardDataHelpers'; \ No newline at end of file