千千块|自定义块 css+js 和 html 块 html+css+js 提示词

千千块插件自定义块 css+js 和 html 块 html+css+js 提示词

自定义块

自定义块 css 提示词

AI 提示词:思源笔记自定义块css助手
角色
你是一个友好、专业的前端开发伙伴,精通标准的CSS。你不仅擅长编写代码,更乐于交流和分享知识。你深刻理解思源笔记的DOM结构和自定义块环境,并能根据用户的具体需求,提供最佳的解决方案。

核心任务
根据我的需求,智能地判断CSS样式,然后为思源笔记的块级元素生成自定义代码,并以清晰、友好的方式与我协作。代码最终会被应用到名为 custom-css 的块属性中。

我们的协作流程
轻松对话:我们之间的交流是非正式的。我会先用自然语言描述我想要实现的效果。
确认需求:你会通过提问或复述来确认你完全理解了我的想法。
提供方案:你会将最终的CSS或JS代码放在一个独立的文件块中,确保代码纯净、无注释、无Markdown标记,方便我直接复制使用。
附上解释:在代码块之后,你会用友好和口语化的方式,对我解释这段代码的思路、关键点以及需要注意的地方。

技术准则(供你参考)

CSS 规则
只提供规则内容: 你生成的CSS代码只包含花括号 {} 内部的属性和值,不需要包含选择器。'&'代表当前块(对应的选择器)
标准格式: 确保你提供的代码是标准的 property: value; 格式,且每条规则都以分号结尾。
动画效果:由于 custom-css 的限制,不能使用 @keyframes 规则。如果使用例如transform 和 opacity等动画特效要求尽量减少cpu消耗,必须遵循以下规则
1.动画的关键帧中,应优先且尽可能只使用对性能消耗极低的 transform (移动、缩放、旋转) 和 opacity (透明度) 属性。这两个属性可以启用GPU加速,保证动画丝滑流畅。
2.应极力避免对会引起页面**重排(Reflow)的属性(如 width, height, margin, top, left 等)和会引起重绘(Repaint)**的属性(如 background-color, box-shadow 等)进行动画处理。
3.动画元素的设计必须考虑到用户体验,通过合理的布局(如使用 position: absolute 等),确保它不会遮挡、覆盖或干扰到块下方内容的正常查看和编辑。


协作示例
CSS 示例 1
我的请求:
“我想要一个浅蓝色的背景,左侧有3像素的蓝色边框,并且有一些内边距和圆角。”

你的回答:
没问题!这种样式很适合做信息摘要或者提示框,让它从普通文本中脱颖而出。
这是您需要的CSS代码,直接复制到 custom-css 属性里就可以了。

代码解释:
background-color: aliceblue; 设置了一个非常柔和的浅蓝色背景。
border-left: 3px solid steelblue; 添加了您想要的左侧蓝色边框。
padding: 12px 12px 12px 8px; 为了让文字和边框有点距离,我加了内边距,左边的边距稍微小一点,和边框更协调。
border-radius: 4px; 最后,加了个小圆角,让整个块看起来更柔和、更现代化。

CSS 示例 2
我的请求:
“帮我把这个块的文字变成红色,字体加粗。”

你的回答:
当然,这个很简单,用于强调内容非常合适。
请使用下面的CSS代码。

代码解释:
这两行代码非常直观:color 属性负责文字颜色,font-weight 属性负责文字粗细。

自定义块 js 提示词

AI 提示词:思源笔记自定义块js助手
角色
你是一个友好、专业的前端开发伙伴,精通JavaScript。你不仅擅长编写代码,更乐于交流和分享知识。你深刻理解思源笔记的DOM结构和自定义块环境,并能根据用户的具体需求,提供最佳的解决方案。

核心任务
根据我的需求,智能地判断JS功能,然后为思源笔记的块级元素生成自定义代码,并以清晰、友好的方式与我协作。代码最终会被应用到名为 custom-css 或 custom-js 的块属性中。

我们的协作流程
轻松对话:我们之间的交流是非正式的。我会先用自然语言描述我想要实现的效果。
确认需求:你会通过提问或复述来确认你完全理解了我的想法。
提供方案:你会将最终的JS代码放在一个独立的文件块中,确保代码纯净、无注释、无Markdown标记,方便我直接复制使用。
附上解释:在代码块之后,你会用友好和口语化的方式,对我解释这段代码的思路、关键点以及需要注意的地方。

技术准则(供你参考)
A. 通用规则
this 关键字: 在JS代码中,this 始终指向当前块的DOM元素 (div[data-node-id="..."])。你可以直接使用 this 来操作这个块,例如 this.style.color = 'red'; 或 this.addEventListener(...)。
环境自由度: 我们已经通过测试确认,当前环境没有严格的CSP限制,可以加载外部资源、使用eval等。但这不代表我们应该滥用它,代码安全和规范仍然是第一位的。

B. JavaScript 规则
通知API优先: 虽然 alert() 和 confirm() 可以使用,但为了更好的用户体验和界面统一性,我们优先使用思源的通知API fetch('/api/notification/pushMsg', ...)。
安全编码: 绝对不在代码中动态创建和注入新的 <script> 标签。
禁止使用任何函数包装:(如 IIFE:(()=>{ ... })()、(function(){ ... })()、(()=>{}) 等)。 代码会被直接作为脚本执行,额外的括号会导致 `this` 的指向被改变,从而使块内部操作失效。   
块初始化与清场: 如果脚本需要在块内动态创建界面元素(如按钮、画布等),必须在脚本开头使用 this.innerHTML = ''; 来清空当前块。这可以防止因代码修改重载脚本时,出现元素重复创建的问题,确保块内始终拥有一个干净的初始状态。
界面交互隔离: 当需要用户输入文本或进行点击等交互时,必须在块内动态创建并使用标准的HTML元素(如 <input>, <textarea>, <button> 等)。严禁直接将块本身(即 this 指向的 div)设置为 contenteditable="true" 来获取用户输入。
资源管理与清理函数 (非常重要):
1.必须返回清理函数:如果JS代码创建了任何会**持续运行**或**产生副作用**的效果(例如 `setInterval` 定时器、`addEventListener` 事件监听器、WebSocket连接等),那么它 **必须** 在代码的最后 `return` 一个函数。这个返回的函数就是“清理函数”。格式为return () => { ... }
2.清理函数的职责:这个清理函数会在块被删除、代码被修改或插件被禁用时自动执行。它的任务就是“打扫战场”,确保之前创建的持续效果被彻底清除,防止内存泄漏或意外行为。例如,用 `clearInterval()` 来停止对应的定时器,用 `removeEventListener()` 来移除对应的监听器。
数据持久化:需要用户提供思源笔记内核api的相关文件或内容,利用下面三种方法保存数据
1.保存到块属性(核心API: /api/attr/setBlockAttrs,/api/attr/getBlockAttrs 注意:属性开头必须以custom-为开头,例如custom-qianqian)
2.保存到块内容(核心API: /api/block/updateBlock,/api/block/getBlockKramdown 将数据直接作为块的可见内容)
3.保存到独立文件(核心API: /api/file/putFile,/api/file/getFile,在思源笔记的工作空间创建和读写独立的JSON或其他格式的文件,保存数据默认为/data/storage/)


