{"_id":"@bluelamp/brand-kit","_rev":"8-5310e3d700fff5fb6903093262d1cc7c","name":"@bluelamp/brand-kit","dist-tags":{"latest":"0.2.6"},"versions":{"0.1.0":{"name":"@bluelamp/brand-kit","version":"0.1.0","keywords":["bluelamp","branding","theme","sanitize","design-tokens"],"author":{"name":"BlueLamp","email":"dev@bluelamp.app"},"license":"MIT","_id":"@bluelamp/brand-kit@0.1.0","maintainers":[{"name":"bluelamp","email":"shiraishi.tatsuya@mikoto.co.jp"}],"dist":{"shasum":"f6d24a3757f2d15188030ed38f88f3f5e3fcfc0a","tarball":"https://registry.npmjs.org/@bluelamp/brand-kit/-/brand-kit-0.1.0.tgz","fileCount":23,"integrity":"sha512-bz12GFRxzrfNHkVdvUuzxFwOqjc5nWJbS1ymFAnQOCy0UXWmC9AO8mXai/r7eFV33y2sv0ghhXwDMQEBRAGsZA==","signatures":[{"sig":"MEQCIEmUL9XJV6NXSrEtuXKso0P+cw1c2D00zOkEbnqSVu4aAiAc/HR39QZYcVu2wa1jTVQfXmJ8MJK9+JTGDBziFQiPtw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50139},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"scripts":{"tsc":"tsc --noEmit","test":"jest --passWithNoTests","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"bluelamp","email":"shiraishi.tatsuya@mikoto.co.jp"},"_npmVersion":"11.5.1","description":"BlueLamp テナント branding の器: API 型 / sanitize 純関数 / CSS トークンを別リポのフロント（YASHIRO）と backend の双方へ 1 か所から配る","directories":{},"_nodeVersion":"24.5.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/brand-kit_0.1.0_1788259633590_0.8795582065514662","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@bluelamp/brand-kit","version":"0.2.0","keywords":["bluelamp","branding","theme","sanitize","design-tokens","prompt-cards"],"author":{"name":"BlueLamp","email":"dev@bluelamp.app"},"license":"MIT","_id":"@bluelamp/brand-kit@0.2.0","maintainers":[{"name":"bluelamp","email":"shiraishi.tatsuya@mikoto.co.jp"}],"dist":{"shasum":"02bf847c6030173c62af0cee7c14c9927ce450ac","tarball":"https://registry.npmjs.org/@bluelamp/brand-kit/-/brand-kit-0.2.0.tgz","fileCount":71,"integrity":"sha512-MKow2LdaE7kl58RTBhyqex67ygVSQs5MYn4JyVvT6/8MOAUIW8MzYgS4LjTHF2/Ws6YtctQ3kU47L4M8NA2Jgg==","signatures":[{"sig":"MEQCIB2p3GIJHUYzfXwjiKq1XBCYrikOU62YT1wEiLypg+HSAiB3cVohLOiriSZ+gffFABVl7oTta1qqhdLyjTfuqVS5GA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":242621},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cards":{"types":"./dist/cards/index.d.ts","default":"./dist/cards/index.js"},"./package.json":"./package.json"},"scripts":{"tsc":"tsc --noEmit","test":"jest --passWithNoTests","build":"tsc","bake:css":"node scripts/bake-css.mjs","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"bluelamp","email":"shiraishi.tatsuya@mikoto.co.jp"},"_npmVersion":"11.5.1","description":"BlueLamp テナント branding とカード部品の器: API 型 / 判定の純関数 / React 部品 / CSS を別リポのフロント（YASHIRO）と backend の双方へ 1 か所から配る","directories":{},"_nodeVersion":"24.5.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","react":"^19.2.0","ts-jest":"^29.1.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.0","@types/react":"^19.2.5"},"peerDependencies":{"react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/brand-kit_0.2.0_1788309200375_0.7987211801830119","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@bluelamp/brand-kit","version":"0.2.1","keywords":["bluelamp","branding","theme","sanitize","design-tokens","prompt-cards"],"author":{"name":"BlueLamp","email":"dev@bluelamp.app"},"license":"MIT","_id":"@bluelamp/brand-kit@0.2.1","maintainers":[{"name":"bluelamp","email":"shiraishi.tatsuya@mikoto.co.jp"}],"dist":{"shasum":"28090c3fe78c8748c42cff16af699f2fe8646d87","tarball":"https://registry.npmjs.org/@bluelamp/brand-kit/-/brand-kit-0.2.1.tgz","fileCount":71,"integrity":"sha512-p1YppfNkjuACp81UpOM14BhI4jZ7SGfkPFD5yvjNIT35gaUXGZsLIULERRMblkrmwMyYiXpQnzaS+AeYkJeHmA==","signatures":[{"sig":"MEUCIDErLQgjeziyYo6202AZR+zsGFU/4izeqx6uoYQnAxdXAiEAtifqpdXZkUlY11zXvUjvK3Oq335mOFSavdAApK2dJl0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":249831},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cards":{"types":"./dist/cards/index.d.ts","default":"./dist/cards/index.js"},"./package.json":"./package.json"},"scripts":{"tsc":"tsc --noEmit","test":"jest --passWithNoTests","build":"tsc","bake:css":"node scripts/bake-css.mjs","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"bluelamp","email":"shiraishi.tatsuya@mikoto.co.jp"},"_npmVersion":"11.5.1","description":"BlueLamp テナント branding とカード部品の器: API 型 / 判定の純関数 / React 部品 / CSS を別リポのフロント（YASHIRO）と backend の双方へ 1 か所から配る","directories":{},"_nodeVersion":"24.5.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","react":"^19.2.0","ts-jest":"^29.1.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.0","@types/react":"^19.2.5"},"peerDependencies":{"react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/brand-kit_0.2.1_1788334019329_0.43207182172528635","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@bluelamp/brand-kit","version":"0.2.2","keywords":["bluelamp","branding","theme","sanitize","design-tokens","prompt-cards"],"author":{"name":"BlueLamp","email":"dev@bluelamp.app"},"license":"MIT","_id":"@bluelamp/brand-kit@0.2.2","maintainers":[{"name":"bluelamp","email":"shiraishi.tatsuya@mikoto.co.jp"}],"dist":{"shasum":"3217034aca0b9d095b9a0292f398a2313d2131d4","tarball":"https://registry.npmjs.org/@bluelamp/brand-kit/-/brand-kit-0.2.2.tgz","fileCount":75,"integrity":"sha512-fLIEygGgjo6iZYVpModnJ6S/rMkP3NQZHm1T+BQnmNPgSx0xLnVkTVLERPPAfNFhvffT3mB6eOanNi8nLFLBjw==","signatures":[{"sig":"MEUCIQD4sTZdaxvHcGolFrRId482TfsU4+xSKUs/X1vYPxo+8wIgBfubY/X2wKDefm0aaGnEHr5Bq3K9j0HgAJ3RgFuelC0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":344817},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cards":{"types":"./dist/cards/index.d.ts","default":"./dist/cards/index.js"},"./package.json":"./package.json"},"scripts":{"tsc":"tsc --noEmit","test":"jest --passWithNoTests","build":"tsc","bake:css":"node scripts/bake-css.mjs","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"bluelamp","email":"shiraishi.tatsuya@mikoto.co.jp"},"_npmVersion":"11.5.1","description":"BlueLamp テナント branding とカード部品の器: API 型 / 判定の純関数 / React 部品 / CSS を別リポのフロント（YASHIRO）と backend の双方へ 1 か所から配る","directories":{},"_nodeVersion":"24.5.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","react":"^19.2.0","ts-jest":"^29.1.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.0","@types/react":"^19.2.5"},"peerDependencies":{"react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/brand-kit_0.2.2_1788394496674_0.26794248282832767","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@bluelamp/brand-kit","version":"0.2.3","keywords":["bluelamp","branding","theme","sanitize","design-tokens","prompt-cards"],"author":{"name":"BlueLamp","email":"dev@bluelamp.app"},"license":"MIT","_id":"@bluelamp/brand-kit@0.2.3","maintainers":[{"name":"bluelamp","email":"shiraishi.tatsuya@mikoto.co.jp"}],"dist":{"shasum":"6dd5ccbca389b51ad25f66061a611e6428397fe7","tarball":"https://registry.npmjs.org/@bluelamp/brand-kit/-/brand-kit-0.2.3.tgz","fileCount":75,"integrity":"sha512-22UZ1hHZhJHpwd1UtxdYWgwsO9uDPj48PnUQ9I3qP+HCY8lxfrLPBOvNMqtIm5Spk6EQnAlZLbGsxzAKNDGXQQ==","signatures":[{"sig":"MEQCIHz1lGfGBjJ6niUwoEkyXOGvovVzsCBCFsa7F3ntG36aAiBYhCzSHPPE1Ph8+naW3nlohYctEGBCfEDZH+JqWjrqnw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":389005},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cards":{"types":"./dist/cards/index.d.ts","default":"./dist/cards/index.js"},"./package.json":"./package.json"},"scripts":{"tsc":"tsc --noEmit","test":"jest --passWithNoTests","build":"tsc","bake:css":"node scripts/bake-css.mjs","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"bluelamp","email":"shiraishi.tatsuya@mikoto.co.jp"},"_npmVersion":"11.5.1","description":"BlueLamp テナント branding とカード部品の器: API 型 / 判定の純関数 / React 部品 / CSS を別リポのフロント（YASHIRO）と backend の双方へ 1 か所から配る","directories":{},"_nodeVersion":"24.5.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","react":"^19.2.0","ts-jest":"^29.1.2","react-dom":"^19.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.0","@types/react":"^19.2.5","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/brand-kit_0.2.3_1788404449131_0.4189314980704446","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@bluelamp/brand-kit","version":"0.2.4","keywords":["bluelamp","branding","theme","sanitize","design-tokens","prompt-cards"],"author":{"name":"BlueLamp","email":"dev@bluelamp.app"},"license":"MIT","_id":"@bluelamp/brand-kit@0.2.4","maintainers":[{"name":"bluelamp","email":"shiraishi.tatsuya@mikoto.co.jp"}],"dist":{"shasum":"c58cf59af43c0436dbeb077b284bafe145775f44","tarball":"https://registry.npmjs.org/@bluelamp/brand-kit/-/brand-kit-0.2.4.tgz","fileCount":75,"integrity":"sha512-SHHXXoZo6sIhZUqXYeZ2ml4s7ZmgGRP55IDPWOVwWY+J9NsdXInArxhGsxPd8yhlMj8xvVFwUzdwrmvz30nyUw==","signatures":[{"sig":"MEUCIF8kSlrLZFr2Sdil1cspnXcan6mhsR+L6h4Txa+esUOjAiEA/tuJ8xE7WBU7nF/VxLFOSoWUa6uFETIVYrty8nOeF8c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":392246},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cards":{"types":"./dist/cards/index.d.ts","default":"./dist/cards/index.js"},"./package.json":"./package.json"},"scripts":{"tsc":"tsc --noEmit","test":"jest --passWithNoTests","build":"tsc","bake:css":"node scripts/bake-css.mjs","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"bluelamp","email":"shiraishi.tatsuya@mikoto.co.jp"},"_npmVersion":"11.5.1","description":"BlueLamp テナント branding とカード部品の器: API 型 / 判定の純関数 / React 部品 / CSS を別リポのフロント（YASHIRO）と backend の双方へ 1 か所から配る","directories":{},"_nodeVersion":"24.5.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","react":"^19.2.0","ts-jest":"^29.1.2","react-dom":"^19.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.0","@types/react":"^19.2.5","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/brand-kit_0.2.4_1788420344870_0.26255693250934087","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@bluelamp/brand-kit","version":"0.2.5","keywords":["bluelamp","branding","theme","sanitize","design-tokens","prompt-cards"],"author":{"name":"BlueLamp","email":"dev@bluelamp.app"},"license":"MIT","_id":"@bluelamp/brand-kit@0.2.5","maintainers":[{"name":"bluelamp","email":"shiraishi.tatsuya@mikoto.co.jp"}],"dist":{"shasum":"a978dd7442c596d19bc62424c3bb44be8c942c0c","tarball":"https://registry.npmjs.org/@bluelamp/brand-kit/-/brand-kit-0.2.5.tgz","fileCount":75,"integrity":"sha512-0LoqKDFXpA/9+c/mAtQI6aG1oHCrK4nZQS4sbDMBVnotKp+mEy8ZKqnLrrjRw/P8FXaCSyQKUkVtzqPzw7xF5g==","signatures":[{"sig":"MEUCIQDO52h6zGNBIqx9VIwFH4urW0o5yXa0RPkaJlKa3yAxrQIgV0KN7wexRUBCc+61aJBJEzGjyEaICzhQYW9Hhmk3Fk0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC3oXCZfJYeSo1eB9JZVW3WFaj11k8YRqG7j1/KUAxk4gIhANTIq70KHwCmR40nXBQvG2LZW8vb8+yEkkjSIGOV+V1j","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":412705},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cards":{"types":"./dist/cards/index.d.ts","default":"./dist/cards/index.js"},"./package.json":"./package.json"},"scripts":{"tsc":"tsc --noEmit","test":"jest --passWithNoTests","build":"tsc","bake:css":"node scripts/bake-css.mjs","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"bluelamp","email":"shiraishi.tatsuya@mikoto.co.jp"},"_npmVersion":"11.19.1","description":"BlueLamp テナント branding とカード部品の器: API 型 / 判定の純関数 / React 部品 / CSS を別リポのフロント（YASHIRO）と backend の双方へ 1 か所から配る","directories":{},"_nodeVersion":"26.10.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","react":"^19.2.0","ts-jest":"^29.1.2","react-dom":"^19.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.0","@types/react":"^19.2.5","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/brand-kit_0.2.5_1790401965276_0.6712354166295917","host":"s3://npm-registry-packages-npm-production"}},"0.2.6":{"_id":"@bluelamp/brand-kit@0.2.6","dist":{"shasum":"5f2b26a96d4dac25d97dde532da31ed05c313d51","tarball":"https://registry.npmjs.org/@bluelamp/brand-kit/-/brand-kit-0.2.6.tgz","fileCount":75,"integrity":"sha512-jqHoIaELpO1QsFf9qBK5+o8x9wzEnVuaRFLsK7CbjH8LaQQ2ai0ZZz790zlveOPwDPS0VcANy1GYEOjd2HyD7w==","signatures":[{"sig":"MEYCIQDazA4OebXRzJ8SDk8oD2sYF3+qH278/Ko+FKw0PRO1rgIhAJ6r7w5VKdNLZjKT37TmhGbCqCzBmuAQYzfbz/uTAy/T","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCID4cgHZl3o+4ChT/JwrjtRZ9KR1QQjuw1RdT2irAIPJ3AiBy5N3h2wMCES8RtNLEuqaKqqsLWgjwwSQloeD+HZ7QIQ=="}],"unpackedSize":413036},"main":"dist/index.js","name":"@bluelamp/brand-kit","types":"dist/index.d.ts","author":{"name":"BlueLamp","email":"dev@bluelamp.app"},"engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cards":{"types":"./dist/cards/index.d.ts","default":"./dist/cards/index.js"},"./package.json":"./package.json"},"gitHead":"d330c2bd24334ef60b27d01104664a403818c3c7","license":"MIT","scripts":{"tsc":"tsc --noEmit","test":"jest --passWithNoTests","build":"tsc","bake:css":"node scripts/bake-css.mjs","prepublishOnly":"npm run build && npm test"},"version":"0.2.6","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a6d49447-9230-427d-81fb-96e85f7e42ec"}},"keywords":["bluelamp","branding","theme","sanitize","design-tokens","prompt-cards"],"_npmVersion":"12.1.0","description":"BlueLamp テナント branding とカード部品の器: API 型 / 判定の純関数 / React 部品 / CSS を別リポのフロント（YASHIRO）と backend の双方へ 1 か所から配る","directories":{},"maintainers":[{"name":"bluelamp","email":"shiraishi.tatsuya@mikoto.co.jp"}],"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","react":"^19.2.0","ts-jest":"^29.1.2","react-dom":"^19.2.0","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.0","@types/react":"^19.2.5","@types/react-dom":"^19.2.3"},"peerDependencies":{"react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/brand-kit_0.2.6_1790496711994_0.3504651172811606"}}},"time":{"created":"2026-09-01T10:47:13.143Z","modified":"2026-09-27T08:11:52.253Z","0.1.0":"2026-09-01T10:47:13.723Z","0.2.0":"2026-09-02T00:33:20.548Z","0.2.1":"2026-09-02T07:26:59.476Z","0.2.2":"2026-09-03T00:14:56.872Z","0.2.3":"2026-09-03T03:00:49.259Z","0.2.4":"2026-09-03T07:25:45.013Z","0.2.5":"2026-09-26T05:52:45.371Z","0.2.6":"2026-09-27T08:11:52.080Z"},"author":{"name":"BlueLamp","email":"dev@bluelamp.app"},"license":"MIT","keywords":["bluelamp","branding","theme","sanitize","design-tokens","prompt-cards"],"description":"BlueLamp テナント branding とカード部品の器: API 型 / 判定の純関数 / React 部品 / CSS を別リポのフロント（YASHIRO）と backend の双方へ 1 か所から配る","maintainers":[{"name":"bluelamp","email":"shiraishi.tatsuya@mikoto.co.jp"}],"readme":"# @bluelamp/brand-kit\n\nBlueLamp テナント **branding とカード部品の器**。API 型 ／ 判定の純関数 ／ React 部品 ／ CSS を\n**1 か所から配る**。\n\nフロント（YASHIRO `yamatovision` の admin・portal）とバックエンド（`mikoto-monorepo/backend`）は\n別リポにある。型と見た目の定義を各自で持てば必ずズレるので、本パッケージから配って各自で持たない。\n\n- 仕様の正本: YASHIRO リポ `docs/requirements-yashiro-brand-E.md`（**型は §6 が正本**）\n- 🚨 原則④「BFF は加工しない＝**判断は BlueLamp 側に置いたまま**」。\n  本パッケージは判断を**配る**器であって、受け手が独自の判断を足す場所ではない。\n\n## 入っているもの\n\n| 面 | 出どころ | 備考 |\n|---|---|---|\n| 型 `TenantBranding` / `PublicBranding` / `TenantCategory` | 要件書 §6（正本） | 実装から逆算して増やさない |\n| sanitize `sanitizeBranding` ほか | `backend/src/bluelamp/lib/brandingSanitize.ts` から**移設** | ⛔ backend 側に re-export は残していない |\n| CSS トークン `resolveTenantTheme` / `buildThemeCssVariables` ほか | `apps/bluelamp-vscode/src/ui/theme/tenantTheme.ts` の値が**正** | 拡張側の差し替えは本便外 |\n| **カード部品**（`/cards` サブパス） | `apps/bluelamp-admin/src/components/promptCards/` から**移設**（板 #556 便 H1） | 見た目の正本は vscode 側・下記 |\n\n## 使い方\n\n```ts\nimport {\n  sanitizeBranding,\n  resolveTenantTheme,\n  buildThemeCssVariables,\n  TENANT_THEME_CSS_PROPERTIES,\n  type TenantBranding,\n} from '@bluelamp/brand-kit';\n\n// 配る側（BlueLamp backend）: 公開前に 1 回だけ通す\nconst publicBranding = sanitizeBranding(tenant.branding);\n\n// 受け手（admin のプレビュー / portal / VS Code webview）: そのまま CSS 変数へ\nconst vars = buildThemeCssVariables(resolveTenantTheme(publicBranding));\nfor (const key of TENANT_THEME_CSS_PROPERTIES) {\n  const value = vars[key];\n  // 今回設定されなかったものは消す（テナント A → B で A の色が残らないようにするため）\n  if (value) el.style.setProperty(key, value);\n  else el.style.removeProperty(key);\n}\n```\n\n## カード部品（`@bluelamp/brand-kit/cards`）\n\n会員が VSCode で見ているカードカタログそのもの（判定・見た目・D&D）。BlueLamp admin と\nYASHIRO admin の**両方がここから import する**（＝UI を 1 回だけ書く）。\n\n```ts\nimport {\n  PromptCardTabs, PromptCardView, useCardDrag,\n  buildTabs, toCatalogCards, planPlacement, buildPlacementBody,\n  injectPromptCardStyles, injectSlotsEditorStyles,\n  type CatalogCard, type PlaceableAssetsResponse,\n} from '@bluelamp/brand-kit/cards';\n\n// 見た目の注入は面が 1 回呼ぶ（この順序で）。二重注入は id で弾かれる。\ninjectPromptCardStyles();   // 会員側の design-system.css + promptCards.css（＋器の下に閉じた reset）\ninjectSlotsEditorStyles();  // 編集モードで足す分\n```\n\n### 🚨 見た目の単一源はここではない\n\n`origin: 'vscode'` の CSS の**正本は `apps/bluelamp-vscode/media/**`（会員が実際に見ている面）**で、\n本パッケージは**配布路**である。直すときは:\n\n```bash\n# ① 出典（vscode 側）を直す  ② 焼き直す  ③ 差分を commit\npnpm --filter \"@bluelamp/brand-kit\" run bake:css\n```\n\n⛔ `src/cards/generated/vscodeCss.ts` を手で直さない（単一源が 2 本になる）。\n焼き直し忘れと手編集は `tests/cards/cssSingleSource.test.ts` が捕まえる。\n⚠️ この焼き込みは**出典が vscode 側に在る間の経過措置**であり、恒久の設計ではない（CTO32 承認条件 ②）。\n\n例外は `src/cards/slotsEditor.css`（編集モードで足す分）。会員側に対応物が無いので**ここが正本**。\n\n### 🚨 root からは出していない\n\nカード部品は `react` を requires するため、入口は `/cards` サブパスに閉じてある。\nroot（`@bluelamp/brand-kit`）は **react 非依存**のままである——react を持たない消費者\n（`mikoto-monorepo/backend`）が root を require したときに実行時 `MODULE_NOT_FOUND` にしないため。\n\n## 2 つの色の正規化を取り違えないこと\n\n| 関数 | 何のため | `#abc` の扱い | 落ちたとき |\n|---|---|---|---|\n| `sanitizeBrandingColors` | **保存値を公開して安全にする** | `#abc` のまま（形を変えない） | そのキーだけ `undefined` |\n| `normalizeHexColor` | **CSS へ入れる値にする** | `#aabbcc` へ展開 | `null`（＝CSS 変数を設定しない＝既定色） |\n\n前者は「保存された生値の器」、後者は「CSS 文脈へ持ち込む値」。片方に寄せると、\n編集画面が表示する値と保存値がズレるか、CSS に短縮形が混ざる。**両方いる。**\n\n## 落とし方の原則\n\n**不正な 1 トークンだけ落として既定へフォールバックし、他のトークンは活かす。**\n「1 つ不正だから branding 全体を捨てる」は、利用者から見て原因が分からない壊れ方になる。\n\n## 開発\n\n```bash\nnpm install\nnpm run tsc      # 型検査\nnpm test         # unit（純関数のみ・モック不要）＋ CSS 単一源の対照\nnpm run bake:css # 出典 CSS の焼き直し（出典を直した後に回す）\nnpm run build    # dist/\n```\n\n⚠️ `build` は `tsc` **だけ**である。出典 CSS を読みに行かせないこと——本番 backend イメージの\nビルド文脈には `.gcloudignore` により `apps/` が入っておらず、`build` が出典を読むと\n**本番イメージのビルドが落ちる**（実測 2026-09-02）。焼き込みは `bake:css` の手番である。\n\n⛔ `npm publish` は **CTO が握る**（`.github/workflows/publish-npm.yml` の承認ゲート経由・不可逆チャネル）。\n","readmeFilename":"README.md"}