diff --git a/.gitattributes b/.gitattributes index dfe0770..6324dca 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,19 @@ -# Auto detect text files and perform LF normalization +# Set default behavior to automatically normalize line endings * text=auto + +# Explicitly declare text files you want to always be normalized and converted +*.md text +*.py text +*.js text +*.css text +*.html text + +# Declare files that will always have CRLF line endings on checkout +*.bat text eol=crlf + +# Denote all files that are truly binary and should not be modified +*.png binary +*.jpg binary +*.gif binary +*.ico binary +*.zip binary \ No newline at end of file diff --git a/.gitignore b/.gitignore index 2afde5d..f93f3db 100644 --- a/.gitignore +++ b/.gitignore @@ -86,4 +86,5 @@ yarn-error.log* # AF specific Status.txt *.psd -*.docx \ No newline at end of file +*.docx +helpers/ \ No newline at end of file diff --git a/AF_Enhanced_HTML_Note.py b/AF_Enhanced_HTML_Note.py index fa1cf84..b620257 100644 --- a/AF_Enhanced_HTML_Note.py +++ b/AF_Enhanced_HTML_Note.py @@ -1,184 +1,171 @@ -# ****** ComfyUI-AF - Enhanced HTML-NOTE ****** -# -# Creator: Alex Furer - Co-Creator(s): Claude AI & DeepSeek -# -# Description: -# A ComfyUI Note node with html capabilities. Create notes, UI's and ReadMe's directly inside the workflow, using html. -# -# Repo and ReadMe URL: https://github.com/alFrame/ComfyUI-AF-Find-Nodes -# -# Praise, comment, bugs, improvements: https://github.com/alFrame/ComfyUI-AF-Find-Nodes/issues -# -# LICENSE: MIT License -# -# v0.0.07 -# -# Usage: -# Read Me on Github -# -# Changelog: -# "v0.0.07 - Comsetics, making tis a version", -# "v0.0.06 - Removed all Java Script functionality for links and updated README", -# "v0.0.05 - Made edit mode less intrusive and keep ComfyUI canvas navigation (panning, zooming [space bar] and [H] now work to pan around the canvas)", -# "v0.0.04 - Fixed node selection and resizing by removing OUTPUT_NODE and using proper widget approach. Double clicking is now used to edit the html Mouse interaction is now persistent to ComfyUI behavior. Except middle mouse button for panning.", -# "v0.0.03 - Fixed node resizing issues on save/reload. Improved selection and edit mode behavior to match ComfyUI core notes. Fixed middle mouse button panning over the node. Improved HTML indentation in default content", -# "v0.0.02 - Fixed naming consistency to HTML_Note Implemented single-window toggle behavior", -# "v0.0.01 - Initial Version" -# -# Feature Requests / Wet Dreams -# - - -class AF_Enhanced_HTML_Note: - """ - AF Enhanced HTML-Note node with colored sections and rich formatting - """ - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "html_content": ("STRING", { - "multiline": True, - "default": """

Positive Prompt Section

-
-

đŸŸĸ Positive Prompts

-

masterpiece, best quality, highly detailed

- -
- - -

Negative Prompt Section

-
-

🔴 Negative Prompts

-

low quality, blurry, distorted

-

nsfw, watermark, signature, bad anatomy

-
- - -

Neutral Prompt Section

-
-

📝 Notes

-

General notes and information...

- -
- -

Info Section

-
-

â„šī¸ Information

-

Using: SDXL 1.0

-

Steps: 25 | CFG: 7.5 | Sampler: DPM++ 2M Karras

-
- -

Warning Section

-
-

âš ī¸ Warning

-

This workflow requires:

-
    -
  1. High VRAM (8GB+)
  2. -
  3. Latest ComfyUI version
  4. -
  5. SDXL compatible models
  6. -
-
- -

Column Layouts

-
-
-
-

🎨 Style Settings

-
    -
  • Style: Photorealistic
  • -
  • Aspect: 16:9
  • -
  • Quality: Ultra High
  • -
-
- -
- -
-

âš™ī¸ Technical

-

Resolution: 1920x1080

-

Batch: 4

-
-
- -
-
-

đŸšĢ Exclusions

-
    -
  • No text in image
  • -
  • Avoid oversaturation
  • -
  • No watermarks
  • -
-
- -
- -
-

💡 Tips

-

Use lower CFG for more creative results

-
-
-
- -

Clickable Links & Actions

-
-

🔗 Interactive Links

- - -

External link (opens in new tab with Ctrl+click)

-

Full Frame Studios - Alex Furer

- -

Anchor Links

-

Full Frame Studios - Alex Furer - 3D

-
- -

