@agimon-ai/po-web-components 0.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +165 -0
- package/dist/_virtual/_rolldown/runtime.cjs +1 -0
- package/dist/_virtual/_rolldown/runtime.mjs +1 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.mts +69 -0
- package/dist/index.mjs +1 -0
- package/dist/mcpWidget.cjs +1 -0
- package/dist/mcpWidget.d.mts +3 -0
- package/dist/mcpWidget.mjs +1 -0
- package/dist/nativeTheme.cjs +1 -0
- package/dist/nativeTheme.d.mts +3 -0
- package/dist/nativeTheme.mjs +1 -0
- package/dist/node_modules/.pnpm/@modelcontextprotocol_server@2.2.0/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-CfX6zgs1.d.mts +27 -0
- package/dist/node_modules/.pnpm/@modelcontextprotocol_server@2.2.0/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-CfX6zgs1.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/@modelcontextprotocol_server@2.2.0/node_modules/@modelcontextprotocol/server/dist/index.d.mts +2 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/coerce.d.mts +20 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/coerce.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/compat.d.mts +50 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/compat.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/deep-partial.d.mts +10 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/deep-partial.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/errors.d.mts +33 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/errors.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/external.d.mts +28 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/external.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/from-json-schema.d.mts +14 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/from-json-schema.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/in-out.d.mts +13 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/in-out.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/iso.d.mts +13 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/iso.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/parse.d.mts +54 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/parse.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/schemas.d.mts +775 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/schemas.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/api.d.mts +331 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/api.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/checks.d.mts +296 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/checks.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/compile.d.mts +67 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/compile.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/core.d.mts +85 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/core.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/doc.d.mts +18 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/doc.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/errors.d.mts +219 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/errors.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/index.d.mts +24 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/index.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/json-schema-generator.d.mts +67 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/json-schema-generator.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/json-schema-processors.d.mts +12 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/json-schema-processors.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/json-schema.d.mts +95 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/json-schema.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/memoizer.d.mts +18 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/memoizer.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/parse.d.mts +54 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/parse.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/regexes.d.mts +94 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/regexes.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/registries.d.mts +35 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/registries.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/schemas.d.mts +1201 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/schemas.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/standard-schema.d.mts +120 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/standard-schema.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/to-json-schema.d.mts +157 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/to-json-schema.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/util.d.mts +237 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/util.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/versions.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/core/versions.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/index.d.mts +29 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/index.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ar.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ar.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/az.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/az.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/be.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/be.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/bg.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/bg.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/bn.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/bn.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ca.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ca.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ckb.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ckb.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/cs.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/cs.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/da.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/da.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/de.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/de.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/el.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/el.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/en.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/en.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/eo.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/eo.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/es.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/es.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/fa.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/fa.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/fi.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/fi.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/fr-CA.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/fr-CA.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/fr.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/fr.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/gu.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/gu.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/he.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/he.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/hi.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/hi.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/hr.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/hr.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/hu.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/hu.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/hy.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/hy.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/id.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/id.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/index.d.mts +69 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/index.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/is.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/is.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/it.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/it.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ja.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ja.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ka.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ka.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/kh.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/kh.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/km.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/km.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/kn.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/kn.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ko.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ko.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/lt.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/lt.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/mk.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/mk.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ms.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ms.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ne.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ne.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/nl.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/nl.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/nn.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/nn.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/no.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/no.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ota.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ota.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/pl.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/pl.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ps.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ps.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/pt-BR.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/pt-BR.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/pt.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/pt.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ro.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ro.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ru.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ru.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/sk.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/sk.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/sl.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/sl.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/sv.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/sv.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ta.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ta.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/tg.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/tg.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/th.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/th.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/tk.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/tk.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/tr.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/tr.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ua.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ua.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/uk.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/uk.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ur.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/ur.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/uz.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/uz.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/vi.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/vi.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/yo.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/yo.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/zh-CN.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/zh-CN.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/zh-TW.d.mts +8 -0
- package/dist/node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/locales/zh-TW.d.mts.map +1 -0
- package/dist/packages/core/po-core/dist/mcpWidget.d.mts +2 -0
- package/dist/packages/core/po-core/dist/src/extensions/webPlugin.d.mts +2 -0
- package/dist/packages/core/po-core/dist/src/web/models/globalStore.d.mts +1 -0
- package/dist/packages/core/po-core/dist/src/web/models/sessionStore.d.mts +1 -0
- package/dist/packages/core/po-core/dist/src/web/models/workspaceStore.d.mts +1 -0
- package/dist/packages/core/po-core/dist/src/web/schemas/template.d.mts +2 -0
- package/dist/packages/core/po-core/dist/src/web/services/mcpWidget.d.mts +1 -0
- package/dist/packages/core/po-core/dist/src/web/types/extensionFile.d.mts +3 -0
- package/dist/packages/core/po-core/dist/src/web/types/mcpWidget.d.mts +17 -0
- package/dist/packages/core/po-core/dist/src/web/types/mcpWidget.d.mts.map +1 -0
- package/dist/packages/core/po-core/dist/src/web/types/nativeTemplate.d.mts +2 -0
- package/dist/packages/core/po-core/dist/src/web/types/template.d.mts +1 -0
- package/dist/packages/core/po-core/dist/src/web/types/webPlugin.d.mts +3 -0
- package/dist/packages/core/po-core/dist/web.d.mts +12 -0
- package/dist/packages/core/po-web-components/src/components/Accordion.d.mts +11 -0
- package/dist/packages/core/po-web-components/src/components/Accordion.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Accordion.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Accordion.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/AnsiText.d.mts +16 -0
- package/dist/packages/core/po-web-components/src/components/AnsiText.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/AnsiText.mjs +4 -0
- package/dist/packages/core/po-web-components/src/components/AnsiText.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Avatar.d.mts +10 -0
- package/dist/packages/core/po-web-components/src/components/Avatar.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Avatar.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Avatar.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Badge.d.mts +17 -0
- package/dist/packages/core/po-web-components/src/components/Badge.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Badge.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Badge.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Breadcrumb.d.mts +36 -0
- package/dist/packages/core/po-web-components/src/components/Breadcrumb.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Breadcrumb.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Breadcrumb.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Button.d.mts +24 -0
- package/dist/packages/core/po-web-components/src/components/Button.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Button.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Button.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Checkbox.d.mts +8 -0
- package/dist/packages/core/po-web-components/src/components/Checkbox.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Checkbox.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Checkbox.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/CodeBlock.d.mts +23 -0
- package/dist/packages/core/po-web-components/src/components/CodeBlock.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/CodeBlock.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/CodeBlock.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/CodeEditor.d.mts +5 -0
- package/dist/packages/core/po-web-components/src/components/CodeEditor.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/CodeEditor.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/CodeEditor.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/CodeEditorView.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/CodeEditorView.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Collapsible.d.mts +10 -0
- package/dist/packages/core/po-web-components/src/components/Collapsible.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Collapsible.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Collapsible.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Command.d.mts +41 -0
- package/dist/packages/core/po-web-components/src/components/Command.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Command.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Command.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/CopyButton.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/CopyButton.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Dialog.d.mts +39 -0
- package/dist/packages/core/po-web-components/src/components/Dialog.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Dialog.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Dialog.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/DiffView.d.mts +16 -0
- package/dist/packages/core/po-web-components/src/components/DiffView.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/DiffView.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/DiffView.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Dot.d.mts +15 -0
- package/dist/packages/core/po-web-components/src/components/Dot.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Dot.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Dot.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Drawer.d.mts +17 -0
- package/dist/packages/core/po-web-components/src/components/Drawer.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Drawer.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Drawer.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/DropdownMenu.d.mts +34 -0
- package/dist/packages/core/po-web-components/src/components/DropdownMenu.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/DropdownMenu.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/DropdownMenu.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/EmptyState.d.mts +17 -0
- package/dist/packages/core/po-web-components/src/components/EmptyState.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/EmptyState.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/EmptyState.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/HashlineLines.d.mts +23 -0
- package/dist/packages/core/po-web-components/src/components/HashlineLines.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/HashlineLines.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/HashlineLines.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Input.d.mts +19 -0
- package/dist/packages/core/po-web-components/src/components/Input.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Input.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Input.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Kbd.d.mts +6 -0
- package/dist/packages/core/po-web-components/src/components/Kbd.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Kbd.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Kbd.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Label.d.mts +8 -0
- package/dist/packages/core/po-web-components/src/components/Label.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Label.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Label.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Markdown.d.mts +22 -0
- package/dist/packages/core/po-web-components/src/components/Markdown.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Markdown.mjs +3 -0
- package/dist/packages/core/po-web-components/src/components/Markdown.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/McpApp.d.mts +18 -0
- package/dist/packages/core/po-web-components/src/components/McpApp.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/McpApp.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/McpApp.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/McpToolWidget.d.mts +15 -0
- package/dist/packages/core/po-web-components/src/components/McpToolWidget.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/McpToolWidget.mjs +3 -0
- package/dist/packages/core/po-web-components/src/components/McpToolWidget.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/MediaPreview.d.mts +63 -0
- package/dist/packages/core/po-web-components/src/components/MediaPreview.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/MediaPreview.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/MediaPreview.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/MermaidDiagram.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/MermaidDiagram.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/MessageItem.d.mts +108 -0
- package/dist/packages/core/po-web-components/src/components/MessageItem.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/MessageItem.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/MessageItem.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/MessageLines.d.mts +23 -0
- package/dist/packages/core/po-web-components/src/components/MessageLines.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/MessageLines.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/MessageLines.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/OptionList.d.mts +49 -0
- package/dist/packages/core/po-web-components/src/components/OptionList.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/OptionList.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/OptionList.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Panel.d.mts +14 -0
- package/dist/packages/core/po-web-components/src/components/Panel.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Panel.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Panel.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/PdfPreview.d.mts +52 -0
- package/dist/packages/core/po-web-components/src/components/PdfPreview.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/PdfPreview.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/PdfPreview.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Picker.d.mts +52 -0
- package/dist/packages/core/po-web-components/src/components/Picker.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Picker.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Picker.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Popover.d.mts +19 -0
- package/dist/packages/core/po-web-components/src/components/Popover.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Popover.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Popover.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Progress.d.mts +8 -0
- package/dist/packages/core/po-web-components/src/components/Progress.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Progress.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Progress.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/RadioGroup.d.mts +15 -0
- package/dist/packages/core/po-web-components/src/components/RadioGroup.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/RadioGroup.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/RadioGroup.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/ReviewCommentDraft.d.mts +24 -0
- package/dist/packages/core/po-web-components/src/components/ReviewCommentDraft.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/ReviewCommentDraft.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/ReviewCommentDraft.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/ScrollArea.d.mts +13 -0
- package/dist/packages/core/po-web-components/src/components/ScrollArea.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/ScrollArea.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/ScrollArea.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/SectionLabel.d.mts +6 -0
- package/dist/packages/core/po-web-components/src/components/SectionLabel.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/SectionLabel.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/SectionLabel.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Select.d.mts +19 -0
- package/dist/packages/core/po-web-components/src/components/Select.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Select.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Select.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Separator.d.mts +13 -0
- package/dist/packages/core/po-web-components/src/components/Separator.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Separator.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Separator.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Settings.d.mts +56 -0
- package/dist/packages/core/po-web-components/src/components/Settings.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Settings.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Settings.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Sheet.d.mts +35 -0
- package/dist/packages/core/po-web-components/src/components/Sheet.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Sheet.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Sheet.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Skeleton.d.mts +10 -0
- package/dist/packages/core/po-web-components/src/components/Skeleton.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Skeleton.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Skeleton.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Spinner.d.mts +14 -0
- package/dist/packages/core/po-web-components/src/components/Spinner.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Spinner.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Spinner.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/StatusBadge.d.mts +23 -0
- package/dist/packages/core/po-web-components/src/components/StatusBadge.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/StatusBadge.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/StatusBadge.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/StreamCursor.d.mts +6 -0
- package/dist/packages/core/po-web-components/src/components/StreamCursor.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/StreamCursor.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/StreamCursor.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Switch.d.mts +8 -0
- package/dist/packages/core/po-web-components/src/components/Switch.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Switch.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Switch.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/SyntaxText.d.mts +50 -0
- package/dist/packages/core/po-web-components/src/components/SyntaxText.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/SyntaxText.mjs +4 -0
- package/dist/packages/core/po-web-components/src/components/SyntaxText.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Tabs.d.mts +36 -0
- package/dist/packages/core/po-web-components/src/components/Tabs.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Tabs.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Tabs.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/TerminalView.d.mts +31 -0
- package/dist/packages/core/po-web-components/src/components/TerminalView.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/TerminalView.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/TerminalView.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Textarea.d.mts +9 -0
- package/dist/packages/core/po-web-components/src/components/Textarea.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Textarea.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Textarea.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Toast.d.mts +24 -0
- package/dist/packages/core/po-web-components/src/components/Toast.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Toast.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Toast.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/ToolPathLink.d.mts +22 -0
- package/dist/packages/core/po-web-components/src/components/ToolPathLink.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/ToolPathLink.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/ToolPathLink.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Tooltip.d.mts +11 -0
- package/dist/packages/core/po-web-components/src/components/Tooltip.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/components/Tooltip.mjs +2 -0
- package/dist/packages/core/po-web-components/src/components/Tooltip.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/icons/icons.d.mts +2 -0
- package/dist/packages/core/po-web-components/src/icons/icons.mjs +1 -0
- package/dist/packages/core/po-web-components/src/lib/ansiSpans.d.mts +42 -0
- package/dist/packages/core/po-web-components/src/lib/ansiSpans.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/ansiSpans.mjs +2 -0
- package/dist/packages/core/po-web-components/src/lib/ansiSpans.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/cn.d.mts +6 -0
- package/dist/packages/core/po-web-components/src/lib/cn.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/cn.mjs +2 -0
- package/dist/packages/core/po-web-components/src/lib/cn.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/collapse.d.mts +14 -0
- package/dist/packages/core/po-web-components/src/lib/collapse.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/collapse.mjs +2 -0
- package/dist/packages/core/po-web-components/src/lib/collapse.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/editorController.mjs +2 -0
- package/dist/packages/core/po-web-components/src/lib/editorController.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/editorLanguage.d.mts +21 -0
- package/dist/packages/core/po-web-components/src/lib/editorLanguage.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/editorLanguage.mjs +2 -0
- package/dist/packages/core/po-web-components/src/lib/editorLanguage.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/editorTheme.d.mts +76 -0
- package/dist/packages/core/po-web-components/src/lib/editorTheme.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/editorTheme.mjs +2 -0
- package/dist/packages/core/po-web-components/src/lib/editorTheme.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/fenceGrammar.mjs +2 -0
- package/dist/packages/core/po-web-components/src/lib/fenceGrammar.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/hashlineHighlight.d.mts +30 -0
- package/dist/packages/core/po-web-components/src/lib/hashlineHighlight.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/hashlineHighlight.mjs +3 -0
- package/dist/packages/core/po-web-components/src/lib/hashlineHighlight.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/hashlineView.d.mts +60 -0
- package/dist/packages/core/po-web-components/src/lib/hashlineView.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/hashlineView.mjs +6 -0
- package/dist/packages/core/po-web-components/src/lib/hashlineView.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/media.d.mts +11 -0
- package/dist/packages/core/po-web-components/src/lib/media.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/media.mjs +2 -0
- package/dist/packages/core/po-web-components/src/lib/media.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/mediaPlayback.mjs +2 -0
- package/dist/packages/core/po-web-components/src/lib/mediaPlayback.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/mermaidDiagram.mjs +2 -0
- package/dist/packages/core/po-web-components/src/lib/mermaidDiagram.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/optionList.d.mts +21 -0
- package/dist/packages/core/po-web-components/src/lib/optionList.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/optionList.mjs +2 -0
- package/dist/packages/core/po-web-components/src/lib/optionList.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/pathGroups.d.mts +23 -0
- package/dist/packages/core/po-web-components/src/lib/pathGroups.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/pathGroups.mjs +2 -0
- package/dist/packages/core/po-web-components/src/lib/pathGroups.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/picker.d.mts +10 -0
- package/dist/packages/core/po-web-components/src/lib/picker.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/picker.mjs +2 -0
- package/dist/packages/core/po-web-components/src/lib/picker.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/review.d.mts +40 -0
- package/dist/packages/core/po-web-components/src/lib/review.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/review.mjs +8 -0
- package/dist/packages/core/po-web-components/src/lib/review.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/syntaxHighlight.d.mts +54 -0
- package/dist/packages/core/po-web-components/src/lib/syntaxHighlight.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/syntaxHighlight.mjs +3 -0
- package/dist/packages/core/po-web-components/src/lib/syntaxHighlight.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/tone.d.mts +25 -0
- package/dist/packages/core/po-web-components/src/lib/tone.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/lib/tone.mjs +2 -0
- package/dist/packages/core/po-web-components/src/lib/tone.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/theme/apply.d.mts +25 -0
- package/dist/packages/core/po-web-components/src/theme/apply.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/theme/apply.mjs +3 -0
- package/dist/packages/core/po-web-components/src/theme/apply.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/theme/builtinThemes.d.mts +11 -0
- package/dist/packages/core/po-web-components/src/theme/builtinThemes.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/theme/builtinThemes.mjs +2 -0
- package/dist/packages/core/po-web-components/src/theme/builtinThemes.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/theme/derive.d.mts +14 -0
- package/dist/packages/core/po-web-components/src/theme/derive.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/theme/derive.mjs +2 -0
- package/dist/packages/core/po-web-components/src/theme/derive.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/theme/nativeTheme.d.mts +131 -0
- package/dist/packages/core/po-web-components/src/theme/nativeTheme.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/theme/nativeTheme.mjs +2 -0
- package/dist/packages/core/po-web-components/src/theme/nativeTheme.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/theme/parse.d.mts +10 -0
- package/dist/packages/core/po-web-components/src/theme/parse.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/theme/parse.mjs +2 -0
- package/dist/packages/core/po-web-components/src/theme/parse.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/theme/piTheme.d.mts +19 -0
- package/dist/packages/core/po-web-components/src/theme/piTheme.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/theme/piTheme.mjs +2 -0
- package/dist/packages/core/po-web-components/src/theme/piTheme.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/theme/preference.d.mts +15 -0
- package/dist/packages/core/po-web-components/src/theme/preference.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/theme/preference.mjs +2 -0
- package/dist/packages/core/po-web-components/src/theme/preference.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/types/diff.d.mts +46 -0
- package/dist/packages/core/po-web-components/src/types/diff.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/types/editor.d.mts +78 -0
- package/dist/packages/core/po-web-components/src/types/editor.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/types/editor.mjs +2 -0
- package/dist/packages/core/po-web-components/src/types/editor.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/types/theme.d.mts +38 -0
- package/dist/packages/core/po-web-components/src/types/theme.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/types/theme.mjs +2 -0
- package/dist/packages/core/po-web-components/src/types/theme.mjs.map +1 -0
- package/dist/packages/core/po-web-components/src/types/tone.d.mts +28 -0
- package/dist/packages/core/po-web-components/src/types/tone.d.mts.map +1 -0
- package/dist/packages/core/po-web-components/src/types/tone.mjs +2 -0
- package/dist/packages/core/po-web-components/src/types/tone.mjs.map +1 -0
- package/dist/packages/core/po-web-components/themes/doom-nord-dark.mjs +2 -0
- package/dist/packages/core/po-web-components/themes/doom-nord-dark.mjs.map +1 -0
- package/dist/packages/core/po-web-components/themes/doom-one-dark.mjs +2 -0
- package/dist/packages/core/po-web-components/themes/doom-one-dark.mjs.map +1 -0
- package/dist/packages/core/po-web-components/themes/doom-one-light.mjs +2 -0
- package/dist/packages/core/po-web-components/themes/doom-one-light.mjs.map +1 -0
- package/dist/src/components/Accordion.cjs +2 -0
- package/dist/src/components/Accordion.cjs.map +1 -0
- package/dist/src/components/AnsiText.cjs +4 -0
- package/dist/src/components/AnsiText.cjs.map +1 -0
- package/dist/src/components/Avatar.cjs +2 -0
- package/dist/src/components/Avatar.cjs.map +1 -0
- package/dist/src/components/Badge.cjs +2 -0
- package/dist/src/components/Badge.cjs.map +1 -0
- package/dist/src/components/Breadcrumb.cjs +2 -0
- package/dist/src/components/Breadcrumb.cjs.map +1 -0
- package/dist/src/components/Button.cjs +2 -0
- package/dist/src/components/Button.cjs.map +1 -0
- package/dist/src/components/Checkbox.cjs +2 -0
- package/dist/src/components/Checkbox.cjs.map +1 -0
- package/dist/src/components/CodeBlock.cjs +2 -0
- package/dist/src/components/CodeBlock.cjs.map +1 -0
- package/dist/src/components/CodeEditor.cjs +2 -0
- package/dist/src/components/CodeEditor.cjs.map +1 -0
- package/dist/src/components/CodeEditorView.cjs +2 -0
- package/dist/src/components/CodeEditorView.cjs.map +1 -0
- package/dist/src/components/Collapsible.cjs +2 -0
- package/dist/src/components/Collapsible.cjs.map +1 -0
- package/dist/src/components/Command.cjs +2 -0
- package/dist/src/components/Command.cjs.map +1 -0
- package/dist/src/components/CopyButton.cjs +2 -0
- package/dist/src/components/CopyButton.cjs.map +1 -0
- package/dist/src/components/Dialog.cjs +2 -0
- package/dist/src/components/Dialog.cjs.map +1 -0
- package/dist/src/components/DiffView.cjs +2 -0
- package/dist/src/components/DiffView.cjs.map +1 -0
- package/dist/src/components/Dot.cjs +2 -0
- package/dist/src/components/Dot.cjs.map +1 -0
- package/dist/src/components/Drawer.cjs +2 -0
- package/dist/src/components/Drawer.cjs.map +1 -0
- package/dist/src/components/DropdownMenu.cjs +2 -0
- package/dist/src/components/DropdownMenu.cjs.map +1 -0
- package/dist/src/components/EmptyState.cjs +2 -0
- package/dist/src/components/EmptyState.cjs.map +1 -0
- package/dist/src/components/HashlineLines.cjs +2 -0
- package/dist/src/components/HashlineLines.cjs.map +1 -0
- package/dist/src/components/Input.cjs +2 -0
- package/dist/src/components/Input.cjs.map +1 -0
- package/dist/src/components/Kbd.cjs +2 -0
- package/dist/src/components/Kbd.cjs.map +1 -0
- package/dist/src/components/Label.cjs +2 -0
- package/dist/src/components/Label.cjs.map +1 -0
- package/dist/src/components/Markdown.cjs +3 -0
- package/dist/src/components/Markdown.cjs.map +1 -0
- package/dist/src/components/McpApp.cjs +2 -0
- package/dist/src/components/McpApp.cjs.map +1 -0
- package/dist/src/components/McpToolWidget.cjs +3 -0
- package/dist/src/components/McpToolWidget.cjs.map +1 -0
- package/dist/src/components/MediaPreview.cjs +2 -0
- package/dist/src/components/MediaPreview.cjs.map +1 -0
- package/dist/src/components/MermaidDiagram.cjs +2 -0
- package/dist/src/components/MermaidDiagram.cjs.map +1 -0
- package/dist/src/components/MessageItem.cjs +2 -0
- package/dist/src/components/MessageItem.cjs.map +1 -0
- package/dist/src/components/MessageLines.cjs +2 -0
- package/dist/src/components/MessageLines.cjs.map +1 -0
- package/dist/src/components/OptionList.cjs +2 -0
- package/dist/src/components/OptionList.cjs.map +1 -0
- package/dist/src/components/Panel.cjs +2 -0
- package/dist/src/components/Panel.cjs.map +1 -0
- package/dist/src/components/PdfPreview.cjs +2 -0
- package/dist/src/components/PdfPreview.cjs.map +1 -0
- package/dist/src/components/Picker.cjs +2 -0
- package/dist/src/components/Picker.cjs.map +1 -0
- package/dist/src/components/Popover.cjs +2 -0
- package/dist/src/components/Popover.cjs.map +1 -0
- package/dist/src/components/Progress.cjs +2 -0
- package/dist/src/components/Progress.cjs.map +1 -0
- package/dist/src/components/RadioGroup.cjs +2 -0
- package/dist/src/components/RadioGroup.cjs.map +1 -0
- package/dist/src/components/ReviewCommentDraft.cjs +2 -0
- package/dist/src/components/ReviewCommentDraft.cjs.map +1 -0
- package/dist/src/components/ScrollArea.cjs +2 -0
- package/dist/src/components/ScrollArea.cjs.map +1 -0
- package/dist/src/components/SectionLabel.cjs +2 -0
- package/dist/src/components/SectionLabel.cjs.map +1 -0
- package/dist/src/components/Select.cjs +2 -0
- package/dist/src/components/Select.cjs.map +1 -0
- package/dist/src/components/Separator.cjs +2 -0
- package/dist/src/components/Separator.cjs.map +1 -0
- package/dist/src/components/Settings.cjs +2 -0
- package/dist/src/components/Settings.cjs.map +1 -0
- package/dist/src/components/Sheet.cjs +2 -0
- package/dist/src/components/Sheet.cjs.map +1 -0
- package/dist/src/components/Skeleton.cjs +2 -0
- package/dist/src/components/Skeleton.cjs.map +1 -0
- package/dist/src/components/Spinner.cjs +2 -0
- package/dist/src/components/Spinner.cjs.map +1 -0
- package/dist/src/components/StatusBadge.cjs +2 -0
- package/dist/src/components/StatusBadge.cjs.map +1 -0
- package/dist/src/components/StreamCursor.cjs +2 -0
- package/dist/src/components/StreamCursor.cjs.map +1 -0
- package/dist/src/components/Switch.cjs +2 -0
- package/dist/src/components/Switch.cjs.map +1 -0
- package/dist/src/components/SyntaxText.cjs +4 -0
- package/dist/src/components/SyntaxText.cjs.map +1 -0
- package/dist/src/components/Tabs.cjs +2 -0
- package/dist/src/components/Tabs.cjs.map +1 -0
- package/dist/src/components/TerminalView.cjs +2 -0
- package/dist/src/components/TerminalView.cjs.map +1 -0
- package/dist/src/components/Textarea.cjs +2 -0
- package/dist/src/components/Textarea.cjs.map +1 -0
- package/dist/src/components/Toast.cjs +2 -0
- package/dist/src/components/Toast.cjs.map +1 -0
- package/dist/src/components/ToolPathLink.cjs +2 -0
- package/dist/src/components/ToolPathLink.cjs.map +1 -0
- package/dist/src/components/Tooltip.cjs +2 -0
- package/dist/src/components/Tooltip.cjs.map +1 -0
- package/dist/src/icons/icons.cjs +1 -0
- package/dist/src/lib/ansiSpans.cjs +2 -0
- package/dist/src/lib/ansiSpans.cjs.map +1 -0
- package/dist/src/lib/cn.cjs +2 -0
- package/dist/src/lib/cn.cjs.map +1 -0
- package/dist/src/lib/collapse.cjs +2 -0
- package/dist/src/lib/collapse.cjs.map +1 -0
- package/dist/src/lib/editorController.cjs +2 -0
- package/dist/src/lib/editorController.cjs.map +1 -0
- package/dist/src/lib/editorLanguage.cjs +2 -0
- package/dist/src/lib/editorLanguage.cjs.map +1 -0
- package/dist/src/lib/editorTheme.cjs +2 -0
- package/dist/src/lib/editorTheme.cjs.map +1 -0
- package/dist/src/lib/fenceGrammar.cjs +2 -0
- package/dist/src/lib/fenceGrammar.cjs.map +1 -0
- package/dist/src/lib/hashlineHighlight.cjs +3 -0
- package/dist/src/lib/hashlineHighlight.cjs.map +1 -0
- package/dist/src/lib/hashlineView.cjs +6 -0
- package/dist/src/lib/hashlineView.cjs.map +1 -0
- package/dist/src/lib/media.cjs +2 -0
- package/dist/src/lib/media.cjs.map +1 -0
- package/dist/src/lib/mediaPlayback.cjs +2 -0
- package/dist/src/lib/mediaPlayback.cjs.map +1 -0
- package/dist/src/lib/mermaidDiagram.cjs +2 -0
- package/dist/src/lib/mermaidDiagram.cjs.map +1 -0
- package/dist/src/lib/optionList.cjs +2 -0
- package/dist/src/lib/optionList.cjs.map +1 -0
- package/dist/src/lib/pathGroups.cjs +2 -0
- package/dist/src/lib/pathGroups.cjs.map +1 -0
- package/dist/src/lib/picker.cjs +2 -0
- package/dist/src/lib/picker.cjs.map +1 -0
- package/dist/src/lib/review.cjs +8 -0
- package/dist/src/lib/review.cjs.map +1 -0
- package/dist/src/lib/syntaxHighlight.cjs +3 -0
- package/dist/src/lib/syntaxHighlight.cjs.map +1 -0
- package/dist/src/lib/tone.cjs +2 -0
- package/dist/src/lib/tone.cjs.map +1 -0
- package/dist/src/theme/apply.cjs +3 -0
- package/dist/src/theme/apply.cjs.map +1 -0
- package/dist/src/theme/builtinThemes.cjs +2 -0
- package/dist/src/theme/builtinThemes.cjs.map +1 -0
- package/dist/src/theme/derive.cjs +2 -0
- package/dist/src/theme/derive.cjs.map +1 -0
- package/dist/src/theme/nativeTheme.cjs +2 -0
- package/dist/src/theme/nativeTheme.cjs.map +1 -0
- package/dist/src/theme/parse.cjs +2 -0
- package/dist/src/theme/parse.cjs.map +1 -0
- package/dist/src/theme/piTheme.cjs +2 -0
- package/dist/src/theme/piTheme.cjs.map +1 -0
- package/dist/src/theme/preference.cjs +2 -0
- package/dist/src/theme/preference.cjs.map +1 -0
- package/dist/src/types/editor.cjs +2 -0
- package/dist/src/types/editor.cjs.map +1 -0
- package/dist/src/types/theme.cjs +2 -0
- package/dist/src/types/theme.cjs.map +1 -0
- package/dist/src/types/tone.cjs +2 -0
- package/dist/src/types/tone.cjs.map +1 -0
- package/dist/theme.cjs +1 -0
- package/dist/theme.d.mts +8 -0
- package/dist/theme.mjs +1 -0
- package/dist/themes/doom-nord-dark.cjs +2 -0
- package/dist/themes/doom-nord-dark.cjs.map +1 -0
- package/dist/themes/doom-one-dark.cjs +2 -0
- package/dist/themes/doom-one-dark.cjs.map +1 -0
- package/dist/themes/doom-one-light.cjs +2 -0
- package/dist/themes/doom-one-light.cjs.map +1 -0
- package/llms.txt +8 -0
- package/package.json +130 -0
- package/styles/mcp.css +22 -0
- package/styles/preview.css +17 -0
- package/styles/theme.css +311 -0
- package/styles/tokens.css +15 -0
- package/themes/doom-nord-dark.json +27 -0
- package/themes/doom-one-dark.json +30 -0
- package/themes/doom-one-light.json +28 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolPathLink.cjs","names":["cn","require_cn","react_jsx_runtime","ToolPathLink","testId","props","onOpen","className","path"],"sources":["../../../src/components/ToolPathLink.tsx"],"sourcesContent":["import { cn } from '../lib/cn';\n\n/**\n * The file path in a tool call's header, as a link when something can open it.\n *\n * A read, a write and an edit all put a path in the same place, and a reader\n * who wants to see that file should not have to go looking for it in a file\n * list. Whether the path can be opened is not this component's business: the\n * host resolves it against whatever plugin owns files, and hands the answer\n * down as `onOpen`. Without one the path stays exactly what it was, plain\n * text, because a link that opens nothing is worse than no link.\n */\n\nexport interface ToolPathLinkProps {\n path: string;\n /** Opens the file; omitted when nothing installed can show it. */\n onOpen?: () => void;\n className?: string;\n /** Defaults to `tool-path`, which is how a test finds the link inside a call header. */\n 'data-testid'?: string;\n}\n\nexport function ToolPathLink({\n path,\n onOpen,\n className,\n 'data-testid': testId = 'tool-path',\n ...props\n}: ToolPathLinkProps) {\n if (onOpen === undefined) {\n return (\n <span\n data-slot=\"tool-path\"\n data-testid={testId}\n className={cn('inline-block max-w-full min-w-0 truncate align-bottom text-doom-text', className)}\n {...props}\n >\n {path}\n </span>\n );\n }\n return (\n <button\n type=\"button\"\n data-slot=\"tool-path\"\n data-testid={testId}\n title={`open ${path}`}\n onClick={onOpen}\n className={cn(\n 'min-h-6 max-w-full min-w-0 cursor-pointer truncate text-left text-doom-text hover:text-doom-blue hover:underline',\n className,\n )}\n {...props}\n >\n {path}\n </button>\n );\n}\n"],"mappings":"oEAsBA,SAAgBG,EAAa,CAC3B,OACA,SACA,YACA,cAAeC,EAAS,YACxB,GAAGC,GACiB,CAapB,OAZIC,IAAW,IAAA,GAEX,iBAAA,EAAAJ,EAAA,IAAA,CAAC,OAAD,CACE,YAAU,YACV,cAAaE,EACb,UAAWJ,EAAAA,GAAG,uEAAwEO,CAAS,EAC/F,GAAIF,EAEH,SAAAG,CACG,CAAA,EAIR,iBAAA,EAAAN,EAAA,IAAA,CAAC,SAAD,CACE,KAAK,SACL,YAAU,YACV,cAAaE,EACb,MAAO,QAAQI,IACf,QAASF,EACT,UAAWN,EAAAA,GACT,mHACAO,CACF,EACA,GAAIF,EAEH,SAAAG,CACK,CAAA,CAEZ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../lib/cn.cjs");let t=require("radix-ui"),n=require("react/jsx-runtime");function r({delayDuration:e=300,...r}){return/* @__PURE__ */ (0,n.jsx)(t.Tooltip.Provider,{"data-slot":`tooltip-provider`,delayDuration:e,...r})}function i(e){return/* @__PURE__ */ (0,n.jsx)(t.Tooltip.Root,{"data-slot":`tooltip`,...e})}function a(e){return/* @__PURE__ */ (0,n.jsx)(t.Tooltip.Trigger,{"data-slot":`tooltip-trigger`,...e})}function o({className:r,sideOffset:i=4,children:a,...o}){return/* @__PURE__ */ (0,n.jsx)(t.Tooltip.Portal,{children:/* @__PURE__ */ (0,n.jsx)(t.Tooltip.Content,{"data-slot":`tooltip-content`,sideOffset:i,className:e.cn(`z-50 rounded border border-doom-border bg-doom-deep px-2 py-1 text-sm text-doom-text shadow-lg data-[state=delayed-open]:animate-doom-fade`,r),...o,children:a})})}exports.Tooltip=i,exports.TooltipContent=o,exports.TooltipProvider=r,exports.TooltipTrigger=a;
|
|
2
|
+
//# sourceMappingURL=Tooltip.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tooltip.cjs","names":["TooltipPrimitive","cn","require_cn","radix_ui","react_jsx_runtime","TooltipProvider","props","Tooltip","TooltipTrigger","TooltipContent","className"],"sources":["../../../src/components/Tooltip.tsx"],"sourcesContent":["import { Tooltip as TooltipPrimitive } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/** Mount once near the root; every Tooltip below shares its delay. */\nexport function TooltipProvider({ delayDuration = 300, ...props }: ComponentProps<typeof TooltipPrimitive.Provider>) {\n return <TooltipPrimitive.Provider data-slot=\"tooltip-provider\" delayDuration={delayDuration} {...props} />;\n}\n\nexport function Tooltip(props: ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />;\n}\n\nexport function TooltipTrigger(props: ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nexport function TooltipContent({\n className,\n sideOffset = 4,\n children,\n ...props\n}: ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n 'z-50 rounded border border-doom-border bg-doom-deep px-2 py-1 text-sm text-doom-text shadow-lg data-[state=delayed-open]:animate-doom-fade',\n className,\n )}\n {...props}\n >\n {children}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n"],"mappings":"0FAMA,SAAgBK,EAAgB,CAAE,gBAAgB,IAAK,GAAGC,GAA2D,CACnH,MAAO,iBAAA,EAAAF,EAAA,IAAA,CAACJ,EAAAA,QAAiB,SAAlB,CAA2B,YAAU,mBAAkC,gBAAe,GAAIM,CAAQ,CAAA,CAC3G,CAEA,SAAgBC,EAAQ,EAAqD,CAC3E,MAAO,iBAAA,EAAAH,EAAA,IAAA,CAACJ,EAAAA,QAAiB,KAAlB,CAAuB,YAAU,UAAU,GAAIM,CAAQ,CAAA,CAChE,CAEA,SAAgBE,EAAe,EAAwD,CACrF,MAAO,iBAAA,EAAAJ,EAAA,IAAA,CAACJ,EAAAA,QAAiB,QAAlB,CAA0B,YAAU,kBAAkB,GAAIM,CAAQ,CAAA,CAC3E,CAEA,SAAgBG,EAAe,CAC7B,YACA,aAAa,EACb,WACA,GAAGH,GAC+C,CAClD,MACE,iBAAA,EAAAF,EAAA,IAAA,CAACJ,EAAAA,QAAiB,OAAlB,CAAA,SACE,iBAAA,EAAAI,EAAA,IAAA,CAACJ,EAAAA,QAAiB,QAAlB,CACE,YAAU,kBACE,aACZ,UAAWC,EAAAA,GACT,6IACAS,CACF,EACA,GAAIJ,EAEH,UACuB,CAAA,CACH,CAAA,CAE7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
let e=require("lucide-react");Object.defineProperty(exports,"ActivityIcon",{enumerable:!0,get:function(){return e.Activity}}),Object.defineProperty(exports,"AlertIcon",{enumerable:!0,get:function(){return e.CircleAlert}}),Object.defineProperty(exports,"ArrowRightIcon",{enumerable:!0,get:function(){return e.ArrowRight}}),Object.defineProperty(exports,"AudioLinesIcon",{enumerable:!0,get:function(){return e.AudioLines}}),Object.defineProperty(exports,"BookmarkPlusIcon",{enumerable:!0,get:function(){return e.BookmarkPlus}}),Object.defineProperty(exports,"BranchIcon",{enumerable:!0,get:function(){return e.GitBranch}}),Object.defineProperty(exports,"CheckIcon",{enumerable:!0,get:function(){return e.Check}}),Object.defineProperty(exports,"ChevronDownIcon",{enumerable:!0,get:function(){return e.ChevronDown}}),Object.defineProperty(exports,"ChevronRightIcon",{enumerable:!0,get:function(){return e.ChevronRight}}),Object.defineProperty(exports,"ChevronUpIcon",{enumerable:!0,get:function(){return e.ChevronUp}}),Object.defineProperty(exports,"CloseIcon",{enumerable:!0,get:function(){return e.X}}),Object.defineProperty(exports,"CopyIcon",{enumerable:!0,get:function(){return e.Copy}}),Object.defineProperty(exports,"EditIcon",{enumerable:!0,get:function(){return e.Pencil}}),Object.defineProperty(exports,"EnterIcon",{enumerable:!0,get:function(){return e.CornerDownLeft}}),Object.defineProperty(exports,"ExternalLinkIcon",{enumerable:!0,get:function(){return e.ExternalLink}}),Object.defineProperty(exports,"FileIcon",{enumerable:!0,get:function(){return e.FileText}}),Object.defineProperty(exports,"FolderIcon",{enumerable:!0,get:function(){return e.Folder}}),Object.defineProperty(exports,"ForkIcon",{enumerable:!0,get:function(){return e.GitFork}}),Object.defineProperty(exports,"GearIcon",{enumerable:!0,get:function(){return e.Settings}}),Object.defineProperty(exports,"HomeIcon",{enumerable:!0,get:function(){return e.House}}),Object.defineProperty(exports,"KebabIcon",{enumerable:!0,get:function(){return e.MoreVertical}}),Object.defineProperty(exports,"LightbulbIcon",{enumerable:!0,get:function(){return e.Lightbulb}}),Object.defineProperty(exports,"LoaderIcon",{enumerable:!0,get:function(){return e.Loader2}}),Object.defineProperty(exports,"LockIcon",{enumerable:!0,get:function(){return e.Lock}}),Object.defineProperty(exports,"MessageIcon",{enumerable:!0,get:function(){return e.MessageCircle}}),Object.defineProperty(exports,"MicIcon",{enumerable:!0,get:function(){return e.Mic}}),Object.defineProperty(exports,"PaletteIcon",{enumerable:!0,get:function(){return e.Palette}}),Object.defineProperty(exports,"PaperclipIcon",{enumerable:!0,get:function(){return e.Paperclip}}),Object.defineProperty(exports,"PlayCircleIcon",{enumerable:!0,get:function(){return e.CirclePlay}}),Object.defineProperty(exports,"PlusIcon",{enumerable:!0,get:function(){return e.Plus}}),Object.defineProperty(exports,"QuoteIcon",{enumerable:!0,get:function(){return e.Quote}}),Object.defineProperty(exports,"RefreshIcon",{enumerable:!0,get:function(){return e.RefreshCw}}),Object.defineProperty(exports,"RewindIcon",{enumerable:!0,get:function(){return e.Rewind}}),Object.defineProperty(exports,"SearchIcon",{enumerable:!0,get:function(){return e.Search}}),Object.defineProperty(exports,"SendIcon",{enumerable:!0,get:function(){return e.Send}}),Object.defineProperty(exports,"ShieldIcon",{enumerable:!0,get:function(){return e.ShieldCheck}}),Object.defineProperty(exports,"SparklesIcon",{enumerable:!0,get:function(){return e.Sparkles}}),Object.defineProperty(exports,"StopIcon",{enumerable:!0,get:function(){return e.Square}}),Object.defineProperty(exports,"TaskIcon",{enumerable:!0,get:function(){return e.SquareCheckBig}}),Object.defineProperty(exports,"TrashIcon",{enumerable:!0,get:function(){return e.Trash2}}),Object.defineProperty(exports,"UnlockIcon",{enumerable:!0,get:function(){return e.LockOpen}}),Object.defineProperty(exports,"UserIcon",{enumerable:!0,get:function(){return e.UserRound}}),Object.defineProperty(exports,"UsersIcon",{enumerable:!0,get:function(){return e.Users}}),Object.defineProperty(exports,"VolumeIcon",{enumerable:!0,get:function(){return e.Volume2}}),Object.defineProperty(exports,"WorkflowIcon",{enumerable:!0,get:function(){return e.Workflow}}),Object.defineProperty(exports,"WrenchIcon",{enumerable:!0,get:function(){return e.Wrench}});
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=/\x1b\[([0-9;:]*)([A-Za-z])|\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)|\x1b[()][A-Za-z0-9]|\x1b[A-Za-z]/g,t={30:`text-doom-faint`,31:`text-doom-red`,32:`text-doom-green`,33:`text-doom-yellow`,34:`text-doom-blue`,35:`text-doom-magenta`,36:`text-doom-cyan`,37:`text-doom-text`,90:`text-doom-dim`,91:`text-doom-red`,92:`text-doom-green`,93:`text-doom-orange`,94:`text-doom-blue`,95:`text-doom-violet`,96:`text-doom-cyan`,97:`text-doom-hi`};function n(){return{bold:!1,faint:!1,italic:!1,underline:!1,inverse:!1}}function r(e){if(e<0||e>=256||e<16)return;if(e>=232){let t=(e-232)*10+8;return i(t,t,t)}let t=e-16,n=e=>e===0?0:e*40+55;return i(n(Math.floor(t/36)%6),n(Math.floor(t/6)%6),n(t%6))}function i(e,t,n){let r=e=>Math.max(0,Math.min(255,Math.round(e)));return`rgb(${r(e)} ${r(t)} ${r(n)})`}function a(e,t){let n=e[t+1];if(n===2){let[n,r,a]=e.slice(t+2,t+2+3);return n===void 0||r===void 0||a===void 0?{consumed:e.length}:{color:i(n,r,a),consumed:5}}if(n===5){let n=e[t+2];return{...n===void 0?{}:{color:r(n)},consumed:3}}return{consumed:1}}function o(e,r){let i=r===``?[0]:r.split(/[;:]/).map(e=>Number(e)||0),o={...e};for(let e=0;e<i.length;e+=1){let r=i[e];if(r===0)o=n();else if(r===1)o.bold=!0;else if(r===2)o.faint=!0;else if(r===3)o.italic=!0;else if(r===4)o.underline=!0;else if(r===7)o.inverse=!0;else if(r===22)o.bold=!1,o.faint=!1;else if(r===23)o.italic=!1;else if(r===24)o.underline=!1;else if(r===27)o.inverse=!1;else if(r===39)delete o.className,delete o.color;else if(r===38){let{color:t,consumed:n}=a(i,e);delete o.className,t===void 0?delete o.color:o.color=t,e+=n-1}else if(r===48)e+=a(i,e).consumed-1;else if(r>=30&&r<=37||r>=90&&r<=97){let e=t[r];delete o.color,e===void 0?delete o.className:o.className=e}else(r>=40&&r<=49||r>=100&&r<=107)&&(o.inverse=!1)}return o}function s(e,t){return{text:e,...t.className===void 0?{}:{className:t.className},...t.color===void 0?{}:{color:t.color},...t.bold?{bold:!0}:{},...t.faint?{faint:!0}:{},...t.italic?{italic:!0}:{},...t.underline?{underline:!0}:{},...t.inverse?{inverse:!0}:{}}}function c(t){let r=[],i=n(),a=0;e.lastIndex=0;let c=e.exec(t);for(;c!==null;)c.index>a&&r.push(s(t.slice(a,c.index),i)),c[2]===`m`&&(i=o(i,c[1]??``)),a=c.index+c[0].length,c=e.exec(t);return a<t.length&&r.push(s(t.slice(a),i)),r}exports.ansiSpans=c;
|
|
2
|
+
//# sourceMappingURL=ansiSpans.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ansiSpans.cjs","names":["ANSI_PATTERN","FOREGROUND_CLASS","blank","paletteColor","index","level","rgb","offset","channel","value","clamp","red","green","blue","extendedColor","selector","codes","entry","applySgr","parameters","part","next","current","code","color","consumed","className","spanOf","attributes","ansiSpans","spans","cursor","match","line"],"sources":["../../../src/lib/ansiSpans.ts"],"sourcesContent":["/**\n * The escapes a captured terminal screen carries, turned into spans.\n *\n * WHY THIS EXISTS:\n * Two kinds of output reach the cockpit with a terminal's colour still in it.\n * A workflow captures a tmux pane with `-e`, and a runner's log file keeps the\n * palette on purpose, stripping only cursor moves and redraws. The browser has\n * no terminal, and the cockpit carries no terminal emulator, so the sequences\n * are read here and rendered as ordinary spans. It lives in the component\n * library because both readers need it and neither may import the other.\n *\n * WHAT IT UNDERSTANDS:\n * SGR (`ESC [ … m`) only: the eight base colours and their bright forms, 256\n * colour and truecolour, and bold, faint, italic, underline and inverse. Every\n * other sequence is dropped rather than printed, because a cursor move or a\n * clear that arrives as visible junk is worse than one that arrives as\n * nothing: the screen is a snapshot, and the next one repaints it anyway.\n *\n * The named colours become theme tokens rather than the child's own palette,\n * so a run's output sits in the cockpit's colours instead of fighting them.\n * Only 256-colour and truecolour, which name a colour no token can stand in\n * for, are rendered as themselves.\n */\n\n/** One run of text with the attributes in force when it was printed. */\nexport interface AnsiSpan {\n text: string;\n /** Theme class for a named colour, absent when the colour is the default. */\n className?: string;\n /** An exact colour the child asked for, as `rgb(r g b)`; only 256/truecolour set this. */\n color?: string;\n bold?: boolean;\n faint?: boolean;\n italic?: boolean;\n underline?: boolean;\n /** Foreground and background swapped, which a TUI uses for selection and cursors. */\n inverse?: boolean;\n}\n\n// oxlint-disable-next-line no-control-regex -- reading terminal escapes is the point\nconst ANSI_PATTERN = /\\x1b\\[([0-9;:]*)([A-Za-z])|\\x1b\\][^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)|\\x1b[()][A-Za-z0-9]|\\x1b[A-Za-z]/g;\nconst SGR_FINAL = 'm';\nconst RESET_CODE = 0;\nconst DEFAULT_FOREGROUND = 39;\nconst EXTENDED_FOREGROUND = 38;\nconst EXTENDED_BACKGROUND = 48;\nconst TRUECOLOR_SELECTOR = 2;\nconst PALETTE_SELECTOR = 5;\nconst BASE_FOREGROUND_START = 30;\nconst BASE_FOREGROUND_END = 37;\nconst BRIGHT_FOREGROUND_START = 90;\nconst BRIGHT_FOREGROUND_END = 97;\nconst BACKGROUND_START = 40;\nconst BACKGROUND_END = 49;\nconst BRIGHT_BACKGROUND_START = 100;\nconst BRIGHT_BACKGROUND_END = 107;\nconst RGB_CHANNELS = 3;\nconst PALETTE_SIZE = 256;\nconst PALETTE_CUBE_START = 16;\nconst PALETTE_GREY_START = 232;\nconst CUBE_SIDE = 6;\nconst CUBE_STEP = 40;\nconst CUBE_OFFSET = 55;\nconst GREY_STEP = 10;\nconst GREY_OFFSET = 8;\nconst MAX_CHANNEL = 255;\n\nconst BOLD = 1;\nconst FAINT = 2;\nconst ITALIC = 3;\nconst UNDERLINE = 4;\nconst INVERSE = 7;\nconst NOT_BOLD = 22;\nconst NOT_ITALIC = 23;\nconst NOT_UNDERLINE = 24;\nconst NOT_INVERSE = 27;\n\n/**\n * The eight terminal colours as theme tokens, listed as whole class strings so\n * the host's class scanner can see them.\n */\nconst FOREGROUND_CLASS: Readonly<Record<number, string>> = {\n 30: 'text-doom-faint',\n 31: 'text-doom-red',\n 32: 'text-doom-green',\n 33: 'text-doom-yellow',\n 34: 'text-doom-blue',\n 35: 'text-doom-magenta',\n 36: 'text-doom-cyan',\n 37: 'text-doom-text',\n 90: 'text-doom-dim',\n 91: 'text-doom-red',\n 92: 'text-doom-green',\n 93: 'text-doom-orange',\n 94: 'text-doom-blue',\n 95: 'text-doom-violet',\n 96: 'text-doom-cyan',\n 97: 'text-doom-hi',\n};\n\ninterface Attributes {\n className?: string;\n color?: string;\n bold: boolean;\n faint: boolean;\n italic: boolean;\n underline: boolean;\n inverse: boolean;\n}\n\nfunction blank(): Attributes {\n return { bold: false, faint: false, italic: false, underline: false, inverse: false };\n}\n\n/** One of the 256 palette entries as an exact colour, since no token stands for it. */\nfunction paletteColor(index: number): string | undefined {\n if (index < 0 || index >= PALETTE_SIZE) return undefined;\n if (index < PALETTE_CUBE_START) return undefined; // The first sixteen are the named ones.\n if (index >= PALETTE_GREY_START) {\n const level = (index - PALETTE_GREY_START) * GREY_STEP + GREY_OFFSET;\n return rgb(level, level, level);\n }\n const offset = index - PALETTE_CUBE_START;\n const channel = (value: number): number => (value === 0 ? 0 : value * CUBE_STEP + CUBE_OFFSET);\n return rgb(\n channel(Math.floor(offset / (CUBE_SIDE * CUBE_SIDE)) % CUBE_SIDE),\n channel(Math.floor(offset / CUBE_SIDE) % CUBE_SIDE),\n channel(offset % CUBE_SIDE),\n );\n}\n\nfunction rgb(red: number, green: number, blue: number): string {\n const clamp = (value: number): number => Math.max(0, Math.min(MAX_CHANNEL, Math.round(value)));\n return `rgb(${clamp(red)} ${clamp(green)} ${clamp(blue)})`;\n}\n\n/** Reads one extended-colour run (`38;5;n` or `38;2;r;g;b`), answering how many codes it ate. */\nfunction extendedColor(codes: readonly number[], index: number): { color?: string; consumed: number } {\n const selector = codes[index + 1];\n if (selector === TRUECOLOR_SELECTOR) {\n const [red, green, blue] = codes.slice(index + 2, index + 2 + RGB_CHANNELS);\n if (red === undefined || green === undefined || blue === undefined) return { consumed: codes.length };\n return { color: rgb(red, green, blue), consumed: 1 + 1 + RGB_CHANNELS };\n }\n if (selector === PALETTE_SELECTOR) {\n const entry = codes[index + 2];\n return { ...(entry === undefined ? {} : { color: paletteColor(entry) }), consumed: 3 };\n }\n return { consumed: 1 };\n}\n\nfunction applySgr(current: Attributes, parameters: string): Attributes {\n // An empty parameter list is a reset, which is what a bare `ESC[m` means.\n const codes = parameters === '' ? [RESET_CODE] : parameters.split(/[;:]/).map((part) => Number(part) || 0);\n let next = { ...current };\n for (let index = 0; index < codes.length; index += 1) {\n const code = codes[index] as number;\n if (code === RESET_CODE) {\n next = blank();\n } else if (code === BOLD) next.bold = true;\n else if (code === FAINT) next.faint = true;\n else if (code === ITALIC) next.italic = true;\n else if (code === UNDERLINE) next.underline = true;\n else if (code === INVERSE) next.inverse = true;\n else if (code === NOT_BOLD) {\n next.bold = false;\n next.faint = false;\n } else if (code === NOT_ITALIC) next.italic = false;\n else if (code === NOT_UNDERLINE) next.underline = false;\n else if (code === NOT_INVERSE) next.inverse = false;\n else if (code === DEFAULT_FOREGROUND) {\n delete next.className;\n delete next.color;\n } else if (code === EXTENDED_FOREGROUND) {\n const { color, consumed } = extendedColor(codes, index);\n delete next.className;\n if (color === undefined) delete next.color;\n else next.color = color;\n index += consumed - 1;\n } else if (code === EXTENDED_BACKGROUND) {\n // Backgrounds are dropped: a child painting its own background over the\n // cockpit's panel is what makes captured output unreadable in a theme.\n index += extendedColor(codes, index).consumed - 1;\n } else if (\n (code >= BASE_FOREGROUND_START && code <= BASE_FOREGROUND_END) ||\n (code >= BRIGHT_FOREGROUND_START && code <= BRIGHT_FOREGROUND_END)\n ) {\n const className = FOREGROUND_CLASS[code];\n delete next.color;\n if (className === undefined) delete next.className;\n else next.className = className;\n }\n // Background and everything else is read and dropped.\n else if (\n (code >= BACKGROUND_START && code <= BACKGROUND_END) ||\n (code >= BRIGHT_BACKGROUND_START && code <= BRIGHT_BACKGROUND_END)\n ) {\n next.inverse = false;\n }\n }\n return next;\n}\n\nfunction spanOf(text: string, attributes: Attributes): AnsiSpan {\n return {\n text,\n ...(attributes.className === undefined ? {} : { className: attributes.className }),\n ...(attributes.color === undefined ? {} : { color: attributes.color }),\n ...(attributes.bold ? { bold: true } : {}),\n ...(attributes.faint ? { faint: true } : {}),\n ...(attributes.italic ? { italic: true } : {}),\n ...(attributes.underline ? { underline: true } : {}),\n ...(attributes.inverse ? { inverse: true } : {}),\n };\n}\n\n/** One line of captured screen as spans, with every unreadable sequence dropped. */\nexport function ansiSpans(line: string): AnsiSpan[] {\n const spans: AnsiSpan[] = [];\n let attributes = blank();\n let cursor = 0;\n ANSI_PATTERN.lastIndex = 0;\n let match = ANSI_PATTERN.exec(line);\n while (match !== null) {\n if (match.index > cursor) spans.push(spanOf(line.slice(cursor, match.index), attributes));\n if (match[2] === SGR_FINAL) attributes = applySgr(attributes, match[1] ?? '');\n cursor = match.index + match[0].length;\n match = ANSI_PATTERN.exec(line);\n }\n if (cursor < line.length) spans.push(spanOf(line.slice(cursor), attributes));\n return spans;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cn.cjs","names":["twMerge","clsx","tailwind_merge","cn","inputs"],"sources":["../../../src/lib/cn.ts"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/** Merges class lists the shadcn way: conditional joins, then Tailwind conflict resolution. */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n"],"mappings":"kDAIA,SAAgBG,EAAG,GAAGC,EAA8B,CAClD,OAAA,EAAOJ,EAAAA,QAAAA,EAAAA,EAAQC,EAAA,KAAA,CAAKG,CAAM,CAAC,CAC7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collapse.cjs","names":["collapseLines","expanded","lines","limit"],"sources":["../../../src/lib/collapse.ts"],"sourcesContent":["export interface CollapsedLines<T> {\n shown: T[];\n /** How many lines the collapse holds back; 0 once expanded or when nothing was clipped. */\n hidden: number;\n}\n\n/**\n * The first `limit` lines until expanded. Head-only on purpose: a card that\n * shows the tail (a running command) keeps its own slice and reports the\n * count it hid.\n */\nexport function collapseLines<T>(lines: readonly T[], limit: number, expanded: boolean): CollapsedLines<T> {\n if (expanded || lines.length <= limit) return { shown: [...lines], hidden: 0 };\n return { shown: lines.slice(0, limit), hidden: lines.length - limit };\n}\n"],"mappings":"AAWA,SAAgBA,EAAiB,EAAqB,EAAe,EAAsC,CAEzG,OADIC,GAAYC,EAAM,QAAUC,EAAc,CAAE,MAAO,CAAC,GAAGD,CAAK,EAAG,OAAQ,CAAE,EACtE,CAAE,MAAOA,EAAM,MAAM,EAAGC,CAAK,EAAG,OAAQD,EAAM,OAASC,CAAM,CACtE"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e,t){let n=[...t].sort((e,t)=>e.from-t.from||e.to-t.to),r=0;for(let[t,i]of n.entries()){if(!Number.isInteger(i.from)||!Number.isInteger(i.to))throw RangeError(`Editor ranges must use integer offsets`);if(i.from<0||i.to<i.from||i.to>e)throw RangeError(`Editor range ${t} is outside the document`);if(t>0&&i.from<r)throw RangeError(`Editor ranges must not overlap`);r=Math.max(r,i.to)}return n}function t(t,n){return e(t,n)}exports.boundedEditorEdits=t,exports.boundedEditorRanges=e;
|
|
2
|
+
//# sourceMappingURL=editorController.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editorController.cjs","names":["boundedEditorRanges","ordered","ranges","left","right","previousEnd","index","range","documentLength","boundedEditorEdits","edits"],"sources":["../../../src/lib/editorController.ts"],"sourcesContent":["import type { EditorEdit, EditorTextRange } from '../types/editor';\n\n/** Validate and order offset ranges before they reach CodeMirror. */\nexport function boundedEditorRanges<T extends EditorTextRange>(\n documentLength: number,\n ranges: readonly T[],\n): readonly T[] {\n const ordered = [...ranges].sort((left, right) => left.from - right.from || left.to - right.to);\n let previousEnd = 0;\n\n for (const [index, range] of ordered.entries()) {\n if (!Number.isInteger(range.from) || !Number.isInteger(range.to)) {\n throw new RangeError('Editor ranges must use integer offsets');\n }\n if (range.from < 0 || range.to < range.from || range.to > documentLength) {\n throw new RangeError(`Editor range ${index} is outside the document`);\n }\n if (index > 0 && range.from < previousEnd) {\n throw new RangeError('Editor ranges must not overlap');\n }\n previousEnd = Math.max(previousEnd, range.to);\n }\n\n return ordered;\n}\n\n/** Convert caller edits to the bounded, ordered shape accepted by one transaction. */\nexport function boundedEditorEdits(documentLength: number, edits: readonly EditorEdit[]): readonly EditorEdit[] {\n return boundedEditorRanges(documentLength, edits);\n}\n"],"mappings":"AAGA,SAAgBA,EACd,EACA,EACc,CACd,IAAMC,EAAU,CAAC,GAAGC,CAAM,CAAC,CAAC,MAAM,EAAM,IAAUC,EAAK,KAAOC,EAAM,MAAQD,EAAK,GAAKC,EAAM,EAAE,EAC1FC,EAAc,EAElB,IAAK,GAAM,CAACC,EAAOC,KAAUN,EAAQ,QAAQ,EAAG,CAC9C,GAAI,CAAC,OAAO,UAAUM,EAAM,IAAI,GAAK,CAAC,OAAO,UAAUA,EAAM,EAAE,EAC7D,MAAU,WAAW,wCAAwC,EAE/D,GAAIA,EAAM,KAAO,GAAKA,EAAM,GAAKA,EAAM,MAAQA,EAAM,GAAKC,EACxD,MAAU,WAAW,gBAAgBF,EAAM,yBAAyB,EAEtE,GAAIA,EAAQ,GAAKC,EAAM,KAAOF,EAC5B,MAAU,WAAW,gCAAgC,EAEvD,EAAc,KAAK,IAAIA,EAAaE,EAAM,EAAE,CAC9C,CAEA,OAAON,CACT,CAGA,SAAgBQ,EAAmB,EAAwB,EAAqD,CAC9G,OAAOT,EAAoBQ,EAAgBE,CAAK,CAClD"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e={cjs:`javascript`,js:`javascript`,mjs:`javascript`,jsx:`jsx`,cts:`typescript`,mts:`typescript`,ts:`typescript`,tsx:`tsx`,json:`json`,jsonc:`json`,markdown:`markdown`,md:`markdown`,htm:`html`,html:`html`,xhtml:`html`,css:`css`,py:`python`,pyi:`python`,yaml:`yaml`,yml:`yaml`,bash:`shell`,sh:`shell`,zsh:`shell`,toml:`toml`},t={".bashrc":`shell`,".zshrc":`shell`,containerfile:`dockerfile`,dockerfile:`dockerfile`};function n(e){return(e.split(`/`).at(-1)??``).toLowerCase()}function r(r){let i=n(r),a=t[i];if(a!==void 0)return a;let o=i.lastIndexOf(`.`);if(!(o<1))return e[i.slice(o+1)]}async function i(e){let[{StreamLanguage:t},n]=await Promise.all([import(`@codemirror/language`),e()]);return t.define(n)}async function a(e){switch(e){case`javascript`:return(await import(`@codemirror/lang-javascript`)).javascript();case`jsx`:return(await import(`@codemirror/lang-javascript`)).javascript({jsx:!0});case`typescript`:return(await import(`@codemirror/lang-javascript`)).javascript({typescript:!0});case`tsx`:return(await import(`@codemirror/lang-javascript`)).javascript({jsx:!0,typescript:!0});case`json`:return(await import(`@codemirror/lang-json`)).json();case`markdown`:return(await import(`@codemirror/lang-markdown`)).markdown();case`html`:return(await import(`@codemirror/lang-html`)).html();case`css`:return(await import(`@codemirror/lang-css`)).css();case`python`:return(await import(`@codemirror/lang-python`)).python();case`yaml`:return(await import(`@codemirror/lang-yaml`)).yaml();case`shell`:return i(async()=>(await import(`@codemirror/legacy-modes/mode/shell`)).shell);case`toml`:return i(async()=>(await import(`@codemirror/legacy-modes/mode/toml`)).toml);case`dockerfile`:return i(async()=>(await import(`@codemirror/legacy-modes/mode/dockerfile`)).dockerFile)}}exports.grammarKeyOf=r,exports.loadGrammar=a;
|
|
2
|
+
//# sourceMappingURL=editorLanguage.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editorLanguage.cjs","names":["GRAMMAR_BY_EXTENSION","GRAMMAR_BY_FILENAME","basenameOf","filePath","grammarKeyOf","name","named","dot","streamMode","parser","load","StreamLanguage","loadGrammar","key"],"sources":["../../../src/lib/editorLanguage.ts"],"sourcesContent":["import type { StreamParser } from '@codemirror/language';\nimport type { Extension } from '@codemirror/state';\n\n/**\n * Which grammar a file gets, and how it arrives.\n *\n * The two halves are apart on purpose. Naming the grammar is a pure lookup a\n * caller can run before deciding anything, and loading it is a dynamic import\n * so a session that only ever opens Markdown never downloads the JavaScript\n * parser. Nothing here imports CodeMirror at runtime: every specifier below is\n * either a type, which erases, or inside an `import()` the bundler splits into\n * its own chunk.\n */\n\nexport type GrammarKey =\n | 'javascript'\n | 'jsx'\n | 'typescript'\n | 'tsx'\n | 'json'\n | 'markdown'\n | 'html'\n | 'css'\n | 'python'\n | 'yaml'\n | 'shell'\n | 'toml'\n | 'dockerfile';\n\n/** Keyed by lower-case extension without the dot. */\nconst GRAMMAR_BY_EXTENSION: Readonly<Record<string, GrammarKey>> = {\n cjs: 'javascript',\n js: 'javascript',\n mjs: 'javascript',\n jsx: 'jsx',\n cts: 'typescript',\n mts: 'typescript',\n ts: 'typescript',\n tsx: 'tsx',\n json: 'json',\n jsonc: 'json',\n markdown: 'markdown',\n md: 'markdown',\n htm: 'html',\n html: 'html',\n xhtml: 'html',\n css: 'css',\n py: 'python',\n pyi: 'python',\n yaml: 'yaml',\n yml: 'yaml',\n bash: 'shell',\n sh: 'shell',\n zsh: 'shell',\n toml: 'toml',\n};\n\n/** Files a project names rather than suffixes, matched on the whole lower-cased basename. */\nconst GRAMMAR_BY_FILENAME: Readonly<Record<string, GrammarKey>> = {\n '.bashrc': 'shell',\n '.zshrc': 'shell',\n containerfile: 'dockerfile',\n dockerfile: 'dockerfile',\n};\n\n/** The last segment of a path, lower-cased. */\nfunction basenameOf(filePath: string): string {\n return (filePath.split('/').at(-1) ?? '').toLowerCase();\n}\n\n/**\n * The grammar for a path, or undefined for a file the editor shows as plain\n * text. A name is tried whole before it is tried as a suffix, so\n * `Dockerfile.dev` is a Dockerfile and not a file with a `dev` extension.\n */\nexport function grammarKeyOf(filePath: string): GrammarKey | undefined {\n const name = basenameOf(filePath);\n const named = GRAMMAR_BY_FILENAME[name];\n if (named !== undefined) return named;\n const dot = name.lastIndexOf('.');\n if (dot < 1) return undefined;\n return GRAMMAR_BY_EXTENSION[name.slice(dot + 1)];\n}\n\n/** A legacy stream mode wrapped as a language; the modes predate Lezer and ship as tokenizers. */\nasync function streamMode(load: () => Promise<StreamParser<unknown>>): Promise<Extension> {\n const [{ StreamLanguage }, parser] = await Promise.all([import('@codemirror/language'), load()]);\n return StreamLanguage.define(parser);\n}\n\n/** Downloads one grammar. Each arm is its own chunk, so the cost is the languages actually opened. */\nexport async function loadGrammar(key: GrammarKey): Promise<Extension> {\n switch (key) {\n case 'javascript':\n return (await import('@codemirror/lang-javascript')).javascript();\n case 'jsx':\n return (await import('@codemirror/lang-javascript')).javascript({ jsx: true });\n case 'typescript':\n return (await import('@codemirror/lang-javascript')).javascript({ typescript: true });\n case 'tsx':\n return (await import('@codemirror/lang-javascript')).javascript({ jsx: true, typescript: true });\n case 'json':\n return (await import('@codemirror/lang-json')).json();\n case 'markdown':\n return (await import('@codemirror/lang-markdown')).markdown();\n case 'html':\n return (await import('@codemirror/lang-html')).html();\n case 'css':\n return (await import('@codemirror/lang-css')).css();\n case 'python':\n return (await import('@codemirror/lang-python')).python();\n case 'yaml':\n return (await import('@codemirror/lang-yaml')).yaml();\n case 'shell':\n return streamMode(async () => (await import('@codemirror/legacy-modes/mode/shell')).shell);\n case 'toml':\n return streamMode(async () => (await import('@codemirror/legacy-modes/mode/toml')).toml);\n case 'dockerfile':\n return streamMode(async () => (await import('@codemirror/legacy-modes/mode/dockerfile')).dockerFile);\n }\n}\n"],"mappings":"AA8BA,MAAMA,EAA6D,CACjE,IAAK,aACL,GAAI,aACJ,IAAK,aACL,IAAK,MACL,IAAK,aACL,IAAK,aACL,GAAI,aACJ,IAAK,MACL,KAAM,OACN,MAAO,OACP,SAAU,WACV,GAAI,WACJ,IAAK,OACL,KAAM,OACN,MAAO,OACP,IAAK,MACL,GAAI,SACJ,IAAK,SACL,KAAM,OACN,IAAK,OACL,KAAM,QACN,GAAI,QACJ,IAAK,QACL,KAAM,MACR,EAGMC,EAA4D,CAChE,UAAW,QACX,SAAU,QACV,cAAe,aACf,WAAY,YACd,EAGA,SAASC,EAAW,EAA0B,CAC5C,OAAQC,EAAS,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,GAAK,GAAA,CAAI,YAAY,CACxD,CAOA,SAAgBC,EAAa,EAA0C,CACrE,IAAMC,EAAOH,EAAWC,CAAQ,EAC1BG,EAAQL,EAAoBI,GAClC,GAAIC,IAAU,IAAA,GAAW,OAAOA,EAChC,IAAMC,EAAMF,EAAK,YAAY,GAAG,EAChC,GAAI,IAAM,GACV,OAAOL,EAAqBK,EAAK,MAAME,EAAM,CAAC,EAChD,CAGA,eAAeC,EAAW,EAAgE,CACxF,GAAM,CAAC,CAAE,kBAAkBC,GAAU,MAAM,QAAQ,IAAI,CAAC,OAAO,wBAAyBC,EAAK,CAAC,CAAC,EAC/F,OAAOC,EAAe,OAAOF,CAAM,CACrC,CAGA,eAAsBG,EAAY,EAAqC,CACrE,OAAQC,EAAR,CACE,IAAK,aACH,OAAQ,MAAM,OAAO,+BAAA,CAAgC,WAAW,EAClE,IAAK,MACH,OAAQ,MAAM,OAAO,+BAAA,CAAgC,WAAW,CAAE,IAAK,EAAK,CAAC,EAC/E,IAAK,aACH,OAAQ,MAAM,OAAO,+BAAA,CAAgC,WAAW,CAAE,WAAY,EAAK,CAAC,EACtF,IAAK,MACH,OAAQ,MAAM,OAAO,+BAAA,CAAgC,WAAW,CAAE,IAAK,GAAM,WAAY,EAAK,CAAC,EACjG,IAAK,OACH,OAAQ,MAAM,OAAO,yBAAA,CAA0B,KAAK,EACtD,IAAK,WACH,OAAQ,MAAM,OAAO,6BAAA,CAA8B,SAAS,EAC9D,IAAK,OACH,OAAQ,MAAM,OAAO,yBAAA,CAA0B,KAAK,EACtD,IAAK,MACH,OAAQ,MAAM,OAAO,wBAAA,CAAyB,IAAI,EACpD,IAAK,SACH,OAAQ,MAAM,OAAO,2BAAA,CAA4B,OAAO,EAC1D,IAAK,OACH,OAAQ,MAAM,OAAO,yBAAA,CAA0B,KAAK,EACtD,IAAK,QACH,OAAOL,EAAW,UAAa,MAAM,OAAO,uCAAA,CAAwC,KAAK,EAC3F,IAAK,OACH,OAAOA,EAAW,UAAa,MAAM,OAAO,sCAAA,CAAuC,IAAI,EACzF,IAAK,aACH,OAAOA,EAAW,UAAa,MAAM,OAAO,4CAAA,CAA6C,UAAU,CACvG,CACF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e={"&":{color:`var(--doom-text)`,backgroundColor:`var(--doom-deep)`,fontSize:`12px`,height:`100%`},".cm-scroller":{fontFamily:`var(--doom-font-mono)`,lineHeight:`1.5`},".cm-content":{caretColor:`var(--doom-blue)`,padding:`8px 0`},".cm-cursor, .cm-dropCursor":{borderLeftColor:`var(--doom-blue)`,borderLeftWidth:`2px`},"&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection":{backgroundColor:`var(--doom-selected)`},".cm-gutters":{backgroundColor:`var(--doom-deep)`,color:`var(--doom-faint)`,borderRight:`1px solid var(--doom-border-soft)`},".cm-activeLine":{backgroundColor:`var(--doom-panel)`},".cm-activeLineGutter":{backgroundColor:`var(--doom-panel)`,color:`var(--doom-dim)`},".cm-foldPlaceholder":{backgroundColor:`var(--doom-panel)`,border:`1px solid var(--doom-border)`,color:`var(--doom-dim)`},".cm-searchMatch":{backgroundColor:`var(--doom-tint-yellow)`,outline:`1px solid var(--doom-edge-yellow)`},".cm-searchMatch.cm-searchMatch-selected":{backgroundColor:`var(--doom-tint-orange)`},".cm-selectionMatch":{backgroundColor:`var(--doom-tint-blue)`},".cm-closed-tone":{backgroundColor:`var(--doom-tint-green)`,textDecoration:`line-through`,textDecorationColor:`var(--doom-edge-green)`},".cm-matchingBracket, &.cm-focused .cm-matchingBracket":{backgroundColor:`var(--doom-tint-green)`,outline:`1px solid var(--doom-edge-green)`},".cm-nonmatchingBracket, &.cm-focused .cm-nonmatchingBracket":{backgroundColor:`var(--doom-tint-red)`},".cm-panels":{backgroundColor:`var(--doom-panel)`,color:`var(--doom-text)`,fontFamily:`var(--font-sans)`,fontSize:`12px`},".cm-panels.cm-panels-bottom":{borderTop:`1px solid var(--doom-border)`},".cm-panels.cm-panels-top":{borderBottom:`1px solid var(--doom-border)`},".cm-panel input, .cm-panel button, .cm-panel select":{backgroundColor:`var(--doom-deep)`,color:`var(--doom-text)`,border:`1px solid var(--doom-border)`,borderRadius:`2px`,fontSize:`12px`},".cm-panel input":{fontFamily:`var(--doom-font-mono)`},".cm-tooltip":{backgroundColor:`var(--doom-panel)`,border:`1px solid var(--doom-border)`,color:`var(--doom-text)`}},t={comment:{color:`var(--doom-faint)`,fontStyle:`italic`},keyword:{color:`var(--doom-magenta)`},constant:{color:`var(--doom-violet)`},literal:{color:`var(--doom-orange)`},string:{color:`var(--doom-green)`},regexp:{color:`var(--doom-teal)`},operator:{color:`var(--doom-blue)`},punctuation:{color:`var(--doom-dim)`},variable:{color:`var(--doom-text)`},property:{color:`var(--doom-cyan)`},callable:{color:`var(--doom-blue)`},type:{color:`var(--doom-yellow)`},tag:{color:`var(--doom-red)`},attribute:{color:`var(--doom-yellow)`},meta:{color:`var(--doom-faint)`},heading:{color:`var(--doom-hi)`,fontWeight:`bold`},link:{color:`var(--doom-cyan)`,textDecoration:`underline`},emphasis:{fontStyle:`italic`},strong:{fontWeight:`bold`},strikethrough:{textDecoration:`line-through`},invalid:{color:`var(--doom-red)`}};exports.DOOM_EDITOR_STYLES=e,exports.DOOM_SYNTAX_STYLES=t;
|
|
2
|
+
//# sourceMappingURL=editorTheme.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editorTheme.cjs","names":["DOOM_EDITOR_STYLES","DOOM_SYNTAX_STYLES"],"sources":["../../../src/lib/editorTheme.ts"],"sourcesContent":["/**\n * The editor's colours, as plain data.\n *\n * Every value is a CSS custom property rather than a resolved colour, which is\n * what lets a theme swap recolour a mounted editor by rewriting `:root`\n * instead of tearing the editor down and rebuilding it. It is also why this is\n * data and not a built CodeMirror extension: nothing here imports an editor,\n * so a caller pays for the styles only inside the chunk that draws them.\n */\n\n/** The chrome: the surface, the gutter, the cursor, the selection, and the search panel. */\nexport const DOOM_EDITOR_STYLES: Readonly<Record<string, Readonly<Record<string, string>>>> = {\n '&': {\n color: 'var(--doom-text)',\n backgroundColor: 'var(--doom-deep)',\n fontSize: '12px',\n height: '100%',\n },\n '.cm-scroller': {\n fontFamily: 'var(--doom-font-mono)',\n lineHeight: '1.5',\n },\n '.cm-content': {\n caretColor: 'var(--doom-blue)',\n padding: '8px 0',\n },\n '.cm-cursor, .cm-dropCursor': {\n borderLeftColor: 'var(--doom-blue)',\n borderLeftWidth: '2px',\n },\n // CodeMirror draws its own selection layer when the editor has focus and\n // leans on the native one when it does not, so both need saying or a\n // selection vanishes the moment a reader clicks the comment box.\n '&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection': {\n backgroundColor: 'var(--doom-selected)',\n },\n '.cm-gutters': {\n backgroundColor: 'var(--doom-deep)',\n color: 'var(--doom-faint)',\n borderRight: '1px solid var(--doom-border-soft)',\n },\n '.cm-activeLine': {\n backgroundColor: 'var(--doom-panel)',\n },\n '.cm-activeLineGutter': {\n backgroundColor: 'var(--doom-panel)',\n color: 'var(--doom-dim)',\n },\n '.cm-foldPlaceholder': {\n backgroundColor: 'var(--doom-panel)',\n border: '1px solid var(--doom-border)',\n color: 'var(--doom-dim)',\n },\n '.cm-searchMatch': {\n backgroundColor: 'var(--doom-tint-yellow)',\n outline: '1px solid var(--doom-edge-yellow)',\n },\n '.cm-searchMatch.cm-searchMatch-selected': {\n backgroundColor: 'var(--doom-tint-orange)',\n },\n '.cm-selectionMatch': {\n backgroundColor: 'var(--doom-tint-blue)',\n },\n '.cm-closed-tone': {\n backgroundColor: 'var(--doom-tint-green)',\n textDecoration: 'line-through',\n textDecorationColor: 'var(--doom-edge-green)',\n },\n '.cm-matchingBracket, &.cm-focused .cm-matchingBracket': {\n backgroundColor: 'var(--doom-tint-green)',\n outline: '1px solid var(--doom-edge-green)',\n },\n '.cm-nonmatchingBracket, &.cm-focused .cm-nonmatchingBracket': {\n backgroundColor: 'var(--doom-tint-red)',\n },\n // Search and replace chrome reads as UI; only what is typed into it is literal.\n '.cm-panels': {\n backgroundColor: 'var(--doom-panel)',\n color: 'var(--doom-text)',\n fontFamily: 'var(--font-sans)',\n fontSize: '12px',\n },\n '.cm-panels.cm-panels-bottom': {\n borderTop: '1px solid var(--doom-border)',\n },\n '.cm-panels.cm-panels-top': {\n borderBottom: '1px solid var(--doom-border)',\n },\n '.cm-panel input, .cm-panel button, .cm-panel select': {\n backgroundColor: 'var(--doom-deep)',\n color: 'var(--doom-text)',\n border: '1px solid var(--doom-border)',\n borderRadius: '2px',\n fontSize: '12px',\n },\n '.cm-panel input': {\n fontFamily: 'var(--doom-font-mono)',\n },\n '.cm-tooltip': {\n backgroundColor: 'var(--doom-panel)',\n border: '1px solid var(--doom-border)',\n color: 'var(--doom-text)',\n },\n};\n\n/**\n * The syntax colours, named by what they mark rather than by tag, so the\n * pairing with Lezer's tags stays next to the editor that imports them and\n * this table can be read as a palette.\n */\nexport const DOOM_SYNTAX_STYLES = {\n comment: { color: 'var(--doom-faint)', fontStyle: 'italic' },\n keyword: { color: 'var(--doom-magenta)' },\n constant: { color: 'var(--doom-violet)' },\n literal: { color: 'var(--doom-orange)' },\n string: { color: 'var(--doom-green)' },\n regexp: { color: 'var(--doom-teal)' },\n operator: { color: 'var(--doom-blue)' },\n punctuation: { color: 'var(--doom-dim)' },\n variable: { color: 'var(--doom-text)' },\n property: { color: 'var(--doom-cyan)' },\n callable: { color: 'var(--doom-blue)' },\n type: { color: 'var(--doom-yellow)' },\n tag: { color: 'var(--doom-red)' },\n attribute: { color: 'var(--doom-yellow)' },\n meta: { color: 'var(--doom-faint)' },\n heading: { color: 'var(--doom-hi)', fontWeight: 'bold' },\n link: { color: 'var(--doom-cyan)', textDecoration: 'underline' },\n emphasis: { fontStyle: 'italic' },\n strong: { fontWeight: 'bold' },\n strikethrough: { textDecoration: 'line-through' },\n invalid: { color: 'var(--doom-red)' },\n} as const;\n"],"mappings":"AAWA,MAAaA,EAAiF,CAC5F,IAAK,CACH,MAAO,mBACP,gBAAiB,mBACjB,SAAU,OACV,OAAQ,MACV,EACA,eAAgB,CACd,WAAY,wBACZ,WAAY,KACd,EACA,cAAe,CACb,WAAY,mBACZ,QAAS,OACX,EACA,6BAA8B,CAC5B,gBAAiB,mBACjB,gBAAiB,KACnB,EAIA,yFAA0F,CACxF,gBAAiB,sBACnB,EACA,cAAe,CACb,gBAAiB,mBACjB,MAAO,oBACP,YAAa,mCACf,EACA,iBAAkB,CAChB,gBAAiB,mBACnB,EACA,uBAAwB,CACtB,gBAAiB,oBACjB,MAAO,iBACT,EACA,sBAAuB,CACrB,gBAAiB,oBACjB,OAAQ,+BACR,MAAO,iBACT,EACA,kBAAmB,CACjB,gBAAiB,0BACjB,QAAS,mCACX,EACA,0CAA2C,CACzC,gBAAiB,yBACnB,EACA,qBAAsB,CACpB,gBAAiB,uBACnB,EACA,kBAAmB,CACjB,gBAAiB,yBACjB,eAAgB,eAChB,oBAAqB,wBACvB,EACA,wDAAyD,CACvD,gBAAiB,yBACjB,QAAS,kCACX,EACA,8DAA+D,CAC7D,gBAAiB,sBACnB,EAEA,aAAc,CACZ,gBAAiB,oBACjB,MAAO,mBACP,WAAY,mBACZ,SAAU,MACZ,EACA,8BAA+B,CAC7B,UAAW,8BACb,EACA,2BAA4B,CAC1B,aAAc,8BAChB,EACA,sDAAuD,CACrD,gBAAiB,mBACjB,MAAO,mBACP,OAAQ,+BACR,aAAc,MACd,SAAU,MACZ,EACA,kBAAmB,CACjB,WAAY,uBACd,EACA,cAAe,CACb,gBAAiB,oBACjB,OAAQ,+BACR,MAAO,kBACT,CACF,EAOaC,EAAqB,CAChC,QAAS,CAAE,MAAO,oBAAqB,UAAW,QAAS,EAC3D,QAAS,CAAE,MAAO,qBAAsB,EACxC,SAAU,CAAE,MAAO,oBAAqB,EACxC,QAAS,CAAE,MAAO,oBAAqB,EACvC,OAAQ,CAAE,MAAO,mBAAoB,EACrC,OAAQ,CAAE,MAAO,kBAAmB,EACpC,SAAU,CAAE,MAAO,kBAAmB,EACtC,YAAa,CAAE,MAAO,iBAAkB,EACxC,SAAU,CAAE,MAAO,kBAAmB,EACtC,SAAU,CAAE,MAAO,kBAAmB,EACtC,SAAU,CAAE,MAAO,kBAAmB,EACtC,KAAM,CAAE,MAAO,oBAAqB,EACpC,IAAK,CAAE,MAAO,iBAAkB,EAChC,UAAW,CAAE,MAAO,oBAAqB,EACzC,KAAM,CAAE,MAAO,mBAAoB,EACnC,QAAS,CAAE,MAAO,iBAAkB,WAAY,MAAO,EACvD,KAAM,CAAE,MAAO,mBAAoB,eAAgB,WAAY,EAC/D,SAAU,CAAE,UAAW,QAAS,EAChC,OAAQ,CAAE,WAAY,MAAO,EAC7B,cAAe,CAAE,eAAgB,cAAe,EAChD,QAAS,CAAE,MAAO,iBAAkB,CACtC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./editorLanguage.cjs"),t={javascript:`javascript`,typescript:`typescript`,python:`python`,shell:`shell`,console:`shell`,docker:`dockerfile`};function n(e){return/(?:^|\s)language-(\S+)/.exec(e??``)?.[1]?.toLowerCase()}function r(n){if(n===void 0||n.length===0)return;let r=t[n];return r===void 0?e.grammarKeyOf(n)??e.grammarKeyOf(`fence.${n}`):r}exports.MERMAID_LANGUAGE=`mermaid`,exports.fenceGrammarOf=r,exports.fenceLanguageOf=n;
|
|
2
|
+
//# sourceMappingURL=fenceGrammar.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fenceGrammar.cjs","names":["grammarKeyOf","require_editorLanguage","GRAMMAR_BY_WORD","fenceLanguageOf","className","fenceGrammarOf","language","word"],"sources":["../../../src/lib/fenceGrammar.ts"],"sourcesContent":["import { type GrammarKey, grammarKeyOf } from './editorLanguage';\n\n/**\n * What a fenced code block's info string means.\n *\n * A fence names its language the way a person writes it in a message, so\n * `ts`, `typescript` and `tsx` all arrive and all mean something. The file\n * lookup in `editorLanguage.ts` already answers for every spelling that is\n * also an extension, so this module only carries the words that are not one\n * and leaves the rest to it. A name with no grammar is not an error: the block\n * renders as plain text, which is what it would have done anyway.\n */\n\n/** The one fence that is a picture rather than code. */\nexport const MERMAID_LANGUAGE = 'mermaid';\n\n/** Spellings a fence uses that no filename would. */\nconst GRAMMAR_BY_WORD: Readonly<Record<string, GrammarKey>> = {\n javascript: 'javascript',\n typescript: 'typescript',\n python: 'python',\n shell: 'shell',\n console: 'shell',\n docker: 'dockerfile',\n};\n\n/**\n * The language a fence declares, lower-cased, or undefined for a bare fence.\n *\n * react-markdown hands the info string down as a `language-*` class, and a\n * fence may carry metadata after the language (```` ```ts title=x ````), which\n * is not part of the name.\n */\nexport function fenceLanguageOf(className: string | undefined): string | undefined {\n const match = /(?:^|\\s)language-(\\S+)/.exec(className ?? '');\n return match?.[1]?.toLowerCase();\n}\n\n/** The grammar to colour a fence with, or undefined to leave it plain. */\nexport function fenceGrammarOf(language: string | undefined): GrammarKey | undefined {\n if (language === undefined || language.length === 0) return undefined;\n const word = GRAMMAR_BY_WORD[language];\n if (word !== undefined) return word;\n // A fence that names an extension is the same lookup a file gets, and one\n // that names a whole file, like `dockerfile`, is tried as that name first.\n return grammarKeyOf(language) ?? grammarKeyOf(`fence.${language}`);\n}\n"],"mappings":"wCAiBME,EAAwD,CAC5D,WAAY,aACZ,WAAY,aACZ,OAAQ,SACR,MAAO,QACP,QAAS,QACT,OAAQ,YACV,EASA,SAAgBC,EAAgB,EAAmD,CAEjF,MADc,yBAAyB,KAAKC,GAAa,EAC9C,CAAC,GAAG,EAAE,EAAE,YAAY,CACjC,CAGA,SAAgBC,EAAe,EAAsD,CACnF,GAAIC,IAAa,IAAA,IAAaA,EAAS,SAAW,EAAG,OACrD,IAAMC,EAAOL,EAAgBI,GAI7B,OAHIC,IAAS,IAAA,GAGNP,EAAAA,aAAaM,CAAQ,GAAKN,EAAAA,aAAa,SAASM,GAAU,EAHlCC,CAIjC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
function e(e,t){let n=[],r=t,i=[],a=[],o=()=>{i.length>0&&n.push({path:r,indices:i,text:a.join(`
|
|
2
|
+
`)}),i=[],a=[]};for(let[t,n]of e.entries()){if(n.type===`tagged`){i.push(t),a.push(n.value.content);continue}o(),n.type===`file`&&(r=n.path)}return o(),n}function t(e){return e.map(e=>`${e.path??``}\u0000${e.text}`).join(``)}exports.hashlineGroups=e,exports.hashlineGroupsKey=t;
|
|
3
|
+
//# sourceMappingURL=hashlineHighlight.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hashlineHighlight.cjs","names":["hashlineGroups","groups","path","fallbackPath","indices","texts","flush","index","line","lines","hashlineGroupsKey","group"],"sources":["../../../src/lib/hashlineHighlight.ts"],"sourcesContent":["import type { PresentedLine } from './hashlineView';\n\n/**\n * Grouping for highlighted hashline bodies.\n *\n * A read result is one file and a grep result is many, so the lines a card\n * shows have to be cut into runs that belong to the same file before any of\n * them can be parsed. A run is parsed whole because a string or a comment\n * spans lines, and grep's gaps between context blocks are accepted: an excerpt\n * is not the file, and colouring it as if it were is close enough to be worth\n * far more than colouring nothing.\n */\n\nexport interface HashlineGroup {\n /** The file the run came from, when the body named one. */\n readonly path: string | undefined;\n /** Indices into the presented lines, in order, that this run covers. */\n readonly indices: readonly number[];\n /** The run's content, newline-joined, ready to parse. */\n readonly text: string;\n}\n\n/**\n * Consecutive anchored lines, cut at every file heading and at anything that\n * is not code. `fallbackPath` names the file for a body that never states one,\n * which is how a read result arrives.\n */\nexport function hashlineGroups(\n lines: readonly PresentedLine[],\n fallbackPath: string | undefined,\n): readonly HashlineGroup[] {\n const groups: HashlineGroup[] = [];\n let path = fallbackPath;\n let indices: number[] = [];\n let texts: string[] = [];\n\n const flush = (): void => {\n if (indices.length > 0) groups.push({ path, indices, text: texts.join('\\n') });\n indices = [];\n texts = [];\n };\n\n for (const [index, line] of lines.entries()) {\n if (line.type === 'tagged') {\n indices.push(index);\n texts.push(line.value.content);\n continue;\n }\n flush();\n // A heading opens the next file; a plain line is prose between runs.\n if (line.type === 'file') path = line.path;\n }\n flush();\n return groups;\n}\n\n/** One string that changes whenever the groups would highlight differently. */\nexport function hashlineGroupsKey(groups: readonly HashlineGroup[]): string {\n return groups.map((group) => `${group.path ?? ''}\\u0000${group.text}`).join('\\u0001');\n}\n"],"mappings":"AA2BA,SAAgBA,EACd,EACA,EAC0B,CAC1B,IAAMC,EAA0B,CAAC,EAC7BC,EAAOC,EACPC,EAAoB,CAAC,EACrBC,EAAkB,CAAC,EAEjBC,MAAoB,CACpBF,EAAQ,OAAS,GAAGH,EAAO,KAAK,CAAE,OAAM,UAAS,KAAMI,EAAM,KAAK;CAAI,CAAE,CAAC,EAC7E,EAAU,CAAC,EACX,EAAQ,CAAC,CACX,EAEA,IAAK,GAAM,CAACE,EAAOC,KAASC,EAAM,QAAQ,EAAG,CAC3C,GAAID,EAAK,OAAS,SAAU,CAC1BJ,EAAQ,KAAKG,CAAK,EAClBF,EAAM,KAAKG,EAAK,MAAM,OAAO,EAC7B,QACF,CACAF,EAAM,EAEFE,EAAK,OAAS,SAAQ,EAAOA,EAAK,KACxC,CAEA,OADAF,EAAM,EACCL,CACT,CAGA,SAAgBS,EAAkB,EAA0C,CAC1E,OAAOT,EAAO,IAAK,GAAU,GAAGU,EAAM,MAAQ,GAAG,QAAQA,EAAM,MAAM,CAAC,CAAC,KAAK,GAAQ,CACtF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
const e=require("./collapse.cjs"),t=/^@file (.+)#([A-Za-z0-9_-]{8})$/u,n=/^(>> | {3})?(\d+)#[a-z]{3}\|(.*)$/u;function r(e){return typeof e==`object`&&!!e&&typeof e.type==`string`}function i(e,t){let n=e?.content.filter(r)??[],i=e===null?t:n.flatMap(e=>e.type===`text`?[e.text??``]:[]).join(`
|
|
2
|
+
`);if(i.length===0)return n.some(e=>e.type===`image`)?[`[Image attached]`]:[];let a=i.replaceAll(` `,` `).replaceAll(`\r
|
|
3
|
+
`,`
|
|
4
|
+
`).split(`
|
|
5
|
+
`);for(;a.at(-1)===``;)a.pop();return a}function a(e){let t=e.at(-1);if(t!==void 0&&t.startsWith(`[`)&&t.endsWith(`]`)){for(e.pop();e.at(-1)===``;)e.pop();return t}}function o(e){let t=n.exec(e),r=t?.[2],i=t?.[3];if(r===void 0||i===void 0)return;let a=Number.parseInt(r,10);if(!Number.isSafeInteger(a)||a<1)return;let o=t?.[1];return{line:a,content:i,marker:o===`>> `?`match`:o===` `?`context`:void 0}}function s(e){return t.exec(e)?.[1]}function c(e,t){let n=[];for(let r of e){let e=s(r);if(e!==void 0){t!==`read`&&n.push({type:`file`,path:e});continue}let i=o(r);if(i!==void 0){n.push({type:`tagged`,value:i});continue}n.push({type:`plain`,text:r})}return n}function l(t,n,r,o){let s=i(t,n),l=a(s),u=c(s,r),{shown:d,hidden:f}=e.collapseLines(u,r===`read`?10:15,o);return{shown:d,hidden:f,notice:l,gutter:d.reduce((e,t)=>t.type===`tagged`?Math.max(e,String(t.value.line).length):e,1)}}function u(e){return e.filter(e=>e!==void 0&&e.length>0)}exports.GREP_COLLAPSED_LINES=15,exports.READ_COLLAPSED_LINES=10,exports.compactDetails=u,exports.hashlineBody=l,exports.parseFileHeader=s,exports.parseTaggedLine=o,exports.presentHashlineLines=c,exports.resultTextLines=i,exports.takeTrailingNotice=a;
|
|
6
|
+
//# sourceMappingURL=hashlineView.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hashlineView.cjs","names":["collapseLines","require_collapse","FILE_HEADER_PATTERN","TAGGED_LINE_PATTERN","isTextBlock","block","resultTextLines","blocks","result","text","output","lines","takeTrailingNotice","last","parseTaggedLine","match","value","lineText","content","line","prefix","parseFileHeader","presentHashlineLines","presented","path","kind","tagged","hashlineBody","notice","expanded","shown","widest","compactDetails","values"],"sources":["../../../src/lib/hashlineView.ts"],"sourcesContent":["import { collapseLines } from './collapse';\n\n/**\n * The hashline wire format, parsed the way the TUI's hashlineRendering does:\n * `@file path#tag` opens a file, `N#abc|content` is an anchored line, and a\n * `>> ` or three-space prefix marks grep matches and their context.\n *\n * It lives here rather than in each tool package because the read and grep\n * cards render the same bytes and had drifted into byte-identical copies of\n * this module. The patterns are still a transcription of po-hashline: a\n * cockpit plugin may import this library and the web contract, but not a\n * runtime package, so the format is stated twice on purpose and only once per\n * side of that line.\n */\nconst FILE_HEADER_PATTERN = /^@file (.+)#([A-Za-z0-9_-]{8})$/u;\nconst TAGGED_LINE_PATTERN = /^(>> | {3})?(\\d+)#[a-z]{3}\\|(.*)$/u;\nconst MATCH_PREFIX = '>> ';\nconst CONTEXT_PREFIX = ' ';\nconst IMAGE_PLACEHOLDER = '[Image attached]';\n\nexport const READ_COLLAPSED_LINES = 10;\nexport const GREP_COLLAPSED_LINES = 15;\n\nexport type HashlineResultKind = 'read' | 'grep';\nexport type TaggedLineMarker = 'match' | 'context';\n\n/**\n * The part of a tool result this parser reads.\n *\n * Named structurally rather than imported: the component library sits below\n * the web contract and must not depend on it, so it states the shape it needs\n * and any `ToolResultView` satisfies it.\n */\nexport interface HashlineResult {\n readonly content: readonly unknown[];\n}\n\nexport interface TaggedLine {\n readonly line: number;\n readonly content: string;\n readonly marker: TaggedLineMarker | undefined;\n}\n\nexport type PresentedLine =\n | { readonly type: 'file'; readonly path: string }\n | { readonly type: 'tagged'; readonly value: TaggedLine }\n | { readonly type: 'plain'; readonly text: string };\n\nexport interface HashlineBody {\n readonly shown: readonly PresentedLine[];\n /** Lines the collapsed view holds back; zero once expanded. */\n readonly hidden: number;\n /** The bracketed pagination or compaction note the tool appends after its lines. */\n readonly notice: string | undefined;\n /** Widest line number among the shown anchored lines, in characters. */\n readonly gutter: number;\n}\n\ninterface TextBlock {\n readonly type: string;\n readonly text?: string;\n}\n\nfunction isTextBlock(block: unknown): block is TextBlock {\n return typeof block === 'object' && block !== null && typeof (block as TextBlock).type === 'string';\n}\n\n/**\n * The result's text as lines: tabs widened, CRLF folded, trailing blanks\n * dropped. A result with no text but an image block reads as the TUI's\n * placeholder. The joined `output` stands in when no result view exists.\n */\nexport function resultTextLines(result: HashlineResult | null, output: string): string[] {\n const blocks = result?.content.filter(isTextBlock) ?? [];\n const text =\n result === null ? output : blocks.flatMap((block) => (block.type === 'text' ? [block.text ?? ''] : [])).join('\\n');\n if (text.length === 0) {\n return blocks.some((block) => block.type === 'image') ? [IMAGE_PLACEHOLDER] : [];\n }\n const lines = text.replaceAll('\\t', ' ').replaceAll('\\r\\n', '\\n').split('\\n');\n while (lines.at(-1) === '') lines.pop();\n return lines;\n}\n\n/** Detaches the tool's trailing `[...]` note so the body numbers file content only. */\nexport function takeTrailingNotice(lines: string[]): string | undefined {\n const last = lines.at(-1);\n if (last === undefined || !last.startsWith('[') || !last.endsWith(']')) return undefined;\n lines.pop();\n while (lines.at(-1) === '') lines.pop();\n return last;\n}\n\nexport function parseTaggedLine(value: string): TaggedLine | undefined {\n const match = TAGGED_LINE_PATTERN.exec(value);\n const lineText = match?.[2];\n const content = match?.[3];\n if (lineText === undefined || content === undefined) return undefined;\n const line = Number.parseInt(lineText, 10);\n if (!Number.isSafeInteger(line) || line < 1) return undefined;\n const prefix = match?.[1];\n const marker = prefix === MATCH_PREFIX ? 'match' : prefix === CONTEXT_PREFIX ? 'context' : undefined;\n return { line, content, marker };\n}\n\nexport function parseFileHeader(value: string): string | undefined {\n return FILE_HEADER_PATTERN.exec(value)?.[1];\n}\n\n/**\n * Lines as the card presents them. A read shows one file, so its header is\n * dropped; a grep groups anchored matches under each file's path.\n */\nexport function presentHashlineLines(lines: readonly string[], kind: HashlineResultKind): PresentedLine[] {\n const presented: PresentedLine[] = [];\n for (const line of lines) {\n const path = parseFileHeader(line);\n if (path !== undefined) {\n if (kind !== 'read') presented.push({ type: 'file', path });\n continue;\n }\n const tagged = parseTaggedLine(line);\n if (tagged !== undefined) {\n presented.push({ type: 'tagged', value: tagged });\n continue;\n }\n presented.push({ type: 'plain', text: line });\n }\n return presented;\n}\n\n/** The body a card shows for one result, collapsed to the kind's line budget unless expanded. */\nexport function hashlineBody(\n result: HashlineResult | null,\n output: string,\n kind: HashlineResultKind,\n expanded: boolean,\n): HashlineBody {\n const lines = resultTextLines(result, output);\n const notice = takeTrailingNotice(lines);\n const presented = presentHashlineLines(lines, kind);\n const budget = kind === 'read' ? READ_COLLAPSED_LINES : GREP_COLLAPSED_LINES;\n const { shown, hidden } = collapseLines(presented, budget, expanded);\n const gutter = shown.reduce(\n (widest, line) => (line.type === 'tagged' ? Math.max(widest, String(line.value.line).length) : widest),\n 1,\n );\n return { shown, hidden, notice, gutter };\n}\n\n/** The `key · key` detail list beside a call's primary argument, with absent values dropped. */\nexport function compactDetails(values: ReadonlyArray<string | undefined>): string[] {\n return values.filter((value): value is string => value !== undefined && value.length > 0);\n}\n"],"mappings":"kCAcME,EAAsB,mCACtBC,EAAsB,qCAgD5B,SAASC,EAAY,EAAoC,CACvD,OAAO,OAAOC,GAAU,YAAYA,GAAkB,OAAQA,EAAoB,MAAS,QAC7F,CAOA,SAAgBC,EAAgB,EAA+B,EAA0B,CACvF,IAAMC,EAASC,GAAQ,QAAQ,OAAOJ,CAAW,GAAK,CAAC,EACjDK,EACJD,IAAW,KAAOE,EAASH,EAAO,QAAS,GAAWF,EAAM,OAAS,OAAS,CAACA,EAAM,MAAQ,EAAE,EAAI,CAAC,CAAE,CAAC,CAAC,KAAK;CAAI,EACnH,GAAII,EAAK,SAAW,EAClB,OAAOF,EAAO,KAAM,GAAUF,EAAM,OAAS,OAAO,EAAI,CAAC,kBAAiB,EAAI,CAAC,EAEjF,IAAMM,EAAQF,EAAK,WAAW,IAAM,IAAI,CAAC,CAAC,WAAW;EAAQ;CAAI,CAAC,CAAC,MAAM;CAAI,EAC7E,KAAOE,EAAM,GAAG,EAAE,IAAM,IAAIA,EAAM,IAAI,EACtC,OAAOA,CACT,CAGA,SAAgBC,EAAmB,EAAqC,CACtE,IAAMC,EAAOF,EAAM,GAAG,EAAE,EACxB,GAAIE,IAAS,IAAA,IAAcA,EAAK,WAAW,GAAG,GAAMA,EAAK,SAAS,GAAG,EAErE,KADAF,EAAM,IAAI,EACHA,EAAM,GAAG,EAAE,IAAM,IAAIA,EAAM,IAAI,EACtC,OAAOE,CAD+B,CAExC,CAEA,SAAgBC,EAAgB,EAAuC,CACrE,IAAMC,EAAQZ,EAAoB,KAAKa,CAAK,EACtCC,EAAWF,IAAQ,GACnBG,EAAUH,IAAQ,GACxB,GAAIE,IAAa,IAAA,IAAaC,IAAY,IAAA,GAAW,OACrD,IAAMC,EAAO,OAAO,SAASF,EAAU,EAAE,EACzC,GAAI,CAAC,OAAO,cAAcE,CAAI,GAAKA,EAAO,EAAG,OAC7C,IAAMC,EAASL,IAAQ,GAEvB,MAAO,CAAE,OAAM,UAAS,OADTK,IAAW,MAAe,QAAUA,IAAW,MAAiB,UAAY,IAAA,EAC5D,CACjC,CAEA,SAAgBC,EAAgB,EAAmC,CACjE,OAAOnB,EAAoB,KAAKc,CAAK,CAAC,GAAG,EAC3C,CAMA,SAAgBM,EAAqB,EAA0B,EAA2C,CACxG,IAAMC,EAA6B,CAAC,EACpC,IAAK,IAAMJ,KAAQR,EAAO,CACxB,IAAMa,EAAOH,EAAgBF,CAAI,EACjC,GAAIK,IAAS,IAAA,GAAW,CAClBC,IAAS,QAAQF,EAAU,KAAK,CAAE,KAAM,OAAQ,MAAK,CAAC,EAC1D,QACF,CACA,IAAMG,EAASZ,EAAgBK,CAAI,EACnC,GAAIO,IAAW,IAAA,GAAW,CACxBH,EAAU,KAAK,CAAE,KAAM,SAAU,MAAOG,CAAO,CAAC,EAChD,QACF,CACAH,EAAU,KAAK,CAAE,KAAM,QAAS,KAAMJ,CAAK,CAAC,CAC9C,CACA,OAAOI,CACT,CAGA,SAAgBI,EACd,EACA,EACA,EACA,EACc,CACd,IAAMhB,EAAQL,EAAgBE,EAAQE,CAAM,EACtCkB,EAAShB,EAAmBD,CAAK,EACjCY,EAAYD,EAAqBX,EAAOc,CAAI,EAE5C,CAAE,QAAO,UAAWzB,EAAAA,cAAcuB,EADzBE,IAAS,OAAA,GAAA,GACmCI,CAAQ,EAKnE,MAAO,CAAE,QAAO,SAAQ,SAAQ,OAJjBC,EAAM,QAClB,EAAQ,IAAUX,EAAK,OAAS,SAAW,KAAK,IAAIY,EAAQ,OAAOZ,EAAK,MAAM,IAAI,CAAC,CAAC,MAAM,EAAIY,EAC/F,CAEmC,CAAE,CACzC,CAGA,SAAgBC,EAAe,EAAqD,CAClF,OAAOC,EAAO,OAAQ,GAA2BjB,IAAU,IAAA,IAAaA,EAAM,OAAS,CAAC,CAC1F"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e={avif:`image`,bmp:`image`,gif:`image`,ico:`image`,jpeg:`image`,jpg:`image`,png:`image`,svg:`image`,webp:`image`,m4v:`video`,mov:`video`,mp4:`video`,webm:`video`,pdf:`pdf`};function t(e){let t=e.split(`/`).at(-1)??``,n=t.lastIndexOf(`.`);return n<1?``:t.slice(n+1).toLowerCase()}function n(n){return e[t(n)]??`download`}exports.mediaKindOf=n;
|
|
2
|
+
//# sourceMappingURL=media.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.cjs","names":["MEDIA_KIND_BY_EXTENSION","extensionOf","name","filePath","dot","mediaKindOf"],"sources":["../../../src/lib/media.ts"],"sourcesContent":["import type { MediaKind } from '../types/editor';\n\n/**\n * Which files a browser can show without help.\n *\n * Keyed by lower-case extension without the dot, and deliberately short: an\n * entry here is a promise that the element named by its kind will render the\n * bytes, so a format the browser only sometimes handles belongs in the\n * download fallback instead of on this list.\n */\nconst MEDIA_KIND_BY_EXTENSION: Readonly<Record<string, MediaKind>> = {\n avif: 'image',\n bmp: 'image',\n gif: 'image',\n ico: 'image',\n jpeg: 'image',\n jpg: 'image',\n png: 'image',\n svg: 'image',\n webp: 'image',\n m4v: 'video',\n mov: 'video',\n mp4: 'video',\n webm: 'video',\n pdf: 'pdf',\n};\n\n/** The extension of a path, lower-cased and without the dot; empty when it has none. */\nfunction extensionOf(filePath: string): string {\n const name = filePath.split('/').at(-1) ?? '';\n const dot = name.lastIndexOf('.');\n // A leading dot is the whole name of a dotfile, not the start of a suffix.\n return dot < 1 ? '' : name.slice(dot + 1).toLowerCase();\n}\n\n/**\n * How to show the file at this path. Anything unrecognised is a download,\n * which is the honest answer for a `.docx` or a `.zip`: a browser cannot\n * render it, and pretending otherwise costs a converter that loses the\n * formatting it converted.\n */\nexport function mediaKindOf(filePath: string): MediaKind {\n return MEDIA_KIND_BY_EXTENSION[extensionOf(filePath)] ?? 'download';\n}\n"],"mappings":"AAUA,MAAMA,EAA+D,CACnE,KAAM,QACN,IAAK,QACL,IAAK,QACL,IAAK,QACL,KAAM,QACN,IAAK,QACL,IAAK,QACL,IAAK,QACL,KAAM,QACN,IAAK,QACL,IAAK,QACL,IAAK,QACL,KAAM,QACN,IAAK,KACP,EAGA,SAASC,EAAY,EAA0B,CAC7C,IAAMC,EAAOC,EAAS,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,GAAK,GACrCC,EAAMF,EAAK,YAAY,GAAG,EAEhC,OAAOE,EAAM,EAAI,GAAKF,EAAK,MAAME,EAAM,CAAC,CAAC,CAAC,YAAY,CACxD,CAQA,SAAgBC,EAAY,EAA6B,CACvD,OAAOL,EAAwBC,EAAYE,CAAQ,IAAM,UAC3D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mediaPlayback.cjs","names":["boundedMediaTime","seconds","duration"],"sources":["../../../src/lib/mediaPlayback.ts"],"sourcesContent":["/** Keep an imperative seek inside the playable part of the current video. */\nexport function boundedMediaTime(seconds: number, duration: number): number {\n if (!Number.isFinite(seconds)) throw new RangeError('Media seek time must be finite');\n const end = Number.isFinite(duration) && duration >= 0 ? duration : Number.POSITIVE_INFINITY;\n return Math.min(Math.max(seconds, 0), end);\n}\n"],"mappings":"AACA,SAAgBA,EAAiB,EAAiB,EAA0B,CAC1E,GAAI,CAAC,OAAO,SAASC,CAAO,EAAG,MAAU,WAAW,gCAAgC,EAEpF,OAAO,KAAK,IAAI,KAAK,IAAIA,EAAS,CAAC,EADvB,OAAO,SAASC,CAAQ,GAAKA,GAAY,EAAIA,EAAW,GAC3B,CAC3C"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
let e;async function t(){return e??=import(`mermaid`).then(({default:e})=>(e.initialize({startOnLoad:!1,fontFamily:`inherit`,theme:`dark`,securityLevel:`strict`}),e)),e}async function n(e,n){let{svg:r}=await(await t()).render(e,n);return r}exports.renderMermaid=n;
|
|
2
|
+
//# sourceMappingURL=mermaidDiagram.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mermaidDiagram.cjs","names":["loading","mermaidApi","mermaid","renderMermaid","id","code","svg"],"sources":["../../../src/lib/mermaidDiagram.ts"],"sourcesContent":["/**\n * Mermaid, loaded only for a message that actually draws one.\n *\n * Mermaid is the largest thing this library can pull in, so nothing imports it\n * at module scope: the dynamic import below is its own chunk, fetched the\n * first time a `mermaid` fence renders and reused after that. The renderer\n * needs a document to measure text, so this module is browser-only by nature\n * and every caller is inside an effect.\n */\n\nlet loading: Promise<typeof import('mermaid').default> | undefined;\n\n/** Loads and configures mermaid once per page. */\nasync function mermaidApi(): Promise<typeof import('mermaid').default> {\n loading ??= import('mermaid').then(({ default: mermaid }) => {\n mermaid.initialize({\n startOnLoad: false,\n // Diagram text follows the surface it sits on rather than mermaid's own\n // font stack, and the dark base is the only preset close to the cockpit.\n fontFamily: 'inherit',\n theme: 'dark',\n // Strict is mermaid's default and its sanitiser: labels are escaped and\n // script-carrying markup is stripped before the SVG is handed back,\n // which is what makes rendering diagram text from a model safe.\n securityLevel: 'strict',\n });\n return mermaid;\n });\n return loading;\n}\n\n/**\n * The SVG for one diagram.\n *\n * Rejects on invalid syntax, which for a streaming message is the normal case\n * until the fence closes; the caller shows the source until it resolves.\n */\nexport async function renderMermaid(id: string, code: string): Promise<string> {\n const mermaid = await mermaidApi();\n const { svg } = await mermaid.render(id, code);\n return svg;\n}\n"],"mappings":"AAUA,IAAIA,EAGJ,eAAeC,GAAwD,CAerE,MAdA,KAAY,OAAO,UAAU,CAAC,MAAM,CAAE,QAASC,MAC7CA,EAAQ,WAAW,CACjB,YAAa,GAGb,WAAY,UACZ,MAAO,OAIP,cAAe,QACjB,CAAC,EACMA,EACR,EACMF,CACT,CAQA,eAAsBG,EAAc,EAAY,EAA+B,CAE7E,GAAM,CAAE,OAAQ,MAAM,MADAF,EAAW,EAAA,CACH,OAAOG,EAAIC,CAAI,EAC7C,OAAOC,CACT"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e,t){let{options:n,cursor:r,onCursorChange:i,onSelect:a}=t,o=n.length;if(o===0)return;if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault(),e.stopPropagation(),i((r+(e.key===`ArrowDown`?1:-1)+o)%o);return}if(e.key===`Enter`){let t=n[r];if(t===void 0)return;e.preventDefault(),e.stopPropagation(),a(t);return}let s=Number.parseInt(e.key,10)-1,c=Number.isInteger(s)&&s<9?n[s]:void 0;c!==void 0&&(e.preventDefault(),e.stopPropagation(),a(c))}function t(e){return e>9?`up/down move · enter select · 1-9 jump`:`1-9 select · enter confirm`}function n(e){return e<9?String(e+1):`·`}exports.MAX_DIGIT_SHORTCUT=9,exports.handleOptionListKey=e,exports.optionListHint=t,exports.optionMarker=n;
|
|
2
|
+
//# sourceMappingURL=optionList.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optionList.cjs","names":["handleOptionListKey","input","count","options","event","onCursorChange","cursor","option","onSelect","index","optionListHint","optionMarker"],"sources":["../../../src/lib/optionList.ts"],"sourcesContent":["import type { KeyboardEvent } from 'react';\n\n/** Digits are a shortcut, not the only way in: only the first nine can have one. */\nexport const MAX_DIGIT_SHORTCUT = 9;\n\n/**\n * The keyboard an option list answers to, handled on whichever element the\n * surrounding overlay focuses. Every key it claims is consumed, so a digit\n * that answers the agent never also reaches the rail's session shortcuts.\n */\nexport function handleOptionListKey(\n event: KeyboardEvent,\n input: {\n options: readonly string[];\n cursor: number;\n onCursorChange: (cursor: number) => void;\n onSelect: (option: string) => void;\n },\n): void {\n const { options, cursor, onCursorChange, onSelect } = input;\n const count = options.length;\n if (count === 0) return;\n\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n event.stopPropagation();\n onCursorChange((cursor + (event.key === 'ArrowDown' ? 1 : -1) + count) % count);\n return;\n }\n if (event.key === 'Enter') {\n const option = options[cursor];\n if (option === undefined) return;\n event.preventDefault();\n event.stopPropagation();\n onSelect(option);\n return;\n }\n const index = Number.parseInt(event.key, 10) - 1;\n const option = Number.isInteger(index) && index < MAX_DIGIT_SHORTCUT ? options[index] : undefined;\n if (option === undefined) return;\n event.preventDefault();\n event.stopPropagation();\n onSelect(option);\n}\n\n/** What the footer should promise, given how many options there are. */\nexport function optionListHint(count: number): string {\n return count > MAX_DIGIT_SHORTCUT ? 'up/down move · enter select · 1-9 jump' : '1-9 select · enter confirm';\n}\n\n/** The digit a row answers to, or the bullet that says it has none. */\nexport function optionMarker(index: number): string {\n return index < MAX_DIGIT_SHORTCUT ? String(index + 1) : '·';\n}\n"],"mappings":"AAUA,SAAgBA,EACd,EACA,EAMM,CACN,GAAM,CAAE,UAAS,SAAQ,iBAAgB,YAAaC,EAChDC,EAAQC,EAAQ,OACtB,GAAID,IAAU,EAAG,OAEjB,GAAIE,EAAM,MAAQ,aAAeA,EAAM,MAAQ,UAAW,CACxDA,EAAM,eAAe,EACrBA,EAAM,gBAAgB,EACtBC,GAAgBC,GAAUF,EAAM,MAAQ,YAAc,EAAI,IAAMF,GAASA,CAAK,EAC9E,MACF,CACA,GAAIE,EAAM,MAAQ,QAAS,CACzB,IAAMG,EAASJ,EAAQG,GACvB,GAAIC,IAAW,IAAA,GAAW,OAC1BH,EAAM,eAAe,EACrBA,EAAM,gBAAgB,EACtBI,EAASD,CAAM,EACf,MACF,CACA,IAAME,EAAQ,OAAO,SAASL,EAAM,IAAK,EAAE,EAAI,EACzCG,EAAS,OAAO,UAAUE,CAAK,GAAKA,EAAA,EAA6BN,EAAQM,GAAS,IAAA,GACpFF,IAAW,IAAA,KACfH,EAAM,eAAe,EACrBA,EAAM,gBAAgB,EACtBI,EAASD,CAAM,EACjB,CAGA,SAAgBG,EAAe,EAAuB,CACpD,OAAOR,EAAA,EAA6B,yCAA2C,4BACjF,CAGA,SAAgBS,EAAa,EAAuB,CAClD,OAAOF,EAAA,EAA6B,OAAOA,EAAQ,CAAC,EAAI,GAC1D"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e){let t=e.lastIndexOf(`/`);return t===-1?``:e.slice(0,t)}function t(e,t){let n=e.split(`/`),r=t.split(`/`),i=[];for(let e=0;e<Math.min(n.length,r.length)&&n[e]===r[e];e+=1)i.push(n[e]);return i.join(`/`)}function n(n,r){let i=/* @__PURE__ */ new Map;for(let e of n){let t=r(e),n=t.indexOf(`/`),a=n===-1?``:t.slice(0,n),o=i.get(a);o===void 0?i.set(a,[e]):o.push(e)}let a=[];for(let[n,o]of i){let i=[...o].sort((e,t)=>r(e).localeCompare(r(t))),s=n===``?``:i.map(t=>e(r(t))).reduce(t);a.push({prefix:s,items:i})}return a.sort((e,t)=>e.prefix.localeCompare(t.prefix))}function r(e,t){return e===``?t:t.slice(e.length+1)}exports.groupByDirectory=n,exports.groupRowLabel=r;
|
|
2
|
+
//# sourceMappingURL=pathGroups.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathGroups.cjs","names":["parentDir","cut","relPath","commonDir","leftParts","left","rightParts","right","shared","index","groupByDirectory","buckets","item","items","pathOf","key","bucket","groups","sorted","prefix","groupRowLabel"],"sources":["../../../src/lib/pathGroups.ts"],"sourcesContent":["/**\n * The two-level grouping a changed-file list uses: one header per top-level\n * segment, each naming the deepest directory its files share.\n *\n * Two levels rather than a full tree: paths here run five and six segments\n * deep, so a node per segment spends more rows on directories than on the files\n * someone came to find. The header carries the shared run of directories and\n * each row carries what is left, so a file stays one row and the part that\n * distinguishes it stays readable.\n */\n\n/** One header row and the items under it. */\nexport interface PathGroup<T> {\n /** The shared directory the header names, or empty for files at the root. */\n prefix: string;\n items: T[];\n}\n\n/** The directory part of a relative path, or empty for a file at the root. */\nfunction parentDir(relPath: string): string {\n const cut = relPath.lastIndexOf('/');\n return cut === -1 ? '' : relPath.slice(0, cut);\n}\n\n/** The longest directory two paths share, compared segment by segment rather than character by character. */\nfunction commonDir(left: string, right: string): string {\n const leftParts = left.split('/');\n const rightParts = right.split('/');\n const shared: string[] = [];\n for (let index = 0; index < Math.min(leftParts.length, rightParts.length); index += 1) {\n if (leftParts[index] !== rightParts[index]) break;\n shared.push(leftParts[index]);\n }\n return shared.join('/');\n}\n\n/** Groups by top-level segment, ordered by path so a header's files sit together under it. */\nexport function groupByDirectory<T>(items: readonly T[], pathOf: (item: T) => string): PathGroup<T>[] {\n const buckets = new Map<string, T[]>();\n for (const item of items) {\n const relPath = pathOf(item);\n const cut = relPath.indexOf('/');\n const key = cut === -1 ? '' : relPath.slice(0, cut);\n const bucket = buckets.get(key);\n if (bucket === undefined) buckets.set(key, [item]);\n else bucket.push(item);\n }\n const groups: PathGroup<T>[] = [];\n for (const [key, bucket] of buckets) {\n const sorted = [...bucket].sort((left, right) => pathOf(left).localeCompare(pathOf(right)));\n // Root files have no directory to name, so they keep an empty header and\n // render their own paths in full.\n const prefix = key === '' ? '' : sorted.map((item) => parentDir(pathOf(item))).reduce(commonDir);\n groups.push({ prefix, items: sorted });\n }\n return groups.sort((left, right) => left.prefix.localeCompare(right.prefix));\n}\n\n/** What one row shows once its group's header has already said the shared part. */\nexport function groupRowLabel(prefix: string, relPath: string): string {\n return prefix === '' ? relPath : relPath.slice(prefix.length + 1);\n}\n"],"mappings":"AAmBA,SAASA,EAAU,EAAyB,CAC1C,IAAMC,EAAMC,EAAQ,YAAY,GAAG,EACnC,OAAOD,IAAQ,GAAK,GAAKC,EAAQ,MAAM,EAAGD,CAAG,CAC/C,CAGA,SAASE,EAAU,EAAc,EAAuB,CACtD,IAAMC,EAAYC,EAAK,MAAM,GAAG,EAC1BC,EAAaC,EAAM,MAAM,GAAG,EAC5BC,EAAmB,CAAC,EAC1B,IAAK,IAAIC,EAAQ,EAAGA,EAAQ,KAAK,IAAIL,EAAU,OAAQE,EAAW,MAAM,GAClEF,EAAUK,KAAWH,EAAWG,GADqC,GAAS,EAElFD,EAAO,KAAKJ,EAAUK,EAAM,EAE9B,OAAOD,EAAO,KAAK,GAAG,CACxB,CAGA,SAAgBE,EAAoB,EAAqB,EAA6C,CACpG,IAAMC,kBAAU,IAAI,IACpB,IAAK,IAAMC,KAAQC,EAAO,CACxB,IAAMX,EAAUY,EAAOF,CAAI,EACrBX,EAAMC,EAAQ,QAAQ,GAAG,EACzBa,EAAMd,IAAQ,GAAK,GAAKC,EAAQ,MAAM,EAAGD,CAAG,EAC5Ce,EAASL,EAAQ,IAAII,CAAG,EAC1BC,IAAW,IAAA,GAAWL,EAAQ,IAAII,EAAK,CAACH,CAAI,CAAC,EAC5CI,EAAO,KAAKJ,CAAI,CACvB,CACA,IAAMK,EAAyB,CAAC,EAChC,IAAK,GAAM,CAACF,EAAKC,KAAWL,EAAS,CACnC,IAAMO,EAAS,CAAC,GAAGF,CAAM,CAAC,CAAC,MAAM,EAAM,IAAUF,EAAOT,CAAI,CAAC,CAAC,cAAcS,EAAOP,CAAK,CAAC,CAAC,EAGpFY,EAASJ,IAAQ,GAAK,GAAKG,EAAO,IAAK,GAASlB,EAAUc,EAAOF,CAAI,CAAC,CAAC,CAAC,CAAC,OAAOT,CAAS,EAC/Fc,EAAO,KAAK,CAAE,SAAQ,MAAOC,CAAO,CAAC,CACvC,CACA,OAAOD,EAAO,MAAM,EAAM,IAAUZ,EAAK,OAAO,cAAcE,EAAM,MAAM,CAAC,CAC7E,CAGA,SAAgBa,EAAc,EAAgB,EAAyB,CACrE,OAAOD,IAAW,GAAKjB,EAAUA,EAAQ,MAAMiB,EAAO,OAAS,CAAC,CAClE"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require("./optionList.cjs");function e(e,t){let n=t.trim().toLowerCase();return n===``?e:e.filter(e=>`${e.title} ${e.subtitle??``} ${e.value}`.toLowerCase().includes(n))}function t(e,t){return Math.max(0,e.findIndex(e=>t.includes(e.value)))}function n(e,t){let n=new Set(e);return n.delete(t)||n.add(t),n}function r(e,t){return e.size!==t.length||t.some(t=>!e.has(t))}function i(e,t){return e.filter(e=>t.has(e.value)).map(e=>e.value)}function a(e,t){return e?t?`enter toggles · tab to Apply`:`1-9, space or enter toggles · tab to Apply`:t?`type to filter · enter picks`:`1-9 or enter picks`}function o(e,t){let{count:n,cursor:r,multiple:i,filterable:a}=t;if(e===`ArrowDown`||e===`ArrowUp`)return n===0?null:{kind:`move`,cursor:(r+(e===`ArrowDown`?1:-1)+n)%n};if(e===`Enter`)return n===0?null:{kind:`pick`,index:r};if(a)return null;if(e===` `&&i)return n===0?null:{kind:`pick`,index:r};let o=Number.parseInt(e,10)-1;return!Number.isInteger(o)||o<0||o>=Math.min(n,9)?null:{kind:`pick`,index:o}}exports.appliedValues=i,exports.draftChanged=r,exports.filterPickerItems=e,exports.initialPickerCursor=t,exports.pickerHint=a,exports.pickerKeyAction=o,exports.toggleDraft=n;
|
|
2
|
+
//# sourceMappingURL=picker.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"picker.cjs","names":["filterPickerItems","needle","filter","items","item","initialPickerCursor","value","toggleDraft","next","draft","draftChanged","appliedValues","pickerHint","multiple","filterable","pickerKeyAction","state","key","count","cursor","index"],"sources":["../../../src/lib/picker.ts"],"sourcesContent":["import { MAX_DIGIT_SHORTCUT } from './optionList';\n\n/** What a picker row needs for matching and ordering; the view adds its own presentation. */\nexport interface PickerChoice {\n value: string;\n title: string;\n subtitle?: string;\n disabledReason?: string;\n}\n\n/** What a key does to a picker, decided apart from the DOM so it can be tested. */\nexport type PickerKeyAction = { kind: 'move'; cursor: number } | { kind: 'pick'; index: number };\n\n/** Rows whose title, subtitle or value contain the filter, case-insensitively. */\nexport function filterPickerItems<T extends PickerChoice>(items: readonly T[], filter: string): readonly T[] {\n const needle = filter.trim().toLowerCase();\n if (needle === '') return items;\n return items.filter((item) => `${item.title} ${item.subtitle ?? ''} ${item.value}`.toLowerCase().includes(needle));\n}\n\n/** Open on what is in effect, so Enter on a single choice keeps it. */\nexport function initialPickerCursor(items: readonly PickerChoice[], value: readonly string[]): number {\n return Math.max(\n 0,\n items.findIndex((item) => value.includes(item.value)),\n );\n}\n\n/** The draft with one value flipped. */\nexport function toggleDraft(draft: ReadonlySet<string>, value: string): Set<string> {\n const next = new Set(draft);\n if (!next.delete(value)) next.add(value);\n return next;\n}\n\n/** Whether the draft differs from what is in effect, which is what makes Apply worth pressing. */\nexport function draftChanged(draft: ReadonlySet<string>, value: readonly string[]): boolean {\n return draft.size !== value.length || value.some((item) => !draft.has(item));\n}\n\n/** The drafted values in the order they were offered, not the order they were clicked. */\nexport function appliedValues(items: readonly PickerChoice[], draft: ReadonlySet<string>): string[] {\n return items.filter((item) => draft.has(item.value)).map((item) => item.value);\n}\n\n/** The keys the footer promises, given the mode and whether a filter takes typing. */\nexport function pickerHint(multiple: boolean, filterable: boolean): string {\n if (multiple) return filterable ? 'enter toggles · tab to Apply' : '1-9, space or enter toggles · tab to Apply';\n return filterable ? 'type to filter · enter picks' : '1-9 or enter picks';\n}\n\n/**\n * The action a key asks for, or null to leave it alone. Digits jump to a row\n * only without a filter, which would otherwise take them as typing; space\n * toggles a multiple choice for the same reason.\n */\nexport function pickerKeyAction(\n key: string,\n state: { count: number; cursor: number; multiple: boolean; filterable: boolean },\n): PickerKeyAction | null {\n const { count, cursor, multiple, filterable } = state;\n if (key === 'ArrowDown' || key === 'ArrowUp') {\n if (count === 0) return null;\n return { kind: 'move', cursor: (cursor + (key === 'ArrowDown' ? 1 : -1) + count) % count };\n }\n if (key === 'Enter') return count === 0 ? null : { kind: 'pick', index: cursor };\n if (filterable) return null;\n if (key === ' ' && multiple) return count === 0 ? null : { kind: 'pick', index: cursor };\n const index = Number.parseInt(key, 10) - 1;\n if (!Number.isInteger(index) || index < 0 || index >= Math.min(count, MAX_DIGIT_SHORTCUT)) return null;\n return { kind: 'pick', index };\n}\n"],"mappings":"4BAcA,SAAgBA,EAA0C,EAAqB,EAA8B,CAC3G,IAAMC,EAASC,EAAO,KAAK,CAAC,CAAC,YAAY,EAEzC,OADID,IAAW,GAAWE,EACnBA,EAAM,OAAQ,GAAS,GAAGC,EAAK,MAAM,GAAGA,EAAK,UAAY,GAAG,GAAGA,EAAK,QAAQ,YAAY,CAAC,CAAC,SAASH,CAAM,CAAC,CACnH,CAGA,SAAgBI,EAAoB,EAAgC,EAAkC,CACpG,OAAO,KAAK,IACV,EACAF,EAAM,UAAW,GAASG,EAAM,SAASF,EAAK,KAAK,CAAC,CACtD,CACF,CAGA,SAAgBG,EAAY,EAA4B,EAA4B,CAClF,IAAMC,EAAO,IAAI,IAAIC,CAAK,EAE1B,OADKD,EAAK,OAAOF,CAAK,GAAGE,EAAK,IAAIF,CAAK,EAChCE,CACT,CAGA,SAAgBE,EAAa,EAA4B,EAAmC,CAC1F,OAAOD,EAAM,OAASH,EAAM,QAAUA,EAAM,KAAM,GAAS,CAACG,EAAM,IAAIL,CAAI,CAAC,CAC7E,CAGA,SAAgBO,EAAc,EAAgC,EAAsC,CAClG,OAAOR,EAAM,OAAQ,GAASM,EAAM,IAAIL,EAAK,KAAK,CAAC,CAAC,CAAC,IAAK,GAASA,EAAK,KAAK,CAC/E,CAGA,SAAgBQ,EAAW,EAAmB,EAA6B,CAEzE,OADIC,EAAiBC,EAAa,+BAAiC,6CAC5DA,EAAa,+BAAiC,oBACvD,CAOA,SAAgBC,EACd,EACA,EACwB,CACxB,GAAM,CAAE,QAAO,SAAQ,WAAU,cAAeC,EAChD,GAAIC,IAAQ,aAAeA,IAAQ,UAEjC,OADIC,IAAU,EAAU,KACjB,CAAE,KAAM,OAAQ,QAASC,GAAUF,IAAQ,YAAc,EAAI,IAAMC,GAASA,CAAM,EAE3F,GAAID,IAAQ,QAAS,OAAOC,IAAU,EAAI,KAAO,CAAE,KAAM,OAAQ,MAAOC,CAAO,EAC/E,GAAIL,EAAY,OAAO,KACvB,GAAIG,IAAQ,KAAOJ,EAAU,OAAOK,IAAU,EAAI,KAAO,CAAE,KAAM,OAAQ,MAAOC,CAAO,EACvF,IAAMC,EAAQ,OAAO,SAASH,EAAK,EAAE,EAAI,EAEzC,MADI,CAAC,OAAO,UAAUG,CAAK,GAAKA,EAAQ,GAAKA,GAAS,KAAK,IAAIF,EAAA,CAAyB,EAAU,KAC3F,CAAE,KAAM,OAAQ,OAAM,CAC/B"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
function e(e){let t=1;for(let n of e)for(let e of n.rows)t=Math.max(t,String(e.line).length);return t}function t(e){let t=e.filter(e=>Number.isFinite(e.line)&&e.line>0),n=t.filter(e=>e.marker!==`-`),r=n.length>0?`new`:`old`,i=(n.length>0?n:t).map(e=>e.line);if(i.length!==0)return{side:r,startLine:Math.min(...i),endLine:Math.max(...i)}}function n(e,t=20,n=2e3){let r=e.split(`
|
|
2
|
+
`),i=(r.length>t?[...r.slice(0,t),`…`]:r).join(`
|
|
3
|
+
`);return i.length>n?`${i.slice(0,n)}…`:i}function r(e){if(e.startLine===void 0)return e.relPath;let t=e.endLine===void 0||e.endLine===e.startLine;return e.side===`old`?t?`${e.relPath} (removed line ${e.startLine})`:`${e.relPath} (removed lines ${e.startLine}-${e.endLine})`:t?`${e.relPath}:${e.startLine}`:`${e.relPath}:${e.startLine}-${e.endLine}`}function i(e){return e===1?`I left one review comment on a file you changed. Please address it.`:`I left ${e} review comments on files you changed. Please address them.`}function a(e,t){if(e.length===0)return``;let a=e.map(e=>{let t=n(e.snippet).split(`
|
|
4
|
+
`).map(e=>`> ${e}`).join(`
|
|
5
|
+
`);return`### ${r(e)}\n\n${t}\n\n${e.body.trim()}`}).join(`
|
|
6
|
+
|
|
7
|
+
`);return`${t??i(e.length)}\n\n${a}`}exports.buildReviewPrompt=a,exports.defaultReviewHeading=i,exports.diffGutterWidth=e,exports.diffRangeOf=t,exports.reviewCommentAnchor=r,exports.trimSnippet=n;
|
|
8
|
+
//# sourceMappingURL=review.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.cjs","names":["diffGutterWidth","widest","hunk","hunks","row","diffRangeOf","numbered","rows","kept","side","lines","trimSnippet","snippet","text","maxLines","maxChars","reviewCommentAnchor","comment","single","defaultReviewHeading","count","buildReviewPrompt","comments","body","quoted","line","heading"],"sources":["../../../src/lib/review.ts"],"sourcesContent":["import type { DiffHunk, DiffMarker, DiffSide, ReviewComment } from '../types/diff';\n\n/**\n * Pure review logic shared by every surface that comments on a diff: sizing a\n * gutter, deciding which side a selection is on, naming an anchor, and folding\n * a set of notes into one message.\n */\n\n/** The widest line number in a diff, in characters, which sizes the gutter. */\nexport function diffGutterWidth(hunks: readonly DiffHunk[]): number {\n let widest = 1;\n for (const hunk of hunks) {\n for (const row of hunk.rows) widest = Math.max(widest, String(row.line).length);\n }\n return widest;\n}\n\n/**\n * The line range a set of touched rows covers, and the side it is on.\n *\n * Any context or added row puts the selection on the new side, and then the\n * removed rows in it are ignored: their numbers belong to the other file and\n * would stretch the range over lines that have nothing to do with it. Only a\n * selection made entirely of removed rows lands on the old side.\n */\nexport function diffRangeOf(\n rows: readonly { marker: DiffMarker; line: number }[],\n): { side: DiffSide; startLine: number; endLine: number } | undefined {\n const numbered = rows.filter((row) => Number.isFinite(row.line) && row.line > 0);\n const kept = numbered.filter((row) => row.marker !== '-');\n const side: DiffSide = kept.length > 0 ? 'new' : 'old';\n const lines = (kept.length > 0 ? kept : numbered).map((row) => row.line);\n if (lines.length === 0) return undefined;\n return { side, startLine: Math.min(...lines), endLine: Math.max(...lines) };\n}\n\n/** Trims a quoted snippet to something a prompt can carry without drowning it. */\nexport function trimSnippet(snippet: string, maxLines = 20, maxChars = 2000): string {\n const lines = snippet.split('\\n');\n const clipped = lines.length > maxLines ? [...lines.slice(0, maxLines), '…'] : lines;\n const text = clipped.join('\\n');\n return text.length > maxChars ? `${text.slice(0, maxChars)}…` : text;\n}\n\n/** How a comment names the place it is about. New-side anchors keep the `path:line` form. */\nexport function reviewCommentAnchor(comment: ReviewComment): string {\n if (comment.startLine === undefined) return comment.relPath;\n const single = comment.endLine === undefined || comment.endLine === comment.startLine;\n if (comment.side === 'old') {\n return single\n ? `${comment.relPath} (removed line ${comment.startLine})`\n : `${comment.relPath} (removed lines ${comment.startLine}-${comment.endLine})`;\n }\n return single\n ? `${comment.relPath}:${comment.startLine}`\n : `${comment.relPath}:${comment.startLine}-${comment.endLine}`;\n}\n\n/** The opening line of a review when the caller names no context of its own. */\nexport function defaultReviewHeading(count: number): string {\n return count === 1\n ? 'I left one review comment on a file you changed. Please address it.'\n : `I left ${count} review comments on files you changed. Please address them.`;\n}\n\n/**\n * The one message a review sends.\n *\n * Every note goes in a single message rather than one each: N notes then cost\n * one turn, and the agent sees the whole review before it changes anything.\n */\nexport function buildReviewPrompt(comments: readonly ReviewComment[], heading?: string): string {\n if (comments.length === 0) return '';\n const body = comments\n .map((comment) => {\n const quoted = trimSnippet(comment.snippet)\n .split('\\n')\n .map((line) => `> ${line}`)\n .join('\\n');\n return `### ${reviewCommentAnchor(comment)}\\n\\n${quoted}\\n\\n${comment.body.trim()}`;\n })\n .join('\\n\\n');\n return `${heading ?? defaultReviewHeading(comments.length)}\\n\\n${body}`;\n}\n"],"mappings":"AASA,SAAgBA,EAAgB,EAAoC,CAClE,IAAIC,EAAS,EACb,IAAK,IAAMC,KAAQC,EACjB,IAAK,IAAMC,KAAOF,EAAK,KAAM,EAAS,KAAK,IAAID,EAAQ,OAAOG,EAAI,IAAI,CAAC,CAAC,MAAM,EAEhF,OAAOH,CACT,CAUA,SAAgBI,EACd,EACoE,CACpE,IAAMC,EAAWC,EAAK,OAAQ,GAAQ,OAAO,SAASH,EAAI,IAAI,GAAKA,EAAI,KAAO,CAAC,EACzEI,EAAOF,EAAS,OAAQ,GAAQF,EAAI,SAAW,GAAG,EAClDK,EAAiBD,EAAK,OAAS,EAAI,MAAQ,MAC3CE,GAASF,EAAK,OAAS,EAAIA,EAAOF,EAAA,CAAU,IAAK,GAAQF,EAAI,IAAI,EACvE,GAAIM,EAAM,SAAW,EACrB,MAAO,CAAE,OAAM,UAAW,KAAK,IAAI,GAAGA,CAAK,EAAG,QAAS,KAAK,IAAI,GAAGA,CAAK,CAAE,CAC5E,CAGA,SAAgBC,EAAY,EAAiB,EAAW,GAAI,EAAW,IAAc,CACnF,IAAMD,EAAQE,EAAQ,MAAM;CAAI,EAE1BC,GADUH,EAAM,OAASI,EAAW,CAAC,GAAGJ,EAAM,MAAM,EAAGI,CAAQ,EAAG,GAAG,EAAIJ,EAAA,CAC1D,KAAK;CAAI,EAC9B,OAAOG,EAAK,OAASE,EAAW,GAAGF,EAAK,MAAM,EAAGE,CAAQ,EAAE,GAAKF,CAClE,CAGA,SAAgBG,EAAoB,EAAgC,CAClE,GAAIC,EAAQ,YAAc,IAAA,GAAW,OAAOA,EAAQ,QACpD,IAAMC,EAASD,EAAQ,UAAY,IAAA,IAAaA,EAAQ,UAAYA,EAAQ,UAM5E,OALIA,EAAQ,OAAS,MACZC,EACH,GAAGD,EAAQ,QAAQ,iBAAiBA,EAAQ,UAAU,GACtD,GAAGA,EAAQ,QAAQ,kBAAkBA,EAAQ,UAAU,GAAGA,EAAQ,QAAQ,GAEzEC,EACH,GAAGD,EAAQ,QAAQ,GAAGA,EAAQ,YAC9B,GAAGA,EAAQ,QAAQ,GAAGA,EAAQ,UAAU,GAAGA,EAAQ,SACzD,CAGA,SAAgBE,EAAqB,EAAuB,CAC1D,OAAOC,IAAU,EACb,sEACA,UAAUA,EAAM,4DACtB,CAQA,SAAgBC,EAAkB,EAAoC,EAA0B,CAC9F,GAAIC,EAAS,SAAW,EAAG,MAAO,GAClC,IAAMC,EAAOD,EACV,IAAK,GAAY,CAChB,IAAME,EAASb,EAAYM,EAAQ,OAAO,CAAC,CACxC,MAAM;CAAI,CAAC,CACX,IAAK,GAAS,KAAKQ,GAAM,CAAC,CAC1B,KAAK;CAAI,EACZ,MAAO,OAAOT,EAAoBC,CAAO,EAAE,MAAMO,EAAO,MAAMP,EAAQ,KAAK,KAAK,GAClF,CAAC,CAAC,CACD,KAAK;;CAAM,EACd,MAAO,GAAGS,GAAWP,EAAqBG,EAAS,MAAM,EAAE,MAAMC,GACnE"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const e=require("./editorLanguage.cjs"),t=require("./editorTheme.cjs"),n=[{pattern:/^#!.*\b(?:bash|sh|zsh|dash|ksh)\b/,grammar:`shell`},{pattern:/^#!.*\bpython[\d.]*\b/,grammar:`python`},{pattern:/^#!.*\b(?:node|bun|deno)\b/,grammar:`javascript`}],r=/^\s*[[{][\s\S]*[\]}]\s*$/;function i(t){let i=t.path===void 0||t.path.length===0?void 0:e.grammarKeyOf(t.path);if(i!==void 0)return i;let a=t.text??``;if(a.length===0)return;let o=a.slice(0,200);if(o.startsWith(`#!`)){let e=o.split(`
|
|
2
|
+
`,1)[0]??``;for(let t of n)if(t.pattern.test(e))return t.grammar;return`shell`}return r.test(a)?`json`:void 0}function a(e){return e===void 0?void 0:t.DOOM_SYNTAX_STYLES[e]}async function o(){let{tagHighlighter:e,tags:t}=await import(`@lezer/highlight`);return e([{tag:t.comment,class:`comment`},{tag:t.keyword,class:`keyword`},{tag:[t.atom,t.bool,t.null,t.self],class:`constant`},{tag:t.number,class:`literal`},{tag:[t.string,t.special(t.string)],class:`string`},{tag:t.regexp,class:`regexp`},{tag:[t.operator,t.operatorKeyword],class:`operator`},{tag:[t.punctuation,t.separator,t.bracket],class:`punctuation`},{tag:[t.variableName,t.definition(t.variableName)],class:`variable`},{tag:[t.propertyName,t.definition(t.propertyName)],class:`property`},{tag:[t.function(t.variableName),t.function(t.propertyName)],class:`callable`},{tag:[t.typeName,t.className,t.namespace],class:`type`},{tag:[t.tagName,t.angleBracket],class:`tag`},{tag:t.attributeName,class:`attribute`},{tag:[t.meta,t.processingInstruction,t.documentMeta],class:`meta`},{tag:t.heading,class:`heading`},{tag:[t.link,t.url],class:`link`},{tag:t.emphasis,class:`emphasis`},{tag:t.strong,class:`strong`},{tag:t.strikethrough,class:`strikethrough`},{tag:t.invalid,class:`invalid`}])}async function s(t){let[{Language:n,LanguageSupport:r},i]=await Promise.all([import(`@codemirror/language`),e.loadGrammar(t)]);if(i instanceof r)return i.language.parser;if(i instanceof n)return i.parser}async function c(e,t){if(e.length===0||e.length>2e5)return;let[{highlightCode:n},r,i]=await Promise.all([import(`@lezer/highlight`),o(),s(t)]);if(i===void 0)return;let a=[[]];return n(e,i.parse(e),r,(e,t)=>{a[a.length-1]?.push(t===``?{text:e}:{text:e,token:t})},()=>a.push([])),a}exports.detectGrammar=i,exports.highlightToLines=c,exports.syntaxStyleOf=a;
|
|
3
|
+
//# sourceMappingURL=syntaxHighlight.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syntaxHighlight.cjs","names":["grammarKeyOf","DOOM_SYNTAX_STYLES","loadGrammar","require_editorLanguage","require_editorTheme","SHEBANG_GRAMMARS","JSON_SHAPE","detectGrammar","byPath","query","text","head","firstLine","entry","syntaxStyleOf","token","doomHighlighter","tagHighlighter","tags","parserFor","extension","grammar","LanguageSupport","Language","highlightToLines","highlighter","parser","lines","highlightCode","classes","code"],"sources":["../../../src/lib/syntaxHighlight.ts"],"sourcesContent":["import type { CSSProperties } from 'react';\n\nimport { type GrammarKey, grammarKeyOf, loadGrammar } from './editorLanguage';\nimport { DOOM_SYNTAX_STYLES } from './editorTheme';\n\n/**\n * Static syntax highlighting for read-only code, the timeline's half of the\n * editor's `syntaxHighlighting`.\n *\n * A tool card shows code it cannot edit, so it needs the colours without the\n * editor: the same grammars `editorLanguage.ts` loads and the same token\n * palette `editorTheme.ts` names, run once over a string and handed back as\n * spans. Everything CodeMirror-shaped is behind a dynamic import, so a session\n * that never opens a code result never downloads a parser, and the caller\n * always has plain text to show first.\n */\n\n/** The palette keys a token can land on; the styles themselves are the editor's. */\nexport type SyntaxToken = keyof typeof DOOM_SYNTAX_STYLES;\n\n/** One run of same-styled text inside a line. `token` absent means unstyled. */\nexport interface SyntaxSpan {\n text: string;\n token?: SyntaxToken;\n}\n\n/** Lines of spans, one array per source line, so a gutter can pair with them. */\nexport type SyntaxLines = readonly (readonly SyntaxSpan[])[];\n\n/**\n * Above this the parse costs more than the colour is worth. Tool results are\n * bounded well below it; a pasted file is not, and blocking the frame to paint\n * a wall of text nobody reads is the worse outcome.\n */\nconst MAX_HIGHLIGHT_CHARS = 200_000;\n\n/** Only the first line is needed to spot a shebang, and reading more of a big string is waste. */\nconst SNIFF_CHARS = 200;\n\nconst SHEBANG_GRAMMARS: ReadonlyArray<{ readonly pattern: RegExp; readonly grammar: GrammarKey }> = [\n { pattern: /^#!.*\\b(?:bash|sh|zsh|dash|ksh)\\b/, grammar: 'shell' },\n { pattern: /^#!.*\\bpython[\\d.]*\\b/, grammar: 'python' },\n { pattern: /^#!.*\\b(?:node|bun|deno)\\b/, grammar: 'javascript' },\n];\n\n/** JSON is the one shape worth guessing from the body: a document is an object or an array. */\nconst JSON_SHAPE = /^\\s*[[{][\\s\\S]*[\\]}]\\s*$/;\n\nexport interface GrammarQuery {\n /** The file the text came from, when the tool knows one. */\n path?: string | undefined;\n /** The text itself, used only when the path settles nothing. */\n text?: string | undefined;\n}\n\n/**\n * Which grammar to colour a result with.\n *\n * The path decides whenever it can, because a name is evidence and a body is a\n * guess. Sniffing only answers for text that arrived without a usable name: a\n * shebang says what runs the script, and a document that opens and closes with\n * brackets is treated as JSON. Anything else stays plain rather than being\n * coloured as the wrong language.\n */\nexport function detectGrammar(query: GrammarQuery): GrammarKey | undefined {\n const byPath = query.path === undefined || query.path.length === 0 ? undefined : grammarKeyOf(query.path);\n if (byPath !== undefined) return byPath;\n const text = query.text ?? '';\n if (text.length === 0) return undefined;\n const head = text.slice(0, SNIFF_CHARS);\n if (head.startsWith('#!')) {\n const firstLine = head.split('\\n', 1)[0] ?? '';\n for (const entry of SHEBANG_GRAMMARS) {\n if (entry.pattern.test(firstLine)) return entry.grammar;\n }\n // A shebang naming something with no grammar here is still a script.\n return 'shell';\n }\n return JSON_SHAPE.test(text) ? 'json' : undefined;\n}\n\n/** The inline style a token wears. Colours come from the editor palette, which names theme tokens. */\nexport function syntaxStyleOf(token: SyntaxToken | undefined): CSSProperties | undefined {\n return token === undefined ? undefined : DOOM_SYNTAX_STYLES[token];\n}\n\n/**\n * Every tag the palette answers for, in the order the editor lists them. The\n * class each entry carries is a palette key rather than a CSS class: the\n * result is rendered as inline styles, so nothing has to be mounted in the\n * document for a card to show colour.\n */\nasync function doomHighlighter() {\n const { tagHighlighter, tags } = await import('@lezer/highlight');\n return tagHighlighter([\n { tag: tags.comment, class: 'comment' satisfies SyntaxToken },\n { tag: tags.keyword, class: 'keyword' satisfies SyntaxToken },\n { tag: [tags.atom, tags.bool, tags.null, tags.self], class: 'constant' satisfies SyntaxToken },\n { tag: tags.number, class: 'literal' satisfies SyntaxToken },\n { tag: [tags.string, tags.special(tags.string)], class: 'string' satisfies SyntaxToken },\n { tag: tags.regexp, class: 'regexp' satisfies SyntaxToken },\n { tag: [tags.operator, tags.operatorKeyword], class: 'operator' satisfies SyntaxToken },\n { tag: [tags.punctuation, tags.separator, tags.bracket], class: 'punctuation' satisfies SyntaxToken },\n { tag: [tags.variableName, tags.definition(tags.variableName)], class: 'variable' satisfies SyntaxToken },\n { tag: [tags.propertyName, tags.definition(tags.propertyName)], class: 'property' satisfies SyntaxToken },\n {\n tag: [tags.function(tags.variableName), tags.function(tags.propertyName)],\n class: 'callable' satisfies SyntaxToken,\n },\n { tag: [tags.typeName, tags.className, tags.namespace], class: 'type' satisfies SyntaxToken },\n { tag: [tags.tagName, tags.angleBracket], class: 'tag' satisfies SyntaxToken },\n { tag: tags.attributeName, class: 'attribute' satisfies SyntaxToken },\n { tag: [tags.meta, tags.processingInstruction, tags.documentMeta], class: 'meta' satisfies SyntaxToken },\n { tag: tags.heading, class: 'heading' satisfies SyntaxToken },\n { tag: [tags.link, tags.url], class: 'link' satisfies SyntaxToken },\n { tag: tags.emphasis, class: 'emphasis' satisfies SyntaxToken },\n { tag: tags.strong, class: 'strong' satisfies SyntaxToken },\n { tag: tags.strikethrough, class: 'strikethrough' satisfies SyntaxToken },\n { tag: tags.invalid, class: 'invalid' satisfies SyntaxToken },\n ]);\n}\n\n/** The parser behind a grammar. `loadGrammar` hands back an editor extension, which wraps one. */\nasync function parserFor(grammar: GrammarKey) {\n const [{ Language, LanguageSupport }, extension] = await Promise.all([\n import('@codemirror/language'),\n loadGrammar(grammar),\n ]);\n if (extension instanceof LanguageSupport) return extension.language.parser;\n if (extension instanceof Language) return extension.parser;\n return undefined;\n}\n\n/**\n * Colours `text` as `grammar`, as lines of spans.\n *\n * The whole text is parsed at once even though the caller may render it line\n * by line, because a template literal or a block comment only makes sense with\n * its neighbours. Text past the size cap, and a grammar whose extension turns\n * out to carry no parser, come back unhighlighted rather than throwing: colour\n * is decoration, and the caller already has the plain text on screen.\n */\nexport async function highlightToLines(text: string, grammar: GrammarKey): Promise<SyntaxLines | undefined> {\n if (text.length === 0 || text.length > MAX_HIGHLIGHT_CHARS) return undefined;\n const [{ highlightCode }, highlighter, parser] = await Promise.all([\n import('@lezer/highlight'),\n doomHighlighter(),\n parserFor(grammar),\n ]);\n if (parser === undefined) return undefined;\n\n const lines: SyntaxSpan[][] = [[]];\n highlightCode(\n text,\n parser.parse(text),\n highlighter,\n (code, classes) => {\n const current = lines[lines.length - 1];\n // `classes` is the palette key this module handed the tag highlighter,\n // or empty for text no tag claimed.\n current?.push(classes === '' ? { text: code } : { text: code, token: classes as SyntaxToken });\n },\n () => lines.push([]),\n );\n return lines;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e={neutral:`neutral`,running:`yellow`,ok:`green`,error:`red`,info:`blue`,accent:`magenta`},t={neutral:`muted`,running:`yellow`,ok:`green`,error:`red`,info:`blue`,accent:`magenta`},n={neutral:`neutral`,blue:`info`,green:`ok`,yellow:`running`,red:`error`,magenta:`accent`,violet:`accent`,cyan:`info`,orange:`running`,teal:`info`},r={hi:`neutral`,text:`neutral`,dim:`neutral`,muted:`neutral`,success:`ok`,error:`error`,warning:`running`,accent:`info`};exports.CHIP_TO_STATUS=n,exports.LINE_TONE_TO_STATUS=r,exports.STATUS_TO_CHIP=e,exports.STATUS_TO_DOT=t;
|
|
2
|
+
//# sourceMappingURL=tone.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tone.cjs","names":["STATUS_TO_CHIP","STATUS_TO_DOT","CHIP_TO_STATUS","LINE_TONE_TO_STATUS"],"sources":["../../../src/lib/tone.ts"],"sourcesContent":["import type { ChipTone, DotTone, MessageLineTone, StatusTone } from '../types/tone';\n\n/**\n * Translations between the tone vocabularies.\n *\n * Every surface that shows an outcome used to carry its own\n * `Record<Tone, string>` table mapping a state onto a colour class. Those\n * tables disagreed as often as they agreed. These maps are the one place the\n * translation lives, so a card picks a status tone from its own domain and\n * asks here what colour that reads as.\n */\n\n/** The colour a status reads as, for the chip and border families. */\nexport const STATUS_TO_CHIP: Readonly<Record<StatusTone, ChipTone>> = {\n neutral: 'neutral',\n running: 'yellow',\n ok: 'green',\n error: 'red',\n info: 'blue',\n accent: 'magenta',\n};\n\n/** The dot a status reads as; a neutral status is present but not live. */\nexport const STATUS_TO_DOT: Readonly<Record<StatusTone, DotTone>> = {\n neutral: 'muted',\n running: 'yellow',\n ok: 'green',\n error: 'red',\n info: 'blue',\n accent: 'magenta',\n};\n\n/**\n * The status a colour stands for, for a caller that has only a chip tone.\n * Lossy on purpose: the palette has more colours than there are outcomes, and\n * a colour with no outcome of its own reads as neutral.\n */\nexport const CHIP_TO_STATUS: Readonly<Record<ChipTone, StatusTone>> = {\n neutral: 'neutral',\n blue: 'info',\n green: 'ok',\n yellow: 'running',\n red: 'error',\n magenta: 'accent',\n violet: 'accent',\n cyan: 'info',\n orange: 'running',\n teal: 'info',\n};\n\n/** The status a body line's role corresponds to, for a card that badges its worst line. */\nexport const LINE_TONE_TO_STATUS: Readonly<Record<MessageLineTone, StatusTone>> = {\n hi: 'neutral',\n text: 'neutral',\n dim: 'neutral',\n muted: 'neutral',\n success: 'ok',\n error: 'error',\n warning: 'running',\n accent: 'info',\n};\n"],"mappings":"AAaA,MAAaA,EAAyD,CACpE,QAAS,UACT,QAAS,SACT,GAAI,QACJ,MAAO,MACP,KAAM,OACN,OAAQ,SACV,EAGaC,EAAuD,CAClE,QAAS,QACT,QAAS,SACT,GAAI,QACJ,MAAO,MACP,KAAM,OACN,OAAQ,SACV,EAOaC,EAAyD,CACpE,QAAS,UACT,KAAM,OACN,MAAO,KACP,OAAQ,UACR,IAAK,QACL,QAAS,SACT,OAAQ,SACR,KAAM,OACN,OAAQ,UACR,KAAM,MACR,EAGaC,EAAqE,CAChF,GAAI,UACJ,KAAM,UACN,IAAK,UACL,MAAO,UACP,QAAS,KACT,MAAO,QACP,QAAS,UACT,OAAQ,MACV"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const e=require("../types/theme.cjs"),t=require("./derive.cjs"),n=`data-theme`;function r(n){let r={};for(let t of e.PALETTE_TOKENS)r[e.themeVariable(t)]=n.tokens[t];for(let i of t.derivedTokens())r[e.themeVariable(i)]=t.tokenValue(n,i);return r}function i(e,t=`:root`){let n=Object.entries(r(e)).map(([e,t])=>` ${e}: ${t};`);return`${t} {\n color-scheme: ${e.scheme};\n${n.join(`
|
|
2
|
+
`)}\n}\n`}function a(e,t){for(let[n,i]of Object.entries(r(e)))t.style.setProperty(n,i);t.style.colorScheme=e.scheme,t.setAttribute(n,e.name)}exports.THEME_ATTRIBUTE=n,exports.applyTheme=a,exports.themeCssText=i,exports.themeCssVariables=r;
|
|
3
|
+
//# sourceMappingURL=apply.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.cjs","names":["PALETTE_TOKENS","themeVariable","derivedTokens","tokenValue","require_theme","require_derive","THEME_ATTRIBUTE","themeCssVariables","variables","token","theme","themeCssText","declarations","name","value","selector","applyTheme","root"],"sources":["../../../src/theme/apply.ts"],"sourcesContent":["import { PALETTE_TOKENS, type ThemeConfig, themeVariable } from '../types/theme';\nimport { derivedTokens, tokenValue } from './derive';\n\n/** The attribute the active theme's name is stamped on, for CSS that keys off a theme. */\nexport const THEME_ATTRIBUTE = 'data-theme';\n\n/** Every custom property a theme publishes, keyed by property name. */\nexport function themeCssVariables(theme: ThemeConfig): Record<string, string> {\n const variables: Record<string, string> = {};\n for (const token of PALETTE_TOKENS) variables[themeVariable(token)] = theme.tokens[token];\n for (const token of derivedTokens()) variables[themeVariable(token)] = tokenValue(theme, token);\n return variables;\n}\n\n/** The theme as a stylesheet rule, for a server that wants to inline it. */\nexport function themeCssText(theme: ThemeConfig, selector = ':root'): string {\n const declarations = Object.entries(themeCssVariables(theme)).map(([name, value]) => ` ${name}: ${value};`);\n return `${selector} {\\n color-scheme: ${theme.scheme};\\n${declarations.join('\\n')}\\n}\\n`;\n}\n\n/** The subset of an element the theme touches, so tests can pass a plain object. */\nexport interface ThemeRoot {\n style: { setProperty(name: string, value: string): void; colorScheme: string };\n setAttribute(name: string, value: string): void;\n}\n\n/**\n * Applies a theme to the page: every token becomes a custom property on the\n * root, the colour scheme follows, and the theme name is stamped so a style\n * may key off it. Idempotent and synchronous, so calling it before the first\n * render avoids a flash of the default theme.\n */\nexport function applyTheme(theme: ThemeConfig, root: ThemeRoot): void {\n for (const [name, value] of Object.entries(themeCssVariables(theme))) root.style.setProperty(name, value);\n root.style.colorScheme = theme.scheme;\n root.setAttribute(THEME_ATTRIBUTE, theme.name);\n}\n"],"mappings":"gEAIaM,EAAkB,aAG/B,SAAgBC,EAAkB,EAA4C,CAC5E,IAAMC,EAAoC,CAAC,EAC3C,IAAK,IAAMC,KAAST,EAAAA,eAAgB,EAAUC,EAAAA,cAAcQ,CAAK,GAAKC,EAAM,OAAOD,GACnF,IAAK,IAAMA,KAASP,EAAAA,cAAc,EAAG,EAAUD,EAAAA,cAAcQ,CAAK,GAAKN,EAAAA,WAAWO,EAAOD,CAAK,EAC9F,OAAOD,CACT,CAGA,SAAgBG,EAAa,EAAoB,EAAW,QAAiB,CAC3E,IAAMC,EAAe,OAAO,QAAQL,EAAkBG,CAAK,CAAC,CAAC,CAAC,KAAK,CAACG,EAAMC,KAAW,KAAKD,EAAK,IAAIC,EAAM,EAAE,EAC3G,MAAO,GAAGC,EAAS,sBAAsBL,EAAM,OAAO,KAAKE,EAAa,KAAK;CAAI,EAAE,MACrF,CAcA,SAAgBI,EAAW,EAAoB,EAAuB,CACpE,IAAK,GAAM,CAACH,EAAMC,KAAU,OAAO,QAAQP,EAAkBG,CAAK,CAAC,EAAGO,EAAK,MAAM,YAAYJ,EAAMC,CAAK,EACxG,EAAK,MAAM,YAAcJ,EAAM,OAC/BO,EAAK,aAAaX,EAAiBI,EAAM,IAAI,CAC/C"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../../themes/doom-nord-dark.cjs"),t=require("../../themes/doom-one-dark.cjs"),n=require("../../themes/doom-one-light.cjs"),r=require("./parse.cjs");function i(e,t){let n=r.parseThemeConfig(e);if(n===null)throw Error(`The shipped theme ${t} is malformed.`);return n}const a=[i(t.default,`doom-one-dark.json`),i(n.default,`doom-one-light.json`),i(e.default,`doom-nord-dark.json`)],o=a[0];function s(e){return a.find(t=>t.name===e)}exports.BUILTIN_THEMES=a,exports.DEFAULT_THEME=o,exports.DEFAULT_THEME_NAME=`doom-one-dark`,exports.builtinTheme=s;
|
|
2
|
+
//# sourceMappingURL=builtinThemes.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtinThemes.cjs","names":["parseThemeConfig","doomOneDark","doomOneLight","doomNordDark","require_doom_nord_dark","require_doom_one_dark","require_doom_one_light","require_parse","shipped","theme","input","file","BUILTIN_THEMES","DEFAULT_THEME","builtinTheme","name"],"sources":["../../../src/theme/builtinThemes.ts"],"sourcesContent":["import doomNordDark from '../../themes/doom-nord-dark.json' with { type: 'json' };\nimport doomOneDark from '../../themes/doom-one-dark.json' with { type: 'json' };\nimport doomOneLight from '../../themes/doom-one-light.json' with { type: 'json' };\nimport type { ThemeConfig } from '../types/theme';\nimport { parseThemeConfig } from './parse';\n\nfunction shipped(input: unknown, file: string): ThemeConfig {\n const theme = parseThemeConfig(input);\n if (theme === null) throw new Error(`The shipped theme ${file} is malformed.`);\n return theme;\n}\n\n/** The theme the cockpit renders with until a preference says otherwise. */\nexport const DEFAULT_THEME_NAME = 'doom-one-dark';\n\n/** The themes this package ships, default first. */\nexport const BUILTIN_THEMES: readonly ThemeConfig[] = [\n shipped(doomOneDark, 'doom-one-dark.json'),\n shipped(doomOneLight, 'doom-one-light.json'),\n shipped(doomNordDark, 'doom-nord-dark.json'),\n];\n\nexport const DEFAULT_THEME: ThemeConfig = BUILTIN_THEMES[0];\n\n/** A shipped theme by name, or undefined for a name nothing shipped under. */\nexport function builtinTheme(name: string): ThemeConfig | undefined {\n return BUILTIN_THEMES.find((theme) => theme.name === name);\n}\n"],"mappings":"qKAMA,SAASQ,EAAQ,EAAgB,EAA2B,CAC1D,IAAMC,EAAQT,EAAAA,iBAAiBU,CAAK,EACpC,GAAID,IAAU,KAAM,MAAU,MAAM,qBAAqBE,EAAK,eAAe,EAC7E,OAAOF,CACT,CAGA,MAGaG,EAAyC,CACpDJ,EAAQP,EAAAA,QAAa,oBAAoB,EACzCO,EAAQN,EAAAA,QAAc,qBAAqB,EAC3CM,EAAQL,EAAAA,QAAc,qBAAqB,CAC7C,EAEaU,EAA6BD,EAAe,GAGzD,SAAgBE,EAAa,EAAuC,CAClE,OAAOF,EAAe,KAAM,GAAUH,EAAM,OAASM,CAAI,CAC3D"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../types/theme.cjs"),t=`'JetBrains Mono Variable', 'JetBrains Mono', ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace`;function n(e){if(e===`font-mono`)return t;if(e===`on-selected`)return`color-mix(in srgb, var(--doom-selected) 12%, white)`;let[n,r]=e.split(`-`);return n===`tint`?`color-mix(in srgb, var(--doom-${r}) 16%, var(--doom-panel))`:`color-mix(in srgb, var(--doom-${r}) 40%, var(--doom-border))`}function r(){let t=[];for(let n of e.ACCENT_TOKENS)t.push(`tint-${n}`);for(let n of e.ACCENT_TOKENS)t.push(`edge-${n}`);return t.push(`on-selected`,`font-mono`),t}function i(e,t){let r=e.tokens[t];return r===void 0?n(t):r}exports.DEFAULT_FONT_MONO=t,exports.derivedFallback=n,exports.derivedTokens=r,exports.tokenValue=i;
|
|
2
|
+
//# sourceMappingURL=derive.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive.cjs","names":["ACCENT_TOKENS","require_theme","DEFAULT_FONT_MONO","derivedFallback","token","kind","accent","derivedTokens","tokens","tokenValue","own","theme"],"sources":["../../../src/theme/derive.ts"],"sourcesContent":["import { ACCENT_TOKENS, type AccentToken, type DerivedToken, type ThemeConfig, type ThemeToken } from '../types/theme';\n\n/** How much of an accent goes into its tinted background; the rest is the panel. */\nexport const TINT_MIX_PERCENT = 16;\n/** How much of an accent goes into its accented border; the rest is the border. */\nexport const EDGE_MIX_PERCENT = 40;\n/** How much of the selection tints its foreground; the rest is white, so the label stays legible on it. */\nexport const ON_SELECTED_MIX_PERCENT = 12;\n\nexport const DEFAULT_FONT_MONO =\n \"'JetBrains Mono Variable', 'JetBrains Mono', ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace\";\n\n/**\n * A derived token's fallback: a CSS colour expression over the palette, so a\n * theme that supplies only its palette still gets coherent tints and edges.\n */\nexport function derivedFallback(token: DerivedToken): string {\n if (token === 'font-mono') return DEFAULT_FONT_MONO;\n if (token === 'on-selected')\n return `color-mix(in srgb, var(--doom-selected) ${String(ON_SELECTED_MIX_PERCENT)}%, white)`;\n const [kind, accent] = token.split('-') as ['tint' | 'edge', AccentToken];\n return kind === 'tint'\n ? `color-mix(in srgb, var(--doom-${accent}) ${String(TINT_MIX_PERCENT)}%, var(--doom-panel))`\n : `color-mix(in srgb, var(--doom-${accent}) ${String(EDGE_MIX_PERCENT)}%, var(--doom-border))`;\n}\n\n/** Every derived token, in a stable order. */\nexport function derivedTokens(): DerivedToken[] {\n const tokens: DerivedToken[] = [];\n for (const accent of ACCENT_TOKENS) tokens.push(`tint-${accent}`);\n for (const accent of ACCENT_TOKENS) tokens.push(`edge-${accent}`);\n tokens.push('on-selected', 'font-mono');\n return tokens;\n}\n\n/** The value a theme publishes for a token: its own, or the derived fallback. */\nexport function tokenValue(theme: ThemeConfig, token: ThemeToken): string {\n const own = (theme.tokens as Partial<Record<ThemeToken, string>>)[token];\n if (own !== undefined) return own;\n return derivedFallback(token as DerivedToken);\n}\n"],"mappings":"sCASaE,EACX,mHAMF,SAAgBC,EAAgB,EAA6B,CAC3D,GAAIC,IAAU,YAAa,OAAOF,EAClC,GAAIE,IAAU,cACZ,MAAO,sDACT,GAAM,CAACC,EAAMC,GAAUF,EAAM,MAAM,GAAG,EACtC,OAAOC,IAAS,OACZ,iCAAiCC,EAAO,2BACxC,iCAAiCA,EAAO,2BAC9C,CAGA,SAAgBC,GAAgC,CAC9C,IAAMC,EAAyB,CAAC,EAChC,IAAK,IAAMF,KAAUN,EAAAA,cAAeQ,EAAO,KAAK,QAAQF,GAAQ,EAChE,IAAK,IAAMA,KAAUN,EAAAA,cAAeQ,EAAO,KAAK,QAAQF,GAAQ,EAEhE,OADAE,EAAO,KAAK,cAAe,WAAW,EAC/BA,CACT,CAGA,SAAgBC,EAAW,EAAoB,EAA2B,CACxE,IAAMC,EAAOC,EAAM,OAA+CP,GAElE,OADIM,IAAQ,IAAA,GACLP,EAAgBC,CAAqB,EADdM,CAEhC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../types/theme.cjs"),t=require("./builtinThemes.cjs");require("./derive.cjs");const n={xs:2,sm:3,md:5,lg:10},r={...n,DEFAULT:4,full:9999},i={"2xs":{size:9,leading:1.45},xs:{size:10,leading:1.45},sm:{size:12,leading:1.45},base:{size:13,leading:1.5},lg:{size:15,leading:1.4},xl:{size:18,leading:1.3},"2xl":{size:22,leading:1.25},"3xl":{size:28,leading:1.2}},a={xl:-.01,"2xl":-.01,"3xl":-.01},o=1.625,s={regular:`400`,medium:`500`,semibold:`600`},c={fade:140,pop:160,rise:160,slide:180,easing:[.16,1,.3,1]},l={sans:{family:`IBM Plex Sans`,ios:`System`,android:`sans-serif`},mono:{family:`JetBrains Mono`,ios:`Menlo`,android:`monospace`}},u=/^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;function d(e){if(!u.test(e))throw Error(`Native themes need hex colours; got "${e}".`);let t=e.length===4?e.slice(1).split(``).map(e=>e+e).join(``):e.slice(1);return[0,2,4].map(e=>Number.parseInt(t.slice(e,e+2),16))}function f(e,t,n){let r=t/100,i=d(e),a=d(n);return`#${i.map((e,t)=>{let n=Math.round(e*r+a[t]*(1-r));return Math.min(255,Math.max(0,n)).toString(16).padStart(2,`0`)}).join(``)}`}function p(e,t){let n=Math.min(255,Math.max(0,Math.round(t/100*255)));return`#${[...d(e),n].map(e=>e.toString(16).padStart(2,`0`)).join(``)}`}function m(e){let t={};for(let n of Object.keys(i))t[n]=e(n);return t}function h(t){let n=t.tokens,u={};for(let n of e.PALETTE_TOKENS)u[n]=t.tokens[n];let d=(e,t)=>{u[e]=n[e]??t()};for(let t of e.ACCENT_TOKENS)d(`tint-${t}`,()=>f(u[t],16,u.panel));for(let t of e.ACCENT_TOKENS)d(`edge-${t}`,()=>f(u[t],40,u.border));return d(`on-selected`,()=>f(u.selected,12,`#ffffff`)),{scheme:t.scheme,colors:u,spacing:e=>e*4,borderRadius:r,fontSize:m(e=>i[e].size),lineHeight:m(e=>Math.round(i[e].size*i[e].leading)),lineHeightRelaxed:m(e=>Math.round(i[e].size*o)),letterSpacing:m(e=>{let t=a[e]??0;return Math.round(i[e].size*t*100)/100}),fontWeight:s,fontFamily:l,motion:c}}function g(e){let n=t.builtinTheme(e);if(n===void 0)throw Error(`The shipped theme ${e} is missing.`);return h(n)}const _={dark:g(`doom-one-dark`),light:g(`doom-one-light`)};exports.NATIVE_BORDER_RADIUS=r,exports.NATIVE_FONT_FAMILY=l,exports.NATIVE_FONT_WEIGHT=s,exports.NATIVE_LEADING_RELAXED=o,exports.NATIVE_LETTER_SPACING_EM=a,exports.NATIVE_MOTION=c,exports.NATIVE_RADII=n,exports.NATIVE_SPACING_BASE=4,exports.NATIVE_THEMES=_,exports.NATIVE_TYPE_RAMP=i,exports.mixHex=f,exports.nativeTheme=h,exports.withAlpha=p;
|
|
2
|
+
//# sourceMappingURL=nativeTheme.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nativeTheme.cjs","names":["PALETTE_TOKENS","ACCENT_TOKENS","builtinTheme","require_theme","require_builtinThemes","NATIVE_RADII","NATIVE_BORDER_RADIUS","NATIVE_TYPE_RAMP","NATIVE_LETTER_SPACING_EM","NATIVE_LEADING_RELAXED","NATIVE_FONT_WEIGHT","NATIVE_MOTION","NATIVE_FONT_FAMILY","HEX_COLOR","hexChannels","hex","digits","digit","offset","mixHex","weight","percent","a","first","b","second","mixed","channel","index","withAlpha","alpha","rampValues","values","step","pick","nativeTheme","pinned","config","colors","token","resolve","fallback","accent","steps","em","shippedNative","theme","name","NATIVE_THEMES"],"sources":["../../../src/theme/nativeTheme.ts"],"sourcesContent":["import { ACCENT_TOKENS, PALETTE_TOKENS, type ThemeConfig, type ThemeScheme, type ThemeToken } from '../types/theme';\nimport { builtinTheme } from './builtinThemes';\nimport { EDGE_MIX_PERCENT, ON_SELECTED_MIX_PERCENT, TINT_MIX_PERCENT } from './derive';\n\n/*\n * The React Native copy of the web theme. Native styles cannot read CSS\n * custom properties or evaluate color-mix(), so this module resolves the same\n * tokens to plain values. The scales below mirror styles/theme.css by hand\n * (CSS cannot import TypeScript); tests/nativeTheme.test.ts fails when the two\n * drift.\n *\n * ponytail: bundle IBM Plex Sans and JetBrains Mono through expo-font when the\n * native visual review starts; until then the named families fall back to the\n * platform fonts below.\n * ponytail: add a native theme picker later; the shell follows the system\n * scheme between `light` and `dark` for now.\n * ponytail: `--tracking-*` (tracked uppercase micro-labels) is not ported;\n * docs/design.md bans tracked uppercase on new surfaces.\n * ponytail: `shadow-2xl` is not ported; native surfaces (sheets, modals,\n * headers) draw their own platform shadows.\n */\n\n/** The spacing unit, matching `--spacing: 0.25rem` at a 16px root. */\nexport const NATIVE_SPACING_BASE = 4;\n\n/** Corner radii in px, matching `--radius-*`. */\nexport const NATIVE_RADII = { xs: 2, sm: 3, md: 5, lg: 10 } as const;\n\n/**\n * Every radius a native style may name: the retunable `--radius-*` steps, plus\n * Tailwind's hardcoded bare `rounded` (4px) and `rounded-full`.\n */\nexport const NATIVE_BORDER_RADIUS = { ...NATIVE_RADII, DEFAULT: 4, full: 9999 } as const;\n\n/** The type ramp, matching `--text-*` (px) and `--text-*--line-height` (a multiple of the size). */\nexport const NATIVE_TYPE_RAMP = {\n '2xs': { size: 9, leading: 1.45 },\n xs: { size: 10, leading: 1.45 },\n sm: { size: 12, leading: 1.45 },\n base: { size: 13, leading: 1.5 },\n lg: { size: 15, leading: 1.4 },\n xl: { size: 18, leading: 1.3 },\n '2xl': { size: 22, leading: 1.25 },\n '3xl': { size: 28, leading: 1.2 },\n} as const;\n\n/** Title tracking in em, matching `--text-*--letter-spacing`; steps not listed track at 0. */\nexport const NATIVE_LETTER_SPACING_EM = { xl: -0.01, '2xl': -0.01, '3xl': -0.01 } as const;\n\n/** Tailwind's `leading-relaxed` multiple, which theme.css does not override. */\nexport const NATIVE_LEADING_RELAXED = 1.625;\n\n/** Font weights as React Native takes them, matching `font-normal`, `font-medium` and `font-semibold`. */\nexport const NATIVE_FONT_WEIGHT = { regular: '400', medium: '500', semibold: '600' } as const;\n\n/**\n * Durations in ms and the shared easing curve of `--animate-doom-*`. `slide`\n * covers both slide directions; `easing` is the `cubic-bezier()` control points\n * for Reanimated's `Easing.bezier`.\n */\nexport const NATIVE_MOTION = {\n fade: 140,\n pop: 160,\n rise: 160,\n slide: 180,\n easing: [0.16, 1, 0.3, 1],\n} as const;\n\n/** A font as native styles name it: one family, plus the platform font to use until it is bundled. */\nexport interface NativeFontStack {\n family: string;\n ios: string;\n android: string;\n}\n\n/** The sans and mono families of `--font-sans` and `--doom-font-mono`, with system fallbacks. */\nexport const NATIVE_FONT_FAMILY: { readonly sans: NativeFontStack; readonly mono: NativeFontStack } = {\n sans: { family: 'IBM Plex Sans', ios: 'System', android: 'sans-serif' },\n mono: { family: 'JetBrains Mono', ios: 'Menlo', android: 'monospace' },\n};\n\n/** The foreground `on-selected` mixes toward, as `white` in derive.ts. */\nconst ON_SELECTED_BASE = '#ffffff';\nconst HEX_COLOR = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;\nconst PERCENT = 100;\nconst CHANNEL_MAX = 255;\n/** Rounds px values to hundredths so `18 * -0.01` reads -0.18, not a float tail. */\nconst PX_PRECISION = 100;\n\nexport type NativeColorToken = Exclude<ThemeToken, 'font-mono'>;\nexport type NativeTypeStep = keyof typeof NATIVE_TYPE_RAMP;\nexport type NativeNamedTheme = 'dark' | 'light';\n\nexport interface PoNativeTheme {\n scheme: ThemeScheme;\n colors: Record<NativeColorToken, string>;\n /** `spacing(n)` is n steps of the 4px base, as Tailwind's `p-n`. */\n spacing: (steps: number) => number;\n borderRadius: typeof NATIVE_BORDER_RADIUS;\n fontSize: Record<NativeTypeStep, number>;\n /** Absolute line heights in px, since native styles take no unitless multiple. */\n lineHeight: Record<NativeTypeStep, number>;\n /** `leading-relaxed` line heights in px, for reading text such as markdown bodies. */\n lineHeightRelaxed: Record<NativeTypeStep, number>;\n /** Letter spacing in px per step; titles track slightly tight, the rest at 0. */\n letterSpacing: Record<NativeTypeStep, number>;\n fontWeight: typeof NATIVE_FONT_WEIGHT;\n fontFamily: typeof NATIVE_FONT_FAMILY;\n motion: typeof NATIVE_MOTION;\n}\n\nfunction hexChannels(hex: string): [number, number, number] {\n if (!HEX_COLOR.test(hex)) throw new Error(`Native themes need hex colours; got \"${hex}\".`);\n const digits =\n hex.length === 4\n ? hex\n .slice(1)\n .split('')\n .map((digit) => digit + digit)\n .join('')\n : hex.slice(1);\n return [0, 2, 4].map((offset) => Number.parseInt(digits.slice(offset, offset + 2), 16)) as [number, number, number];\n}\n\n/**\n * `color-mix(in srgb, first percent%, second)` for hex inputs: a straight\n * per-channel blend, rounded to the nearest 8-bit value.\n */\nexport function mixHex(first: string, percent: number, second: string): string {\n const weight = percent / PERCENT;\n const a = hexChannels(first);\n const b = hexChannels(second);\n return `#${a\n .map((channel, index) => {\n const mixed = Math.round(channel * weight + b[index]! * (1 - weight));\n return Math.min(CHANNEL_MAX, Math.max(0, mixed)).toString(16).padStart(2, '0');\n })\n .join('')}`;\n}\n\n/**\n * A hex colour at `percent` opacity as `#rrggbbaa`: the native form of\n * Tailwind's `/40`-style opacity modifiers.\n */\nexport function withAlpha(hex: string, percent: number): string {\n const alpha = Math.min(CHANNEL_MAX, Math.max(0, Math.round((percent / PERCENT) * CHANNEL_MAX)));\n const channels = [...hexChannels(hex), alpha];\n return `#${channels.map((channel) => channel.toString(16).padStart(2, '0')).join('')}`;\n}\n\nfunction rampValues(pick: (step: NativeTypeStep) => number): Record<NativeTypeStep, number> {\n const values = {} as Record<NativeTypeStep, number>;\n for (const step of Object.keys(NATIVE_TYPE_RAMP) as NativeTypeStep[]) values[step] = pick(step);\n return values;\n}\n\n/** Resolves a web theme config to native values; tokens the theme pins win over the derived mix. */\nexport function nativeTheme(config: ThemeConfig): PoNativeTheme {\n const pinned = config.tokens as Partial<Record<ThemeToken, string>>;\n const colors = {} as Record<NativeColorToken, string>;\n for (const token of PALETTE_TOKENS) colors[token] = config.tokens[token];\n const resolve = (token: NativeColorToken, fallback: () => string): void => {\n colors[token] = pinned[token] ?? fallback();\n };\n for (const accent of ACCENT_TOKENS) {\n resolve(`tint-${accent}`, () => mixHex(colors[accent], TINT_MIX_PERCENT, colors.panel));\n }\n for (const accent of ACCENT_TOKENS) {\n resolve(`edge-${accent}`, () => mixHex(colors[accent], EDGE_MIX_PERCENT, colors.border));\n }\n resolve('on-selected', () => mixHex(colors.selected, ON_SELECTED_MIX_PERCENT, ON_SELECTED_BASE));\n\n return {\n scheme: config.scheme,\n colors,\n spacing: (steps) => steps * NATIVE_SPACING_BASE,\n borderRadius: NATIVE_BORDER_RADIUS,\n fontSize: rampValues((step) => NATIVE_TYPE_RAMP[step].size),\n lineHeight: rampValues((step) => Math.round(NATIVE_TYPE_RAMP[step].size * NATIVE_TYPE_RAMP[step].leading)),\n lineHeightRelaxed: rampValues((step) => Math.round(NATIVE_TYPE_RAMP[step].size * NATIVE_LEADING_RELAXED)),\n letterSpacing: rampValues((step) => {\n const em = (NATIVE_LETTER_SPACING_EM as Partial<Record<NativeTypeStep, number>>)[step] ?? 0;\n return Math.round(NATIVE_TYPE_RAMP[step].size * em * PX_PRECISION) / PX_PRECISION;\n }),\n fontWeight: NATIVE_FONT_WEIGHT,\n fontFamily: NATIVE_FONT_FAMILY,\n motion: NATIVE_MOTION,\n };\n}\n\nfunction shippedNative(name: string): PoNativeTheme {\n const theme = builtinTheme(name);\n if (theme === undefined) throw new Error(`The shipped theme ${name} is missing.`);\n return nativeTheme(theme);\n}\n\n/** The native themes by the names the native shell registers: `dark` and `light`. */\nexport const NATIVE_THEMES: Readonly<Record<NativeNamedTheme, PoNativeTheme>> = {\n dark: shippedNative('doom-one-dark'),\n light: shippedNative('doom-one-light'),\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../types/theme.cjs"),t=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,n=/^(?:#[0-9a-f]{3,8}|(?:rgb|rgba|hsl|hsla|hwb|lab|lch|oklab|oklch|color|color-mix|light-dark)\((?:[^()]|\([^()]*\))*\)|[a-z]+)$/i;function r(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function i(i){if(!r(i))return null;let{name:a,label:o,scheme:s,tokens:c}=i;if(typeof a!=`string`||!t.test(a)||typeof o!=`string`||o.trim()===``||s!==`dark`&&s!==`light`||!r(c))return null;let l={};for(let t of e.PALETTE_TOKENS){let e=c[t];if(typeof e!=`string`||!n.test(e.trim()))return null;l[t]=e.trim()}for(let t of e.DERIVED_TOKENS){let e=c[t];if(e!==void 0){if(typeof e!=`string`||e.trim()===``)return null;l[t]=e.trim()}}return{name:a,label:o,scheme:s,tokens:l}}exports.parseThemeConfig=i;
|
|
2
|
+
//# sourceMappingURL=parse.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.cjs","names":["PALETTE_TOKENS","DERIVED_TOKENS","require_theme","THEME_NAME","CSS_COLOR","isRecord","value","parseThemeConfig","input","name","label","scheme","tokens","accepted","token"],"sources":["../../../src/theme/parse.ts"],"sourcesContent":["import { DERIVED_TOKENS, PALETTE_TOKENS, type ThemeConfig, type ThemeScheme } from '../types/theme';\n\nconst THEME_NAME = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n/** A CSS colour as a theme may spell it: hex, a colour function, or a named colour; never a url or an image. */\nconst CSS_COLOR =\n /^(?:#[0-9a-f]{3,8}|(?:rgb|rgba|hsl|hsla|hwb|lab|lch|oklab|oklch|color|color-mix|light-dark)\\((?:[^()]|\\([^()]*\\))*\\)|[a-z]+)$/i;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Validates a theme config read from JSON. Returns null rather than throwing\n * because a bad theme file must never take the cockpit down; the caller falls\n * back to the shipped default and says so.\n */\nexport function parseThemeConfig(input: unknown): ThemeConfig | null {\n if (!isRecord(input)) return null;\n const { name, label, scheme, tokens } = input;\n if (typeof name !== 'string' || !THEME_NAME.test(name)) return null;\n if (typeof label !== 'string' || label.trim() === '') return null;\n if (scheme !== 'dark' && scheme !== 'light') return null;\n if (!isRecord(tokens)) return null;\n\n const accepted: Record<string, string> = {};\n for (const token of PALETTE_TOKENS) {\n const value = tokens[token];\n if (typeof value !== 'string' || !CSS_COLOR.test(value.trim())) return null;\n accepted[token] = value.trim();\n }\n for (const token of DERIVED_TOKENS) {\n const value = tokens[token];\n if (value === undefined) continue;\n if (typeof value !== 'string' || value.trim() === '') return null;\n accepted[token] = value.trim();\n }\n return { name, label, scheme: scheme as ThemeScheme, tokens: accepted as ThemeConfig['tokens'] };\n}\n"],"mappings":"sCAEMG,EAAa,6BAEbC,EACJ,iIAEF,SAASC,EAAS,EAAkD,CAClE,OAAO,OAAOC,GAAU,YAAYA,GAAkB,CAAC,MAAM,QAAQA,CAAK,CAC5E,CAOA,SAAgBC,EAAiB,EAAoC,CACnE,GAAI,CAACF,EAASG,CAAK,EAAG,OAAO,KAC7B,GAAM,CAAE,OAAM,QAAO,SAAQ,UAAWA,EAIxC,GAHI,OAAOC,GAAS,UAAY,CAACN,EAAW,KAAKM,CAAI,GACjD,OAAOC,GAAU,UAAYA,EAAM,KAAK,IAAM,IAC9CC,IAAW,QAAUA,IAAW,SAChC,CAACN,EAASO,CAAM,EAAG,OAAO,KAE9B,IAAMC,EAAmC,CAAC,EAC1C,IAAK,IAAMC,KAASd,EAAAA,eAAgB,CAClC,IAAMM,EAAQM,EAAOE,GACrB,GAAI,OAAOR,GAAU,UAAY,CAACF,EAAU,KAAKE,EAAM,KAAK,CAAC,EAAG,OAAO,KACvE,EAASQ,GAASR,EAAM,KAAK,CAC/B,CACA,IAAK,IAAMQ,KAASb,EAAAA,eAAgB,CAClC,IAAMK,EAAQM,EAAOE,GACrB,GAAIR,IAAU,IAAA,GACd,IAAI,OAAOA,GAAU,UAAYA,EAAM,KAAK,IAAM,GAAI,OAAO,KAC7D,EAASQ,GAASR,EAAM,KAAK,CADgC,CAE/D,CACA,MAAO,CAAE,OAAM,QAAe,SAAuB,OAAQO,CAAkC,CACjG"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./parse.cjs");function t(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function n(e){let t=/^#([0-9a-f]{6})$/i.exec(e.trim());if(!t)return null;let n=Number.parseInt(t[1],16),r=n>>16&255,i=n>>8&255,a=n&255;return(.2126*r+.7152*i+.0722*a)/255}function r(e,t){if(t!==void 0)return e[t]??t}function i(i,a={}){if(!t(i))return null;let{name:o,vars:s,colors:c}=i;if(!t(s))return null;let l={};for(let[e,t]of Object.entries(s))typeof t==`string`&&(l[e]=t);let u={};if(t(c))for(let[e,t]of Object.entries(c))typeof t==`string`&&(u[e]=t);let d=l.bg,f=l.bgAlt??d,p=l.fg;if(d===void 0||p===void 0)return null;let m=n(d),h=a.scheme??(m!==null&&m>.5?`light`:`dark`),g=`color-mix(in srgb, ${f} 84%, ${h===`dark`?`black`:`white`})`,_=r(l,u.borderMuted)??l.grey??`color-mix(in srgb, ${p} 25%, ${d})`,v=a.name??(typeof o==`string`?o:`pi-theme`);return e.parseThemeConfig({name:v,label:a.label??v,scheme:h,tokens:{bg:d,rail:f,panel:`color-mix(in srgb, ${f} 70%, ${d})`,deep:g,border:_,"border-soft":`color-mix(in srgb, ${_} 55%, ${d})`,hi:`color-mix(in srgb, ${p} 65%, ${h===`dark`?`white`:`black`})`,text:p,dim:r(l,u.muted)??l.fgAlt??p,faint:r(l,u.dim)??l.comment??l.greyAlt??p,blue:l.blue??r(l,u.accent)??p,green:l.green??r(l,u.success)??p,yellow:l.yellow??r(l,u.warning)??p,red:l.red??r(l,u.error)??p,magenta:l.magenta??l.violet??p,violet:l.violet??l.magenta??p,cyan:l.cyan??l.blue??p,orange:l.orange??l.yellow??p,teal:l.teal??l.cyan??p,selected:l.darkBlue??l.blue??p}})}exports.themeFromPiTheme=i;
|
|
2
|
+
//# sourceMappingURL=piTheme.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"piTheme.cjs","names":["parseThemeConfig","require_parse","isRecord","value","hexLuminance","match","hex","g","b","resolve","reference","vars","themeFromPiTheme","input","palette","key","semantic","colors","bg","bgAlt","fg","luminance","scheme","options","deep","border","themeName","name"],"sources":["../../../src/theme/piTheme.ts"],"sourcesContent":["import type { ThemeConfig, ThemeScheme } from '../types/theme';\nimport { parseThemeConfig } from './parse';\n\n/**\n * The Pi TUI theme shape (theme-schema.json): a palette of named vars and\n * semantic colours that name a var or spell a colour.\n */\ninterface PiThemeLike {\n name?: unknown;\n vars?: unknown;\n colors?: unknown;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction hexLuminance(hex: string): number | null {\n const match = /^#([0-9a-f]{6})$/i.exec(hex.trim());\n if (!match) return null;\n const value = Number.parseInt(match[1], 16);\n const r = (value >> 16) & 0xff;\n const g = (value >> 8) & 0xff;\n const b = value & 0xff;\n return (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255;\n}\n\n/** Resolves a Pi colour reference: a var name, or a literal colour. */\nfunction resolve(vars: Record<string, string>, reference: string | undefined): string | undefined {\n if (reference === undefined) return undefined;\n return vars[reference] ?? reference;\n}\n\nexport interface PiThemeBridgeOptions {\n /** The web theme's id; defaults to the Pi theme's name. */\n name?: string;\n label?: string;\n /** Forced scheme; otherwise inferred from the background luminance. */\n scheme?: ThemeScheme;\n}\n\n/**\n * Builds a web theme from a Pi TUI theme, so the palette Po ships for\n * the terminal (po-ui/themes/po-dark.json) drives the browser too.\n * The mapping is by role, not by name: Pi has no cockpit \"deep\" surface or\n * \"border-soft\" line, so those are mixed from the nearest vars. Returns null\n * when the input is not a Pi theme with a complete palette.\n */\nexport function themeFromPiTheme(input: unknown, options: PiThemeBridgeOptions = {}): ThemeConfig | null {\n if (!isRecord(input)) return null;\n const { name, vars, colors } = input as PiThemeLike;\n if (!isRecord(vars)) return null;\n const palette: Record<string, string> = {};\n for (const [key, value] of Object.entries(vars)) if (typeof value === 'string') palette[key] = value;\n const semantic: Record<string, string> = {};\n if (isRecord(colors))\n for (const [key, value] of Object.entries(colors)) if (typeof value === 'string') semantic[key] = value;\n\n const bg = palette.bg;\n const bgAlt = palette.bgAlt ?? bg;\n const fg = palette.fg;\n if (bg === undefined || fg === undefined) return null;\n\n const luminance = hexLuminance(bg);\n const scheme: ThemeScheme = options.scheme ?? (luminance !== null && luminance > 0.5 ? 'light' : 'dark');\n const towards = scheme === 'dark' ? 'black' : 'white';\n const deep = `color-mix(in srgb, ${bgAlt} 84%, ${towards})`;\n const border = resolve(palette, semantic.borderMuted) ?? palette.grey ?? `color-mix(in srgb, ${fg} 25%, ${bg})`;\n const themeName = options.name ?? (typeof name === 'string' ? name : 'pi-theme');\n\n return parseThemeConfig({\n name: themeName,\n label: options.label ?? themeName,\n scheme,\n tokens: {\n bg,\n rail: bgAlt,\n panel: `color-mix(in srgb, ${bgAlt} 70%, ${bg})`,\n deep,\n border,\n 'border-soft': `color-mix(in srgb, ${border} 55%, ${bg})`,\n hi: `color-mix(in srgb, ${fg} 65%, ${scheme === 'dark' ? 'white' : 'black'})`,\n text: fg,\n dim: resolve(palette, semantic.muted) ?? palette.fgAlt ?? fg,\n faint: resolve(palette, semantic.dim) ?? palette.comment ?? palette.greyAlt ?? fg,\n blue: palette.blue ?? resolve(palette, semantic.accent) ?? fg,\n green: palette.green ?? resolve(palette, semantic.success) ?? fg,\n yellow: palette.yellow ?? resolve(palette, semantic.warning) ?? fg,\n red: palette.red ?? resolve(palette, semantic.error) ?? fg,\n magenta: palette.magenta ?? palette.violet ?? fg,\n violet: palette.violet ?? palette.magenta ?? fg,\n cyan: palette.cyan ?? palette.blue ?? fg,\n orange: palette.orange ?? palette.yellow ?? fg,\n teal: palette.teal ?? palette.cyan ?? fg,\n selected: palette.darkBlue ?? palette.blue ?? fg,\n },\n });\n}\n"],"mappings":"+BAaA,SAASE,EAAS,EAAkD,CAClE,OAAO,OAAOC,GAAU,YAAYA,GAAkB,CAAC,MAAM,QAAQA,CAAK,CAC5E,CAEA,SAASC,EAAa,EAA4B,CAChD,IAAMC,EAAQ,oBAAoB,KAAKC,EAAI,KAAK,CAAC,EACjD,GAAI,CAACD,EAAO,OAAO,KACnB,IAAMF,EAAQ,OAAO,SAASE,EAAM,GAAI,EAAE,EACpC,EAAKF,GAAS,GAAM,IACpBI,EAAKJ,GAAS,EAAK,IACnBK,EAAIL,EAAQ,IAClB,OAAQ,MAAS,EAAI,MAASI,EAAI,MAASC,GAAK,GAClD,CAGA,SAASC,EAAQ,EAA8B,EAAmD,CAChG,GAAIC,IAAc,IAAA,GAClB,OAAOC,EAAKD,IAAcA,CAC5B,CAiBA,SAAgBE,EAAiB,EAAgB,EAAgC,CAAC,EAAuB,CACvG,GAAI,CAACV,EAASW,CAAK,EAAG,OAAO,KAC7B,GAAM,CAAE,OAAM,OAAM,UAAWA,EAC/B,GAAI,CAACX,EAASS,CAAI,EAAG,OAAO,KAC5B,IAAMG,EAAkC,CAAC,EACzC,IAAK,GAAM,CAACC,EAAKZ,KAAU,OAAO,QAAQQ,CAAI,EAAO,OAAOR,GAAU,WAAU,EAAQY,GAAOZ,GAC/F,IAAMa,EAAmC,CAAC,EAC1C,GAAId,EAASe,CAAM,EACZ,IAAA,GAAM,CAACF,EAAKZ,KAAU,OAAO,QAAQc,CAAM,EAAO,OAAOd,GAAU,WAAU,EAASY,GAAOZ,GAEpG,IAAMe,EAAKJ,EAAQ,GACbK,EAAQL,EAAQ,OAASI,EACzBE,EAAKN,EAAQ,GACnB,GAAII,IAAO,IAAA,IAAaE,IAAO,IAAA,GAAW,OAAO,KAEjD,IAAMC,EAAYjB,EAAac,CAAE,EAC3BI,EAAsBC,EAAQ,SAAWF,IAAc,MAAQA,EAAY,GAAM,QAAU,QAE3FG,EAAO,sBAAsBL,EAAM,QADzBG,IAAW,OAAS,QAAU,QACW,GACnDG,EAAShB,EAAQK,EAASE,EAAS,WAAW,GAAKF,EAAQ,MAAQ,sBAAsBM,EAAG,QAAQF,EAAG,GACvGQ,EAAYH,EAAQ,OAAS,OAAOI,GAAS,SAAWA,EAAO,YAErE,OAAO3B,EAAAA,iBAAiB,CACtB,KAAM0B,EACN,MAAOH,EAAQ,OAASG,EACxB,SACA,OAAQ,CACN,KACA,KAAMP,EACN,MAAO,sBAAsBA,EAAM,QAAQD,EAAG,GAC9C,OACA,SACA,cAAe,sBAAsBO,EAAO,QAAQP,EAAG,GACvD,GAAI,sBAAsBE,EAAG,QAAQE,IAAW,OAAS,QAAU,QAAQ,GAC3E,KAAMF,EACN,IAAKX,EAAQK,EAASE,EAAS,KAAK,GAAKF,EAAQ,OAASM,EAC1D,MAAOX,EAAQK,EAASE,EAAS,GAAG,GAAKF,EAAQ,SAAWA,EAAQ,SAAWM,EAC/E,KAAMN,EAAQ,MAAQL,EAAQK,EAASE,EAAS,MAAM,GAAKI,EAC3D,MAAON,EAAQ,OAASL,EAAQK,EAASE,EAAS,OAAO,GAAKI,EAC9D,OAAQN,EAAQ,QAAUL,EAAQK,EAASE,EAAS,OAAO,GAAKI,EAChE,IAAKN,EAAQ,KAAOL,EAAQK,EAASE,EAAS,KAAK,GAAKI,EACxD,QAASN,EAAQ,SAAWA,EAAQ,QAAUM,EAC9C,OAAQN,EAAQ,QAAUA,EAAQ,SAAWM,EAC7C,KAAMN,EAAQ,MAAQA,EAAQ,MAAQM,EACtC,OAAQN,EAAQ,QAAUA,EAAQ,QAAUM,EAC5C,KAAMN,EAAQ,MAAQA,EAAQ,MAAQM,EACtC,SAAUN,EAAQ,UAAYA,EAAQ,MAAQM,CAChD,CACF,CAAC,CACH"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=`po.web.theme`;function t(e){try{let t=e?.getItem(`po.web.theme`)??null;return t===null||t===``?null:t}catch{return null}}function n(t,n){try{n===null?t?.removeItem(e):t?.setItem(e,n)}catch{}}exports.THEME_STORAGE_KEY=e,exports.readThemePreference=t,exports.writeThemePreference=n;
|
|
2
|
+
//# sourceMappingURL=preference.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preference.cjs","names":["THEME_STORAGE_KEY","readThemePreference","value","storage","writeThemePreference","name"],"sources":["../../../src/theme/preference.ts"],"sourcesContent":["/** Where the page remembers the chosen theme; one key, machine-local. */\nexport const THEME_STORAGE_KEY = 'po.web.theme';\n\n/** The two Storage calls the preference needs, so tests pass a plain map. */\nexport interface PreferenceStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\n/** The stored theme name, or null when nothing was chosen or storage is unavailable. */\nexport function readThemePreference(storage: PreferenceStorage | undefined): string | null {\n try {\n const value = storage?.getItem(THEME_STORAGE_KEY) ?? null;\n return value === null || value === '' ? null : value;\n } catch {\n return null;\n }\n}\n\n/** Remembers a theme name; null forgets it. Storage failures are swallowed: a theme is a convenience. */\nexport function writeThemePreference(storage: PreferenceStorage | undefined, name: string | null): void {\n try {\n if (name === null) storage?.removeItem(THEME_STORAGE_KEY);\n else storage?.setItem(THEME_STORAGE_KEY, name);\n } catch {\n // Private mode or a full quota: the theme still applies for this page load.\n }\n}\n"],"mappings":"AACA,MAAaA,EAAoB,eAUjC,SAAgBC,EAAoB,EAAuD,CACzF,GAAI,CACF,IAAMC,EAAQC,GAAS,QAAA,cAAyB,GAAK,KACrD,OAAOD,IAAU,MAAQA,IAAU,GAAK,KAAOA,CACjD,MAAQ,CACN,OAAO,IACT,CACF,CAGA,SAAgBE,EAAqB,EAAwC,EAA2B,CACtG,GAAI,CACEC,IAAS,KAAMF,GAAS,WAAWH,CAAiB,EACnDG,GAAS,QAAQH,EAAmBK,CAAI,CAC/C,MAAQ,CAER,CACF"}
|