Token导航 LogoToken导航

Agent Skill · 前端设计

theme-snippets(主题片段)

theme-snippets 用于处理 GitHub 仓库、Issue、Pull Request 和代码协作信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要围绕仓库状态、代码变更或协作事项进行整理时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

theme-snippets 是前端设计类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为需要联网;许可证信息还不明确,第三方扫描已通过,按安装量在前端设计类的 10,216 个 Skill 里排第 8,571。

总安装 275周安装 11GitHub Stars 51下载 89核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
unknown

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:theme-snippets(主题片段)
来源仓库:https://github.com/ahmed-lakosha/odoo-upgrade-skill
仓库路径:skills/theme-snippets
安装命令:
npx skills add https://github.com/ahmed-lakosha/odoo-upgrade-skill --skill theme-snippets
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/ahmed-lakosha/odoo-upgrade-skill --skill theme-snippets

这个 Skill 是做什么的

前端设计类 Skill 关注页面结构、视觉规范和组件写法,输出通常是可运行的界面代码。

theme-snippets 用于处理 GitHub 仓库、Issue、Pull Request 和代码协作信息,适合整理项目状态与变更事项。适用于围绕仓库动态、代码审查和协作流程进行信息梳理。通过 npx skills add 命令从 GitHub 仓库安装,需结合原始 README 确认具体用法。

安装前建议确认权限范围和维护状态,注意是否触发联网或文件读写操作。适用宿主包括 Codex、Claude、Cursor、Gemini CLI,接入前应确认版本、权限和运行环境要求。

来源仓库内路径:skills/theme-snippets

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/ahmed-lakosha/odoo-upgrade-skill --skill theme…;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要需要联网,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

theme-snippets 怎么安装?

在终端执行 npx skills add https://github.com/ahmed-lakosha/odoo-upgrade-skill --skill theme-snippets。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

theme-snippets 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

theme-snippets 需要什么权限?

权限级别是需要联网。该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

theme-snippets 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

theme-snippets 用的人多吗?

公开数据是累计安装 275 次,近一周安装 11 次,下载 89 次,GitHub 51 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

theme-snippets 安全吗?

第三方扫描结果为通过,但这只覆盖已知的静态检查项,不能替代自己读一遍源码和安装命令。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 第三方扫描已通过,常见的高风险行为没有命中。

先想清楚的地方

  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理前端设计类任务、又不想每次都手写提示词的人。

不太适合

  • 需要明确授权才能用到公司项目里的场景。
  • 需要厂商级技术支持和 SLA 的生产系统。

前端设计类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
frontend-design

前端设计 · Codex、Claude

8,823,360126,072只读MIT通过
vercel-composition-patterns

Vercel 组合模式 · Codex、Claude

3,858,81625,893需要联网MIT通过
vercel-react-native-skills

Vercel React native skills 前端 · Codex、Claude

2,468,66425,878只读MIT通过
adapt

adapt 搜索 · Codex、Claude

2,027,04023,125操作浏览器未明确通过
bolder

bolder 分析 · Codex、Claude

2,004,28823,130只读未明确通过
theme-snippets

主题片段 · 本页

27551需要联网未明确通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Odoo Website Snippets Reference

Snippet Architecture

STATIC SNIPPETS (81+ templates)    DYNAMIC SNIPPETS (data-driven)
├── Pre-built HTML                  ├── ir.filters (data source)
├── Drag & drop                     ├── website.snippet.filter (fetcher)
└── 6 categories                    └── Display templates (renderer)

              SNIPPET OPTIONS SYSTEM
              we-select | we-button | we-colorpicker | we-input
              data-selector | data-select-class | data-js

Static Snippets Inventory (81+ Templates)

Structure (14)

IDNameBest For
s_bannerBannerLanding pages
s_coverCoverHeaders
s_text_imageText - ImageFeatures
s_image_textImage - TextFeatures
s_titleTitleSection headers
s_text_blockText BlockContent
s_numbersNumbersAchievements
s_three_columnsColumnsContent grids
s_featuresFeaturesBenefits
s_masonry_blockMasonryGalleries
s_image_galleryImage GalleryPortfolios

Features (11)

