@qilin-agent/client-ui-primitives 0.0.0-stage → 3.1.3

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.
Files changed (120) hide show
  1. package/LICENSE +21 -0
  2. package/README.i18n.yaml +61 -0
  3. package/README.md +181 -2
  4. package/README.zh.md +182 -0
  5. package/lib/Button.module.css +79 -0
  6. package/lib/Checkbox.module.css +28 -0
  7. package/lib/ConnectionIndicator.module.css +123 -0
  8. package/lib/DiffBlock.module.css +109 -0
  9. package/lib/DisclosureRow.module.css +84 -0
  10. package/lib/FileTypeIcon.module.css +50 -0
  11. package/lib/HoverCard.module.css +70 -0
  12. package/lib/ImageLightbox.module.css +48 -0
  13. package/lib/ImagePreview.module.css +24 -0
  14. package/lib/Input.module.css +38 -0
  15. package/lib/JsonTree.module.css +345 -0
  16. package/lib/Menu.module.css +274 -0
  17. package/lib/MenuGroup.module.css +37 -0
  18. package/lib/MenuSurface.module.css +49 -0
  19. package/lib/Modal.module.css +103 -0
  20. package/lib/OnboardingSurface.module.css +29 -0
  21. package/lib/PathLabel.module.css +28 -0
  22. package/lib/Pill.module.css +27 -0
  23. package/lib/ReadBlock.module.css +111 -0
  24. package/lib/RiskConfirmation.module.css +73 -0
  25. package/lib/SearchBlock.module.css +112 -0
  26. package/lib/SegmentedControl.module.css +76 -0
  27. package/lib/ShortcutKeys.module.css +33 -0
  28. package/lib/StateDot.module.css +73 -0
  29. package/lib/Switch.module.css +50 -0
  30. package/lib/Tag.module.css +57 -0
  31. package/lib/TerminalBlock.module.css +205 -0
  32. package/lib/TextShimmer.module.css +88 -0
  33. package/lib/Toast.module.css +76 -0
  34. package/lib/Tooltip.module.css +52 -0
  35. package/lib/WebBlock.module.css +141 -0
  36. package/lib/index.js +10096 -0
  37. package/lib/markdown/CodeBlock.module.css +130 -0
  38. package/lib/markdown/JsonBlock.module.css +32 -0
  39. package/lib/markdown/MarkdownText.module.css +485 -0
  40. package/lib/markdown/mermaid.module.css +49 -0
  41. package/lib/types/Button.d.ts +18 -0
  42. package/lib/types/Checkbox.d.ts +20 -0
  43. package/lib/types/CodeFileIcon.d.ts +12 -0
  44. package/lib/types/ConnectionIndicator.d.ts +26 -0
  45. package/lib/types/DiffBlock.d.ts +52 -0
  46. package/lib/types/DisclosureRow.d.ts +36 -0
  47. package/lib/types/FileTypeIcon.d.ts +43 -0
  48. package/lib/types/FoldToggle.d.ts +20 -0
  49. package/lib/types/HoverCard.d.ts +32 -0
  50. package/lib/types/ImageLightbox.d.ts +27 -0
  51. package/lib/types/ImagePreview.d.ts +12 -0
  52. package/lib/types/Input.d.ts +12 -0
  53. package/lib/types/JsonTree.d.ts +59 -0
  54. package/lib/types/LinkIcon.d.ts +49 -0
  55. package/lib/types/Menu.d.ts +133 -0
  56. package/lib/types/MenuGroup.d.ts +22 -0
  57. package/lib/types/MenuSurface.d.ts +16 -0
  58. package/lib/types/Modal.d.ts +44 -0
  59. package/lib/types/OnboardingSurface.d.ts +11 -0
  60. package/lib/types/PathLabel.d.ts +13 -0
  61. package/lib/types/Pill.d.ts +13 -0
  62. package/lib/types/QilinSeal.d.ts +18 -0
  63. package/lib/types/ReadBlock.d.ts +47 -0
  64. package/lib/types/ReferenceIcon.d.ts +16 -0
  65. package/lib/types/RiskConfirmation.d.ts +20 -0
  66. package/lib/types/SearchBlock.d.ts +72 -0
  67. package/lib/types/SegmentedControl.d.ts +35 -0
  68. package/lib/types/ShortcutKeys.d.ts +11 -0
  69. package/lib/types/SiteGlyph.d.ts +25 -0
  70. package/lib/types/StateDot.d.ts +18 -0
  71. package/lib/types/Switch.d.ts +20 -0
  72. package/lib/types/Tag.d.ts +32 -0
  73. package/lib/types/TerminalBlock.d.ts +66 -0
  74. package/lib/types/TextShimmer.d.ts +22 -0
  75. package/lib/types/Toast.d.ts +36 -0
  76. package/lib/types/Tooltip.d.ts +45 -0
  77. package/lib/types/WebBlock.d.ts +61 -0
  78. package/lib/types/ansi.d.ts +17 -0
  79. package/lib/types/clipboard.d.ts +9 -0
  80. package/lib/types/code-file-icon-artwork.d.ts +54 -0
  81. package/lib/types/code-file-types.d.ts +30 -0
  82. package/lib/types/darwin-desktop.d.ts +9 -0
  83. package/lib/types/file-size.d.ts +17 -0
  84. package/lib/types/focus.d.ts +9 -0
  85. package/lib/types/head-tail-cap.d.ts +23 -0
  86. package/lib/types/icons/index.d.ts +211 -0
  87. package/lib/types/icons/props.d.ts +9 -0
  88. package/lib/types/index.d.ts +84 -0
  89. package/lib/types/input-modality.d.ts +19 -0
  90. package/lib/types/keyboard-composition.d.ts +11 -0
  91. package/lib/types/markdown/CodeBlock.d.ts +30 -0
  92. package/lib/types/markdown/JsonBlock.d.ts +8 -0
  93. package/lib/types/markdown/MarkdownDelegate.d.ts +46 -0
  94. package/lib/types/markdown/MarkdownText.d.ts +54 -0
  95. package/lib/types/markdown/cjkFriendlyStrong.d.ts +9 -0
  96. package/lib/types/markdown/file-link.d.ts +13 -0
  97. package/lib/types/markdown/highlight.d.ts +142 -0
  98. package/lib/types/markdown/incremental.d.ts +80 -0
  99. package/lib/types/markdown/katex.d.ts +27 -0
  100. package/lib/types/markdown/local-image-syntax.d.ts +10 -0
  101. package/lib/types/markdown/mathCompatibility.d.ts +11 -0
  102. package/lib/types/markdown/mermaid.d.ts +39 -0
  103. package/lib/types/markdown/parse.d.ts +25 -0
  104. package/lib/types/markdown/plain-text.d.ts +22 -0
  105. package/lib/types/markdown/render.d.ts +158 -0
  106. package/lib/types/markdown/useViewportHighlighting.d.ts +11 -0
  107. package/lib/types/overlay-top-margin.d.ts +8 -0
  108. package/lib/types/pointer-grace.d.ts +22 -0
  109. package/lib/types/rank-by-name.d.ts +22 -0
  110. package/lib/types/relative-time.d.ts +23 -0
  111. package/lib/types/seal-geometry.d.ts +27 -0
  112. package/lib/types/seal-glyphs.d.ts +9 -0
  113. package/lib/types/use-copy-feedback.d.ts +14 -0
  114. package/lib/types/useAnchoredMaxHeight.d.ts +11 -0
  115. package/lib/types/useAnchoredPosition.d.ts +34 -0
  116. package/lib/types/useDismissOnOutsidePointer.d.ts +11 -0
  117. package/lib/types/useModalLayer.d.ts +27 -0
  118. package/lib/types/user-text.d.ts +37 -0
  119. package/lib/user-text.module.css +43 -0
  120. package/package.json +62 -3
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Direct mdast→React markdown renderer. Replaces the react-markdown /
3
+ * remark-rehype pipeline with one switch over parsed nodes so streaming can
4
+ * cache frozen blocks as React elements; the rendered DOM is pinned
5
+ * byte-for-byte by `tests/fixtures/markdown-dom` and must not drift.
6
+ *
7
+ * External link and image destinations pass a protocol allowlist; settled
8
+ * local file links use an explicit owner callback. Images additionally require
9
+ * absolute HTTP(S), raw HTML renders as literal text (no HTML enters the
10
+ * DOM), and KaTeX runs without trusted commands. Fragment-anchor URLs fail
11
+ * the allowlist, so footnote references and back-references render as plain
12
+ * text rather than in-page links.
13
+ *
14
+ * Merge-extensible node unions fall through the documented default (render
15
+ * nothing) rather than ending in assertNever: grammars registered elsewhere
16
+ * may add node types this renderer has no mapping for.
17
+ */
18
+ import type { ReactNode } from 'react';
19
+ import type * as Md from 'mdast';
20
+ import type { PositionedBlock } from './incremental.ts';
21
+ /** Copy-button labels forwarded to fence CodeBlocks (this package is cordis-free, so copy arrives via props). */
22
+ export interface MarkdownCodeLabels {
23
+ /** Copy-button idle label. */
24
+ copyLabel: string;
25
+ /** Copy-button label during the post-copy confirmation window. */
26
+ copiedLabel: string;
27
+ }
28
+ /** Localized alt text for a rendered Mermaid diagram. */
29
+ export interface MarkdownMermaidLabels {
30
+ /** Alt text naming the on-page diagram stage. */
31
+ diagramLabel: string;
32
+ /** Alt text naming the enlarged overlay copy. */
33
+ enlargedLabel: string;
34
+ }
35
+ /** Localized chrome for a Markdown document. */
36
+ export interface MarkdownLabels {
37
+ code: MarkdownCodeLabels;
38
+ mermaid: MarkdownMermaidLabels;
39
+ footnotes: string;
40
+ }
41
+ /** Link/image reference targets collected from a document (first definition per identifier wins, as in CommonMark). */
42
+ export interface ReferenceTargets {
43
+ /** Link/image definitions keyed by upper-cased identifier. */
44
+ definitions: Map<string, Md.Definition>;
45
+ /** Footnote definitions keyed by upper-cased identifier. */
46
+ footnotes: Map<string, Md.FootnoteDefinition>;
47
+ }
48
+ /**
49
+ * Create an empty {@link ReferenceTargets}.
50
+ * @returns Fresh empty maps.
51
+ */
52
+ export declare function createReferenceTargets(): ReferenceTargets;
53
+ /**
54
+ * Record every definition and footnote definition under `nodes` into
55
+ * `targets`, depth-first, keeping the first definition per identifier.
56
+ * @param nodes - Subtrees to walk (top-level blocks or any nested children).
57
+ * @param targets - Accumulator, typically shared across incremental segments.
58
+ */
59
+ export declare function collectReferenceTargets(nodes: readonly Md.RootContent[], targets: ReferenceTargets): void;
60
+ /**
61
+ * Local-path image vocabulary for image destinations: the owner maps an
62
+ * authored destination that fails the remote-URL allowlist (an absolute local
63
+ * file path, for example) to a displayable URL it can vouch for. Absent
64
+ * wherever no such vocabulary exists, authored local destinations keep their
65
+ * documented fallback (the image's alt text). Rewritten destinations must be
66
+ * absolute; the renderer re-checks their protocol before emitting them.
67
+ */
68
+ export interface MarkdownPathImages {
69
+ /**
70
+ * Resolve one authored image destination.
71
+ * @param value - The destination exactly as the markdown author wrote it.
72
+ * @returns A displayable absolute URL, or undefined when the destination
73
+ * names no displayable image — it then stays inert alt text.
74
+ */
75
+ resolve(value: string): string | undefined;
76
+ }
77
+ /**
78
+ * File-mention affordance for inline code: the owner resolves an authored
79
+ * token to the file it names, using its own vocabulary of real files — the
80
+ * renderer never guesses at what looks like a path.
81
+ */
82
+ export interface MarkdownFileMentions {
83
+ /**
84
+ * Resolve one inline-code token.
85
+ * @param value - The authored token, exactly as written.
86
+ * @returns The opener with its accessible label and full-path title, or
87
+ * undefined when the token names no known file — it then stays inert code.
88
+ */
89
+ resolve(value: string): {
90
+ open: () => void;
91
+ label: string;
92
+ title: string;
93
+ } | undefined;
94
+ }
95
+ /**
96
+ * One render pass's state: immutable options and targets plus the footnote
97
+ * numbering accumulated in document order while references render.
98
+ */
99
+ export interface MarkdownRenderContext {
100
+ /** Streaming arm: fences highlight incrementally as they grow; TeX (including ```math fences) stays literal until the settled pass. */
101
+ readonly streaming: boolean;
102
+ /** Localized fence copy-button labels. */
103
+ readonly labels: MarkdownLabels;
104
+ /** Inside a blockquote's children: tables there always fill the quote's width. */
105
+ readonly inBlockquote?: boolean;
106
+ /** Inline-code file mentions; absent wherever no opener vocabulary exists. */
107
+ readonly fileMentions: MarkdownFileMentions | undefined;
108
+ /** Local-path image vocabulary; absent wherever no rewriting owner exists. */
109
+ readonly pathImages: MarkdownPathImages | undefined;
110
+ /**
111
+ * Owner-supplied renderer for one authored raw-HTML run. Absent — the default
112
+ * — keeps the run as literal text, which is what every consumer that renders
113
+ * untrusted model output gets unless it installs a sanitizer of its own.
114
+ */
115
+ readonly html: MarkdownHtmlRenderer | undefined;
116
+ /** Inside an anchor's children: interactive mentions must not nest there. */
117
+ readonly inLink?: boolean;
118
+ /** Reference targets visible to this pass. */
119
+ readonly targets: ReferenceTargets;
120
+ /** Footnote identifiers in first-reference order; a footnote's number is its 1-based index here. */
121
+ readonly footnoteOrder: string[];
122
+ /** References rendered per identifier; drives the section's back-reference count. */
123
+ readonly footnoteCounts: Map<string, number>;
124
+ }
125
+ /**
126
+ * Owner-side renderer for authored raw HTML in a Markdown source.
127
+ * @param source - the raw HTML run exactly as the stream carried it.
128
+ * @returns the element to render in the run's place.
129
+ */
130
+ export type MarkdownHtmlRenderer = (source: string) => ReactNode;
131
+ /**
132
+ * Render top-level blocks. Nodes that render nothing (definitions, unmapped
133
+ * types) are dropped rather than kept as null placeholders, matching the
134
+ * replaced pipeline's child lists so separator newlines land identically.
135
+ * @param blocks - Blocks with their stream-stable render keys.
136
+ * @param context - The pass state; footnote numbering mutates in document order.
137
+ * @returns One React node per rendered block.
138
+ */
139
+ export declare function renderBlocks(blocks: readonly PositionedBlock[], context: MarkdownRenderContext): ReactNode[];
140
+ /**
141
+ * Interleave the newline text nodes the replaced pipeline emitted between
142
+ * block-level children. They are invisible between elements but coalesce
143
+ * into adjacent literal raw-HTML text, where the DOM parity fixtures pin
144
+ * them.
145
+ * @param elements - Rendered block children with empty renders already dropped.
146
+ * @param edges - Also emit the leading and trailing newline (hast's loose wrap).
147
+ * @returns The interleaved children.
148
+ */
149
+ export declare function wrapBlockChildren(elements: readonly ReactNode[], edges: boolean): ReactNode[];
150
+ /**
151
+ * Render the trailing footnote section for every footnote referenced during
152
+ * the pass, in first-reference order, with one plain-text back-reference
153
+ * marker per rendered reference.
154
+ * @param context - The pass state after all blocks rendered.
155
+ * @returns The section, or null when no referenced footnote has a definition.
156
+ */
157
+ export declare function renderFootnoteSection(context: MarkdownRenderContext): ReactNode | null;
158
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1,11 @@
1
+ import type { RefObject } from 'react';
2
+ /**
3
+ * Activate one supported code surface when it first intersects the viewport.
4
+ * Activation lasts for the component lifetime; browsers without
5
+ * IntersectionObserver activate immediately.
6
+ * @param target - Code surface whose plain rendering reserves its geometry.
7
+ * @param lang - Optional language hint.
8
+ * @returns Whether this component may build highlighted output.
9
+ */
10
+ export declare function useViewportHighlighting(target: RefObject<Element>, lang: string | undefined): boolean;
11
+ //# sourceMappingURL=useViewportHighlighting.d.ts.map
@@ -0,0 +1,8 @@
1
+ /** Shared viewport inset for overlays, derived from the desktop frame's reserved top strip. */
2
+ /**
3
+ * Resolve the top margin an overlay keeps from the viewport edge.
4
+ * @param min - the overlay's own viewport margin in px, used as the floor.
5
+ * @returns the larger of `min` and the frame clearance plus 20px; fullscreen keeps only the 20px gap.
6
+ */
7
+ export declare function overlayTopMargin(min: number): number;
8
+ //# sourceMappingURL=overlay-top-margin.d.ts.map
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Grace before a pointer-dismissed popup closes. Covers the anchor->popup gap
3
+ * (8px for HoverCard, 4px for Menu) at a hand's travel speed without leaving a
4
+ * popup lingering once the pointer has genuinely moved on.
5
+ */
6
+ export declare const POINTER_GRACE_MS = 200;
7
+ /** Cancelable delayed close for a pointer-dismissed popup. */
8
+ export interface PointerGrace {
9
+ /** Schedule the close {@link POINTER_GRACE_MS} from now, replacing any pending one. */
10
+ arm: () => void;
11
+ /** Abort a pending close (the pointer came back). */
12
+ cancel: () => void;
13
+ }
14
+ /**
15
+ * Delay a pointer-dismissed popup's close so the pointer can cross the gap
16
+ * between anchor and popup. A pending close is dropped on unmount.
17
+ * @param close - runs when the grace elapses with no re-entry; read at fire
18
+ * time, so callers may pass a fresh closure each render.
19
+ * @returns the {@link PointerGrace} handle.
20
+ */
21
+ export declare function usePointerGrace(close: () => void): PointerGrace;
22
+ //# sourceMappingURL=pointer-grace.d.ts.map
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Shared ranking for `/` menu candidates: the query must be a
3
+ * case-insensitive ordered subsequence of the candidate name or, when the
4
+ * candidate carries one, of its display label (a localized title). Prefix
5
+ * hits rank first, then the strongest alignment score over either key, then
6
+ * the source order of the input. Decision record:
7
+ * .agents/notes/archived/feature/2026-08-04-web-slash-command-fuzzy-discovery.md
8
+ */
9
+ /**
10
+ * Rank named items by a menu query.
11
+ * @param items - candidates in source order (a host catalog, then client
12
+ * contributions); an item's optional `label` is a second search key beside
13
+ * its name.
14
+ * @param rawQuery - the text typed after the trigger, matched case-insensitively.
15
+ * @returns the matching items: prefix hits first, then by alignment score,
16
+ * then in source order. The input list itself for an empty query.
17
+ */
18
+ export declare function rankByName<T extends {
19
+ readonly name: string;
20
+ readonly label?: string;
21
+ }>(items: readonly T[], rawQuery: string): readonly T[];
22
+ //# sourceMappingURL=rank-by-name.d.ts.map
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Compact relative-time bucketing shared by every surface that dates a
3
+ * session. Bucketing is here so two surfaces naming the same session agree;
4
+ * the words stay in each plugin's own dictionary, per locale-owned copy.
5
+ *
6
+ * @module @qilin-agent/client-ui-primitives/relative-time
7
+ */
8
+ /** Relative-time bucket of a dated row's trailing label. */
9
+ export type RelativeTimeUnit = 'now' | 'minutes' | 'hours' | 'days' | 'months' | 'years';
10
+ /** Structured relative time: the bucket plus its magnitude (0 for 'now'). */
11
+ export interface RelativeTime {
12
+ unit: RelativeTimeUnit;
13
+ n: number;
14
+ }
15
+ /**
16
+ * Compact relative time, as a structured bucket the renderer localizes
17
+ * ("now"/"5min"/"3h"/"2d"/"4mo"/"1y" in en).
18
+ * @param at - epoch ms of the dated moment.
19
+ * @param now - current epoch ms (injected for pure rendering).
20
+ * @returns the row's trailing time bucket and magnitude.
21
+ */
22
+ export declare function relativeTime(at: number, now: number): RelativeTime;
23
+ //# sourceMappingURL=relative-time.d.ts.map
@@ -0,0 +1,27 @@
1
+ /** Seal geometry: the cinnabar body, its gold hairline ring, and the two glyph cells. */
2
+ /** The seal body: a rounded square filling the viewBox. */
3
+ export declare const SEAL_BODY: {
4
+ readonly inset: 0;
5
+ readonly side: 24;
6
+ readonly radius: 5.2;
7
+ };
8
+ /** The gold hairline ring inside the body, close to its edge. */
9
+ export declare const SEAL_RING: {
10
+ readonly inset: 0.94;
11
+ readonly side: 22.13;
12
+ readonly radius: 4.31;
13
+ readonly stroke: 0.375;
14
+ };
15
+ /** The glyph cells: side by side and centered vertically in the body. */
16
+ export declare const SEAL_CELL: {
17
+ size: number;
18
+ top: number;
19
+ lefts: readonly [2.28, 12.12];
20
+ };
21
+ /**
22
+ * Placement transform for one glyph cell.
23
+ * @param left - left edge of the cell in viewBox units.
24
+ * @returns the transform placing the unit-box outline into that cell.
25
+ */
26
+ export declare function cellTransform(left: number): string;
27
+ //# sourceMappingURL=seal-geometry.d.ts.map
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Glyph outlines for the QiLin seal, extracted once from a system CJK face
3
+ * and normalized to a unit box so the mark carries no runtime font dependency.
4
+ */
5
+ /** 麒 (U+9E92), normalized to a unit box. */
6
+ export declare const SEAL_GLYPH_QI = "M0.42 0.84Q0.42 0.86 0.45 0.86Q0.47 0.86 0.48 0.86Q0.49 0.86 0.5 0.85Q0.5 0.84 0.51 0.83Q0.51 0.81 0.51 0.79Q0.53 0.81 0.55 0.81Q0.56 0.82 0.59 0.82Q0.57 0.85 0.56 0.88Q0.55 0.9 0.53 0.91Q0.52 0.93 0.49 0.93Q0.47 0.94 0.44 0.94Q0.41 0.94 0.39 0.93Q0.38 0.93 0.37 0.92Q0.36 0.92 0.35 0.91Q0.35 0.9 0.35 0.89V0.63Q0.35 0.61 0.35 0.59Q0.35 0.58 0.35 0.57Q0.35 0.56 0.35 0.55Q0.35 0.54 0.34 0.54Q0.37 0.54 0.39 0.54Q0.4 0.54 0.42 0.54Q0.44 0.54 0.44 0.55Q0.44 0.55 0.43 0.56Q0.42 0.57 0.42 0.61V0.68Q0.44 0.65 0.46 0.63Q0.47 0.61 0.48 0.59Q0.49 0.61 0.51 0.62Q0.52 0.63 0.54 0.64Q0.55 0.64 0.55 0.65Q0.54 0.65 0.54 0.65Q0.53 0.65 0.53 0.66Q0.52 0.66 0.51 0.67Q0.5 0.68 0.48 0.7Q0.45 0.73 0.42 0.76ZM0.92 0.99Q0.9 0.95 0.87 0.9Q0.84 0.85 0.79 0.8L0.86 0.76Q0.9 0.81 0.94 0.86Q0.97 0.9 1 0.94ZM0.74 0.81Q0.74 0.81 0.73 0.82Q0.72 0.83 0.7 0.85Q0.68 0.87 0.66 0.91Q0.63 0.94 0.59 1Q0.57 0.98 0.55 0.97Q0.54 0.96 0.51 0.95Q0.54 0.93 0.56 0.91Q0.58 0.89 0.6 0.86Q0.62 0.84 0.63 0.82Q0.65 0.79 0.66 0.76Q0.68 0.77 0.7 0.78Q0.72 0.79 0.74 0.79Q0.75 0.8 0.75 0.8Q0.75 0.81 0.74 0.81ZM0.25 0.84Q0.26 0.83 0.28 0.82Q0.29 0.81 0.3 0.8Q0.3 0.81 0.31 0.83Q0.32 0.84 0.33 0.86L0.25 0.92Q0.23 0.93 0.21 0.95Q0.19 0.97 0.18 0.97Q0.17 0.96 0.16 0.94Q0.15 0.92 0.14 0.91Q0.15 0.9 0.16 0.9Q0.17 0.89 0.18 0.89V0.65Q0.18 0.58 0.18 0.55Q0.2 0.55 0.22 0.55Q0.24 0.55 0.26 0.55Q0.27 0.55 0.27 0.55Q0.27 0.56 0.27 0.56Q0.26 0.57 0.25 0.58Q0.25 0.58 0.25 0.59V0.64Q0.29 0.64 0.31 0.64Q0.32 0.64 0.33 0.64V0.71Q0.32 0.71 0.3 0.71Q0.28 0.71 0.25 0.71ZM0.61 0.15Q0.61 0.11 0.61 0.07Q0.61 0.03 0.6 0.01Q0.63 0.01 0.65 0.01Q0.67 0.01 0.69 0.01Q0.7 0.01 0.7 0.01Q0.71 0.02 0.7 0.03Q0.69 0.03 0.69 0.04Q0.68 0.05 0.68 0.06V0.15H0.84Q0.84 0.09 0.84 0.05Q0.83 0.02 0.83 0Q0.86 0.01 0.88 0.01Q0.9 0.01 0.93 0.01Q0.94 0.01 0.94 0.01Q0.95 0.02 0.94 0.02Q0.93 0.03 0.92 0.04Q0.92 0.05 0.92 0.06V0.15Q0.93 0.15 0.95 0.14Q0.97 0.14 0.99 0.14V0.21Q0.97 0.21 0.95 0.21Q0.93 0.21 0.92 0.21V0.67Q0.93 0.67 0.96 0.67Q0.98 0.67 1 0.67V0.75Q0.98 0.74 0.97 0.74Q0.95 0.74 0.92 0.74Q0.9 0.74 0.86 0.74Q0.82 0.74 0.76 0.74Q0.7 0.74 0.67 0.74Q0.63 0.74 0.6 0.74Q0.58 0.74 0.56 0.74Q0.55 0.74 0.53 0.75V0.67Q0.55 0.67 0.57 0.67Q0.6 0.67 0.61 0.67V0.21Q0.6 0.21 0.58 0.21Q0.56 0.21 0.54 0.21V0.14Q0.56 0.14 0.58 0.14Q0.6 0.15 0.61 0.15ZM0.68 0.67H0.84V0.55H0.68ZM0.84 0.31V0.21H0.68V0.31ZM0.68 0.38V0.49H0.84V0.38ZM0.49 0.47V0.35H0.42V0.47ZM0.35 0.47V0.35H0.28V0.47ZM0.13 0.35Q0.13 0.38 0.13 0.41Q0.13 0.44 0.13 0.47H0.22V0.35ZM0.13 0.17V0.3H0.22V0.17ZM0.42 0.3Q0.44 0.3 0.46 0.3Q0.48 0.29 0.49 0.29Q0.51 0.29 0.53 0.29Q0.54 0.29 0.55 0.29Q0.55 0.3 0.55 0.34Q0.55 0.37 0.55 0.41Q0.55 0.45 0.55 0.48Q0.55 0.52 0.55 0.53Q0.53 0.53 0.48 0.53Q0.43 0.52 0.38 0.52H0.13Q0.13 0.61 0.12 0.68Q0.12 0.74 0.11 0.79Q0.1 0.84 0.09 0.88Q0.08 0.92 0.06 0.96Q0.04 0.94 0.03 0.92Q0.01 0.91 0 0.89Q0.02 0.86 0.03 0.83Q0.04 0.8 0.05 0.76Q0.06 0.72 0.06 0.67Q0.06 0.62 0.07 0.54Q0.07 0.46 0.07 0.36Q0.07 0.25 0.06 0.11Q0.08 0.11 0.14 0.11Q0.19 0.11 0.27 0.11Q0.26 0.09 0.25 0.06Q0.24 0.04 0.22 0.02L0.32 0Q0.32 0.02 0.33 0.05Q0.34 0.08 0.35 0.11Q0.39 0.11 0.42 0.11Q0.45 0.11 0.47 0.11Q0.49 0.11 0.5 0.11Q0.51 0.1 0.52 0.1V0.18Q0.51 0.18 0.48 0.18Q0.45 0.18 0.42 0.18ZM0.28 0.17V0.3H0.35V0.17Z";
7
+ /** 麟 (U+9E9F), normalized to a unit box. */
8
+ export declare const SEAL_GLYPH_LIN = "M0.53 0.66Q0.55 0.68 0.57 0.71Q0.59 0.73 0.6 0.74Q0.61 0.71 0.61 0.68Q0.61 0.65 0.61 0.62H0.55Q0.54 0.63 0.54 0.64Q0.53 0.65 0.53 0.66ZM0.25 0.18V0.28H0.31V0.18ZM0.13 0.18V0.28H0.19V0.18ZM0.13 0.44H0.19V0.34H0.13ZM0.31 0.44V0.34H0.25V0.44ZM0.42 0.44V0.34H0.37V0.44ZM0.83 0.76V0.62Q0.79 0.62 0.76 0.62Q0.74 0.63 0.72 0.63V0.55Q0.76 0.56 0.83 0.56Q0.83 0.52 0.83 0.5Q0.83 0.48 0.82 0.47Q0.87 0.48 0.9 0.47Q0.92 0.47 0.92 0.48Q0.92 0.48 0.91 0.49Q0.9 0.5 0.9 0.5Q0.9 0.51 0.9 0.52V0.56Q0.92 0.56 0.94 0.56Q0.97 0.56 0.99 0.55V0.63Q0.97 0.63 0.95 0.63Q0.93 0.62 0.9 0.62V0.76Q0.92 0.76 0.95 0.75Q0.98 0.75 1 0.75V0.83Q0.99 0.83 0.96 0.82Q0.93 0.82 0.9 0.82Q0.9 0.85 0.9 0.88Q0.9 0.9 0.9 0.92Q0.9 0.93 0.9 0.95Q0.9 0.96 0.91 0.98H0.82Q0.83 0.96 0.83 0.95Q0.83 0.94 0.83 0.92Q0.83 0.9 0.83 0.88Q0.83 0.86 0.83 0.82H0.77Q0.77 0.83 0.77 0.83Q0.77 0.83 0.77 0.84L0.7 0.84Q0.71 0.78 0.71 0.74Q0.71 0.7 0.71 0.66Q0.74 0.67 0.78 0.67Q0.79 0.66 0.79 0.67Q0.79 0.67 0.78 0.68Q0.78 0.69 0.78 0.7Q0.78 0.72 0.77 0.76ZM0.37 0.62Q0.39 0.6 0.41 0.59Q0.43 0.58 0.44 0.56Q0.46 0.59 0.48 0.61Q0.5 0.58 0.51 0.55Q0.52 0.52 0.53 0.48Q0.57 0.49 0.6 0.5Q0.62 0.5 0.6 0.52Q0.59 0.52 0.59 0.53Q0.58 0.54 0.58 0.56Q0.63 0.56 0.65 0.56Q0.67 0.55 0.68 0.55Q0.68 0.64 0.67 0.7Q0.66 0.77 0.64 0.82Q0.62 0.87 0.58 0.91Q0.54 0.96 0.47 0.99Q0.46 0.97 0.44 0.96Q0.43 0.94 0.41 0.93Q0.47 0.91 0.51 0.88Q0.55 0.85 0.57 0.81Q0.56 0.79 0.54 0.77Q0.52 0.74 0.49 0.72Q0.49 0.72 0.49 0.73Q0.49 0.73 0.48 0.73Q0.47 0.72 0.46 0.71Q0.45 0.7 0.43 0.7Q0.46 0.66 0.47 0.63Q0.46 0.64 0.43 0.65Q0.41 0.66 0.37 0.68V0.81Q0.37 0.83 0.38 0.83Q0.39 0.84 0.41 0.84Q0.42 0.84 0.43 0.83Q0.44 0.81 0.45 0.78Q0.46 0.79 0.47 0.8Q0.49 0.8 0.51 0.81Q0.5 0.84 0.49 0.85Q0.48 0.87 0.46 0.88Q0.45 0.89 0.44 0.9Q0.43 0.9 0.41 0.9Q0.38 0.9 0.36 0.9Q0.34 0.89 0.33 0.89Q0.32 0.88 0.31 0.86Q0.31 0.85 0.31 0.82V0.51H0.12Q0.12 0.61 0.12 0.68Q0.12 0.75 0.11 0.79Q0.1 0.84 0.09 0.87Q0.08 0.91 0.07 0.95Q0.05 0.91 0.03 0.9Q0.02 0.88 0 0.88Q0.05 0.79 0.06 0.59Q0.07 0.4 0.05 0.11Q0.06 0.11 0.11 0.12Q0.16 0.12 0.25 0.12Q0.24 0.1 0.23 0.08Q0.22 0.06 0.2 0.04L0.3 0.01Q0.31 0.04 0.32 0.06Q0.33 0.09 0.34 0.12Q0.39 0.12 0.44 0.12Q0.48 0.11 0.5 0.11V0.19Q0.49 0.19 0.47 0.19Q0.46 0.18 0.44 0.18Q0.42 0.18 0.4 0.18Q0.38 0.18 0.37 0.18V0.28Q0.4 0.28 0.43 0.27Q0.47 0.27 0.48 0.27Q0.48 0.28 0.48 0.29Q0.48 0.3 0.48 0.31Q0.48 0.32 0.48 0.34Q0.48 0.36 0.48 0.39Q0.48 0.42 0.48 0.44Q0.48 0.46 0.48 0.48Q0.48 0.49 0.48 0.5Q0.48 0.51 0.48 0.52Q0.45 0.51 0.37 0.51ZM0.22 0.62Q0.25 0.62 0.27 0.62Q0.28 0.62 0.3 0.62Q0.3 0.63 0.3 0.65Q0.3 0.66 0.3 0.68Q0.28 0.68 0.27 0.68Q0.25 0.68 0.22 0.68V0.82Q0.24 0.81 0.26 0.8Q0.28 0.79 0.3 0.78Q0.3 0.8 0.3 0.81Q0.3 0.82 0.31 0.84L0.21 0.89Q0.19 0.9 0.18 0.91Q0.16 0.92 0.15 0.93Q0.15 0.91 0.14 0.9Q0.13 0.88 0.12 0.85Q0.14 0.85 0.16 0.84V0.65Q0.16 0.54 0.15 0.51Q0.19 0.52 0.22 0.52Q0.23 0.52 0.23 0.52Q0.23 0.53 0.23 0.53Q0.22 0.54 0.22 0.55Q0.22 0.55 0.22 0.56ZM0.57 0.04Q0.59 0.07 0.61 0.1Q0.63 0.14 0.64 0.17L0.57 0.2Q0.56 0.14 0.51 0.08ZM0.93 0.06Q0.94 0.06 0.94 0.07Q0.94 0.08 0.93 0.08Q0.92 0.08 0.92 0.08Q0.91 0.09 0.9 0.1Q0.89 0.11 0.88 0.14Q0.87 0.16 0.85 0.19Q0.83 0.18 0.82 0.17Q0.8 0.17 0.78 0.16Q0.8 0.13 0.82 0.1Q0.83 0.07 0.84 0.03Q0.85 0.03 0.86 0.04Q0.87 0.04 0.89 0.05Q0.9 0.05 0.91 0.05Q0.92 0.06 0.93 0.06ZM0.68 0.27Q0.66 0.31 0.65 0.33Q0.64 0.36 0.63 0.38Q0.61 0.4 0.59 0.42Q0.57 0.44 0.53 0.47Q0.52 0.45 0.52 0.44Q0.51 0.43 0.49 0.42Q0.51 0.4 0.53 0.39Q0.55 0.37 0.57 0.35Q0.58 0.33 0.6 0.31Q0.61 0.29 0.63 0.27Q0.61 0.27 0.59 0.27Q0.57 0.27 0.56 0.27Q0.54 0.27 0.52 0.27Q0.51 0.28 0.5 0.28V0.2Q0.51 0.2 0.52 0.21Q0.53 0.21 0.55 0.21Q0.57 0.21 0.6 0.21Q0.63 0.21 0.68 0.21V0.15Q0.68 0.09 0.68 0.07Q0.67 0.04 0.67 0.02Q0.69 0.02 0.71 0.02Q0.74 0.02 0.75 0.02Q0.76 0.02 0.77 0.03Q0.77 0.03 0.76 0.04Q0.75 0.05 0.75 0.06Q0.75 0.07 0.75 0.09V0.21Q0.81 0.21 0.85 0.21Q0.9 0.21 0.92 0.21Q0.94 0.21 0.95 0.21Q0.97 0.2 0.97 0.2V0.28Q0.97 0.27 0.95 0.27Q0.94 0.27 0.92 0.27Q0.9 0.27 0.87 0.27Q0.85 0.27 0.81 0.27Q0.83 0.29 0.84 0.31Q0.86 0.32 0.88 0.34Q0.9 0.35 0.93 0.36Q0.95 0.37 0.99 0.37Q0.97 0.39 0.96 0.41Q0.95 0.43 0.94 0.46Q0.87 0.43 0.83 0.38Q0.78 0.34 0.75 0.27H0.75V0.35Q0.75 0.4 0.75 0.44Q0.75 0.47 0.75 0.5H0.67Q0.67 0.47 0.68 0.43Q0.68 0.4 0.68 0.35Z";
9
+ //# sourceMappingURL=seal-glyphs.d.ts.map
@@ -0,0 +1,14 @@
1
+ /** The copy-feedback hook's return: the transient flag and the copy handler. */
2
+ export interface CopyFeedback {
3
+ /** True for {@link COPIED_FEEDBACK_MS} after a successful write; render the success label off it. */
4
+ copied: boolean;
5
+ /** Copy the hook's text; no-op while `copied` is still true, silent on a refused write. */
6
+ onCopy: () => void;
7
+ }
8
+ /**
9
+ * Copy `text` to the clipboard with one-second success feedback.
10
+ * @param text - the text to write on copy.
11
+ * @returns the `copied` flag and the `onCopy` handler.
12
+ */
13
+ export declare function useCopyFeedback(text: string): CopyFeedback;
14
+ //# sourceMappingURL=use-copy-feedback.d.ts.map
@@ -0,0 +1,11 @@
1
+ import type { RefObject } from 'react';
2
+ /**
3
+ * Clamp a bottom-anchored overlay's max-height to the viewport.
4
+ * @param ref - the overlay element; a null current (overlay closed) skips measuring.
5
+ * @param cap - design max-height in px (the clamp never exceeds it).
6
+ * @param signal - re-measure trigger: pass the overlay's render state so anchor
7
+ * moves (composer growth) re-fit; resize/scroll re-fit while mounted.
8
+ * @returns the max-height to apply inline, in px.
9
+ */
10
+ export declare function useAnchoredMaxHeight(ref: RefObject<HTMLElement>, cap: number, signal: unknown): number;
11
+ //# sourceMappingURL=useAnchoredMaxHeight.d.ts.map
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Keep a fixed-position floating element anchored to a trigger.
3
+ *
4
+ * A portaled panel is positioned from its anchor's viewport rect, which stops
5
+ * being true the moment anything scrolls or the window resizes. This owns that
6
+ * one concern: measure the anchor, offset the panel below or above it, clamp
7
+ * the result inside the viewport, and re-run on scroll (capture phase, so
8
+ * scrollers nested inside the page are caught too), on resize, and on the
9
+ * panel's own size changes while the element is open.
10
+ * @module @qilin-agent/client-ui-primitives/useAnchoredPosition
11
+ */
12
+ import { type CSSProperties, type RefObject } from 'react';
13
+ /** Inputs for {@link useAnchoredPosition}. */
14
+ export interface AnchoredPositionOptions {
15
+ /** Whether the floating element is mounted and should track its anchor. */
16
+ open: boolean;
17
+ /** The element the panel is placed from. */
18
+ anchorRef: RefObject<HTMLElement | null>;
19
+ /** The floating element, measured so the clamp uses real dimensions. */
20
+ panelRef: RefObject<HTMLElement | null>;
21
+ /** Which anchor edge the panel hangs from: below it (`bottom`, the default) or above it (`top`). */
22
+ side?: 'top' | 'bottom';
23
+ /** Distance kept between the anchor edge named by `side` and the panel. */
24
+ gap: number;
25
+ /** Distance kept between the panel and each viewport edge. */
26
+ margin: number;
27
+ }
28
+ /**
29
+ * Track an anchor and return the panel's fixed coordinates.
30
+ * @param options - the open state, the two refs, the placement side, and the gap/margin distances.
31
+ * @returns `left`/`top` for the panel, or `null` before the first measurement.
32
+ */
33
+ export declare function useAnchoredPosition(options: AnchoredPositionOptions): CSSProperties | null;
34
+ //# sourceMappingURL=useAnchoredPosition.d.ts.map
@@ -0,0 +1,11 @@
1
+ import type { RefObject } from 'react';
2
+ /**
3
+ * Close an open popover when a pointerdown lands outside its root element.
4
+ * @param root - element containing both the trigger and the open surface.
5
+ * @param open - whether the surface is showing; false detaches the listener.
6
+ * @param setOpen - state setter invoked with false on an outside pointerdown.
7
+ * @param portal - surface portaled outside the root (a `document.body` dialog)
8
+ * that also counts as inside; omit when the root contains the whole popover.
9
+ */
10
+ export declare function useDismissOnOutsidePointer(root: RefObject<HTMLElement | null>, open: boolean, setOpen: (open: boolean) => void, portal?: RefObject<HTMLElement | null>): void;
11
+ //# sourceMappingURL=useDismissOnOutsidePointer.d.ts.map
@@ -0,0 +1,27 @@
1
+ import type { RefObject } from 'react';
2
+ /** Dialog and menu elements whose document order determines foreground shortcut ownership. */
3
+ export declare const modalSelector = "[role=\"dialog\"][aria-modal=\"true\"], [role=\"menu\"]";
4
+ /**
5
+ * Request closure of the foreground registered modal using its current onClose callback.
6
+ * A newer menu or unregistered dialog blocks dismissal of the modal behind it.
7
+ * @param document - product document whose modal owns the close command.
8
+ */
9
+ export declare function closeTopModal(document: Document): void;
10
+ /**
11
+ * Whether an anchor belongs behind the current modal and must yield keyboard input.
12
+ * @param anchor - local control owning the input handler.
13
+ * @returns true when another modal owns the foreground.
14
+ */
15
+ export declare function isBehindModal(anchor: HTMLElement | null): boolean;
16
+ /**
17
+ * Give only the top modal Escape and Tab ownership, then restore its previous focus.
18
+ * Automatic entry and return focus omit outlines; keyboard traversal retains its indicators.
19
+ * Controls mounted with the dialog use data-modal-autofocus for initial focus;
20
+ * React autoFocus runs before this layer can capture the invoking control.
21
+ * Local menus handle their Escape during capture before this bubble listener.
22
+ * @param dialog - mounted dialog element.
23
+ * @param open - whether this layer is active.
24
+ * @param onClose - top-layer Escape or application close action.
25
+ */
26
+ export declare function useModalLayer(dialog: RefObject<HTMLElement | null>, open: boolean, onClose: () => void): void;
27
+ //# sourceMappingURL=useModalLayer.d.ts.map
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Display projection of reference forms in sent user text (bubble and queue
3
+ * rows). The logged model text remains the single truth; this is presentation
4
+ * only, and every part renders inline so a single-line message never breaks
5
+ * across lines. Four decoration sources, by precedence: the wire session form
6
+ * `@[label](qilin-session:...)` folds to its label; exact session labels
7
+ * supplied by an adjacent recall decorate their bare `@label` mention; plain
8
+ * `@name` word-boundary tokens decorate by shape alone; and a plain `/name`
9
+ * token decorates only when the caller names it — a skill the host actually
10
+ * loaded for that message (ui-chat reads the step's `skill-invocation`
11
+ * injections) or the command a command-input bubble echoes — so `/123` or a
12
+ * stray `/word` stays plain text. A `/name` token is whitespace-bounded like
13
+ * the host skill gesture (`qilin-tool-skill`): it ends at whitespace or the
14
+ * text end, so slash paths (`/nfs-hg/xxx`, `/plan.md`) and punctuation-glued
15
+ * tokens (`/plan。`) stay plain even for a loaded name.
16
+ */
17
+ import type { ReactNode } from 'react';
18
+ /** Optional navigation supplied by consumers that can preview references. */
19
+ export interface UserTextReferences {
20
+ /** Open a file path decoded from an `@` mention. */
21
+ openFile: (path: string) => void;
22
+ /** Open the source of a skill loaded for this message. */
23
+ openSkill: (name: string) => void;
24
+ }
25
+ /**
26
+ * Split one sent text into inline plain runs and reference chips.
27
+ * @param text - the logged model text of the message or queue row.
28
+ * @param sessionLabels - exact session mention labels associated by an adjacent recall.
29
+ * @param slashNames - names a `/name` token may decorate as: the skills the
30
+ * host loaded for this message, or the command a command bubble echoes
31
+ * (unsent queue rows pass none).
32
+ * @param slashKind - the chip kind those tokens render as.
33
+ * @param references - optional file and skill preview actions; session and command tokens stay labels.
34
+ * @returns inline nodes covering the whole text.
35
+ */
36
+ export declare function projectUserText(text: string, sessionLabels: readonly string[], slashNames?: readonly string[], slashKind?: 'skill' | 'command', references?: UserTextReferences): ReactNode;
37
+ //# sourceMappingURL=user-text.d.ts.map
@@ -0,0 +1,43 @@
1
+ /* Inline projection of sent user text: plain runs and reference chips flow in
2
+ the consumer's own line box (bubble or queue row); nothing here is block.
3
+ White-space policy stays with the consumer: the bubble wraps with pre-wrap,
4
+ the queue preview keeps its single nowrap/ellipsis line. */
5
+
6
+ .plainRun {
7
+ font-size: inherit;
8
+ line-height: inherit;
9
+ }
10
+
11
+ .refChip {
12
+ /* Plain inline, NOT inline-flex: a flex container takes its baseline from
13
+ its first flex item — the icon svg, which has no text baseline — so the
14
+ chip's label rode ~3px above the surrounding text in both surfaces. An
15
+ inline chip shares the consumer's baseline by construction. */
16
+ display: inline;
17
+ margin: 0 2px;
18
+ color: var(--qilin-alias-state-business-primary);
19
+ font-weight: 500;
20
+ white-space: nowrap;
21
+ }
22
+
23
+ /* Skill and command tokens read as code: the theme's code family at the
24
+ consumer's own size and line height, so the chip sits on the bubble line
25
+ like the plain runs around it. `@` chips keep the body face — a file or
26
+ session name is a label, not code. */
27
+ .slashChip {
28
+ font-family: var(--qilin-font-markdown-code-font-family);
29
+ }
30
+
31
+ /* Inline reference glyphs (always ReferenceIcon svgs) ride the consumer's own
32
+ font: 1em keeps the glyph at the text's size in the bubble (14px + user
33
+ setting), the queue preview's fixed 13px line, and any future consumer — a
34
+ px+delta size followed only the bubble axis and left the glyph oversized in
35
+ the queue row. */
36
+ .refIcon {
37
+ width: 1em;
38
+ height: 1em;
39
+ margin-right: 4px;
40
+ /* Optical centering against the text: drops the glyph below the baseline by
41
+ a font-relative amount, so it holds across the font axis. */
42
+ vertical-align: -0.125em;
43
+ }
package/package.json CHANGED
@@ -1,6 +1,65 @@
1
1
  {
2
2
  "name": "@qilin-agent/client-ui-primitives",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "description": "Pure React atoms for the qilin web UI: controls, icons, markdown, and JSON inspectors (zero cordis)",
4
+ "version": "3.1.3",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/kkutysllb/QiLin.git",
11
+ "directory": "packages/client/ui-primitives"
12
+ },
13
+ "engines": {
14
+ "node": "^22.19.0 || >=24.0.0"
15
+ },
16
+ "type": "module",
17
+ "main": "lib/index.js",
18
+ "types": "lib/types/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "types": "./lib/types/index.d.ts",
22
+ "default": "./lib/index.js"
23
+ },
24
+ "./src/*": "./src/*",
25
+ "./package.json": "./package.json"
26
+ },
27
+ "license": "MIT",
28
+ "devDependencies": {
29
+ "@shikijs/langs": "^4.3.1",
30
+ "@types/mdast": "^4.0.4",
31
+ "@types/react": "~18.3.1",
32
+ "@types/react-dom": "~18.3.0",
33
+ "anser": "^2.3.5",
34
+ "clsx": "^2.0.0",
35
+ "diff": "^9.0.0",
36
+ "katex": "^0.16.47",
37
+ "mdast-util-from-markdown": "^2.0.3",
38
+ "mdast-util-gfm": "^3.1.0",
39
+ "mdast-util-math": "^3.0.0",
40
+ "mermaid": "11.17.2",
41
+ "micromark-core-commonmark": "^2.0.3",
42
+ "micromark-extension-gfm": "^3.0.0",
43
+ "micromark-extension-math": "^3.1.0",
44
+ "micromark-factory-space": "^2.0.1",
45
+ "micromark-util-character": "^2.1.1",
46
+ "micromark-util-classify-character": "^2.0.1",
47
+ "micromark-util-sanitize-uri": "^2.0.1",
48
+ "micromark-util-symbol": "^2.0.1",
49
+ "micromark-util-types": "^2.0.2",
50
+ "react": "^18.2.0",
51
+ "react-dom": "^18.2.0",
52
+ "shiki": "^4.3.1",
53
+ "simple-icons": "16.31.0",
54
+ "@qilin-agent/util-workspace-path": "3.1.3",
55
+ "@qilin-agent/kylin": "~4.0.3"
56
+ },
57
+ "files": [
58
+ "lib/index.js",
59
+ "lib/**/*.css",
60
+ "lib/types/**/*.d.ts"
61
+ ],
62
+ "peerDependencies": {
63
+ "@qilin-agent/kylin": "~4.0.3"
64
+ }
6
65
  }