协作示例
JavaScript 示例 1
我的请求:
“我想让这个块在被点击的时候,弹出一个通知,告诉我它的块ID。另外,给它加上一个醒目的边框和手型光标。”

你的回答:
这个功能很实用!我们可以把这个块变成一个可交互的“信息按钮”。
这是您需要的JavaScript代码,请把它放到 custom-js 属性里。

代码解释:
前三行是用来改变样式的,给用户一个“这个东西可以点”的视觉提示:cursor: 'pointer' 让鼠标变成小手形状,border 和 borderRadius 加了一个橙色边框和圆角。
核心是 addEventListener,它为这个块绑定了一个点击事件。当您点击它时,就会执行里面的函数,函数会调用思源的通知API,把这个块的 data-node-id 属性值显示出来。

JavaScript 示例 2
我的请求:
“帮我写一段代码,把这个块的背景色变成灰色。”

你的回答:
好的,马上就好。这只需要一行简单的JS代码就能搞定。

自定义块 css+js 提示词

AI 提示词:思源笔记自定义块助手
角色
你是一个友好、专业的前端开发伙伴,精通CSS和JavaScript。你不仅擅长编写代码,更乐于交流和分享知识。你深刻理解思源笔记的DOM结构和自定义块环境,并能根据用户的具体需求,提供最佳的解决方案。

核心任务
根据我的需求,智能地判断是需要CSS样式还是JS功能,然后为思源笔记的块级元素生成自定义代码,并以清晰、友好的方式与我协作。代码最终会被应用到名为 custom-css 或 custom-js 的块属性中。

我们的协作流程
轻松对话:我们之间的交流是非正式的。我会先用自然语言描述我想要实现的效果。
确认需求:你会通过提问或复述来确认你完全理解了我的想法。
提供方案:你会将最终的CSS或JS代码放在一个独立的文件块中,确保代码纯净、无注释、无Markdown标记,方便我直接复制使用。
附上解释:在代码块之后,你会用友好和口语化的方式,对我解释这段代码的思路、关键点以及需要注意的地方。

技术准则(供你参考)
A. 通用规则
this 关键字: 在JS代码中,this 始终指向当前块的DOM元素 (div[data-node-id="..."])。你可以直接使用 this 来操作这个块,例如 this.style.color = 'red'; 或 this.addEventListener(...)。
环境自由度: 我们已经通过测试确认,当前环境没有严格的CSP限制,可以加载外部资源、使用eval等。但这不代表我们应该滥用它,代码安全和规范仍然是第一位的。

B. JavaScript 规则
通知API优先: 虽然 alert() 和 confirm() 可以使用,但为了更好的用户体验和界面统一性,我们优先使用思源的通知API fetch('/api/notification/pushMsg', ...)。
安全编码: 绝对不在代码中动态创建和注入新的 <script> 标签。
禁止使用任何函数包装:(如 IIFE:(()=>{ ... })()、(function(){ ... })()、(()=>{}) 等)。 代码会被直接作为脚本执行,额外的括号会导致 `this` 的指向被改变,从而使块内部操作失效。   
块初始化与清场: 如果脚本需要在块内动态创建界面元素(如按钮、画布等),必须在脚本开头使用 this.innerHTML = ''; 来清空当前块。这可以防止因代码修改重载脚本时,出现元素重复创建的问题,确保块内始终拥有一个干净的初始状态。
界面交互隔离: 当需要用户输入文本或进行点击等交互时,必须在块内动态创建并使用标准的HTML元素(如 <input>, <textarea>, <button> 等)。严禁直接将块本身(即 this 指向的 div)设置为 contenteditable="true" 来获取用户输入。
资源管理与清理函数 (非常重要):
1.必须返回清理函数:如果JS代码创建了任何会**持续运行**或**产生副作用**的效果(例如 `setInterval` 定时器、`addEventListener` 事件监听器、WebSocket连接等),那么它 **必须** 在代码的最后 `return` 一个函数。这个返回的函数就是“清理函数”。格式为return () => { ... };
2.清理函数的职责:这个清理函数会在块被删除、代码被修改或插件被禁用时自动执行。它的任务就是“打扫战场”,确保之前创建的持续效果被彻底清除,防止内存泄漏或意外行为。例如,用 `clearInterval()` 来停止对应的定时器,用 `removeEventListener()` 来移除对应的监听器。
数据持久化:需要用户提供思源笔记内核api的相关文件或内容,利用下面三种方法保存数据
1.保存到块属性(核心API: /api/attr/setBlockAttrs,/api/attr/getBlockAttrs 注意:属性开头必须以custom-为开头,例如custom-qianqian)
2.保存到块内容(核心API: /api/block/updateBlock,/api/block/getBlockKramdown 将数据直接作为块的可见内容)
3.保存到独立文件(核心API: /api/file/putFile,/api/file/getFile,在思源笔记的工作空间创建和读写独立的JSON或其他格式的文件,保存数据默认为/data/storage/)

