-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patheslint-out.json
More file actions
12 lines (11 loc) · 70.3 KB
/
Copy patheslint-out.json
File metadata and controls
12 lines (11 loc) · 70.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
node : (node:6528) ESLintIgnoreWarning: The ".eslintignore" file is no longer supported. Switch to
using the "ignores" property in "eslint.config.js":
https://eslint.org/docs/latest/use/configure/migration-guide#ignoring-files
At line:1 char:1
+ node .\eslint-plugin\node_modules\eslint\bin\eslint.js --config obsid ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: ((node:6528) ESL...#ignoring-files:String) [], RemoteEx
ception
+ FullyQualifiedErrorId : NativeCommandError
(Use `node --trace-warnings ...` to show where the warning was created)
[{"filePath":"C:\\Users\\Lilly\\OneDrive\\Desktop\\Test\\.obsidian\\plugins\\Flashly-\\src\\ui\\settings-tab.ts","messages":[{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":44,"column":14,"nodeType":"Literal","messageId":"useSentenceCase","endLine":44,"endColumn":34},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":54,"column":14,"nodeType":"Literal","messageId":"useSentenceCase","endLine":54,"endColumn":32},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":102,"column":14,"nodeType":"Literal","messageId":"useSentenceCase","endLine":102,"endColumn":30},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":105,"column":22,"nodeType":"Literal","messageId":"useSentenceCase","endLine":105,"endColumn":41},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":176,"column":14,"nodeType":"Literal","messageId":"useSentenceCase","endLine":176,"endColumn":41},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":177,"column":14,"nodeType":"Literal","messageId":"useSentenceCase","endLine":177,"endColumn":54},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":187,"column":15,"nodeType":"Literal","messageId":"useSentenceCase","endLine":187,"endColumn":34},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":190,"column":23,"nodeType":"Literal","messageId":"useSentenceCase","endLine":190,"endColumn":41},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":220,"column":13,"nodeType":"Literal","messageId":"useSentenceCase","endLine":220,"endColumn":34},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":221,"column":13,"nodeType":"Literal","messageId":"useSentenceCase","endLine":221,"endColumn":61},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":224,"column":32,"nodeType":"Literal","messageId":"useSentenceCase","endLine":224,"endColumn":52},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":225,"column":31,"nodeType":"Literal","messageId":"useSentenceCase","endLine":225,"endColumn":48},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":297,"column":13,"nodeType":"Literal","messageId":"useSentenceCase","endLine":297,"endColumn":33},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":298,"column":14,"nodeType":"Literal","messageId":"useSentenceCase","endLine":298,"endColumn":77},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":327,"column":27,"nodeType":"Literal","messageId":"useSentenceCase","endLine":327,"endColumn":52},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":328,"column":30,"nodeType":"Literal","messageId":"useSentenceCase","endLine":328,"endColumn":50},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":329,"column":27,"nodeType":"Literal","messageId":"useSentenceCase","endLine":329,"endColumn":44},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":330,"column":27,"nodeType":"Literal","messageId":"useSentenceCase","endLine":330,"endColumn":48},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":341,"column":15,"nodeType":"Literal","messageId":"useSentenceCase","endLine":341,"endColumn":37},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":346,"column":15,"nodeType":"Literal","messageId":"useSentenceCase","endLine":346,"endColumn":36},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":349,"column":27,"nodeType":"Literal","messageId":"useSentenceCase","endLine":349,"endColumn":35},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":364,"column":15,"nodeType":"Literal","messageId":"useSentenceCase","endLine":364,"endColumn":22},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":365,"column":15,"nodeType":"Literal","messageId":"useSentenceCase","endLine":365,"endColumn":36},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":367,"column":27,"nodeType":"Literal","messageId":"useSentenceCase","endLine":367,"endColumn":49},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":368,"column":33,"nodeType":"Literal","messageId":"useSentenceCase","endLine":368,"endColumn":55},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":369,"column":35,"nodeType":"Literal","messageId":"useSentenceCase","endLine":369,"endColumn":60},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":391,"column":15,"nodeType":"Literal","messageId":"useSentenceCase","endLine":391,"endColumn":39},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":394,"column":27,"nodeType":"Literal","messageId":"useSentenceCase","endLine":394,"endColumn":39},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":409,"column":15,"nodeType":"Literal","messageId":"useSentenceCase","endLine":409,"endColumn":22},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":412,"column":48,"nodeType":"Literal","messageId":"useSentenceCase","endLine":412,"endColumn":67},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":413,"column":44,"nodeType":"Literal","messageId":"useSentenceCase","endLine":413,"endColumn":59},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":414,"column":46,"nodeType":"Literal","messageId":"useSentenceCase","endLine":414,"endColumn":63},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":415,"column":45,"nodeType":"Literal","messageId":"useSentenceCase","endLine":415,"endColumn":61},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":432,"column":15,"nodeType":"Literal","messageId":"useSentenceCase","endLine":432,"endColumn":44},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":437,"column":15,"nodeType":"Literal","messageId":"useSentenceCase","endLine":437,"endColumn":46},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":440,"column":27,"nodeType":"Literal","messageId":"useSentenceCase","endLine":440,"endColumn":36},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":455,"column":14,"nodeType":"Literal","messageId":"useSentenceCase","endLine":455,"endColumn":21},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":458,"column":35,"nodeType":"Literal","messageId":"useSentenceCase","endLine":458,"endColumn":77},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":460,"column":37,"nodeType":"Literal","messageId":"useSentenceCase","endLine":460,"endColumn":55},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":461,"column":35,"nodeType":"Literal","messageId":"useSentenceCase","endLine":461,"endColumn":60},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":462,"column":37,"nodeType":"Literal","messageId":"useSentenceCase","endLine":462,"endColumn":64},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":522,"column":14,"nodeType":"Literal","messageId":"useSentenceCase","endLine":522,"endColumn":26},{"ruleId":"obsidianmd/ui/sentence-case","severity":2,"message":"Use sentence case for UI text.","line":525,"column":26,"nodeType":"Literal","messageId":"useSentenceCase","endLine":525,"endColumn":38}],"suppressedMessages":[],"errorCount":43,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\r\n * Settings UI for Flashly plugin\r\n */\r\n\r\nimport { App, PluginSettingTab, Setting } from 'obsidian';\r\nimport type FlashlyPlugin from '../../main';\r\nimport type { SchedulerType } from '../settings';\r\nimport type { AIProvider } from '../models/quiz';\r\nimport { TutorialModal, getTutorialSteps } from './tutorial-modal';\r\n\r\nexport class FlashlySettingTab extends PluginSettingTab {\r\n\tplugin: FlashlyPlugin;\r\n\r\n\tconstructor(app: App, plugin: FlashlyPlugin) {\r\n\t\tsuper(app, plugin);\r\n\t\tthis.plugin = plugin;\r\n\t}\r\n\r\n\tdisplay(): void {\r\n\t\tconst { containerEl } = this;\r\n\t\tcontainerEl.empty();\r\n\r\n\t\t// Removed redundant heading per Obsidian guidelines\r\n\t\t// Settings tab title is already shown by Obsidian\r\n\r\n\t\t// Inline Parser Settings\r\n\t\tnew Setting(containerEl)\r\n\t\t\t.setName('Inline flashcards')\r\n\t\t\t.setHeading();\r\n\r\n\t\tnew Setting(containerEl)\r\n\t\t\t.setName('Enable inline flashcards')\r\n\t\t\t.setDesc('Parse Q::A, ??, and {cloze} formats')\r\n\t\t\t.addToggle(toggle => toggle\r\n\t\t\t\t.setValue(this.plugin.settings.parser.inline.enabled)\r\n\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\tthis.plugin.settings.parser.inline.enabled = value;\r\n\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\tvoid this.display(); // Refresh to show/hide dependent settings\r\n\t\t\t\t}));\r\n\r\n\t\tif (this.plugin.settings.parser.inline.enabled) {\r\n\t\t\tnew Setting(containerEl)\r\n\t\t\t\t.setName('enable Q::A format')\r\n\t\t\t\t.setDesc('Single-line question::answer format')\r\n\t\t\t\t.addToggle(toggle => toggle\r\n\t\t\t\t\t.setValue(this.plugin.settings.parser.inline.enableQA)\r\n\t\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\t\tthis.plugin.settings.parser.inline.enableQA = value;\r\n\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t}));\r\n\r\n\t\t\tnew Setting(containerEl)\r\n\t\t\t\t.setName('enable ?? format')\r\n\t\t\t\t.setDesc('Multi-line question/answer format')\r\n\t\t\t\t.addToggle(toggle => toggle\r\n\t\t\t\t\t.setValue(this.plugin.settings.parser.inline.enableMultiLine)\r\n\t\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\t\tthis.plugin.settings.parser.inline.enableMultiLine = value;\r\n\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t}));\r\n\r\n\t\t\tnew Setting(containerEl)\r\n\t\t\t\t.setName('Enable {cloze} format')\r\n\t\t\t\t.setDesc('Cloze deletion format')\r\n\t\t\t\t.addToggle(toggle => toggle\r\n\t\t\t\t\t.setValue(this.plugin.settings.parser.inline.enableCloze)\r\n\t\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\t\tthis.plugin.settings.parser.inline.enableCloze = value;\r\n\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t}));\r\n\r\n\t\t\tnew Setting(containerEl)\r\n\t\t\t\t.setName('Create empty cards')\r\n\t\t\t\t.setDesc('Create flashcards even when answer is empty')\r\n\t\t\t\t.addToggle(toggle => toggle\r\n\t\t\t\t\t.setValue(this.plugin.settings.parser.inline.createEmptyCards)\r\n\t\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\t\tthis.plugin.settings.parser.inline.createEmptyCards = value;\r\n\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t}));\r\n\t\t}\r\n\r\n\t\t// Header Parser Settings\r\n\t\tnew Setting(containerEl)\r\n\t\t\t.setName('Header-based flashcards')\r\n\t\t\t.setHeading();\r\n\r\n\t\tnew Setting(containerEl)\r\n\t\t\t.setName('Enable header-based flashcards')\r\n\t\t\t.setDesc('Convert headers in tagged notes to flashcards')\r\n\t\t\t.addToggle(toggle => toggle\r\n\t\t\t\t.setValue(this.plugin.settings.parser.header.enabled)\r\n\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\tthis.plugin.settings.parser.header.enabled = value;\r\n\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\tvoid this.display(); // Refresh to show/hide dependent settings\r\n\t\t\t\t}));\r\n\r\n\t\tif (this.plugin.settings.parser.header.enabled) {\r\n\t\t\tnew Setting(containerEl)\r\n\t\t\t\t.setName('flashcard tags')\r\n\t\t\t\t.setDesc('Tags that mark notes for header parsing (comma-separated)')\r\n\t\t\t\t.addText(text => text\r\n\t\t\t\t\t.setPlaceholder('flashcards, cards')\r\n\t\t\t\t\t.setValue(this.plugin.settings.parser.header.flashcardTags.join(', '))\r\n\t\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\t\tthis.plugin.settings.parser.header.flashcardTags = \r\n\t\t\t\t\t\t\tvalue.split(',').map(tag => tag.trim()).filter(tag => tag.length > 0);\r\n\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t}));\r\n\r\n\t\t\tnew Setting(containerEl)\r\n\t\t\t\t.setName('Header levels')\r\n\t\t\t\t.setDesc('Which header levels to convert (2-6, comma-separated)')\r\n\t\t\t\t.addText(text => text\r\n\t\t\t\t\t.setPlaceholder('2, 3, 4, 5, 6')\r\n\t\t\t\t\t.setValue(this.plugin.settings.parser.header.headerLevels.join(', '))\r\n\t\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\t\tconst levels = value.split(',')\r\n\t\t\t\t\t\t\t.map(l => parseInt(l.trim()))\r\n\t\t\t\t\t\t\t.filter(l => l >= 2 && l <= 6);\r\n\t\t\t\t\t\tthis.plugin.settings.parser.header.headerLevels = levels;\r\n\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t}));\r\n\r\n\t\t\tnew Setting(containerEl)\r\n\t\t\t\t.setName('Deck name priority')\r\n\t\t\t\t.setDesc('Order to determine deck name: frontmatter, title, subtags')\r\n\t\t\t\t.addDropdown(dropdown => dropdown\r\n\t\t\t\t\t.addOption('frontmatter,title,subtags', 'Frontmatter → title → subtags')\r\n\t\t\t\t\t.addOption('title,frontmatter,subtags', 'Title → frontmatter → subtags')\r\n\t\t\t\t\t.addOption('frontmatter,subtags,title', 'Frontmatter → subtags → title')\r\n\t\t\t\t\t.setValue(this.plugin.settings.parser.header.deckNamePriority.join(','))\r\n\t\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\t\tthis.plugin.settings.parser.header.deckNamePriority = \r\n\t\t\t\t\t\t\tvalue.split(',') as ('frontmatter' | 'title' | 'subtags')[];\r\n\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t}));\r\n\r\n\t\t\tnew Setting(containerEl)\r\n\t\t\t\t.setName('Use subtags for deck names')\r\n\t\t\t\t.setDesc('Use #flashcards/math as deck name')\r\n\t\t\t\t.addToggle(toggle => toggle\r\n\t\t\t\t\t.setValue(this.plugin.settings.parser.header.useSubtags)\r\n\t\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\t\tthis.plugin.settings.parser.header.useSubtags = value;\r\n\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t}));\r\n\r\n\t\t\tnew Setting(containerEl)\r\n\t\t\t\t.setName('Answer terminator')\r\n\t\t\t\t.setDesc('How to determine where answer ends')\r\n\t\t\t\t.addDropdown(dropdown => dropdown\r\n\t\t\t\t\t.addOption('next-header', 'Next header')\r\n\t\t\t\t\t.addOption('blank-line', 'Blank line')\r\n\t\t\t\t\t.addOption('hr', 'Horizontal rule')\r\n\t\t\t\t\t.setValue(this.plugin.settings.parser.header.answerTerminator)\r\n\t\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\t\tthis.plugin.settings.parser.header.answerTerminator = \r\n\t\t\t\t\t\t\tvalue as 'next-header' | 'blank-line' | 'hr';\r\n\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t}));\r\n\r\n\t\t\tnew Setting(containerEl)\r\n\t\t\t\t.setName('Create empty cards')\r\n\t\t\t\t.setDesc('Create flashcards even when answer is empty')\r\n\t\t\t\t.addToggle(toggle => toggle\r\n\t\t\t\t\t.setValue(this.plugin.settings.parser.header.createEmptyCards)\r\n\t\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\t\tthis.plugin.settings.parser.header.createEmptyCards = value;\r\n\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t}));\r\n\r\n\t\t\tnew Setting(containerEl)\r\n\t\t\t\t.setName('enable exclusion comments')\r\n\t\t\t\t.setDesc('Allow %%NO_FLASHCARD%% to skip headers')\r\n\t\t\t\t.addToggle(toggle => toggle\r\n\t\t\t\t\t.setValue(this.plugin.settings.parser.header.enableExclusion)\r\n\t\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\t\tthis.plugin.settings.parser.header.enableExclusion = value;\r\n\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t}));\r\n\r\n\t\t\tif (this.plugin.settings.parser.header.enableExclusion) {\r\n\t\t\t\tnew Setting(containerEl)\r\n\t\t\t\t\t.setName('exclusion comment')\r\n\t\t\t\t\t.setDesc('Comment text to exclude headers')\r\n\t\t\t\t\t.addText(text => text\r\n\t\t\t\t\t\t.setPlaceholder('%%NO_FLASHCARD%%')\r\n\t\t\t\t\t\t.setValue(this.plugin.settings.parser.header.exclusionComment)\r\n\t\t\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\t\t\tthis.plugin.settings.parser.header.exclusionComment = value;\r\n\t\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t\t}));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Mixed Formats\r\n\t\tnew Setting(containerEl)\r\n\t\t\t.setName('Advanced')\r\n\t\t\t.setHeading();\r\n\r\n\t\tnew Setting(containerEl)\r\n\t\t\t.setName('Allow mixed formats')\r\n\t\t\t.setDesc('Allow both inline and header flashcards in same note')\r\n\t\t\t.addToggle(toggle => toggle\r\n\t\t\t\t.setValue(this.plugin.settings.parser.mixedFormats)\r\n\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\tthis.plugin.settings.parser.mixedFormats = value;\r\n\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t}));\r\n\r\n\t\t// Review Sessions\r\n\t\tnew Setting(containerEl)\r\n\t\t\t.setName('Review sessions')\r\n\t\t\t.setHeading();\r\n\r\n\t\tnew Setting(containerEl)\r\n\t\t\t.setName('scheduler algorithm')\r\n\t\t\t.setDesc('Choose between FSRS (default) or SM-2 fallback')\r\n\t\t\t.addDropdown(dropdown => {\r\n\t\t\t\tconst scheduler = this.plugin.settings.review.scheduler;\r\n\t\t\t\tdropdown.addOption('fsrs', 'FSRS (recommended)');\r\n\t\t\t\tdropdown.addOption('sm2', 'SM-2 (fallback)');\r\n\t\t\t\tdropdown.setValue(scheduler);\r\n\t\t\t\tdropdown.onChange(async (value) => {\r\n\t\t\t\t\tthis.plugin.settings.review.scheduler = value as SchedulerType;\r\n\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\tnew Setting(containerEl)\r\n\t\t\t.setName('Daily due limit')\r\n\t\t\t.setDesc('Maximum number of due cards per review session')\r\n\t\t\t.addText(text => {\r\n\t\t\t\ttext.inputEl.type = 'number';\r\n\t\t\t\ttext.setPlaceholder('100');\r\n\t\t\t\ttext.setValue(String(this.plugin.settings.review.limits.reviewPerDay));\r\n\t\t\t\ttext.onChange(async (value) => {\r\n\t\t\t\t\tconst parsed = parseInt(value, 10);\r\n\t\t\t\t\tthis.plugin.settings.review.limits.reviewPerDay = Number.isNaN(parsed) ? 0 : Math.max(0, parsed);\r\n\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\tnew Setting(containerEl)\r\n\t\t\t.setName('Daily new limit')\r\n\t\t\t.setDesc('Maximum number of new cards introduced per session')\r\n\t\t\t.addText(text => {\r\n\t\t\t\ttext.inputEl.type = 'number';\r\n\t\t\t\ttext.setPlaceholder('20');\r\n\t\t\t\ttext.setValue(String(this.plugin.settings.review.limits.newPerDay));\r\n\t\t\t\ttext.onChange(async (value) => {\r\n\t\t\t\t\tconst parsed = parseInt(value, 10);\r\n\t\t\t\t\tthis.plugin.settings.review.limits.newPerDay = Number.isNaN(parsed) ? 0 : Math.max(0, parsed);\r\n\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\tnew Setting(containerEl)\r\n\t\t\t.setName('Include learning cards')\r\n\t\t\t.setDesc('Keep cards in learning steps within the queue')\r\n\t\t\t.addToggle(toggle => toggle\r\n\t\t\t\t.setValue(this.plugin.settings.review.includeLearningCards)\r\n\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\tthis.plugin.settings.review.includeLearningCards = value;\r\n\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t}));\r\n\r\n\t\tnew Setting(containerEl)\r\n\t\t\t.setName('Ignore empty answers')\r\n\t\t\t.setDesc('Skip cards without answers until filled in')\r\n\t\t\t.addToggle(toggle => toggle\r\n\t\t\t\t.setValue(this.plugin.settings.review.excludeEmptyCards)\r\n\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\tthis.plugin.settings.review.excludeEmptyCards = value;\r\n\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t}));\r\n\r\n\t\tnew Setting(containerEl)\r\n\t\t\t.setName('Deck filter')\r\n\t\t\t\t.setDesc('Only review specific decks (comma-separated, leave blank for all decks)')\r\n\t\t\t\t.addText(text => {\r\n\t\t\t\t\ttext.setPlaceholder('Biology, chemistry');\r\n\t\t\t\ttext.setValue(this.plugin.settings.review.deckFilter.join(', '));\r\n\t\t\t\ttext.onChange(async (value) => {\r\n\t\t\t\t\tthis.plugin.settings.review.deckFilter = value\r\n\t\t\t\t\t\t.split(',')\r\n\t\t\t\t\t\t.map(deck => deck.trim())\r\n\t\t\t\t\t\t.filter(deck => deck.length > 0);\r\n\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\tnew Setting(containerEl)\r\n\t\t\t.setName('keyboard shortcuts')\r\n\t\t\t\t.setDesc('Enable keyboard controls (space, 1-4, Esc) in review sessions')\r\n\t\t\t.addToggle(toggle => toggle\r\n\t\t\t\t.setValue(this.plugin.settings.review.enableKeyboardShortcuts)\r\n\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\tthis.plugin.settings.review.enableKeyboardShortcuts = value;\r\n\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t}));\r\n\r\n\t\t// AI Quiz Generation\r\n\t\tnew Setting(containerEl)\r\n\t\t\t.setName('Quiz generation (AI-powered)')\r\n\t\t\t.setHeading();\r\n\r\n\t\tnew Setting(containerEl)\r\n\t\t\t.setName('Enable AI quiz generation')\r\n\t\t\t.setDesc('Use AI to generate quiz questions from your flashcards')\r\n\t\t\t.addToggle(toggle => toggle\r\n\t\t\t\t.setValue(this.plugin.settings.quiz.enabled)\r\n\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\tthis.plugin.settings.quiz.enabled = value;\r\n\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\tvoid this.display(); // Refresh to show/hide AI settings\r\n\t\t\t\t}));\r\n\r\n\t\tif (this.plugin.settings.quiz.enabled) {\r\n\t\t\tnew Setting(containerEl)\r\n\t\t\t\t.setName('AI provider')\r\n\t\t\t\t.setDesc('Choose your AI provider for quiz generation')\r\n\t\t\t\t.addDropdown(dropdown => dropdown\r\n\t\t\t\t\t.addOption('openai', 'OpenAI (GPT-4, GPT-3.5)')\r\n\t\t\t\t\t.addOption('anthropic', 'Anthropic (Claude)')\r\n\t\t\t\t\t.addOption('gemini', 'Google (Gemini)')\r\n\t\t\t\t\t.addOption('custom', 'custom API endpoint')\r\n\t\t\t\t\t.setValue(this.plugin.settings.quiz.provider)\r\n\t\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\t\tthis.plugin.settings.quiz.provider = value as AIProvider;\r\n\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t\tvoid this.display(); // Refresh to show provider-specific settings\r\n\t\t\t\t\t}));\r\n\r\n\t\t\t// OpenAI Settings\r\n\t\t\tif (this.plugin.settings.quiz.provider === 'openai') {\r\n\t\t\t\tnew Setting(containerEl)\r\n\t\t\t\t\t.setName('OpenAI configuration')\r\n\t\t\t\t\t.setHeading();\r\n\r\n\t\t\t\tnew Setting(containerEl)\r\n\t\t\t\t\t.setName('API key')\r\n\t\t\t\t\t.setDesc('Your OpenAI API key')\r\n\t\t\t\t\t.addText(text => {\r\n\t\t\t\t\t\ttext.inputEl.type = 'password';\r\n\t\t\t\t\t\ttext.setPlaceholder('sk-...');\r\n\t\t\t\t\t\ttext.setValue(this.plugin.settings.quiz.openai?.apiKey || '');\r\n\t\t\t\t\t\ttext.onChange(async (value) => {\r\n\t\t\t\t\t\t\tif (!this.plugin.settings.quiz.openai) {\r\n\t\t\t\t\t\t\t\tthis.plugin.settings.quiz.openai = {\r\n\t\t\t\t\t\t\t\t\tapiKey: '',\r\n\t\t\t\t\t\t\t\t\tmodel: 'gpt-4'\r\n\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tthis.plugin.settings.quiz.openai.apiKey = value;\r\n\t\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\tnew Setting(containerEl)\r\n\t\t\t\t\t.setName('model')\r\n\t\t\t\t\t.setDesc('OpenAI model to use')\r\n\t\t\t\t\t.addDropdown(dropdown => dropdown\r\n\t\t\t\t\t\t.addOption('gpt-4', 'GPT-4 (most capable)')\r\n\t\t\t\t\t\t.addOption('gpt-4-turbo', 'GPT-4 Turbo (faster)')\r\n\t\t\t\t\t\t.addOption('gpt-3.5-turbo', 'GPT-3.5 Turbo (cheaper)')\r\n\t\t\t\t\t\t.setValue(this.plugin.settings.quiz.openai?.model || 'gpt-4')\r\n\t\t\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\t\t\tif (!this.plugin.settings.quiz.openai) {\r\n\t\t\t\t\t\t\t\tthis.plugin.settings.quiz.openai = {\r\n\t\t\t\t\t\t\t\t\tapiKey: '',\r\n\t\t\t\t\t\t\t\t\tmodel: 'gpt-4'\r\n\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tthis.plugin.settings.quiz.openai.model = value;\r\n\t\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t\t}));\r\n\t\t\t}\r\n\r\n\t\t\t// Anthropic Settings\r\n\t\t\tif (this.plugin.settings.quiz.provider === 'anthropic') {\r\n\t\t\t\tnew Setting(containerEl)\r\n\t\t\t\t\t.setName('Anthropic configuration')\r\n\t\t\t\t\t.setHeading();\r\n\r\n\t\t\t\tnew Setting(containerEl)\r\n\t\t\t\t\t.setName('API key')\r\n\t\t\t\t\t.setDesc('Your Anthropic API key')\r\n\t\t\t\t\t.addText(text => {\r\n\t\t\t\t\t\ttext.inputEl.type = 'password';\r\n\t\t\t\t\t\ttext.setPlaceholder('sk-ant-...');\r\n\t\t\t\t\t\ttext.setValue(this.plugin.settings.quiz.anthropic?.apiKey || '');\r\n\t\t\t\t\t\ttext.onChange(async (value) => {\r\n\t\t\t\t\t\t\tif (!this.plugin.settings.quiz.anthropic) {\r\n\t\t\t\t\t\t\t\tthis.plugin.settings.quiz.anthropic = {\r\n\t\t\t\t\t\t\t\t\tapiKey: '',\r\n\t\t\t\t\t\t\t\t\tmodel: 'claude-3-5-sonnet-20241022'\r\n\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tthis.plugin.settings.quiz.anthropic.apiKey = value;\r\n\t\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\tnew Setting(containerEl)\r\n\t\t\t\t\t.setName('model')\r\n\t\t\t\t\t.setDesc('Anthropic model to use')\r\n\t\t\t\t\t.addDropdown(dropdown => dropdown\r\n\t\t\t\t\t\t.addOption('claude-3-5-sonnet-20241022', 'Claude 3.5 Sonnet')\r\n\t\t\t\t\t\t.addOption('claude-3-opus-20240229', 'Claude 3 Opus')\r\n\t\t\t\t\t\t.addOption('claude-3-sonnet-20240229', 'Claude 3 Sonnet')\r\n\t\t\t\t\t\t.addOption('claude-3-haiku-20240307', 'Claude 3 Haiku')\r\n\t\t\t\t\t\t.setValue(this.plugin.settings.quiz.anthropic?.model || 'claude-3-5-sonnet-20241022')\r\n\t\t\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\t\t\tif (!this.plugin.settings.quiz.anthropic) {\r\n\t\t\t\t\t\t\t\tthis.plugin.settings.quiz.anthropic = {\r\n\t\t\t\t\t\t\t\t\tapiKey: '',\r\n\t\t\t\t\t\t\t\t\tmodel: 'claude-3-5-sonnet-20241022'\r\n\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tthis.plugin.settings.quiz.anthropic.model = value;\r\n\t\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t\t}));\r\n\t\t\t}\r\n\r\n\t\t\t// Gemini Settings\r\n\t\t\tif (this.plugin.settings.quiz.provider === 'gemini') {\r\n\t\t\t\tnew Setting(containerEl)\r\n\t\t\t\t\t.setName('Google Gemini configuration')\r\n\t\t\t\t\t.setHeading();\r\n\r\n\t\t\t\tnew Setting(containerEl)\r\n\t\t\t\t\t.setName('API key')\r\n\t\t\t\t\t.setDesc('Your Google AI Studio API key')\r\n\t\t\t\t\t.addText(text => {\r\n\t\t\t\t\t\ttext.inputEl.type = 'password';\r\n\t\t\t\t\t\ttext.setPlaceholder('AIza...');\r\n\t\t\t\t\t\ttext.setValue(this.plugin.settings.quiz.gemini?.apiKey || '');\r\n\t\t\t\t\t\ttext.onChange(async (value) => {\r\n\t\t\t\t\t\t\tif (!this.plugin.settings.quiz.gemini) {\r\n\t\t\t\t\t\t\t\tthis.plugin.settings.quiz.gemini = {\r\n\t\t\t\t\t\t\t\t\tapiKey: '',\r\n\t\t\t\t\t\t\t\t\tmodel: 'gemini-1.5-pro'\r\n\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tthis.plugin.settings.quiz.gemini.apiKey = value;\r\n\t\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\r\n\t\t\tnew Setting(containerEl)\r\n\t\t\t\t.setName('model')\r\n\t\t\t\t.setDesc('Gemini model to use')\r\n\t\t\t\t.addDropdown(dropdown => dropdown\r\n\t\t\t\t\t.addOption('gemini-2.5-pro', 'Gemini 2.5 Pro (most capable, reasoning)')\r\n\t\t\t\t\t.addOption('gemini-2.5-flash', 'Gemini 2.5 Flash (fast, best price/performance)')\r\n\t\t\t\t\t.addOption('gemini-2.0-flash', 'Gemini 2.0 Flash')\r\n\t\t\t\t\t.addOption('gemini-1.5-pro', 'Gemini 1.5 Pro (legacy)')\r\n\t\t\t\t\t.addOption('gemini-1.5-flash', 'Gemini 1.5 Flash (legacy)')\r\n\t\t\t\t\t.setValue(this.plugin.settings.quiz.gemini?.model || 'gemini-2.5-flash')\r\n\t\t\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\t\t\tif (!this.plugin.settings.quiz.gemini) {\r\n\t\t\t\t\t\t\t\tthis.plugin.settings.quiz.gemini = {\r\n\t\t\t\t\t\t\t\t\tapiKey: '',\r\n\t\t\t\t\t\t\t\t\tmodel: 'gemini-1.5-pro'\r\n\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tthis.plugin.settings.quiz.gemini.model = value;\r\n\t\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t\t}));\r\n\t\t\t}\r\n\r\n\t\t\t// Custom API Settings\r\n\t\t\tif (this.plugin.settings.quiz.provider === 'custom') {\r\n\t\t\t\tnew Setting(containerEl)\r\n\t\t\t\t\t.setName('Custom API configuration')\r\n\t\t\t\t\t.setHeading();\r\n\r\n\t\t\t\tnew Setting(containerEl)\r\n\t\t\t\t\t.setName('API key')\r\n\t\t\t\t\t.setDesc('Your API key')\r\n\t\t\t\t\t.addText(text => {\r\n\t\t\t\t\t\ttext.inputEl.type = 'password';\r\n\t\t\t\t\t\ttext.setPlaceholder('Enter API key');\r\n\t\t\t\t\t\ttext.setValue(this.plugin.settings.quiz.custom?.apiKey || '');\r\n\t\t\t\t\t\ttext.onChange(async (value) => {\r\n\t\t\t\t\t\t\tif (!this.plugin.settings.quiz.custom) {\r\n\t\t\t\t\t\t\t\tthis.plugin.settings.quiz.custom = {\r\n\t\t\t\t\t\t\t\t\tapiKey: '',\r\n\t\t\t\t\t\t\t\t\tmodel: '',\r\n\t\t\t\t\t\t\t\t\tbaseUrl: ''\r\n\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tthis.plugin.settings.quiz.custom.apiKey = value;\r\n\t\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\tnew Setting(containerEl)\r\n\t\t\t\t\t.setName('Base URL')\r\n\t\t\t\t\t.setDesc('API endpoint URL')\r\n\t\t\t\t\t.addText(text => {\r\n\t\t\t\t\t\ttext.setPlaceholder('https://api.example.com/v1');\r\n\t\t\t\t\t\ttext.setValue(this.plugin.settings.quiz.custom?.baseUrl || '');\r\n\t\t\t\t\t\ttext.onChange(async (value) => {\r\n\t\t\t\t\t\t\tif (!this.plugin.settings.quiz.custom) {\r\n\t\t\t\t\t\t\t\tthis.plugin.settings.quiz.custom = {\r\n\t\t\t\t\t\t\t\t\tapiKey: '',\r\n\t\t\t\t\t\t\t\t\tmodel: '',\r\n\t\t\t\t\t\t\t\t\tbaseUrl: ''\r\n\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tthis.plugin.settings.quiz.custom.baseUrl = value;\r\n\t\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\r\n\t\t\tnew Setting(containerEl)\r\n\t\t\t\t.setName('model name')\r\n\t\t\t\t.setDesc('Model identifier')\r\n\t\t\t\t.addText(text => {\r\n\t\t\t\t\ttext.setPlaceholder('model-name');\r\n\t\t\t\t\ttext.setValue(this.plugin.settings.quiz.custom?.model || '');\r\n\t\t\t\t\ttext.onChange(async (value) => {\r\n\t\t\t\t\t\tif (!this.plugin.settings.quiz.custom) {\r\n\t\t\t\t\t\t\tthis.plugin.settings.quiz.custom = {\r\n\t\t\t\t\t\t\t\tapiKey: '',\r\n\t\t\t\t\t\t\t\tmodel: '',\r\n\t\t\t\t\t\t\t\tbaseUrl: ''\r\n\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tthis.plugin.settings.quiz.custom.model = value;\r\n\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\r\n\t\t\tnew Setting(containerEl)\r\n\t\t\t\t.setName('Endpoint path (optional)')\r\n\t\t\t\t.setDesc('API endpoint path (defaults to /chat/completions if not specified)')\r\n\t\t\t\t.addText(text => {\r\n\t\t\t\t\ttext.setPlaceholder('/chat/completions');\r\n\t\t\t\t\ttext.setValue(this.plugin.settings.quiz.custom?.endpoint || '');\r\n\t\t\t\t\ttext.onChange(async (value) => {\r\n\t\t\t\t\t\tif (!this.plugin.settings.quiz.custom) {\r\n\t\t\t\t\t\t\tthis.plugin.settings.quiz.custom = {\r\n\t\t\t\t\t\t\t\tapiKey: '',\r\n\t\t\t\t\t\t\t\tmodel: '',\r\n\t\t\t\t\t\t\t\tbaseUrl: ''\r\n\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tthis.plugin.settings.quiz.custom.endpoint = value;\r\n\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t}\t\t\t// Advanced AI Settings\r\n\t\t\tnew Setting(containerEl)\r\n\t\t\t\t.setName('Advanced')\r\n\t\t\t\t.setHeading();\r\n\r\n\t\t\tnew Setting(containerEl)\r\n\t\t\t\t.setName('Temperature')\r\n\t\t\t\t.setDesc('Creativity level (0-1). Higher = more creative, lower = more focused')\r\n\t\t\t\t.addSlider(slider => slider\r\n\t\t\t\t\t.setLimits(0, 1, 0.1)\r\n\t\t\t\t\t.setValue(this.plugin.settings.quiz.temperature)\r\n\t\t\t\t\t.setDynamicTooltip()\r\n\t\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\t\tthis.plugin.settings.quiz.temperature = value;\r\n\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t}));\r\n\r\n\t\t\tnew Setting(containerEl)\r\n\t\t\t\t.setName('Max tokens')\r\n\t\t\t\t.setDesc('Maximum response length')\r\n\t\t\t\t.addText(text => {\r\n\t\t\t\t\ttext.inputEl.type = 'number';\r\n\t\t\t\t\ttext.setPlaceholder('2000');\r\n\t\t\t\t\ttext.setValue(String(this.plugin.settings.quiz.maxTokens));\r\n\t\t\t\t\ttext.onChange(async (value) => {\r\n\t\t\t\t\t\tconst parsed = parseInt(value, 10);\r\n\t\t\t\t\t\tthis.plugin.settings.quiz.maxTokens = Number.isNaN(parsed) ? 2000 : parsed;\r\n\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\r\n\t\t\tnew Setting(containerEl)\r\n\t\t\t\t.setName('System prompt')\r\n\t\t\t\t.setDesc('Custom instructions for the AI (optional)')\r\n\t\t\t\t.addTextArea(text => {\r\n\t\t\t\t\ttext.setPlaceholder('You are a helpful assistant...');\r\n\t\t\t\t\ttext.setValue(this.plugin.settings.quiz.systemPrompt || '');\r\n\t\t\t\t\ttext.onChange(async (value) => {\r\n\t\t\t\t\t\tthis.plugin.settings.quiz.systemPrompt = value;\r\n\t\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t\t});\r\n\t\t\t\t\ttext.inputEl.rows = 4;\r\n\t\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Tutorial Settings\r\n\t\tnew Setting(containerEl)\r\n\t\t\t.setName('Tutorial')\r\n\t\t\t.setHeading();\r\n\r\n\t\tnew Setting(containerEl)\r\n\t\t\t.setName('Replay tutorial')\r\n\t\t\t.setDesc('Show the first-time user tutorial again')\r\n\t\t\t.addButton(button => button\r\n\t\t\t\t.setButtonText('Replay tutorial')\r\n\t\t\t\t.setTooltip('Replay the interactive tutorial')\r\n\t\t\t\t.onClick(() => {\r\n\t\t\t\t\tconst modal = new TutorialModal(this.app, {\r\n\t\t\t\t\t\tsteps: getTutorialSteps(),\r\n\t\t\t\t\t\tonComplete: () => {\r\n\t\t\t\t\t\t\t// No action needed for replay\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tonSkip: () => {\r\n\t\t\t\t\t\t\t// No action needed for replay\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\tmodal.open();\r\n\t\t\t\t}));\r\n\r\n\t\t// Developer Settings\r\n\t\tnew Setting(containerEl)\r\n\t\t\t.setName('Developer')\r\n\t\t\t.setHeading();\r\n\r\n\t\tnew Setting(containerEl)\r\n\t\t\t.setName('Enable debug logging')\r\n\t\t\t.setDesc('Show detailed debug logs in the console (useful for troubleshooting)')\r\n\t\t\t.addToggle(toggle => toggle\r\n\t\t\t\t.setValue(this.plugin.settings.developer.enableDebugLogging)\r\n\t\t\t\t.onChange(async (value) => {\r\n\t\t\t\t\tthis.plugin.settings.developer.enableDebugLogging = value;\r\n\t\t\t\t\tawait this.plugin.saveSettings();\r\n\t\t\t\t})\r\n\t\t\t);\r\n\t}\r\n}\r\n","usedDeprecatedRules":[]}]