IDNameBest For
s_comparisonsComparisonsProduct comparison
s_company_teamTeamAbout pages
s_call_to_actionCTAConversions
s_referencesReferencesSocial proof
s_accordionAccordionFAQs
s_features_gridFeatures GridBenefits
s_pricelistPricelistProducts
s_faq_collapseFAQSupport
s_tabsTabsOrganization

Dynamic Content (15)

IDNameBest For
s_google_mapGoogle MapContact pages
s_website_formFormLead capture
s_social_mediaSocial MediaEngagement
s_dynamic_snippetDynamicData display
s_countdownCountdownEvents
s_popupPopupPromotions
s_newsletter_blockNewsletterMarketing

Inner Content (16)

IDNameBest For
s_cardCardItems
s_three_cards / s_four_cardsCardsServices/Features
s_timelineTimelineHistory
s_process_stepsStepsTutorials
s_quotes_carouselTestimonialsSocial proof
s_blockquoteBlockquoteEmphasis

Mega Menus (9)

IDName
s_mega_menu_multi_menusMultiple menu columns
s_mega_menu_cardsCard-style menu
s_mega_menu_big_iconsLarge icon menu
s_mega_menu_thumbnailsThumbnail gallery

Creating Custom Snippets

Odoo 14-17: Simple Registration

<!-- 1. Snippet Template -->
<template id="s_my_snippet" name="My Snippet">
    <section class="s_my_snippet pt48 pb48 o_cc o_cc1">
        <div class="container">
            <div class="row">
                <div class="col-lg-12 text-center">
                    <h2>My Custom Snippet</h2>
                    <p>Content goes here...</p>
                </div>
            </div>
        </div>
    </section>
</template>

<!-- 2. Registration -->
<template id="s_my_snippet_insert" inherit_id="website.snippets">
    <xpath expr="//div[@id='snippet_structure']//t[@t-snippet][last()]" position="after">
        <t t-snippet="my_module.s_my_snippet"
           t-thumbnail="/my_module/static/src/img/snippets/s_my_snippet.svg">
            <keywords>my, custom, snippet</keywords>
        </t>
    </xpath>
</template>

Odoo 18-19: With Snippet Groups (Required)

<!-- 1. Snippet Template (same as above) -->

<!-- 2. Custom Group (optional) -->
<template id="snippet_group_custom" inherit_id="website.snippets">
    <xpath expr="//div[@id='snippet_groups']" position="inside">
        <t snippet-group="custom"
           t-snippet="website.s_snippet_group"
           string="Custom Snippets"/>
    </xpath>
</template>

<!-- 3. Registration with Group -->
<template id="s_my_snippet_insert" inherit_id="website.snippets">
    <xpath expr="//div[@id='snippet_structure']/*[1]" position="before">
        <t t-snippet="my_module.s_my_snippet"
           string="My Snippet"
           group="custom"
           t-thumbnail="/my_module/static/src/img/snippets/s_my_snippet.svg"/>
    </xpath>
</template>

Panel Categories

Panel IDCategoryXPath
snippet_structureStructure//div[@id='snippet_structure']
snippet_mediaGallery//div[@id='snippet_media']
snippet_featureFeatures//div[@id='snippet_feature']
snippet_dynamicDynamic//div[@id='snippet_dynamic']
snippet_inner_contentInner Content//div[@id='snippet_inner_content']

Snippet Options System

We-* Elements

ElementPurposeKey Attributes
we-selectDropdowndata-name, data-dependencies
we-buttonToggledata-select-class, data-toggle-class
we-colorpickerColor pickerdata-css-property
we-inputText/numberdata-attribute-name, data-unit
we-rangeSliderdata-min, data-max, data-step
we-checkboxToggledata-select-class

Data Attributes

AttributePurpose
data-selectorTarget CSS selector
data-select-classToggle CSS class
data-css-propertyCSS property to modify
data-jsJavaScript handler class
data-dependenciesConditional visibility
data-no-previewDisable live preview

Complete Options Example