Custom Info Cards

-
-
- Steps -

25

-
- -
- CFG Scale -

7.5

-
- -
- Batch Size -

4

-
-
""", - "placeholder": "Enter your HTML content here..." - }), - } - } - - RETURN_TYPES = () - FUNCTION = "display_html" - CATEGORY = "AF - Nodes" - OUTPUT_NODE = False - - def display_html(self, html_content): - """ - Display enhanced HTML content - """ - return {"ui": {"text": html_content}, "result": (html_content,)} - -# Node mappings for ComfyUI -NODE_CLASS_MAPPINGS = { - "AF_Enhanced_HTML_Note": AF_Enhanced_HTML_Note, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "AF_Enhanced_HTML_Note": "AF - Enhanced HTML Note", -} - +# ****** ComfyUI-AF - Enhanced HTML-NOTE ****** +# +# Creator: Alex Furer - Co-Creator(s): Claude AI & DeepSeek +# +# Description: A ComfyUI Note node with html capabilities. Create notes, UI's and ReadMe's directly inside the workflow, using html. +# +# Repo and ReadMe URL: https://github.com/alFrame/ComfyUI-AF-Enhanced_HTML_Note +# +# Issues praise, comment, bugs, improvements: https://github.com/alFrame/ComfyUI-AF-Enhanced_HTML_Note/issues +# +# LICENSE: MIT License +# +# Usage: https://github.com/alFrame/ComfyUI-AF-Enhanced_HTML_Note +# +# Feature Requests / Wet Dreams +# - + +class AF_Enhanced_HTML_Note: + """ + AF Enhanced HTML-Note node with colored sections and rich formatting + """ + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "html_content": ("STRING", { + "multiline": True, + "default": """

Positive Prompt Section

+
+

đŸŸĸ Positive Prompts

+

masterpiece, best quality, highly detailed

+ +
+ + +

Negative Prompt Section

+
+

🔴 Negative Prompts

+

low quality, blurry, distorted

+

nsfw, watermark, signature, bad anatomy

+
+ + +

Neutral Prompt Section

+
+

📝 Notes

+

General notes and information...

+ +
+ +

Info Section

+
+

â„šī¸ Information

+

Using: SDXL 1.0

+

Steps: 25 | CFG: 7.5 | Sampler: DPM++ 2M Karras

+
+ +

Warning Section

+
+

âš ī¸ Warning

+

This workflow requires:

+
    +
  1. High VRAM (8GB+)
  2. +
  3. Latest ComfyUI version
  4. +
  5. SDXL compatible models
  6. +
+
+ +

Column Layouts

+
+
+
+

🎨 Style Settings

+
    +
  • Style: Photorealistic
  • +
  • Aspect: 16:9
  • +
  • Quality: Ultra High
  • +
+
+ +
+ +
+

âš™ī¸ Technical

+

Resolution: 1920x1080

+

Batch: 4

+
+
+ +
+
+

đŸšĢ Exclusions

+
    +
  • No text in image
  • +
  • Avoid oversaturation
  • +
  • No watermarks
  • +
+
+ +
+ +
+

💡 Tips

+

Use lower CFG for more creative results

+
+
+
+ +

Clickable Links & Actions

+
+

🔗 Interactive Links

+ + +

External link (opens in new tab with Ctrl+click)

+

Full Frame Studios - Alex Furer

+ +

Anchor Links

+

Full Frame Studios - Alex Furer - 3D

+
+ +

Custom Info Cards

+
+
+ Steps +

25

+
+ +
+ CFG Scale +

7.5

+
+ +
+ Batch Size +

4

