Ḿàŕķđöŵñ îñ ţĥé ÜÎ
Šéṽéŕàļ ḿéţàđàţà ƒîéļđš ţĥàţ ƒļöŵ ƒŕöḿ ţĥé ƒŕàḿéŵöŕķ ţö ţĥé ÜΚ (ţööļ àñđ ƒöŕḿàţ đéšçŕîþţîöñš, ƒöŕḿàţ öṽéŕṽîéŵš, þàŕàḿéţéŕ ĥéļþ, éẋàḿþļé đéšçŕîþţîöñš, ļöñĝ-ƒöŕḿ đöçš) àŕé àüţĥöŕéđ àš ḿàŕķđöŵñ ŕàţĥéŕ ţĥàñ þļàîñ ţéẋţ. Ţĥîš ñöţé îš ţĥé çàñöñîçàļ ļîšţ öƒ ŵĥîçĥ ƒîéļđš çàŕŕý ḿàŕķđöŵñ àñđ ţĥé šîñĝļé çöḿþöñéñţ éṽéŕý ÜÎ ḿüšţ üšé ţö ŕéñđéŕ ţĥéḿ.
Ţŵö šéñšéš öƒ "ḿàŕķđöŵñ". Ţĥîš ñöţé îš àƃöüţ ḿàŕķđöŵñ üšéđ àš ÜÎ çöþý (à
descriptionţĥàţ çöñţàîñš**bold**,`code`, öŕ à ļîñķ). Îţ îš üñŕéļàţéđ ţö ţĥé Ḿàŕķđöŵñ đàţà ƒöŕḿàţ (core/formats/markdown/,core/formats/mdx/), ţĥé çöñţéñţ neokapi ŕéàđš àñđ ŵŕîţéš. Ķééþ ţĥé ţŵö šéþàŕàţé.
Ţĥé ŕüļé
Ñéṽéŕ đŕöþ à ḿàŕķđöŵñ-ƃéàŕîñĝ ƒîéļđ šţŕàîĝĥţ îñţö ĴŠẊ àš à šţŕîñĝ. Ŕéñđéŕîñĝ
{tool.description} šĥöŵš ļîţéŕàļ ** àñđ ƃàçķţîçķš àñđ ḿàñĝļéš ļîñķš. Ŕéñđéŕ
îţ ţĥŕöüĝĥ ţĥé šĥàŕéđ ţýþéšéţ þŕîḿîţîṽé îñšţéàđ:
import { Markdown } from "@neokapi/ui-primitives"; // or "@neokapi/ui" in bowrain apps
// Dedicated detail / doc view — block prose:
<Markdown>{tool.description}</Markdown>
// Compact context (clamped list row, table cell, tooltip, chip,
// CardDescription) — inline flow, no block margins:
<Markdown inline>{tool.description}</Markdown>
Ţĥé þŕîḿîţîṽé ļîṽéš àţ
packages/ui/src/components/ui/markdown.tsx
àñđ îš éẋþöŕţéđ ƒŕöḿ @neokapi/ui-primitives. @neokapi/ui (bowrain'š šĥàŕéđ
þàçķàĝé) ŕé-éẋþöŕţš îţ, šö bowrain àþþš îḿþöŕţ îţ ƒŕöḿ @neokapi/ui.
- Îţ ŵŕàþš
react-markdown+remark-gfmƒöŕ ŕéñđéŕîñĝ (ĜîţĤüƃ-ƒļàṽöüŕéđ ḿàŕķđöŵñ: ţàƃļéš, šţŕîķéţĥŕöüĝĥ, àüţöļîñķš, ţàšķ ļîšţš) àñđ ŕéñđéŕš ŕéàçţ-ḿàŕķđöŵñ'š đéƒàüļţ ĤŢḾĻ. - Ƃļöçķ šţýļîñĝ îš ţĥé šĥàŕéđ
.typesetļàýéŕ (packages/ui/src/styles/typeset.css), öüŕ îḿþļéḿéñţàţîöñ öƒ ţĥé šĥàđçñ/ţýþéšéţ çöñţŕàçţ: öñé ÇŠŠ ƒîļé, ţĥŕéé çöñţŕöļš (--typeset-size/--typeset-leading/--typeset-flow) ţĥàţ éṽéŕýţĥîñĝ éļšé đéŕîṽéš ƒŕöḿ, žéŕö-šþéçîƒîçîţý:where()ŕüļéš îñ@layer components(šö Ţàîļŵîñđ üţîļîţîéš šţîļļ öṽéŕŕîđé),margin-block-start-öñļý ƒļöŵ (šţŕéàḿ-šţàƃļé), àñđ çöļöüŕš ḿàþþéđ ţö öüŕ ţĥéḿé ţöķéñš (ţĥéḿéš ļîĝĥţ/đàŕķ ƒöŕ ƒŕéé). Îţ îš ñöţ@tailwindcss/typography(ŵĥîçĥ ţĥé ŕéþö đöéš ñöţ šĥîþ). Ṽàŕîàñţš:.typeset-docs(đéƒàüļţ) àñđ.typeset-chat(ţĥévariantþŕöþ). Öþţ à šüƃţŕéé öüţ ŵîţĥnot-typeset/data-not-typeset. - Ţĥé ÇŠŠ îš
@importéđ ƒŕöḿstyles/theme-tokens.css, ŵĥîçĥ éṽéŕý àþþ àļŕéàđý îḿþöŕţš, šö ţĥéŕé îš ñö þéŕ-àþþ ÇŠŠ ŵîŕîñĝ. inlineḿöđé îš à šḿàļļ ƃéšþöķé þàţĥ (ţýþéšéţ îš ƃļöçķ-öŕîéñţéđ): îţ çöļļàþšéš þàŕàĝŕàþĥš ţö îñļîñé ƒļöŵ àñđ đéĝŕàđéš ƃļöçķ çöñšţŕüçţš (ĥéàđîñĝš, ļîšţš, ŕüļéš) ţö ļîĝĥţŵéîĝĥţ îñļîñé éǫüîṽàļéñţš, šö à öñé-ļîñé çļàḿþéđ ŕöŵ ñéṽéŕ šĥöŵš ļîţéŕàļ ḿàŕķüþ.- Éḿþţý/ŵĥîţéšþàçé îñþüţ ŕéñđéŕš ñöţĥîñĝ.
Đö ñöţ ĥàñđ-ŕöļļ àñöţĥéŕ ŕéñđéŕéŕ (à ļöçàļ react-markdown ŵŕàþþéŕ, à ŕéĝéẋ
markdownToHtml + dangerouslySetInnerHTML, öŕ à ƃéšþöķé components ḿàþ).
Ţĥöšé đŕîƒţ àþàŕţ àñđ àŕé ĥöŵ ţĥé "ḿàŕķđöŵñ šĥöŵñ àš à ŕàŵ šţŕîñĝ" ƃüĝš çŕéþţ îñ.
Ţĥéŕé îš öñé ŕéñđéŕéŕ.
Ƒîéļđš ţĥàţ çàŕŕý ḿàŕķđöŵñ
Ţĥéšé àŕé ţĥé ƒîéļđš ţĥé ÜΚ ţŕéàţ (öŕ šĥöüļđ ţŕéàţ) àš ḿàŕķđöŵñ. Ţĥé Ĝö šţŕüçţš
àñđ ţĥé ḿîŕŕöŕîñĝ ŢýþéŠçŕîþţ ţýþéš àŕé àññöţàţéđ ŵîţĥ à Markdown. / Markdown:
çöḿḿéñţ šö ţĥé çöñţŕàçţ îš đîšçöṽéŕàƃļé àţ ţĥé đéƒîñîţîöñ.
| Çöñçéŕñ | Ƒîéļđ | Ĝö đéƒîñîţîöñ | ŢŠ ḿîŕŕöŕ |
|---|---|---|---|
| Ţööļ | Description | core/registry/tool.go ToolInfo.Description; core/schema/schema.go ToolMeta.Description | packages/contract-types ComponentSchema; đéšķţöþ api.ts ţööļ ĐŢÖš |
| Ţööļ çöñƒîĝ | Description (þéŕ þŕöþéŕţý) | core/schema/schema.go PropertySchema.Description, ComponentSchema.Description | contract-types PropertySchema.description, ParameterGroup.description |
| Ƒöŕḿàţ | Description, Overview | core/format/spec/spec.go Spec.Description, Variant.Description, ConfigKey.Description, Feature.Description, Example.Description | ŕéƒéŕéñçé-đàţà ReferenceDoc.overview; đéšķţöþ FilterDoc.overview |
| Ƒļöŵ | Description | core/flow/definition.go FlowDefinition.Description | đéšķţöþ/bowrain ƒļöŵ ĐŢÖš |
| Þļüĝîñ | Description (öñé ļîñé öƒ îñļîñé ḿàŕķđöŵñ) | core/plugin/manifest/manifest.go Manifest.Description | þļüĝîñ ĐŢÖš |
| Ŕéƒéŕéñçé đöçš | Overview, Limitations, ProcessingNotes, þàŕàḿ Help/Description, éẋàḿþļé Description | scripts/gen-refs/model.go Doc.*, DocParam.*, DocExample.Description | packages/reference-data/src/types.ts ReferenceDoc.* |
| Çöḿḿàñđ | Long (ļöñĝ ĥéļþ) | (ÇĻÎ ĥéļþ çàţàļöĝš) | packages/reference-data CommandEntry.long |
| Þŕöṽîđéŕ | Description (ḿöđéļ/þŕöṽîđéŕ) | providers/ai/provider.go Description | þŕöṽîđéŕ ĐŢÖš |
Šĥöŕţ display_name, šîñĝļé-ŵöŕđ source/type ƃàđĝéš, ţàƃ ļàƃéļš, àñđ
translate="no" đöçüḿéñţ-çöñţéñţ þŕéṽîéŵš çàŕŕý ñö ḿàŕķđöŵñ, šö ļéàṽé ţĥéḿ
þļàîñ.
Ŵĥéŕé îţ ŕéñđéŕš ţöđàý
Ţĥé þŕîḿîţîṽé îš üšéđ àçŕöšš éṽéŕý Ŕéàçţ ÜÎ:
- Kapi Đéšķţöþ (
apps/kapi-desktop/frontend): ţööļ đéţàîļ + ļîšţ (ToolRunnerPage), ƒļöŵ đéšçŕîþţîöñš (FlowsPage), þļüĝîñ đéšçŕîþţîöñš (PluginManager), ƒöŕḿàţ öṽéŕṽîéŵ + þŕéšéţš (FormatsPage), àñđ ţĥé đöçš þàñéļ (DocsPanel). - Ƒļöŵ éđîţöŕ (
packages/flow-editor): ţööļ þàļéţţé éñţŕîéš, šţéþ éẋàḿþļé àñđ þàŕàḿéţéŕ đéšçŕîþţîöñš, ţéḿþļàţé çàŕđš. - Bowrain ÜÎ (
bowrain/packages/ui): ƒüļļ-þàĝé ţööļ/ƒöŕḿàţ đöçš (ToolDocViewer), ţööļ/ƒîļţéŕ çöñƒîĝ ƒîéļđ đéšçŕîþţîöñš, àñđ ţĥé bowrain đéšķţöþ šéţţîñĝš þàĝé.
Ţĥé đöçš šîţé (web/, Đöçüšàüŕüš) ĥàš îţš öŵñ Markdown.tsx ŵŕàþþéŕ ƒöŕ ţĥé
ĝéñéŕàţéđ ŕéƒéŕéñçé đàţàšéţ. Îţ îš à šéþàŕàţé ƃüîļđ (îţš öŵñ ÇŠŠ ḿöđüļé, ñö
@neokapi/ui-primitives đéþéñđéñçý) àñđ ŕéñđéŕš ţĥé šàḿé šéţ öƒ ƒîéļđš ļîšţéđ
àƃöṽé ţĥŕöüĝĥ react-markdown + remark-gfm.
Ŵĥéñ ýöü àđđ à ƒîéļđ
΃ ýöü àđđ à ḿéţàđàţà ƒîéļđ ţĥàţ àüţĥöŕš ŵîļļ ŵŕîţé ḿàŕķđöŵñ îñţö:
- Àññöţàţé ţĥé Ĝö šţŕüçţ ƒîéļđ àñđ îţš ŢýþéŠçŕîþţ ḿîŕŕöŕ ŵîţĥ à
Markdown.çöḿḿéñţ. - Àđđ îţ ţö ţĥé ţàƃļé àƃöṽé.
- Ŕéñđéŕ îţ ŵîţĥ
<Markdown>/<Markdown inline>, ñéṽéŕ àš à ŕàŵ šţŕîñĝ.
Ķééþ ţĥé ḿàŕķđöŵñ ļîĝĥţ. Ţĥéšé àŕé đéšçŕîþţîöñš àñđ ĥéļþ ţéẋţ, ñöţ đöçüḿéñţš: îñļîñé éḿþĥàšîš, çöđé šþàñš, ļîñķš, šĥöŕţ ļîšţš. Ƒöļļöŵ ţĥé ŕéĝîšţéŕ îñ ƃŕàñđ-çöḿḿüñîçàţîöñ.