<template id="s_my_snippet_options" inherit_id="website.snippet_options">
    <xpath expr="." position="inside">
        <div data-js="MySnippetHandler"
             data-selector=".s_my_snippet"
             data-drop-in=".oe_structure">

            <we-select string="Layout" data-name="layout_opt">
                <we-button data-select-class="layout-grid">Grid</we-button>
                <we-button data-select-class="layout-list">List</we-button>
            </we-select>

            <we-colorpicker string="Background"
                            data-select-style="true"
                            data-css-property="background-color"/>

            <we-range string="Spacing"
                      data-select-style="true"
                      data-css-property="gap"
                      data-min="0" data-max="100" data-step="5" data-unit="px"/>
        </div>
    </xpath>
</template>

Built-in JS Handlers

BackgroundImage, BackgroundPosition, BackgroundToggler, ColoredLevelBackground, BackgroundShape, ImageTools, Carousel, DynamicSnippet


Dynamic Snippets

Architecture

Data Source (ir.filters) → Filter (website.snippet.filter) → Display Template

Creating a Dynamic Snippet

Step 1: Define Filter

<record id="dynamic_filter_my_items" model="website.snippet.filter">
    <field name="name">My Items</field>
    <field name="model_name">my.model</field>
    <field name="limit">12</field>
    <field name="filter_id" ref="ir_filter_my_items"/>
</record>

Step 2: Display Template

<template id="dynamic_filter_template_my_model_card" name="Card">
    <t t-foreach="records" t-as="record">
        <div class="col-lg-4 mb-4">
            <div class="card h-100 shadow-sm">
                <img t-att-src="record.image_url" class="card-img-top"/>
                <div class="card-body">
                    <h5 class="card-title" t-esc="record.name"/>
                </div>
            </div>
        </div>
    </t>
</template>

Step 3: Dynamic Snippet

<template id="s_dynamic_my_items" name="Dynamic My Items">
    <section class="s_dynamic_snippet s_dynamic_my_items pt48 pb48"
             data-snippet="s_dynamic_my_items"
             data-filter-id="my_module.dynamic_filter_my_items"
             data-template-key="my_module.dynamic_filter_template_my_model_card"
             data-number-of-elements="6">
        <div class="container">
            <div class="dynamic_snippet_template row"/>
        </div>
    </section>
</template>

Product Dynamic Snippets (website_sale)

Filters: dynamic_filter_newest_products, dynamic_filter_recently_sold_products, dynamic_filter_recently_viewed_products

Display templates: card_style, centered, horizontal_card, mini, minimalist_*, banner


Snippet JavaScript

publicWidget for Snippets

/** @odoo-module **/
import publicWidget from "@web/legacy/js/public/public_widget";

publicWidget.registry.MySnippet = publicWidget.Widget.extend({
    selector: '.s_my_snippet',
    disabledInEditableMode: false,

    start: function () {
        if (!this.editableMode) {
            this._initializeAnimations();
        }
        return this._super(...arguments);
    },

    destroy: function () {
        $(window).off('.mySnippet');
        this._super(...arguments);
    },
});

Snippet Options Handler

/** @odoo-module **/
import options from "@web_editor/js/editor/snippets.options";

options.registry.MySnippetOption = options.Class.extend({
    selectDataAttribute: function(previewMode, widgetValue, params) {
        this._super(...arguments);
        if (params.attributeName === 'layout') {
            this._applyLayout(widgetValue);
        }
    },
});

Version Differences

FeatureOdoo 14-17Odoo 18-19
RegistrationSimple XPathGroups required
JavaScript@odoo-modulePlugin-based (19)
Bootstrap4.x (14-15) / 5.1.3 (16-17)5.1.3
Dynamic SnippetsBasicFull + Categories

Odoo 19 Plugin Pattern

import { Plugin } from "@html_editor/plugin";
import { registry } from "@web/core/registry";

export class MySnippetPlugin extends Plugin {
    static id = "mySnippet";
    resources = {
        builder_options: [{
            template: "my_module.MySnippetOption",
            selector: "section",
            applyTo: ".s_my_snippet",
        }],
    };
}
registry.category("website-plugins").add("mySnippet", MySnippetPlugin);

平台分布

Codex

39.74%
按下载量换算35

Claude

31.85%
按下载量换算28

Cursor

17.47%
按下载量换算16

Gemini CLI

8.5%
按下载量换算8

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills