@bluelamp/brand-kit

中文文档
0.9.0发布于 2026/11/07MITTypeScriptCommonJS零依赖近 30 天下载 2162

BlueLamp テナント branding とカード部品の器: API 型 / 判定の純関数 / React 部品 / CSS を別リポのフロント(YASHIRO)と backend の双方へ 1 か所から配る

原始使用文档
文档目录8 节
  1. 入っているもの
  2. 使い方
  3. カード部品( @bluelamp/brand-kit/cards )
  4. 🚨 見た目の単一源はここではない
  5. 🚨 root からは出していない
  6. 2 つの色の正規化を取り違えないこと
  7. 落とし方の原則
  8. 開発

@bluelamp/brand-kit

BlueLamp テナント branding とカード部品の器。API 型 / 判定の純関数 / React 部品 / CSS を 1 か所から配る。

フロント(YASHIRO yamatovision の admin・portal)とバックエンド(mikoto-monorepo/backend)は 別リポにある。型と見た目の定義を各自で持てば必ずズレるので、本パッケージから配って各自で持たない。

  • 仕様の正本: YASHIRO リポ docs/requirements-yashiro-brand-E.md(型は §6 が正本)
  • 🚨 原則④「BFF は加工しない=判断は BlueLamp 側に置いたまま」。 本パッケージは判断を配る器であって、受け手が独自の判断を足す場所ではない。

入っているもの

面出どころ備考
型 TenantBranding / PublicBranding / TenantCategory要件書 §6(正本)実装から逆算して増やさない
sanitize sanitizeBranding ほかbackend/src/bluelamp/lib/brandingSanitize.ts から移設⛔ backend 側に re-export は残していない
CSS トークン resolveTenantTheme / buildThemeCssVariables ほかapps/bluelamp-vscode/src/ui/theme/tenantTheme.ts の値が正拡張側の差し替えは本便外
カード部品(/cards サブパス)apps/bluelamp-admin/src/components/promptCards/ から移設(板 #556 便 H1)見た目の正本は vscode 側・下記

使い方

import {
  sanitizeBranding,
  resolveTenantTheme,
  buildThemeCssVariables,
  TENANT_THEME_CSS_PROPERTIES,
  type TenantBranding,
} from '@bluelamp/brand-kit';

// 配る側(BlueLamp backend): 公開前に 1 回だけ通す
const publicBranding = sanitizeBranding(tenant.branding);

// 受け手(admin のプレビュー / portal / VS Code webview): そのまま CSS 変数へ
const vars = buildThemeCssVariables(resolveTenantTheme(publicBranding));
for (const key of TENANT_THEME_CSS_PROPERTIES) {
  const value = vars[key];
  // 今回設定されなかったものは消す(テナント A → B で A の色が残らないようにするため)
  if (value) el.style.setProperty(key, value);
  else el.style.removeProperty(key);
}

カード部品(@bluelamp/brand-kit/cards)

会員が VSCode で見ているカードカタログそのもの(判定・見た目・D&D)。BlueLamp admin と YASHIRO admin の両方がここから import する(=UI を 1 回だけ書く)。

import {
  PromptCardTabs, PromptCardView, useCardDrag,
  buildTabs, toCatalogCards, planPlacement, buildPlacementBody,
  injectPromptCardStyles, injectSlotsEditorStyles,
  type CatalogCard, type PlaceableAssetsResponse,
} from '@bluelamp/brand-kit/cards';

// 見た目の注入は面が 1 回呼ぶ(この順序で)。二重注入は id で弾かれる。
injectPromptCardStyles();   // 会員側の design-system.css + promptCards.css(+器の下に閉じた reset)
injectSlotsEditorStyles();  // 編集モードで足す分

🚨 見た目の単一源はここではない

origin: 'vscode' の CSS の正本は apps/bluelamp-vscode/media/**(会員が実際に見ている面)で、 本パッケージは配布路である。直すときは:

# ① 出典(vscode 側)を直す  ② 焼き直す  ③ 差分を commit
pnpm --filter "@bluelamp/brand-kit" run bake:css

⛔ src/cards/generated/vscodeCss.ts を手で直さない(単一源が 2 本になる)。 焼き直し忘れと手編集は tests/cards/cssSingleSource.test.ts が捕まえる。 ⚠️ この焼き込みは出典が vscode 側に在る間の経過措置であり、恒久の設計ではない(CTO32 承認条件 ②)。

例外は src/cards/slotsEditor.css(編集モードで足す分)。会員側に対応物が無いのでここが正本。

🚨 root からは出していない

カード部品は react を requires するため、入口は /cards サブパスに閉じてある。 root(@bluelamp/brand-kit)は react 非依存のままである——react を持たない消費者 (mikoto-monorepo/backend)が root を require したときに実行時 MODULE_NOT_FOUND にしないため。

2 つの色の正規化を取り違えないこと

関数何のため#abc の扱い落ちたとき
sanitizeBrandingColors保存値を公開して安全にする#abc のまま(形を変えない)そのキーだけ undefined
normalizeHexColorCSS へ入れる値にする#aabbcc へ展開null(=CSS 変数を設定しない=既定色)

前者は「保存された生値の器」、後者は「CSS 文脈へ持ち込む値」。片方に寄せると、 編集画面が表示する値と保存値がズレるか、CSS に短縮形が混ざる。両方いる。

落とし方の原則

不正な 1 トークンだけ落として既定へフォールバックし、他のトークンは活かす。 「1 つ不正だから branding 全体を捨てる」は、利用者から見て原因が分からない壊れ方になる。

開発

npm install
npm run tsc      # 型検査
npm test         # unit(純関数のみ・モック不要)+ CSS 単一源の対照
npm run bake:css # 出典 CSS の焼き直し(出典を直した後に回す)
npm run build    # dist/

⚠️ build は tsc だけである。出典 CSS を読みに行かせないこと——本番 backend イメージの ビルド文脈には .gcloudignore により apps/ が入っておらず、build が出典を読むと 本番イメージのビルドが落ちる(実測 2026-09-02)。焼き込みは bake:css の手番である。

⛔ npm publish は CTO が握る(.github/workflows/publish-npm.yml の承認ゲート経由・不可逆チャネル)。

版本与发布记录

@bluelamp/brand-kit 共发布 25 个版本,首次发布于 2026/09/01;过去 12 个月发布了 25 个版本。

版本发布日期距今
0.9.0latest2026/11/071 天前
0.8.02026/10/2712 天前
0.8.0-rc.0next2026/10/2712 天前
0.7.02026/10/2018 天前
0.7.0-rc.12026/10/2018 天前
0.7.0-rc.02026/10/2019 天前

关于 @bluelamp/brand-kit 的常见问题

@bluelamp/brand-kit 是什么?

BlueLamp テナント branding とカード部品の器: API 型 / 判定の純関数 / React 部品 / CSS を別リポのフロント(YASHIRO)と backend の双方へ 1 か所から配る

如何安装 @bluelamp/brand-kit?

在项目目录运行 npm install @bluelamp/brand-kit,或使用 pnpm add / yarn add / bun add。

@bluelamp/brand-kit 支持 TypeScript 吗?

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

@bluelamp/brand-kit 支持 ESM 还是 CommonJS?

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

@bluelamp/brand-kit 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=18。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@bluelamp/brand-kit 可以商用吗?

@bluelamp/brand-kit 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@bluelamp/brand-kit 的下载量有多少?

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

@bluelamp/brand-kit 还在维护吗?

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