+
+
""", + "placeholder": "Enter your HTML content here..." + }), + } + } + + RETURN_TYPES = () + FUNCTION = "display_html" + CATEGORY = "AF - Nodes" + OUTPUT_NODE = False + + def display_html(self, html_content): + """ + Display enhanced HTML content + """ + return {"ui": {"text": html_content}, "result": (html_content,)} + +# Node mappings for ComfyUI +NODE_CLASS_MAPPINGS = { + "AF_Enhanced_HTML_Note": AF_Enhanced_HTML_Note, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "AF_Enhanced_HTML_Note": "AF - Enhanced HTML Note", +} + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..c4d7b95 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,31 @@ +## Changelog + +### v0.0.08 +- Moved the CSS from the JS file to it's own file. +- Added CHANGELOG.md +- Added package.json for ComfyUI Manager compliance +- Added pyproject.toml for registry compliance +- Reworked the README +- Added the "helpers" folder to the .gitignore +- Added an icon to the pyproject.toml + +### v0.0.07 +- Comsetics, making tis a version + +### v0.0.06 +- Removed all Java Script functionality for links and updated README + +### v0.0.05 +- Made edit mode less intrusive and keep ComfyUI canvas navigation (panning, zooming [space bar] and [H] now work to pan around the canvas) + +### v0.0.04 +- Fixed node selection and resizing by removing OUTPUT_NODE and using proper widget approach. Double clicking is now used to edit the html Mouse interaction is now persistent to ComfyUI behavior. Except middle mouse button for panning. + +### v0.0.03 +- Fixed node resizing issues on save/reload. Improved selection and edit mode behavior to match ComfyUI core notes. Fixed middle mouse button panning over the node. Improved HTML indentation in default content + +### v0.0.02 +- Fixed naming consistency to HTML_Note Implemented single-window toggle behavior + +### v0.0.01 +- Initial Version \ No newline at end of file diff --git a/examples/blue-section.webp b/Docs/examples/blue-section.webp similarity index 100% rename from examples/blue-section.webp rename to Docs/examples/blue-section.webp diff --git a/examples/complete-workflow.webp b/Docs/examples/complete-workflow.webp similarity index 100% rename from examples/complete-workflow.webp rename to Docs/examples/complete-workflow.webp diff --git a/examples/custom-borders.webp b/Docs/examples/custom-borders.webp similarity index 100% rename from examples/custom-borders.webp rename to Docs/examples/custom-borders.webp diff --git a/examples/custom-cards.webp b/Docs/examples/custom-cards.webp similarity index 100% rename from examples/custom-cards.webp rename to Docs/examples/custom-cards.webp diff --git a/examples/custom-colors.webp b/Docs/examples/custom-colors.webp similarity index 100% rename from examples/custom-colors.webp rename to Docs/examples/custom-colors.webp diff --git a/examples/custom-layouts.webp b/Docs/examples/custom-layouts.webp similarity index 100% rename from examples/custom-layouts.webp rename to Docs/examples/custom-layouts.webp diff --git a/examples/custom-section.webp b/Docs/examples/custom-section.webp similarity index 100% rename from examples/custom-section.webp rename to Docs/examples/custom-section.webp diff --git a/examples/custom-spacers.webp b/Docs/examples/custom-spacers.webp similarity index 100% rename from examples/custom-spacers.webp rename to Docs/examples/custom-spacers.webp diff --git a/examples/custom-text.webp b/Docs/examples/custom-text.webp similarity index 100% rename from examples/custom-text.webp rename to Docs/examples/custom-text.webp diff --git a/examples/info-section.webp b/Docs/examples/info-section.webp similarity index 100% rename from examples/info-section.webp rename to Docs/examples/info-section.webp diff --git a/examples/links.webp b/Docs/examples/links.webp similarity index 100% rename from examples/links.webp rename to Docs/examples/links.webp diff --git a/examples/negative-section.webp b/Docs/examples/negative-section.webp similarity index 100% rename from examples/negative-section.webp rename to Docs/examples/negative-section.webp diff --git a/examples/neutral-section.webp b/Docs/examples/neutral-section.webp similarity index 100% rename from examples/neutral-section.webp rename to Docs/examples/neutral-section.webp diff --git a/examples/positive-section.webp b/Docs/examples/positive-section.webp similarity index 100% rename from examples/positive-section.webp rename to Docs/examples/positive-section.webp diff --git a/examples/spacers.webp b/Docs/examples/spacers.webp similarity index 100% rename from examples/spacers.webp rename to Docs/examples/spacers.webp diff --git a/examples/two-column-layout.webp b/Docs/examples/two-column-layout.webp similarity index 100% rename from examples/two-column-layout.webp rename to Docs/examples/two-column-layout.webp diff --git a/examples/warning-section.webp b/Docs/examples/warning-section.webp similarity index 100% rename from examples/warning-section.webp rename to Docs/examples/warning-section.webp diff --git a/examples/yellow-section.webp b/Docs/examples/yellow-section.webp similarity index 100% rename from examples/yellow-section.webp rename to Docs/examples/yellow-section.webp diff --git a/Docs/icon.png b/Docs/icon.png new file mode 100644 index 0000000..b6af349 Binary files /dev/null and b/Docs/icon.png differ diff --git a/README.md b/README.md index 2156e75..258fa72 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,6 @@ A ComfyUI Note node with HTML capabilities. Create notes, UI's and ReadMe's directly inside the workflow using rich HTML formatting. -![Version](https://img.shields.io/badge/version-0.0.5-blue) -![License](https://img.shields.io/badge/license-MIT-green) -![ComfyUI](https://img.shields.io/badge/ComfyUI-Compatible-orange) - --- ## ✨ Key Features @@ -89,7 +85,7 @@ The node comes with several predefined colored section styles. Click each sectio ``` ### Rendered Result: -![Positive Section Example](examples/positive-section.webp) +![Positive Section Example](Docs/examples/positive-section.webp) @@ -106,7 +102,7 @@ The node comes with several predefined colored section styles. Click each sectio ``` ### Rendered Result: -![Negative Section Example](examples/negative-section.webp) +![Negative Section Example](Docs/examples/negative-section.webp) @@ -127,7 +123,7 @@ The node comes with several predefined colored section styles. Click each sectio ``` ### Rendered Result: -![Neutral Section Example](examples/neutral-section.webp) +![Neutral Section Example](Docs/examples/neutral-section.webp) @@ -144,7 +140,7 @@ The node comes with several predefined colored section styles. Click each sectio ``` ### Rendered Result: -![Info Section Example](examples/info-section.webp) +![Info Section Example](Docs/examples/info-section.webp) @@ -165,7 +161,7 @@ The node comes with several predefined colored section styles. Click each sectio ``` ### Rendered Result: -![Warning Section Example](examples/warning-section.webp) +![Warning Section Example](Docs/examples/warning-section.webp) @@ -181,7 +177,7 @@ The node comes with several predefined colored section styles. Click each sectio ``` ### Rendered Result: -![Yellow Section Example](examples/yellow-section.webp) +![Yellow Section Example](Docs/examples/yellow-section.webp) @@ -197,7 +193,7 @@ The node comes with several predefined colored section styles. Click each sectio ``` ### Rendered Result: -![Blue Section Example](examples/blue-section.webp) +![Blue Section Example](Docs/examples/blue-section.webp) @@ -213,7 +209,7 @@ The node comes with several predefined colored section styles. Click each sectio ``` ### Rendered Result: -![Custom Section Example](examples/custom-section.webp) +![Custom Section Example](Docs/examples/custom-section.webp) @@ -262,7 +258,7 @@ Use these spacer classes to control vertical spacing between elements. ``` ### Rendered Result: -![Spacer Examples](examples/spacers.webp) +![Spacer Examples](Docs/examples/spacers.webp) ### Size Reference: - `af-spacer-top` → 2px @@ -326,7 +322,7 @@ Create two-column layouts using the predefined column classes. ``` ### Rendered Result: -![Two Column Layout Example](examples/two-column-layout.webp) +![Two Column Layout Example](Docs/examples/two-column-layout.webp) **Note:** The `row` class ensures proper column wrapping, and each column is 49% width with 1% margin. @@ -363,7 +359,7 @@ All links require **Ctrl+Click** to activate for safety and to prevent accidenta **Remember:** Hold **Ctrl** while clicking any link to activate it! ### Rendered Result: -![Link Examples](examples/links.webp) +![Link Examples](Docs/examples/links.webp) @@ -431,7 +427,7 @@ The node supports **standard HTML** with **inline CSS styling**. You can write c ``` ### Rendered Result: -![Custom Spacers](examples/custom-spacers.webp) +![Custom Spacers](Docs/examples/custom-spacers.webp) @@ -460,7 +456,7 @@ The node supports **standard HTML** with **inline CSS styling**. You can write c ``` ### Rendered Result: -![Custom Colors](examples/custom-colors.webp) +![Custom Colors](Docs/examples/custom-colors.webp) @@ -493,7 +489,7 @@ The node supports **standard HTML** with **inline CSS styling**. You can write c ``` ### Rendered Result: -![Custom Text Styles](examples/custom-text.webp) +![Custom Text Styles](Docs/examples/custom-text.webp) @@ -522,7 +518,7 @@ The node supports **standard HTML** with **inline CSS styling**. You can write c ``` ### Rendered Result: -![Custom Borders](examples/custom-borders.webp) +![Custom Borders](Docs/examples/custom-borders.webp) @@ -551,7 +547,7 @@ The node supports **standard HTML** with **inline CSS styling**. You can write c ``` ### Rendered Result: -![Custom Layouts](examples/custom-layouts.webp) +![Custom Layouts](Docs/examples/custom-layouts.webp) @@ -579,7 +575,7 @@ The node supports **standard HTML** with **inline CSS styling**. You can write c ``` ### Rendered Result: -![Custom Info Cards](examples/custom-cards.webp) +![Custom Info Cards](Docs/examples/custom-cards.webp) @@ -652,7 +648,7 @@ The node supports **standard HTML** with **inline CSS styling**. You can write c ``` ### Rendered Result: -![Complete Workflow Example](examples/complete-workflow.webp) +![Complete Workflow Example](Docs/examples/complete-workflow.webp) @@ -734,10 +730,26 @@ The node supports **standard HTML** with **inline CSS styling**. You can write c --- -## 📞 Support & Credits +## âš ī¸ Disclaimer -- **Creator:** Alex Furer -- **Co-Creators:** Claude AI & DeepSeek -- **GitHub:** [ComfyUI_AF_FindNodes](https://github.com/alFrame/ComfyUI-AF-Find-Nodes) -- **License:** MIT License -- **Version:** 0.0.5 \ No newline at end of file +This ComfyUI custom node is developed through AI-assisted coding. While carefully tested, it is provided **"as is" without warranty**. + +**By using this node pack:** +- You install and run at your own risk +- The creator is not liable for damages or data loss +- Compatibility with your setup is not guaranteed +- Test in a safe environment before production use + +Report issues on GitHub - we appreciate your feedback! + +--- + +## 📚 Additional Resources + +- **[Changelog](CHANGELOG.md)** - Version history and updates +- [GitHub Issues](https://github.com/alFrame/ComfyUI-AF-Enhanced_HTML_Note) - Report bugs & request features +- [License](LICENSE) - MIT License details + +--- + +**Made with â¤ī¸ by Alex Furer & Qwen3, Claude AI, DeepSeek** \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..8b75bd1 --- /dev/null +++ b/package.json @@ -0,0 +1,12 @@ +{ + "name": "af-enhanced-html-note", + "version": "0.0.08", + "description": "A ComfyUI Note node with HTML capabilities. Create notes, UI's and ReadMe's directly inside the workflow using rich HTML formatting.", + "author": "Alex Furer", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/alFrame/ComfyUI-AF-Enhanced_HTML_Note" + }, + "nodepath": "custom_nodes/ComfyUI-AF-Enhanced_HTML_Note" +} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..dc026b5 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,14 @@ +[project] +name = "af-enhanced-html-note" +description = "A ComfyUI Note node with HTML capabilities. Create notes, UI's and ReadMe's directly inside the workflow using rich HTML formatting." +version = "0.0.08" +license = {file = "LICENSE"} +dependencies = [] + +[project.urls] +Repository = "https://github.com/alFrame/ComfyUI-AF-Enhanced_HTML_Note" + +[tool.comfy] +PublisherId = "alframe" +DisplayName = "ComfyUI AF - Enhanced HTML Note" +Icon = "https://raw.githubusercontent.com/alFrame/ComfyUI-AF-Enhanced_HTML_Note/main/Docs/icon.png" \ No newline at end of file diff --git a/web/AF_Enhanced_HTML_Note.css b/web/AF_Enhanced_HTML_Note.css new file mode 100644 index 0000000..474e667 --- /dev/null +++ b/web/AF_Enhanced_HTML_Note.css @@ -0,0 +1,276 @@ +.af-html-note-container { + width: 100%; + height: 100%; + min-height: 100px; + background: var(--comfy-menu-bg, #2a2a2a); + /* border: 1px solid var(--border-color, #555); */ + padding: 8px; + box-sizing: border-box; + overflow: hidden; + cursor: default; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; + line-height: 1.6; + color: var(--input-text, #ffffff); + display: flex; + flex-direction: column; + position: relative; +} + +.af-html-note-content { + width: 100%; + height: 100%; + overflow-y: auto; + flex: 1; + /* Prevent text selection */ + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + cursor: default; + /* Prevent keyboard focus */ + outline: none; +} + +/* Ensure content area can't be focused */ +.af-html-note-content:focus { + outline: none; +} + +.af-html-note-editor { + width: 100%; + height: 100%; + background: var(--comfy-menu-bg, #2a2a2a); + border: 1px solid var(--border-color, #555); + padding: 8px; + font-family: 'Monaco', 'Consolas', 'Courier New', monospace; + line-height: 1.4; + color: var(--input-text, #ffffff); + box-sizing: border-box; + resize: none; + outline: none; + font-size: 14px; + display: none; + flex: 1; + /* Add text selection capabilities */ + user-select: auto; + -webkit-user-select: auto; + -moz-user-select: auto; + -ms-user-select: auto; + cursor: text; +} + +/* Floating edit button */ +.af-floating-edit-btn { + position: absolute; + top: 4px; + right: 4px; + background: rgba(0, 0, 0, 0.8); + border: 1px solid var(--border-color, #555); + color: var(--input-text, #ffffff); + border-radius: 3px; + width: 22px; + height: 22px; + cursor: pointer; + z-index: 1000; + font-size: 11px; + display: flex; + align-items: center; + justify-content: center; + opacity: 0.7; + transition: opacity 0.2s ease; +} + +.af-floating-edit-btn:hover { + opacity: 1; + background: rgba(0, 0, 0, 0.9); + border-color: #777; +} + +/* Enable link interactions only when Ctrl is held */ +.af-html-note-content a { + color: #58a6ff; + text-decoration: none; + /* Links are never directly clickable - only via Ctrl */ + pointer-events: none; + cursor: default; +} + +body.af-ctrl-active .af-html-note-content a { + /* Only become clickable when Ctrl is held globally */ + pointer-events: auto; + cursor: pointer; +} + +body.af-ctrl-active .af-html-note-content a:hover { + color: #79c0ff; + text-decoration: underline; +} + +.af-html-note-container.edit-mode .af-html-note-content { + display: none; +} + +.af-html-note-container.edit-mode .af-html-note-editor { + display: block; +} + +/* Hide edit button in edit mode */ +.af-html-note-container.edit-mode .af-floating-edit-btn { + display: none; +} + +/* Rest of your CSS remains the same... */ +.af-html-note-content h1, .af-html-note-content h2, .af-html-note-content h3, +.af-html-note-content h4, .af-html-note-content h5, .af-html-note-content h6 { + margin-top: 0; + margin-bottom: 12px; + font-weight: 600; +} + +.af-html-note-content h1 { font-size: 1.5em; } +.af-html-note-content h2 { font-size: 1.3em; } +.af-html-note-content h3 { font-size: 1.1em; } + +.af-html-note-content .af-section { + padding: 8px 16px; + margin: 8px 0; + border-radius: 6px; + border-left: 4px solid; +} + +.af-html-note-content .af-section.af-positive { + background: rgba(144, 238, 144, 0.1); + border-left-color: #90EE90; +} + +.af-html-note-content .af-section.af-negative { + background: rgba(255, 107, 107, 0.1); + border-left-color: #FF6B6B; +} + +.af-html-note-content .af-section.af-neutral { + background: rgba(224, 224, 224, 0.1); + border-left-color: #E0E0E0; +} + +.af-html-note-content .af-section.af-info { + background: rgba(135, 206, 235, 0.1); + border-left-color: #87CEEB; +} + +.af-html-note-content .af-section.af-warning { + background: rgba(255, 128, 0, 0.1); + border-left-color: #FFD700; +} + +.af-html-note-content .af-section.af-yellow { + background: rgba(255, 128, 0, 0.1); + border-left-color: #FFD700; +} + +.af-html-note-content .af-section.af-blue { + background: rgba(102, 105, 255, 0.1); + border-left-color: #000099; +} + +.af-html-note-content .af-section.af-custom { + background: rgba(186, 85, 211, 0.1); + border-left-color: #BA55D3; +} + +.af-html-note-content .af-spacer-top { height: 2px; margin: 4px 0; } +.af-html-note-content .af-spacer-mini { height: 4px; margin: 4px 0; } +.af-html-note-content .af-spacer-small { height: 8px; margin: 4px 0; } +.af-html-note-content .af-spacer { height: 16px; margin: 8px 0; } +.af-html-note-content .af-spacer-large { height: 32px; margin: 16px 0; } +.af-html-note-content .af-spacer-xl { height: 48px; margin: 24px 0; } + +.af-html-note-content code { + background: rgba(0,0,0,0.3); + padding: 2px 6px; + border-radius: 4px; + font-family: 'Monaco', 'Consolas', 'Courier New', monospace; + font-size: 0.9em; + color: #f0f6fc; +} + +.af-html-note-content pre { + background: rgba(0,0,0,0.4); + border: 1px solid #444; + border-radius: 6px; + padding: 12px; + margin: 16px 0; + overflow-x: auto; +} + +.af-html-note-content pre code { + background: transparent; + padding: 0; +} + +.af-html-note-content ul, .af-html-note-content ol { + padding-left: 20px; + margin: 12px 0; +} + +.af-html-note-content li { margin: 4px 0; } +.af-html-note-content p { margin: 8px 0; } + +.af-html-note-content table { + border-collapse: collapse; + width: 100%; + margin: 16px 0; +} + +.af-html-note-content th, .af-html-note-content td { + border: 1px solid var(--border-color, #555); + padding: 8px 12px; + text-align: left; +} + +.af-html-note-content th { + background: rgba(255,255,255,0.1); + font-weight: 600; +} + +.af-html-note-content hr { + border: none; + border-top: 1px solid var(--border-color, #555); + margin: 16px 0; + opacity: 0.6; +} + +.af-html-note-container::-webkit-scrollbar { width: 8px; } +.af-html-note-container::-webkit-scrollbar-track { background: rgba(0,0,0,0.1); } +.af-html-note-container::-webkit-scrollbar-thumb { + background: var(--border-color, #555); + border-radius: 4px; +} +.af-html-note-container::-webkit-scrollbar-thumb:hover { background: #777; } + +.af-html-note-editor::-webkit-scrollbar { width: 8px; } +.af-html-note-editor::-webkit-scrollbar-track { background: rgba(0,0,0,0.1); } +.af-html-note-editor::-webkit-scrollbar-thumb { + background: var(--border-color, #555); + border-radius: 4px; +} +.af-html-note-editor::-webkit-scrollbar-thumb:hover { background: #777; } + +/* ****** MY OWN STYLES ****** */ +.af-column-half-left { + box-sizing: border-box; + float: left; + width: 49%; + margin-right: 1% !important; +} +.af-column-half-right { + box-sizing: border-box; + float: left; + width: 49%; + margin-left: 1% !important; +} +.row:after { + content: ""; + display: table; + clear: both; +} \ No newline at end of file diff --git a/web/AF_Enhanced_HTML_Note.js b/web/AF_Enhanced_HTML_Note.js index 6135677..7963bf2 100644 --- a/web/AF_Enhanced_HTML_Note.js +++ b/web/AF_Enhanced_HTML_Note.js @@ -2,285 +2,17 @@ import { app } from "../../scripts/app.js"; -// Define inline CSS styles -const AF_HTML_NOTE_STYLES = ` - .af-html-note-container { - width: 100%; - height: 100%; - min-height: 100px; - background: var(--comfy-menu-bg, #2a2a2a); - /* border: 1px solid var(--border-color, #555); */ - padding: 8px; - box-sizing: border-box; - overflow: hidden; - cursor: default; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; - line-height: 1.6; - color: var(--input-text, #ffffff); - display: flex; - flex-direction: column; - position: relative; +// Inject styles from external CSS file +function injectStyles() { + const styleId = 'af-html-note-styles'; + if (!document.getElementById(styleId)) { + const link = document.createElement('link'); + link.id = styleId; + link.rel = 'stylesheet'; + link.href = './web/AF_Enhanced_HTML_Note.css'; + document.head.appendChild(link); } - - .af-html-note-content { - width: 100%; - height: 100%; - overflow-y: auto; - flex: 1; - /* Prevent text selection */ - user-select: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - cursor: default; - /* Prevent keyboard focus */ - outline: none; - } - - /* Ensure content area can't be focused */ - .af-html-note-content:focus { - outline: none; - } - - .af-html-note-editor { - width: 100%; - height: 100%; - background: var(--comfy-menu-bg, #2a2a2a); - border: 1px solid var(--border-color, #555); - padding: 8px; - font-family: 'Monaco', 'Consolas', 'Courier New', monospace; - line-height: 1.4; - color: var(--input-text, #ffffff); - box-sizing: border-box; - resize: none; - outline: none; - font-size: 14px; - display: none; - flex: 1; - /* Add text selection capabilities */ - user-select: auto; - -webkit-user-select: auto; - -moz-user-select: auto; - -ms-user-select: auto; - cursor: text; - } - - /* Floating edit button */ - .af-floating-edit-btn { - position: absolute; - top: 4px; - right: 4px; - background: rgba(0, 0, 0, 0.8); - border: 1px solid var(--border-color, #555); - color: var(--input-text, #ffffff); - border-radius: 3px; - width: 22px; - height: 22px; - cursor: pointer; - z-index: 1000; - font-size: 11px; - display: flex; - align-items: center; - justify-content: center; - opacity: 0.7; - transition: opacity 0.2s ease; - } - - .af-floating-edit-btn:hover { - opacity: 1; - background: rgba(0, 0, 0, 0.9); - border-color: #777; - } - - /* Enable link interactions only when Ctrl is held */ - .af-html-note-content a { - color: #58a6ff; - text-decoration: none; - /* Links are never directly clickable - only via Ctrl */ - pointer-events: none; - cursor: default; - } - - body.af-ctrl-active .af-html-note-content a { - /* Only become clickable when Ctrl is held globally */ - pointer-events: auto; - cursor: pointer; - } - - body.af-ctrl-active .af-html-note-content a:hover { - color: #79c0ff; - text-decoration: underline; - } - - .af-html-note-container.edit-mode .af-html-note-content { - display: none; - } - - .af-html-note-container.edit-mode .af-html-note-editor { - display: block; - } - - /* Hide edit button in edit mode */ - .af-html-note-container.edit-mode .af-floating-edit-btn { - display: none; - } - - /* Rest of your CSS remains the same... */ - .af-html-note-content h1, .af-html-note-content h2, .af-html-note-content h3, - .af-html-note-content h4, .af-html-note-content h5, .af-html-note-content h6 { - margin-top: 0; - margin-bottom: 12px; - font-weight: 600; - } - - .af-html-note-content h1 { font-size: 1.5em; } - .af-html-note-content h2 { font-size: 1.3em; } - .af-html-note-content h3 { font-size: 1.1em; } - - .af-html-note-content .af-section { - padding: 8px 16px; - margin: 8px 0; - border-radius: 6px; - border-left: 4px solid; - } - - .af-html-note-content .af-section.af-positive { - background: rgba(144, 238, 144, 0.1); - border-left-color: #90EE90; - } - - .af-html-note-content .af-section.af-negative { - background: rgba(255, 107, 107, 0.1); - border-left-color: #FF6B6B; - } - - .af-html-note-content .af-section.af-neutral { - background: rgba(224, 224, 224, 0.1); - border-left-color: #E0E0E0; - } - - .af-html-note-content .af-section.af-info { - background: rgba(135, 206, 235, 0.1); - border-left-color: #87CEEB; - } - - .af-html-note-content .af-section.af-warning { - background: rgba(255, 128, 0, 0.1); - border-left-color: #FFD700; - } - - .af-html-note-content .af-section.af-yellow { - background: rgba(255, 128, 0, 0.1); - border-left-color: #FFD700; - } - - .af-html-note-content .af-section.af-blue { - background: rgba(102, 105, 255, 0.1); - border-left-color: #000099; - } - - .af-html-note-content .af-section.af-custom { - background: rgba(186, 85, 211, 0.1); - border-left-color: #BA55D3; - } - - .af-html-note-content .af-spacer-top { height: 2px; margin: 4px 0; } - .af-html-note-content .af-spacer-mini { height: 4px; margin: 4px 0; } - .af-html-note-content .af-spacer-small { height: 8px; margin: 4px 0; } - .af-html-note-content .af-spacer { height: 16px; margin: 8px 0; } - .af-html-note-content .af-spacer-large { height: 32px; margin: 16px 0; } - .af-html-note-content .af-spacer-xl { height: 48px; margin: 24px 0; } - - .af-html-note-content code { - background: rgba(0,0,0,0.3); - padding: 2px 6px; - border-radius: 4px; - font-family: 'Monaco', 'Consolas', 'Courier New', monospace; - font-size: 0.9em; - color: #f0f6fc; - } - - .af-html-note-content pre { - background: rgba(0,0,0,0.4); - border: 1px solid #444; - border-radius: 6px; - padding: 12px; - margin: 16px 0; - overflow-x: auto; - } - - .af-html-note-content pre code { - background: transparent; - padding: 0; - } - - .af-html-note-content ul, .af-html-note-content ol { - padding-left: 20px; - margin: 12px 0; - } - - .af-html-note-content li { margin: 4px 0; } - .af-html-note-content p { margin: 8px 0; } - - .af-html-note-content table { - border-collapse: collapse; - width: 100%; - margin: 16px 0; - } - - .af-html-note-content th, .af-html-note-content td { - border: 1px solid var(--border-color, #555); - padding: 8px 12px; - text-align: left; - } - - .af-html-note-content th { - background: rgba(255,255,255,0.1); - font-weight: 600; - } - - .af-html-note-content hr { - border: none; - border-top: 1px solid var(--border-color, #555); - margin: 16px 0; - opacity: 0.6; - } - - .af-html-note-container::-webkit-scrollbar { width: 8px; } - .af-html-note-container::-webkit-scrollbar-track { background: rgba(0,0,0,0.1); } - .af-html-note-container::-webkit-scrollbar-thumb { - background: var(--border-color, #555); - border-radius: 4px; - } - .af-html-note-container::-webkit-scrollbar-thumb:hover { background: #777; } - - .af-html-note-editor::-webkit-scrollbar { width: 8px; } - .af-html-note-editor::-webkit-scrollbar-track { background: rgba(0,0,0,0.1); } - .af-html-note-editor::-webkit-scrollbar-thumb { - background: var(--border-color, #555); - border-radius: 4px; - } - .af-html-note-editor::-webkit-scrollbar-thumb:hover { background: #777; } - - /* ****** MY OWN STYLES ****** */ - .af-column-half-left { - box-sizing: border-box; - float: left; - width: 49%; - margin-right: 1% !important; - } - .af-column-half-right { - box-sizing: border-box; - float: left; - width: 49%; - margin-left: 1% !important; - } - .row:after { - content: ""; - display: table; - clear: both; - } -`; +} // Inject styles function injectStyles() {