@brilo/base-blocks

中文文档
0.1.77发布于 2026/11/04TypeScriptCommonJS近 30 天下载 2576

共享古腾堡区块工厂图书馆. 租户调用工厂功能,登记结果,只拥有 block.json + 图标文件。 这个文件是唯一一个文件——当它不同意时 src/blocks/*,代码获胜.

中文使用文档
文档目录14 节
  1. 安装( 租户)
  2. 图标
  3. 结构
  4. 块文件
  5. 命名
  6. 进口
  7. 类型
  8. 选项模式
  9. 一般工厂
  10. 编辑组件
  11. 共享组件和钩子
  12. 新的块清单
  13. 租户使用
  14. 样式( 租户)

@ brilo/ 基本块

共享古腾堡区块工厂图书馆. 租户调用工厂功能,登记结果,只拥有 block.json + 图标文件。 这个文件是唯一一个文件——当它不同意时 src/blocks/*,代码获胜.

安装( 租户)

发表于 @brilo/base-blocks npm 软件包——普通 bun install 在租户拉它.

针对未承诺的基块变化的本地 dev 使用 bun link数字 :

# in base-blocks
bun run build
bun link

# in tenant gutenberg dir
bun link @brilo/base-blocks

重新运行 bun run build 任何变化后在基块中的链接点- build/没有 src/。 。 。 .

图标

bun run build      # biome check + tsc → build/
bun run check      # biome check --write + tsc --noEmit
bun run format     # biome (TS) + prettier (SCSS)

结构

src/
  blocks/
    <domain>/     one per content type, mirrors frontoffice twig components 1:1:
                  anchor/, compare/, contact/, faq/, gallery/, hero/, person/,
                  signpost/, step/, testimonial/, usp/ … each with <domain>-group/
                  and/or <domain>-item/
    core/         atomic, no inner blocks: basic-button · basic-heading · basic-overline
    groups/       generic (non-domain) layout groups: banner-group · basic-header-group ·
                  button-group · content-group · text-and-media-group
    sections/     top-level page sections: base-section
    layout/       aside/content layout blocks
    form/         form-group · form-field
    link/ · map/ · newsletter/ · post/ · responsive-grid/
  components/   IconControl · ImagePicker · ItemIconControl · PaletteColorControl
  hooks/        useGroupBlock · useTenantColorPalette
  utils/        createEditAdapter
  constants.ts  shared HEADING_LEVELS · HEADING_STYLES · CONTENT_SIZES
  editor.scss   SCSS barrel — @forward all block + component + global styles
  globals.scss  global editor utility classes (flex, gap-*, u-grid-*, …)
  index.ts      JS/TS barrel
  types.ts      shared types (BriloBlockType, SelectOption, Icon, OptionArray, …)

不要发明新的顶级文件夹: 显示前台组件的块镜像会进入它的域名文件夹, 一个原子 一个英寸 core/,一个没有内容域的通用包装 groups/。 。 。 .

后缀告诉工作,与前台相同:

后缀任务
-groupInnerBlocks 集装箱。 布局/栏/方向控制。 限制儿童通过 allowedBlocks。从不使实体标记.
-item匹配组内的单个实体块( E)parent: ['brilo/xxx-group']) (中文(简体) ). 从不累.
-section顶级页面部分, 包接组( T)sections/base-section) (中文(简体) ).
-form 编号 : -field格式容器/单字段.

块文件

blocks/<domain>/<block-name>/
├── factory.tsx   required
├── edit.tsx      required
├── types.ts      required
├── index.ts      required
├── constants.ts  only if the block has option arrays
├── icon.tsx      only if the block needs a custom icon
└── editor.scss   only if the block needs editor styles
文件出口规则
factory.tsxcreateXxxBlock(options) → BlockConfiguration<XxxAttributes>仅限WP位置 attributes 计划是定义的. save: () => null (原子/项目)或 () => <InnerBlocks.Content /> (组/科). 再出口 XxxAttributes编号 :XxxOptions。 。 。 .
edit.tsxcreateXxxEdit(options) − 反应组件没有内置数组——取自 constants.ts无模块级 __()。 。 。 .
types.tsXxxAttributes, (中文(简体) ), XxxOptionsXxxAttributes extends Record<string, unknown>, (中文(简体) ), XxxOptions extends BriloBlockType。 。 。 .
constants.ts选项数组, DEFAULT_*as const。翻译的标签住在这里,而不是在 edit.tsx。 。 。 .
icon.tsxicon (日语) <svg>(中文(简体) )否则工厂会使用WP图标弹簧弦(例如. 'admin-links') (中文(简体) ).
index.ts枪管+ xxxDefaultsxxxDefaults 在此定义, 不在 factory.tsx常数不再出口 阻断-私人.
editor.scss只编辑器样式@forward 它从 src/editor.scss。没有前端样式.

命名

东西模式实例
工厂createXxxBlockcreateBasicButtonBlock
编辑厂createXxxEditcreateBasicButtonEdit
属性类型XxxAttributesBasicButtonAttributes
选项类型XxxOptionsBasicButtonOptions
默认对象xxxDefaultsbasicButtonDefaults

常数是尖叫-SNAKE. DEFAULT_ 仅用于租户可支配选项的倒置; 固定套件 (单位:千美元)HEADING_LEVELS, (中文(简体) ), CHIP_POSITIONS)没有前缀.

进口

tsconfig.json 地图 ~/* → ./src/*。共享代码总是 ~/types, (中文(简体) ), ~/constants, (中文(简体) ), ~/hooks/..., (中文(简体) ), ~/components/... 从来没有 ../../../。块本地代码为 ./constants, (中文(简体) ), ./types。将冲突命名为 — 导入别名 (单位:千美元)import {HEADING_LEVELS as SHARED_HEADING_LEVELS} from '~/constants') (中文(简体) ).

类型

BriloBlockType (从) ~/types)是每个系统的共同基础 XxxOptions数字 : name, (中文(简体) ), title?, (中文(简体) ), description?, (中文(简体) ), category?, (中文(简体) ), allowedBlocks?, (中文(简体) ), template?, (中文(简体) ), blockClassName?, (中文(简体) ), containerClassName?, (中文(简体) ), icon?, (中文(简体) ), parent?。 。 。 . SelectOption (单位:千美元){value, label}也生活在一个 ~/types 永远不要在街区里重新宣布.

属性结合来源于 as const 数组,从未用手写 :

// constants.ts
export const MEDIA_POSITIONS = [
  {value: 'left', label: __('Vlevo', 'brilo-blocks')},
  {value: 'right', label: __('Vpravo', 'brilo-blocks')},
] as const
export const HEADING_LEVELS = [1, 2, 3] as const

// types.ts
export type MediaPosition = (typeof MEDIA_POSITIONS)[number]['value'] // 'left' | 'right'
export type HeadingLevel = (typeof HEADING_LEVELS)[number] // 1 | 2 | 3

对属性也使用导出类型( E)headingLevel: HeadingLevel没有 number所以铸造像 tagName={`h${headingLevel}` as `h${HeadingLevel}`} 跟随常数。 仅允许一个子集 标题级别定义自己的 HEADING_LEVELS; 否则再出口共享的 ~/constants。 。 。 .

选项模式

每个房客的可支配价值都有 DEFAULT_* 内 constants.ts,解决一次 ??确定的价值是: 绝不是原始的默认——输入两个属性 enum 和编辑用户界面, 或租户控制被悄悄地删除 :

// ✓ reflects tenant override
const variants = options.variants ?? DEFAULT_VARIANTS
attributes: {variant: {type: 'string', default: variants[0].value, enum: variants.map((v) => v.value)}}

// ✗ ignores tenant override
attributes: {variant: {enum: DEFAULT_VARIANTS.map((v) => v.value)}}

强制性选项( 如 name)没有默认,在界面中需要.

一般工厂

其选项包含可压倒性的 enum 阵列的工厂是通用的,所以 TypeScript 将属性字缩入 这正是房客通过。 只有可压倒性的阵列成为类型参数——固定的阵列保持硬码. usp/usp-group/factory.tsx 这是最充分的例子.

// factory.tsx
export function createBasicButtonBlock<
  TVariants extends OptionArray = typeof DEFAULT_VARIANTS,
  TSizes extends OptionArray = typeof DEFAULT_SIZES,
>(options: BasicButtonOptions<TVariants, TSizes>): BlockConfiguration<BasicButtonAttributes<TVariants[number]['value'], TSizes[number]['value']>>

// edit.tsx stays non-generic; factory casts when calling it
edit: createBasicButtonEdit(options as unknown as BasicButtonOptions),

约束类型从 ~/types数字 : OptionArray (单位:千美元)ReadonlyArray<{value; label}>, (中文(简体) ), NumberArray, (中文(简体) ), StringArray。 。 。 .

租户一方—— as const 文字推断需要:

createBasicButtonBlock({...basicButtonDefaults}) // variant: 'primary' | 'secondary'

const MY_VARIANTS = [
  {value: 'primary', label: 'Primární'},
  {value: 'brand', label: 'Brand'},
] as const
createBasicButtonBlock({...basicButtonDefaults, variants: MY_VARIANTS}) // variant: 'primary' | 'brand'

编辑组件

组块使用 useGroupBlock (包装) useBlockProps + 键 useInnerBlocksProps,接受 templateLock, (中文(简体) ), orientation, (中文(简体) ), layout, (中文(简体) ), renderAppender);项目/原子块使用平原 useBlockProps。 。 。 .

const {blockProps, innerBlocksProps} = useGroupBlock({
  blockClassName: options.blockClassName ?? 'g-usp',
  containerClassName: 'g-usp__list',
  allowedBlocks: options.allowedBlocks,
  template: options.template,
})

return (
  <div {...blockProps}>
    <div {...innerBlocksProps} />
  </div>
)

班级总是通过 clsx, BEM, 与它制成的树枝组分相同的根类(g- 组, i- 项目, base- (第2款) editor.scss 常设委员会同意:

const blockProps = useBlockProps({
  className: clsx(options.blockClassName ?? 'i-button', `--variant-${variant}`, outline && '--outline'),
})

所有用户可见的字符串 : __('…', 'brilo-blocks')。 。 。 .

共享组件和钩子

使用这些选项而不是在块内重新执行 UI :

  • PaletteColorControl - 贴有标签的租户-帕莱特取色器(label, (中文(简体) ), help?, (中文(简体) ), id?, (中文(简体) ), value, (中文(简体) ), onChange, (中文(简体) ), enableAlpha?, (中文(简体) ), clearable?) (中文(简体) ). 带走和返回 '' 用于"无色". 使用每个颜色属性代替 BaseControl + 键 ColorPalette + 键 useTenantColorPalette。 。 。 .
  • IconControl ——预选SVG图标网格.
  • ItemIconControl + 键 ItemIconPreview ——带有"预选对媒体"切换的图标控件(anchor-item, (中文(简体) ), usp-item) (中文(简体) ).
  • ImagePickerControl (边栏上传/选择)+ ImagePickerBody (canvas预览), useMediaUrl(id)。 。 。 .
  • useTenantColorPalette ——租户 paletteColors + 键 resolveHex (计: ContrastChecker) (中文(简体) ).

新的块清单

  1. 选择域文件夹 + 后缀(参见 结构) (中文(简体) ).
  2. types.ts数字 : XxxAttributes, (中文(简体) ), XxxOptions。 。 。 .
  3. constants.ts 如果有任何选项数组.
  4. factory.tsx: 用 ??,构建 attributesưμ㼯a BlockConfiguration。 。 。 .
  5. edit.tsx数字 : createXxxEdit(options)中,控件 InspectorControls → PanelBody。 。 。 .
  6. icon.tsx 只有在需要的时候.
  7. index.ts 枪管+ xxxDefaults。 。 。 .
  8. editor.scss, (中文(简体) ), @forward 从 src/editor.scss。 。 。 .
  9. 导出自 src/index.ts数字 : export type {XxxAttributes, XxxOptions} + 键 export {createXxxBlock, xxxDefaults}。 。 。 .
  10. bun run build,然后在租户登记(以下).

最小模板 :

// factory.tsx
import type {BlockConfiguration} from '@wordpress/blocks'
import {createXxxEdit} from './edit'
import type {XxxAttributes, XxxOptions} from './types'

export type {XxxAttributes, XxxOptions}

export function createXxxBlock(options: XxxOptions): BlockConfiguration<XxxAttributes> {
  return {
    name: options.name,
    title: options.title ?? 'TODO',
    description: options.description,
    category: options.category ?? 'common',
    ...(options.parent && {parent: options.parent}),
    supports: {html: false, customClassName: false},
    attributes: {},
    edit: createXxxEdit(options),
    save: () => null,
  } as unknown as BlockConfiguration<XxxAttributes>
}
// index.ts
export type {XxxAttributes, XxxOptions} from './types'
export {createXxxBlock} from './factory'
export {createXxxEdit} from './edit'

import type {XxxOptions} from './types'

export const xxxDefaults: XxxOptions = {
  name: 'brilo/xxx',
  parent: ['brilo/xxx-group'],
}

租户使用

import {createUspItemBlock, uspItemDefaults} from "@brilo/base-blocks"
import {registerBlockType} from "@wordpress/blocks"
import metadata from "./block.json"
import {ICONS, ICONS_SRC} from "./icons"

const config = createUspItemBlock({
  ...uspItemDefaults,
  name: metadata.name,
  parent: metadata.parent as string[],
  icons: ICONS,
  iconsSrc: ICONS_SRC,
})

registerBlockType(config.name as string, config)

每个租户区都需要一个 block.json 旁边 index.tsx:建立元数据($schema, (中文(简体) ), apiVersion, (中文(简体) ), name, (中文(简体) ), editorScript, (中文(简体) ), editorStyle+) 加上 (中文(简体) ) title, (中文(简体) ), description, (中文(简体) ), parent编号 :allowedBlocks, (中文(简体) ), attributes (与 enum 页:1 选项集)和一个 example工厂里的镜子 块目录读取他们通过 /wp/v2/block-types/brilo。 。 。 .

支持它所需的块 extraAttributes (租户在基数之上的属性)和 extraControls (预算外) 基点以下的检查员控制; createBaseSectionBlock 还要 exclude 以删除基准属性 :

type ExtraAttrs = {overlap: boolean}

const config = createBaseSectionBlock<ExtraAttrs>({
  name: "my-tenant/base-section",
  allowedBlocks: ["my-tenant/basic-header-group", "my-tenant/usp-group"],
  blockClassName: "s-base",
  containerClassName: "s-base__inner",
  extraAttributes: {overlap: {type: "boolean", default: false}},
  extraControls: ({attributes, setAttributes}) => (
    <ToggleControl
      label={__("Překrytí sekce", "brilo-blocks")}
      checked={attributes.overlap}
      onChange={(value) => setAttributes({overlap: value})}
    />
  ),
  // exclude: ["background"],
})

样式( 租户)

租户 index.scss数字 :

@use "@brilo/base-blocks/src/editor";  /* block styles, mostly in @layer base */
@import "@brilo/gutenberg-toolkit/build/index.css";