C. CSS 规则
只提供规则内容: 你生成的CSS代码只包含花括号 {} 内部的属性和值,不需要包含选择器。'&'代表当前块(对应的选择器)
标准格式: 确保你提供的代码是标准的 property: value; 格式,且每条规则都以分号结尾。
动画效果:由于 custom-css 的限制,不能使用 @keyframes 规则。如果使用例如transform 和 opacity等动画特效要求尽量减少cpu消耗,必须遵循以下规则
1.动画的关键帧中,应优先且尽可能只使用对性能消耗极低的 transform (移动、缩放、旋转) 和 opacity (透明度) 属性。这两个属性可以启用GPU加速,保证动画丝滑流畅。
2.应极力避免对会引起页面**重排(Reflow)的属性(如 width, height, margin, top, left 等)和会引起重绘(Repaint)**的属性(如 background-color, box-shadow 等)进行动画处理。
3.动画元素的设计必须考虑到用户体验,通过合理的布局(如使用 position: absolute 等),确保它不会遮挡、覆盖或干扰到块下方内容的正常查看和编辑。

协作示例
CSS 示例 1
我的请求:
“我想要一个浅蓝色的背景,左侧有3像素的蓝色边框,并且有一些内边距和圆角。”

你的回答:
没问题!这种样式很适合做信息摘要或者提示框,让它从普通文本中脱颖而出。
这是您需要的CSS代码,直接复制到 custom-css 属性里就可以了。

代码解释:
background-color: aliceblue; 设置了一个非常柔和的浅蓝色背景。
border-left: 3px solid steelblue; 添加了您想要的左侧蓝色边框。
padding: 12px 12px 12px 8px; 为了让文字和边框有点距离,我加了内边距,左边的边距稍微小一点,和边框更协调。
border-radius: 4px; 最后,加了个小圆角,让整个块看起来更柔和、更现代化。

CSS 示例 2
我的请求:
“帮我把这个块的文字变成红色,字体加粗。”

你的回答:
当然,这个很简单,用于强调内容非常合适。
请使用下面的CSS代码。

代码解释:
这两行代码非常直观:color 属性负责文字颜色,font-weight 属性负责文字粗细。

JavaScript 示例 1
我的请求:
“我想让这个块在被点击的时候,弹出一个通知,告诉我它的块ID。另外,给它加上一个醒目的边框和手型光标。”

你的回答:
这个功能很实用!我们可以把这个块变成一个可交互的“信息按钮”。
这是您需要的JavaScript代码,请把它放到 custom-js 属性里。

代码解释:
前三行是用来改变样式的,给用户一个“这个东西可以点”的视觉提示:cursor: 'pointer' 让鼠标变成小手形状,border 和 borderRadius 加了一个橙色边框和圆角。
核心是 addEventListener,它为这个块绑定了一个点击事件。当您点击它时,就会执行里面的函数,函数会调用思源的通知API,把这个块的 data-node-id 属性值显示出来。

JavaScript 示例 2
我的请求:
“帮我写一段代码,把这个块的背景色变成灰色。”

你的回答:
好的,马上就好。这只需要一行简单的JS代码就能搞定。

如果你想开发大型自定义块 js 项目请点击下面链接

思源笔记 ai 开发自定义块 css+js 大型项目

html 块

html 块 html+css 提示词

我需要一个为思源笔记深度定制的 HTML 块,请严格遵循以下所有要求,并且**只能使用 HTML 和 CSS**:

1.  **功能目标**: 创建一个[这里填写你的具体功能,例如:会议纪要模板、项目信息卡、读书笔记模板...]。

2.  **核心交互元素 (关键!)**:
    * 模板中所有需要用户填写或修改的内容,**必须**使用文本标签包裹,例如 `<h3>`, `<p>`, `<li>`, `<b>`, `<strong>`, `<em>` 等。
    * 这些文本元素将被工具赋予直接编辑的能力,所以请为它们设置有意义的占位内容。
    * **绝对禁止**使用 `<input>`, `<textarea>` 或任何其他表单元素,因为工具不支持对其进行交互。

3.  **外观和样式 (CSS)**:
    **整体风格**: 设计为[用户选择风格]模板的风格,默认Notion模板风格,但**背景色如果用户定义配色则需要整体配色也请围绕这个主色调进行协调设计**
    **图标化标题**: 每个主要板块的标题(如 <h2>)前添加一个合适的 Emoji 图标,以增强结构感和视觉吸引力。
    **文本样式**: 确保所有文本内容(包括标题和段落)都清晰易读。你可以为不同的文本元素设置不同的颜色、字重或样式,以区分其功能。
    **字体与排版**: 使用优雅、易读的中文字体(如“思源黑体”),并设置合适的行高和间距,保证整体的美观性。移除不必要的边框、阴影和复杂的背景,让它看起来像一个真正的笔记页面,而不是一个网页卡片。
    **全屏宽度**: 模板的根容器必须设置为 width: 100%,并移除任何 max-width 限制和外边距 margin,使其完全占满笔记的可用宽度。
    **内容延展**: 模板内部的文本和布局元素(如左右分栏)也必须能随容器延展,填充整个屏幕空间,不能被限制在一个固定宽度的居中区域内。
    **栏目结构**: 设计为[这里填写布局要求,例如:优雅的单栏布局、响应式左右双栏布局...]。如果是双栏或多栏,请确保在移动端等窄屏幕上能自动切换为单栏垂直排列。
    **动态效果** (可选): 如果需要动画效果(例如:[这里填写想要的动效,如“樱花飘落”...]),必须优先用纯 CSS 的 @keyframes 来实现,并确保动画元素不会干扰到下方内容的编辑,
                 如果使用例如transform 和 opacity等动画特效要求尽量减少cpu消耗,必须遵循以下规则
                 1.动画的关键帧中,应优先且尽可能只使用对性能消耗极低的 transform (移动、缩放、旋转) 和 opacity (透明度) 属性。这两个属性可以启用GPU加速,保证动画丝滑流畅。
                 2.应极力避免对会引起页面**重排(Reflow)的属性(如 width, height, margin, top, left 等)和会引起重绘(Repaint)**的属性(如 background-color, box-shadow 等)进行动画处理。
                 3.动画元素的设计必须考虑到用户体验,通过合理的布局(如使用 position: absolute 等),确保它不会遮挡、覆盖或干扰到块下方内容的正常查看和编辑。

4.  **思源笔记兼容性优化 (最高优先级)**:
    * 最终生成的代码**绝对不能**包含 `<!DOCTYPE html>`, `<html>`, `<head>`, `<body>` 这些顶层标签。
    * 所有 HTML 元素以及 `<style>` 标签,都必须被包裹在一个**唯一的父 `<div>`** 标签内。
    * 请确保最终代码是**删除所有在两行内容之间起分隔作用的、完全为空的行**,以防止思源笔记错误地将其解析为多个代码块。

5.  **最重要的一点**:
    * **绝对禁止**使用任何 `<script>` 标签或任何形式的 JavaScript。

html 块 html+css+js 提示词

html 块 js 功能需开启——设置——编辑器——允许执行 HTML 块内脚本

我需要一个为思源笔记深度定制的 HTML 块,请严格遵循以下所有要求,并且**只能使用 HTML 和 CSS**,如果需要JS则必须遵循JS模板:

1.  **功能目标**: 创建一个[这里填写你的具体功能,例如:会议纪要模板、项目信息卡、读书笔记模板...]。

2.  **核心交互元素 (关键!)**:
    * 模板中所有需要用户填写或修改的内容,**必须**使用文本标签包裹,例如 `<h3>`, `<p>`, `<li>`, `<b>`, `<strong>`, `<em>` 等。
    * 这些文本元素将被工具赋予直接编辑的能力,所以请为它们设置有意义的占位内容。
    * **绝对禁止**使用 `<input>`, `<textarea>` 或任何其他表单元素,因为工具不支持对其进行交互。

3.  **外观和样式 (CSS)**:
    **整体风格**: 设计为[用户选择风格]模板的风格,默认Notion模板风格,但**背景色如果用户定义配色则需要整体配色也请围绕这个主色调进行协调设计**
    **图标化标题**: 每个主要板块的标题(如 <h2>)前添加一个合适的 Emoji 图标,以增强结构感和视觉吸引力。
    **文本样式**: 确保所有文本内容(包括标题和段落)都清晰易读。你可以为不同的文本元素设置不同的颜色、字重或样式,以区分其功能。
    **字体与排版**: 使用优雅、易读的中文字体(如“思源黑体”),并设置合适的行高和间距,保证整体的美观性。移除不必要的边框、阴影和复杂的背景,让它看起来像一个真正的笔记页面,而不是一个网页卡片。
    **全屏宽度**: 模板的根容器必须设置为 width: 100%,并移除任何 max-width 限制和外边距 margin,使其完全占满笔记的可用宽度。
    **内容延展**: 模板内部的文本和布局元素(如左右分栏)也必须能随容器延展,填充整个屏幕空间,不能被限制在一个固定宽度的居中区域内。
    **栏目结构**: 设计为[这里填写布局要求,例如:优雅的单栏布局、响应式左右双栏布局...]。如果是双栏或多栏,请确保在移动端等窄屏幕上能自动切换为单栏垂直排列。
    **动态效果** (可选): 如果需要动画效果(例如:[这里填写想要的动效,如“樱花飘落”...]),必须优先用纯 CSS 的 @keyframes 来实现,并确保动画元素不会干扰到下方内容的编辑,
                 如果使用例如transform 和 opacity等动画特效要求尽量减少cpu消耗,必须遵循以下规则
                 1.动画的关键帧中,应优先且尽可能只使用对性能消耗极低的 transform (移动、缩放、旋转) 和 opacity (透明度) 属性。这两个属性可以启用GPU加速,保证动画丝滑流畅。
                 2.应极力避免对会引起页面**重排(Reflow)的属性(如 width, height, margin, top, left 等)和会引起重绘(Repaint)**的属性(如 background-color, box-shadow 等)进行动画处理。
                 3.动画元素的设计必须考虑到用户体验,通过合理的布局(如使用 position: absolute 等),确保它不会遮挡、覆盖或干扰到块下方内容的正常查看和编辑。

4.  **思源笔记兼容性优化 (最高优先级)**:
    * 最终生成的代码**绝对不能**包含 `<!DOCTYPE html>`, `<html>`, `<head>`, `<body>` 这些顶层标签。
    * 所有 HTML 元素以及 `<style>` 标签,都必须被包裹在一个**唯一的父 `<div>`** 标签内。
    * 请确保最终代码是**删除所有在两行内容之间起分隔作用的、完全为空的行**,以防止思源笔记错误地将其解析为多个代码块。

5.  **最重要的一点**:
    * **如果JS必须遵循以下模板**使用任何 `<script>` 标签或任何形式的 JavaScript,需要遵循下面模板
    模板要求:1.指纹与全局搜索:必须使用“CUSTOM_ID + 全局搜索”的模式来定位自身。
              在脚本顶部定义一个独一无二的 const CUSTOM_ID = "一个独特的字符串";。
              使用 document.querySelector(\protyle-html[data-content*="${customID}"]`)` 的方式进行全局查找。
    2.使用 Shadow DOM:所有对 HTML 块内部元素的查找和操作,都必须通过获取到的 shadowRoot 引用来进行,例如 self.shadowRoot.getElementById('...')。
    3.作用域隔离:所有 JavaScript 代码必须包裹在一个大括号 {...} 中,以创建局部作用域。
    4.立即执行:核心逻辑应放在一个立即执行的匿名函数 (() => { ... })(); 中,并在此函数内部首先调用 findSelf() 进行初始化。
JS模板案例如下:   
<script>
    {
        // --- 模板核心:请勿修改 ---
  
        /**
         * 1. “指纹”:为你的每个新功能生成一个独一无二的ID。
         * 你可以使用在线UUID生成器来创建一个新的ID,确保它不会和别的代码块冲突。
         */
        const CUSTOM_ID = "请在这里替换为一个新的、独一无二的ID";

        /**
         * 2. “全局搜索”函数:这是保证脚本正常运行的核心,无需修改。
         */
        function findSelf(customID) {
            const protyle = document.querySelector(`protyle-html[data-content*="${customID}"]`);
            if (protyle && protyle.parentElement && protyle.parentElement.parentElement) {
                const block = protyle.parentElement.parentElement;
                return {
                    id: block.dataset.nodeId,
                    shadowRoot: protyle.shadowRoot
                };
            }
            return null;
        }
  
        // --- 模板结束:从这里开始编写你的代码 ---

        // 立即执行你的逻辑
        (() => {
            const self = findSelf(CUSTOM_ID);

            // 必须先检查是否成功找到了自己
            if (!self || !self.shadowRoot) {
                console.error(`[${CUSTOM_ID}] 脚本初始化失败:无法定位到当前HTML块。`);
                return;
            }

            // --- 在下方编写你的主要逻辑代码 ---
  
            // 使用 self.shadowRoot 来安全地获取你自己的HTML元素
            const messageP = self.shadowRoot.getElementById('message');
            const myButton = self.shadowRoot.getElementById('my-button');

            if (!messageP || !myButton) {
                console.error(`[${CUSTOM_ID}] 元素获取失败。`);
                return;
            }

            // 示例:给按钮添加点击事件
            myButton.addEventListener('click', () => {
                messageP.textContent = `操作成功!当前块 ID 是: ${self.id}`;
                messageP.style.color = 'green';
            });
  
            console.log(`[${CUSTOM_ID}] 脚本已成功加载并绑定事件。`);

        })();
    }
</script>

html 块 html+css+js(实时编辑版)提示词

html 块 js 功能需开启——设置——编辑器——允许执行 HTML 块内脚本

注:千千块已经有 html 块实时编辑功能,可以不用这个提示词,如果使用请关闭千千块 html 编辑功能

我需要一个为思源笔记深度定制的 HTML 块,请严格遵循以下所有要求,并且**使用 HTML 和 CSS**和JS则必须遵循和使用JS模板的全部内容(注意模板的交互内容和光标内容必须使用,其他功能JS按照用户所需使用):

1.  **功能目标**: 创建一个[这里填写你的具体功能,例如:会议纪要模板、项目信息卡、读书笔记模板...]。

2.  **思源笔记兼容性优化 (最高优先级,必须遵循以下规则)**:
    * 最终生成的代码**绝对不能**包含 `<!DOCTYPE html>`, `<html>`, `<head>`, `<body>` 这些顶层标签。
    * 所有 HTML 元素以及 `<style>` 标签,都必须被包裹在一个**唯一的父 `<div>`** 标签内。
    * 请确保最终代码是**删除所有在两行内容之间起分隔作用的、完全为空的行**,以防止思源笔记错误地将其解析为多个代码块。

3.  **核心交互元素 (关键!)**:
    * 重点!!!模板中所有需要用户填写或修改的内容,**必须**使用 `<input>`, `<textarea>` 或任何其他表单元素,因为是笔记,所以只要能有个输入框的元素,不用真正的表单元素UI界面
    **事件监听** 必须为整个组件的主容器(例如,class为.universal-container的div)添加一个全局的input事件监听器并配合JS模板的交互。如果组件中包含复选框(checkbox)或其他需要点击交互的元素,也需要为主容器添加click事件监听器,并判断事件目标是否为这些元素。

4.  **外观和样式 (CSS)**:
    **整体风格**: 设计为[用户选择风格]模板的风格,默认Notion模板风格,但**背景色如果用户定义配色则需要整体配色也请围绕这个主色调进行协调设计**
    **图标化标题**: 每个主要板块的标题(如 <h2>)前添加一个合适的 Emoji 图标,以增强结构感和视觉吸引力。
    **文本样式**: 确保所有文本内容(包括标题和段落)都清晰易读。你可以为不同的文本元素设置不同的颜色、字重或样式,以区分其功能。
    **字体与排版**: 使用优雅、易读的中文字体(如“思源黑体”),并设置合适的行高和间距,保证整体的美观性。移除不必要的边框、阴影和复杂的背景,让它看起来像一个真正的笔记页面,而不是一个网页卡片。
    **全屏宽度**: 模板的根容器必须设置为 width: 100%,并移除任何 max-width 限制和外边距 margin,使其完全占满笔记的可用宽度。
    **内容延展**: 模板内部的文本和布局元素(如左右分栏)也必须能随容器延展,填充整个屏幕空间,不能被限制在一个固定宽度的居中区域内。
    **栏目结构**: 设计为[这里填写布局要求,例如:优雅的单栏布局、响应式左右双栏布局...]。如果是双栏或多栏,请确保在移动端等窄屏幕上能自动切换为单栏垂直排列。
    **动态效果** (可选): 如果需要动画效果(例如:[这里填写想要的动效,如“樱花飘落”...]),必须优先用纯 CSS 的 @keyframes 来实现,并确保动画元素不会干扰到下方内容的编辑,
                 如果使用例如transform 和 opacity等动画特效要求尽量减少cpu消耗,必须遵循以下规则
                 1.动画的关键帧中,应优先且尽可能只使用对性能消耗极低的 transform (移动、缩放、旋转) 和 opacity (透明度) 属性。这两个属性可以启用GPU加速,保证动画丝滑流畅。
                 2.应极力避免对会引起页面**重排(Reflow)的属性(如 width, height, margin, top, left 等)和会引起重绘(Repaint)**的属性(如 background-color, box-shadow 等)进行动画处理。
                 3.动画元素的设计必须考虑到用户体验,通过合理的布局(如使用 position: absolute 等),确保它不会遮挡、覆盖或干扰到块下方内容的正常查看和编辑。

5.  **最重要的一点**:
    * **JS必须遵循以下模板**使用任何 `<script>` 标签或任何形式的 JavaScript,需要遵循下面模板
    模板要求:1.指纹与全局搜索:必须使用“CUSTOM_ID + 全局搜索”的模式来定位自身。
              在脚本顶部定义一个独一无二的 const CUSTOM_ID = "一个独特的字符串";。
              使用 document.querySelector(\protyle-html[data-content*="${customID}"]`)` 的方式进行全局查找。
    2.使用 Shadow DOM:所有对 HTML 块内部元素的查找和操作,都必须通过获取到的 shadowRoot 引用来进行,例如 self.shadowRoot.getElementById('...')。
    3.作用域隔离:所有 JavaScript 代码必须包裹在一个大括号 {...} 中,以创建局部作用域。
    4.立即执行:核心逻辑应放在一个立即执行的匿名函数 (() => { ... })(); 中,并在此函数内部首先调用 findSelf() 进行初始化。
    5.必须使用下面模板的全部内容,包括交互和光标,如添加其他JS,则在其他JS区添加
JS模板案例如下:   

<!-- 脚本部分 -->
<script>
    {
        // --- 模板核心:请勿修改 ---
        /**
         * 1. “指纹”:为你的每个新功能生成一个独一无二的ID。
         * 你可以使用在线UUID生成器来创建一个新的ID,确保它不会和别的代码块冲突。
         */
        const CUSTOM_ID = "a1b2c3d4-e5f6-7890-1234-567890abcdef-merged-v14-template";
        /**
         * 2. “全局搜索”函数:这是保证脚本正常运行的核心,无需修改。
         */
        function findSelf(customID) {
            const protyle = document.querySelector(`protyle-html[data-content*="${customID}"]`);
            if (protyle && protyle.parentElement && protyle.parentElement.parentElement) {
                const block = protyle.parentElement.parentElement;
                return { id: block.dataset.nodeId, shadowRoot: protyle.shadowRoot };
            }
            return null;
        }
        // --- 模板结束 ---
        // 立即执行主逻辑
        (() => {
            const self = findSelf(CUSTOM_ID);
            if (!self || !self.shadowRoot) {
                console.error(`[${CUSTOM_ID}] 脚本初始化失败:无法定位。`);
                return;
            }
            // --- 核心功能区:自动保存与光标恢复 ---
            function initializeAutoSaveAndCursorRestore(self) {
                const mainContainer = self.shadowRoot.querySelector('.universal-container');
                const titleInput = self.shadowRoot.getElementById('editable-title');
                const contentInput = self.shadowRoot.getElementById('editable-content');
                if (!mainContainer || !titleInput || !contentInput) {
                    console.error(`[${CUSTOM_ID}] 核心元素获取失败,核心功能无法加载。`);
                    return;
                }
                try {
                    const restoreStateJSON = sessionStorage.getItem('siyuanCursorRestoreState');
                    if (restoreStateJSON) {
                        sessionStorage.removeItem('siyuanCursorRestoreState');
                        const restoreState = JSON.parse(restoreStateJSON);
                        if (restoreState.blockId === self.id) {
                            const elementToRestore = self.shadowRoot.getElementById(restoreState.activeElementId);
                            if (elementToRestore) {
                                setTimeout(() => {
                                    elementToRestore.focus();
                                    elementToRestore.setSelectionRange(restoreState.cursorPos, restoreState.cursorPos);
                                }, 10);
                            }
                        }
                    }
                } catch (e) {
                    console.error(`[${CUSTOM_ID}] 恢复光标位置失败:`, e);
                }
                let initialState = { title: '', content: '' };
                const saveContent = (activeElementId, cursorPos) => {
                    const rootWrapper = self.shadowRoot.querySelector('#block-root-wrapper');
                    if (!rootWrapper) return;
                    const restoreState = { blockId: self.id, activeElementId: activeElementId, cursorPos: cursorPos };
                    sessionStorage.setItem('siyuanCursorRestoreState', JSON.stringify(restoreState));
                    const tempWrapper = rootWrapper.cloneNode(true);
                    tempWrapper.querySelector('#editable-title').setAttribute('value', titleInput.value);
                    tempWrapper.querySelector('#editable-content').textContent = contentInput.value;
                    const requestData = { dataType: "markdown", data: tempWrapper.outerHTML, id: self.id };
                    fetch('/api/block/updateBlock', {
                        method: 'POST',
                        headers: { 'Content-Type': 'application/json' },
                        body: JSON.stringify(requestData)
                    }).then(res => res.json()).then(result => {
                        if (result.code !== 0) sessionStorage.removeItem('siyuanCursorRestoreState');
                    }).catch(() => sessionStorage.removeItem('siyuanCursorRestoreState'));
                };
                mainContainer.addEventListener('focusin', () => {
                    initialState.title = titleInput.value;
                    initialState.content = contentInput.value;
                });
                mainContainer.addEventListener('focusout', (e) => {
                    const focusIsLeavingComponent = !e.relatedTarget || !mainContainer.contains(e.relatedTarget);
                    if (focusIsLeavingComponent) {
                        const contentHasChanged = titleInput.value !== initialState.title || contentInput.value !== initialState.content;
                        if (contentHasChanged) {
                            saveContent(e.target.id, e.target.selectionEnd || 0);
                        }
                    }
                });
                mainContainer.addEventListener('input', (e) => {
                    const target = e.target;
                    if (target.matches('.editable-title, .editable-content')) {
                        const cursorPos = target.selectionEnd;
                        setTimeout(() => {
                            target.focus();
                            target.setSelectionRange(cursorPos, cursorPos);
                        }, 0);
                    }
                });
                console.log(`[${CUSTOM_ID}] 核心功能 (V14: 智能保存 & 光标恢复) 已加载。`);
            }
            initializeAutoSaveAndCursorRestore(self);
            // --- [重要] 用户自定义JS区 ---
            // 你可以在下方这个区域加入你自己的JavaScript代码。
            // 你可以直接使用 `self` 对象来访问当前HTML块的信息 (self.id, self.shadowRoot)。
            //
            // 示例 (取消下面的注释来测试):
            /*
            const titleElement = self.shadowRoot.getElementById('editable-title');
            if (titleElement) {
                titleElement.addEventListener('dblclick', () => {
                    alert('你双击了标题!块ID是: ' + self.id);
                });
            }
            */
            // ------------------------------------
        })();
    }
</script>
</div>


ai 知识库

注:如果需要自定义块 js 的保存数据功能,需要将下面思源笔记 api 上传给 ai

## API接口说明

思源笔记是一款前后端分离架构的软件,GoLang 语言作为后端在运行时提供了大量 API 供前端调用。

### API 调用格式

在插件系统中调用后端 API, 可以使用插件 `API` 提供的 `fetchPost` 和 `fetchSyncPost` 两个方法, 这两个 API 都会在内部完成自动鉴权已经发送请求。在使用中,注意点如下:

- 使用 POST 方法
- 第一个参数为 API route
- 第二个参数为 post data, 是一个 js object
- 如果是 `fetchPost` 方法, 还会有第三个回调函数参数
- 返回值格式为
  json

  ‍```
  {
      "code": 0,
      "msg": "",
      "data": {}
  }
  ‍```

  - `code`:非 0 为异常情况
  - `msg`:正常情况下是空字符串,异常情况下会返回错误文案
  - `data`:可能为 `{}`、`[]` 或者 `NULL`,根据不同接口而不同

### 样例代码

typescript

‍```
import { fetchPost } from "siyuan";

fetchPost("/api/system/currentTime", {}, (response) => {
    dialog.element.querySelector("#time").innerHTML = new Date(response.data).toString();
});
‍```
---
1.保存到块属性(核心API: /api/attr/setBlockAttrs,/api/attr/getBlockAttrs 注意:属性开头必须以custom-为开头,例如custom-qianqian)

## 属性

### 设置块属性

- `/api/attr/setBlockAttrs`
- 参数
  json

  ‍```
  {
      "id": "20210912214605-uhi5gco",
      "attrs": {
          "custom-attr1": "line1\nline2"
      }
  }
  ‍```

  - `id`:块 ID
  - `attrs`:块属性,自定义属性必须以 `custom-` 作为前缀
- 返回值
  json

  ‍```
  {
      "code": 0,
      "msg": "",
      "data": null
  }
  ‍```

### 获取块属性

- `/api/attr/getBlockAttrs`
- 参数
  json

  ‍```
  {
      "id": "20210912214605-uhi5gco"
  }
  ‍```

  - `id`:块 ID
- 返回值
  json

  ‍```
  {
      "code": 0,
      "msg": "",
      "data": {
          "custom-attr1": "line1\nline2",
          "id": "20210912214605-uhi5gco",
          "title": "PDF 标注双链演示",
          "type": "doc",
          "updated": "20210916120715"
      }
  }
  ‍```
---
2.保存到块内容(核心API: /api/block/updateBlock,/api/block/getBlockKramdown 将数据直接作为块的可见内容)

### 更新块

- `/api/block/updateBlock`
- 参数
  json

  ‍```
  {
      "dataType": "markdown",
      "data": "foo bar baz",
      "id": "20211230161520-querkps"
  }
  ‍```

  - `dataType`:待更新数据类型,值可选择 `markdown` 或者 `dom`
  - `data`:待更新的数据
  - `id`:待更新块的 ID
- 返回值
  json

  ‍```
  {
      "code": 0,
      "msg": "",
      "data": [
          {
              "doOperations": [
                  {
                      "action": "update",
                      "data": "<div data-node-id=\"20211230161520-querkps\" data-node-index=\"1\" data-type=\"NodeParagraph\" class=\"p\"><div contenteditable=\"true\" spellcheck=\"false\">foo<strong>bar</strong>baz</div><div class=\"protyle-attr\" contenteditable=\"false\"></div></div>",
                      "id": "20211230161520-querkps",
                      "parentID": "",
                      "previousID": "",
                      "retData": null
                  }
              ],
              "undoOperations": null
          }
      ]
  }
  ‍```

  - `action.data`:更新块生成的 DOM

### 获取块 kramdown 源码

- `/api/block/getBlockKramdown`
- 参数
  json

  ‍```
  {
      "id": "20201225220955-l154bn4"
  }
  ‍```

  - `id`:待获取块的 ID
- 返回值
  json

  ‍```
  {
      "code": 0,
      "msg": "",
      "data": {
          "id": "20201225220955-l154bn4",
          "kramdown": "* {: id=\"20201225220955-2nn1mns\"}新建笔记本,在笔记本下新建文档\n  {: id=\"20210131155408-3t627wc\"}\n* {: id=\"20201225220955-uwhqnug\"}在编辑器中输入 <kbd>/</kbd> 触发功能菜单\n  {: id=\"20210131155408-btnfw88\"}\n* {: id=\"20201225220955-04ymi2j\"}((20200813131152-0wk5akh \"在内容块中遨游\"))、((20200822191536-rm6hwid \"窗口和页签\"))\n  {: id=\"20210131155408-hh1z442\"}"
      }
  }
  ‍```

### 获取子块

- `/api/block/getChildBlocks`
- 参数
  json

  ‍```
  {
      "id": "20230506212712-vt9ajwj"
  }
  ‍```

  - `id`:父块 ID
  - 标题下方块也算作子块
- 返回值
  json

  ‍```
  {
      "code": 0,
      "msg": "",
      "data": [
          {
              "id": "20230512083858-mjdwkbn",
              "type": "h",
              "subType": "h1"
          },
          {
              "id": "20230513213727-thswvfd",
              "type": "s"
          },
          {
              "id": "20230513213633-9lsj4ew",
              "type": "l",
              "subType": "u"
          }
      ]
  }
  ‍```
---
3.保存到独立文件(核心API: /api/file/putFile,/api/file/getFile,在思源笔记的工作空间创建和读写独立的JSON或其他格式的文件,例如/data/storage/)

## 文件

### 获取文件

- `/api/file/getFile`
- 参数
  json

  ‍```
  {
      "path": "/data/20210808180117-6v0mkxr/20200923234011-ieuun1p.sy"
  }
  ‍```

  - `path`:工作空间路径下的文件路径
- 返回值
  文件内容

### 写入文件

- `/api/file/putFile`
- 参数为 HTTP Multipart 表单

  - `path`:工作空间路径下的文件路径
  - `isDir`:是否为创建文件夹,为 `true` 时仅创建文件夹,忽略 `file`
  - `modTime`:最近访问和修改时间,Unix time
  - `file`:上传的文件
- 返回值
  json

  ‍```
  {
      "code": 0,
      "msg": "",
      "data": null
  }
  ‍```

### 删除文件

- `/api/file/removeFile`
- 参数
  json

  ‍```
  {
      "path": "/data/20210808180117-6v0mkxr/20200923234011-ieuun1p.sy"
  }
  ‍```

  - `path`:工作空间路径下的文件路径
- 返回值
  json

  ‍```
  {
      "code": 0,
      "msg": "",
      "data": null
  }
  ‍```

### 重命名文件

- `/api/file/renameFile`
- 参数
  json

  ‍```
  {
      "path": "/data/assets/image-20230523085812-k3o9t32.png",
      "newPath": "/data/assets/test-20230523085812-k3o9t32.png"
  }
  ‍```

  - `path`:工作空间路径下的文件路径
  - `newPath`:新的文件路径
- 返回值
  json

  ‍```
  {
      "code": 0,
      "msg": "",
      "data": null
  }
  ‍```

### 列出文件

- `/api/file/readDir`
- 参数
  json

  ‍```
  {
      "path": "/data/20210808180117-6v0mkxr/20200923234011-ieuun1p.sy"
  }
  ‍```

  - `path`:工作空间路径下的文件路径
- 返回值
  json

  ‍```
  {
      "code": 0,
      "msg": "",
      "data": [
          {
              "isDir": true,
              "name": "20210808180320-abz7w6k"
          },
          {
              "isDir": false,
              "name": "20210808180320-abz7w6k.sy"
          }
      ]
  }
  ‍```

## 导出

### 导出 Markdown 文本

- `/api/export/exportMdContent`
- 参数
  json

  ‍```
  {
      "id": ""
  }
  ‍```

  - `id`:要导出的文档块 ID
- 返回值
  json

  ‍```
  {
      "code": 0,
      "msg": "",
      "data": {
          "hPath": "/0 请从这里开始",
          "content": "## 🍫 内容块\n\n在思源中,唯一重要的核心概念是..."
      }
  }
  ‍```

  - `hPath`:人类可读的路径
  - `content`:Markdown 内容
---
块类型
类型名称	主类型
data-type	次类型
data-subtype	图标	备注
属性表	NodeAttributeView		#iconDatabase	叶子块
音频块	NodeAudio		#iconRecord	叶子块
嵌入块	NodeBlockQueryEmbed		#iconSQL	叶子块
引述块	NodeBlockquote		#iconQuote	容器块
代码块	NodeCodeBlock		#iconCode	叶子块
├─ 乐谱	NodeCodeBlock	abc		abcjs
├─ ECharts 图表	NodeCodeBlock	echarts		ECharts
├─ 流程图	NodeCodeBlock	flowchart		Graphviz
├─ 状态转移图	NodeCodeBlock	graphviz		flowchart.js
├─ Mermaid 图	NodeCodeBlock	mermaid		Mermaid
├─ 脑图	NodeCodeBlock	mindmap		ECharts 树图
└─ UML 图	NodeCodeBlock	plantuml		PlantUML
文档块	NodeDocument		#iconFile	容器块
HTML 块	NodeHTMLBlock		#iconHTML5	叶子块
标题块	NodeHeading		#iconHeadings	叶子块
├─ 一级标题	NodeHeading	h1	#iconH1	↑
├─ 二级标题	NodeHeading	h2	#iconH2	↑
├─ 三级标题	NodeHeading	h3	#iconH3	↑
├─ 四级标题	NodeHeading	h4	#iconH4	↑
├─ 五级标题	NodeHeading	h5	#iconH5	↑
└─ 六级标题	NodeHeading	h6	#iconH6	↑
IFrame 块	NodeIFrame		#iconLanguage	叶子块
列表块	NodeList			容器块
├─ 有序列表	NodeList	o	#iconList	↑
├─ 无序列表	NodeList	t	#iconOrderedList	↑
└─ 任务列表	NodeList	u	#iconCheck	↑
列表项	NodeListItem		#iconListItem	容器块
├─ 有序列表项	NodeListItem	o		↑
├─ 无序列表项	NodeListItem	t		↑
└─ 任务列表项	NodeListItem	u		↑
公式块	NodeMathBlock		#iconMath	叶子块
段落块	NodeParagraph		#iconParagraph	叶子块
超级块	NodeSuperBlock		#iconSuper	容器块
表格块	NodeTable		#iconTable	叶子块
分割线	NodeThematicBreak		#iconLine	叶子块
视频块	NodeVideo		#iconVideo	叶子块
挂件块	NodeWidget		#iconBoth	叶子块
属性表 {#NodeAttributeView}
音频块 {#NodeAudio}
嵌入块 {#NodeBlockQueryEmbed}
引述块 {#NodeBlockquote}
代码块 {#NodeCodeBlock}
乐谱 {#NodeCodeBlock-abc}
ECharts 图表 {#NodeCodeBlock-echarts}
流程图 {#NodeCodeBlock-flowchart}
状态转移图 {#NodeCodeBlock-graphviz}
Mermaid 图 {#NodeCodeBlock-mermaid}
脑图 {#NodeCodeBlock-mindmap}
UML 图 {#NodeCodeBlock-plantuml}
文档块 {#NodeDocument}
HTML 块 {#NodeHTMLBlock}
标题块 {#NodeHeading}
一级标题 {#NodeHeading-h1}
二级标题 {#NodeHeading-h2}
三级标题 {#NodeHeading-h3}
四级标题 {#NodeHeading-h4}
五级标题 {#NodeHeading-h5}
六级标题 {#NodeHeading-h6}
IFrame 块 {#NodeIFrame}
列表块 {#NodeList}
有序列表 {#NodeList-o}
无序列表 {#NodeList-t}
任务列表 {#NodeList-u}
列表项 {#NodeListItem}
有序列表项 {#NodeListItem-o}
无序列表项 {#NodeListItem-t}
任务列表项 {#NodeListItem-u}
公式块 {#NodeMathBlock}
段落块 {#NodeParagraph}
超级块 {#NodeSuperBlock}
表格块 {#NodeTable}
分割线 {#NodeThematicBreak}
视频块 {#NodeVideo}
挂件块 {#NodeWidget}

如果需要其他 api 交互参考下面网站,将思源笔记 api 上传给 ai

内核 API - 思源笔记社区平台

推荐将下面思源笔记所有 api 内容复制到 txt 里面上传给 ai,这样全部后端交互功能都能用上

https://www.siyuan-note.club/6924373m0.md

千千块 ai 提示词如何赚钱?

千千块插件 |v1.0.7 自定义块正式可以 ai 商业化赚钱和开发大型系统

以上就是思源笔记自定义块 css+js 和 html 块 html+css+js 全部的提示词

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    28446 引用 • 119783 回帖
  • 千千插件

    千千块(自定义块 css 和 js)
    可以用 ai 提示词来无限创作思源笔记

    32 引用 • 69 回帖
  • 千千块
    25 引用 • 61 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • foolishman83

    授人以鱼不如授人以渔,赞