@layer base, tenant;  /* tenant layer always wins */

取代租户SSCSS中的基础样式 @layer tenant { } ——只用于其风格坐落的文件 @layer base。一些块 editor.scss 文件还在 无层:他们依靠击打未上层的WP编辑器 缺省数(h*编号 :p编号 :hr 边距和字体大小, .wp-block (边际)和压倒性 .i-item-icon分层 CSS 输给任何没有层次的CSS, 所以压倒那些没有层次的。 移动到层里需要每个文件检查 编辑.

版本与发布记录

@brilo/base-blocks 共发布 74 个版本,首次发布于 2026/06/16;过去 12 个月发布了 74 个版本。

版本发布日期距今
0.1.77latest2026/11/044 天前
0.1.762026/11/044 天前
0.1.752026/10/309 天前
0.1.742026/10/309 天前
0.1.732026/10/309 天前
0.1.712026/10/309 天前

关于 @brilo/base-blocks 的常见问题

@brilo/base-blocks 是什么?

共享古腾堡区块工厂图书馆. 租户调用工厂功能,登记结果,只拥有 block.json + 图标文件。 这个文件是唯一一个文件——当它不同意时 src/blocks/*,代码获胜.

如何安装 @brilo/base-blocks?

在项目目录运行 npm install @brilo/base-blocks,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:react(^18.3.0)、@wordpress/url(^5.0.0)、@wordpress/data(^11.0.0)、@wordpress/date(^6.0.0)、@wordpress/i18n(^7.0.0)、@wordpress/icons(^19.0.0)、@wordpress/blocks(^17.0.0)、@wordpress/element(^10.0.0)、@wordpress/api-fetch(^8.0.0)、@wordpress/dataviews(^21.0.0)、@wordpress/components(^43.0.0)、@wordpress/block-editor(^19.0.0)、@wordpress/html-entities(^5.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@brilo/base-blocks 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@brilo/base-blocks 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@brilo/base-blocks 可以商用吗?

@brilo/base-blocks 使用 未声明 许可。package.json 没有声明许可证。没有许可证的代码默认保留全部权利,商用前请联系作者或查看仓库中的 LICENSE 文件。以上为概括,不构成法律意见,请以许可原文为准。

@brilo/base-blocks 的下载量有多少?

根据 npm 官方下载统计,@brilo/base-blocks 在 2026/10/09 – 2026/11/07 这 30 天内被下载 2,576 次,日均约 86 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@brilo/base-blocks 还在维护吗?

最新版本 0.1.77 发布于 2026/11/04(4 天前);至今共发布 74 个版本,其中过去 12 个月发布了 74 个;首次发布于 2026/06/16。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。