@aleph-alpha/chat-kit 6.2.0 → 6.3.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.
Files changed (80) hide show
  1. package/dist/{CkHistory.vue_vue_type_script_setup_true_lang-DPCpIxWc.js → CkHistory.vue_vue_type_script_setup_true_lang-gV-lp0ZB.js} +345 -164
  2. package/dist/chat-kit.css +111 -28
  3. package/dist/code-palette-DAJUTnR-.js +21598 -0
  4. package/dist/components/base/CkCodeEditor/CkCodeEditor.stories.d.ts +43 -0
  5. package/dist/components/base/CkCodeEditor/CkCodeEditor.stories.d.ts.map +1 -0
  6. package/dist/components/base/CkCodeEditor/CkCodeEditor.vue.d.ts +39 -0
  7. package/dist/components/base/CkCodeEditor/CkCodeEditor.vue.d.ts.map +1 -0
  8. package/dist/components/base/CkCodeEditor/createCodeMirror.d.ts +44 -0
  9. package/dist/components/base/CkCodeEditor/createCodeMirror.d.ts.map +1 -0
  10. package/dist/components/base/CkCodeEditor/index.d.ts +3 -0
  11. package/dist/components/base/CkCodeEditor/index.d.ts.map +1 -0
  12. package/dist/components/base/CkCodeEditor/types.d.ts +129 -0
  13. package/dist/components/base/CkCodeEditor/types.d.ts.map +1 -0
  14. package/dist/components/base/CkMilkdownEditor/CkMilkdownEditor.stories.d.ts +6 -0
  15. package/dist/components/base/CkMilkdownEditor/CkMilkdownEditor.stories.d.ts.map +1 -1
  16. package/dist/components/base/CkMilkdownEditor/CkMilkdownEditor.vue.d.ts +1 -0
  17. package/dist/components/base/CkMilkdownEditor/CkMilkdownEditor.vue.d.ts.map +1 -1
  18. package/dist/components/base/CkMilkdownEditor/createCrepeEditor.d.ts +1 -0
  19. package/dist/components/base/CkMilkdownEditor/createCrepeEditor.d.ts.map +1 -1
  20. package/dist/components/base/CkMilkdownEditor/types.d.ts +8 -0
  21. package/dist/components/base/CkMilkdownEditor/types.d.ts.map +1 -1
  22. package/dist/components/base/index.d.ts +2 -0
  23. package/dist/components/base/index.d.ts.map +1 -1
  24. package/dist/components/index.d.ts +2 -2
  25. package/dist/components/index.d.ts.map +1 -1
  26. package/dist/components/index.js +27 -26
  27. package/dist/createCodeMirror-BkV6FEPn.js +101 -0
  28. package/dist/{createCrepeEditor-C9seqnzm.js → createCrepeEditor-Ci5FHHIV.js} +1433 -24739
  29. package/dist/handlers/index.js +1 -1
  30. package/dist/handlers/useChatKitLabels.d.ts +6 -0
  31. package/dist/handlers/useChatKitLabels.d.ts.map +1 -1
  32. package/dist/{components/base/CkMilkdownEditor/codeMirrorTheme.d.ts → helpers/codemirror/theme.d.ts} +1 -1
  33. package/dist/helpers/codemirror/theme.d.ts.map +1 -0
  34. package/dist/{index-DzpUblMx.js → index-B2tew8uf.js} +3 -3
  35. package/dist/{index-DLZcs4H8.js → index-BLVAx_f8.js} +2 -2
  36. package/dist/{index-CHtY7ztn.js → index-BUCqcTPA.js} +2 -2
  37. package/dist/{index-8mYiDHFC.js → index-BhvbqYsK.js} +2 -2
  38. package/dist/{index-B0nlcqqF.js → index-BoUJGvvQ.js} +2 -2
  39. package/dist/{index-U4LYutvz.js → index-BtY1uxn6.js} +3 -2
  40. package/dist/{index-C5UC1wP7.js → index-BvG6l44n.js} +3 -2
  41. package/dist/{index-D85elIIr.js → index-CB6xZVsf.js} +2 -2
  42. package/dist/{index-DbVRgXxM.js → index-CIF93PZF.js} +3 -3
  43. package/dist/{index-reQfKGuJ.js → index-CN8d3yl1.js} +1 -1
  44. package/dist/{index-By7WdPbk.js → index-CYk7AB8M.js} +4 -4
  45. package/dist/{index-DO8xk00f.js → index-Cxs6kPho.js} +3 -3
  46. package/dist/index-D6ftdiLa.js +1825 -0
  47. package/dist/{index-DXTRMb09.js → index-DgCcFC3N.js} +3 -3
  48. package/dist/{index-Bxg0Q_mk.js → index-DhwsowEf.js} +2 -2
  49. package/dist/{index-C90_LSx6.js → index-Dl24CCB3.js} +4 -4
  50. package/dist/{index-eZunhxNH.js → index-DqGDenO9.js} +2 -2
  51. package/dist/{index-DfvAv_Y2.js → index-DufAP1JF.js} +3 -2
  52. package/dist/{index-VbqLf82s.js → index-DxTzaHLr.js} +4 -4
  53. package/dist/{index-CFdcEeXx.js → index-MfXW4ZyN.js} +3 -2
  54. package/dist/{index-6PiPEjJd.js → index-ZHg2R9iD.js} +3 -2
  55. package/dist/{index-DNxEOsDD.js → index-gYt3E3Cp.js} +2 -2
  56. package/dist/{index-DINJn4Mn.js → index-w2yzH7vs.js} +3 -3
  57. package/dist/index.d.ts +2 -2
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +29 -28
  60. package/dist/{useChatKitLabels-Bz58tas9.js → useChatKitLabels-CatQSpfL.js} +2 -0
  61. package/package.json +5 -3
  62. package/src/components/base/CkCodeEditor/CkCodeEditor.spec.ts +223 -0
  63. package/src/components/base/CkCodeEditor/CkCodeEditor.stories.ts +311 -0
  64. package/src/components/base/CkCodeEditor/CkCodeEditor.vue +238 -0
  65. package/src/components/base/CkCodeEditor/createCodeMirror.ts +188 -0
  66. package/src/components/base/CkCodeEditor/index.ts +2 -0
  67. package/src/components/base/CkCodeEditor/types.ts +128 -0
  68. package/src/components/base/CkMilkdownEditor/CkMilkdownEditor.spec.ts +13 -0
  69. package/src/components/base/CkMilkdownEditor/CkMilkdownEditor.stories.ts +34 -0
  70. package/src/components/base/CkMilkdownEditor/CkMilkdownEditor.vue +3 -1
  71. package/src/components/base/CkMilkdownEditor/createCrepeEditor.ts +2 -1
  72. package/src/components/base/CkMilkdownEditor/milkdown-theme.css +39 -26
  73. package/src/components/base/CkMilkdownEditor/types.ts +8 -0
  74. package/src/components/base/index.ts +6 -0
  75. package/src/components/index.ts +4 -0
  76. package/src/handlers/useChatKitLabels.ts +6 -0
  77. package/src/helpers/codemirror/code-palette.css +49 -0
  78. package/src/{components/base/CkMilkdownEditor/codeMirrorTheme.ts → helpers/codemirror/theme.ts} +23 -12
  79. package/src/index.ts +4 -0
  80. package/dist/components/base/CkMilkdownEditor/codeMirrorTheme.d.ts.map +0 -1
@@ -1,6 +1,6 @@
1
- import { L as LRParser, E as ExternalTokenizer } from "./index-reQfKGuJ.js";
2
- import { s as styleTags, t as tags, a as LanguageSupport, p as parseMixed, L as LRLanguage, i as indentNodeProp, c as continuedIndent, h as delimitedIndent, f as foldNodeProp, j as foldInside } from "./createCrepeEditor-C9seqnzm.js";
3
- import { html } from "./index-VbqLf82s.js";
1
+ import { L as LRParser, E as ExternalTokenizer } from "./index-CN8d3yl1.js";
2
+ import { u as styleTags, v as tags, q as LanguageSupport, y as parseMixed, L as LRLanguage, r as indentNodeProp, s as continuedIndent, z as delimitedIndent, t as foldNodeProp, A as foldInside } from "./code-palette-DAJUTnR-.js";
3
+ import { html } from "./index-DxTzaHLr.js";
4
4
  const castOpen = 1, HeredocString = 2, interpolatedStringContent = 276, EscapeSequence = 3, afterInterpolation = 277, automaticSemicolon = 278, eof = 279, abstract = 4, and = 5, array = 6, as = 7, Boolean = 8, _break = 9, _case = 10, _catch = 11, clone = 12, _const = 13, _continue = 14, _default = 15, declare = 16, _do = 17, echo = 18, _else = 19, elseif = 20, enddeclare = 21, endfor = 22, endforeach = 23, endif = 24, endswitch = 25, endwhile = 26, _enum = 27, _extends = 28, final = 29, _finally = 30, fn = 31, _for = 32, foreach = 33, from = 34, _function = 35, global = 36, goto = 37, _if = 38, _implements = 39, include = 40, include_once = 41, _instanceof = 42, insteadof = 43, _interface = 44, list = 45, match = 46, namespace = 47, _new = 48, _null = 49, or = 50, print = 51, readonly = 52, _require = 53, require_once = 54, _return = 55, _switch = 56, _throw = 57, trait = 58, _try = 59, unset = 60, use = 61, _var = 62, Visibility = 63, _while = 64, xor = 65, _yield = 66;
5
5
  const keywordMap = {
6
6
  abstract,
@@ -1,5 +1,5 @@
1
- import { L as LRParser, E as ExternalTokenizer } from "./index-reQfKGuJ.js";
2
- import { s as styleTags, t as tags, a as LanguageSupport, L as LRLanguage, i as indentNodeProp, c as continuedIndent, f as foldNodeProp, j as foldInside } from "./createCrepeEditor-C9seqnzm.js";
1
+ import { L as LRParser, E as ExternalTokenizer } from "./index-CN8d3yl1.js";
2
+ import { u as styleTags, v as tags, q as LanguageSupport, L as LRLanguage, r as indentNodeProp, s as continuedIndent, t as foldNodeProp, A as foldInside } from "./code-palette-DAJUTnR-.js";
3
3
  const closureParamDelim = 1, tpOpen = 2, tpClose = 3, RawString = 4, Float = 5;
4
4
  const _b = 98, _e = 101, _f = 102, _r = 114, _E = 69, Zero = 48, Dot = 46, Plus = 43, Minus = 45, Hash = 35, Quote = 34, Pipe = 124, LessThan = 60, GreaterThan = 62;
5
5
  function isNum(ch) {
@@ -1,7 +1,7 @@
1
- import { L as LRLanguage, a as LanguageSupport, p as parseMixed, s as styleTags, t as tags } from "./createCrepeEditor-C9seqnzm.js";
2
- import { html } from "./index-VbqLf82s.js";
3
- import { javascriptLanguage } from "./index-DfvAv_Y2.js";
4
- import { L as LRParser, a as LocalTokenGroup } from "./index-reQfKGuJ.js";
1
+ import { L as LRLanguage, q as LanguageSupport, y as parseMixed, u as styleTags, v as tags } from "./code-palette-DAJUTnR-.js";
2
+ import { html } from "./index-DxTzaHLr.js";
3
+ import { javascriptLanguage } from "./index-DufAP1JF.js";
4
+ import { L as LRParser, a as LocalTokenGroup } from "./index-CN8d3yl1.js";
5
5
  const parser = /* @__PURE__ */ LRParser.deserialize({
6
6
  version: 14,
7
7
  states: "%pOVOWOOObQPOOOpOSO'#C_OOOO'#Cp'#CpQVOWOOQxQPOOO!TQQOOQ!YQPOOOOOO,58y,58yO!_OSO,58yOOOO-E6n-E6nO!dQQO'#CqQ{QPOOO!iQPOOQ{QPOOO!qQPOOOOOO1G.e1G.eOOQO,59],59]OOQO-E6o-E6oO!yOpO'#CiO#RO`O'#CiQOQPOOO#ZO#tO'#CmO#fO!bO'#CmOOQO,59T,59TO#qOpO,59TO#vO`O,59TOOOO'#Cr'#CrO#{O#tO,59XOOQO,59X,59XOOOO'#Cs'#CsO$WO!bO,59XOOQO1G.o1G.oOOOO-E6p-E6pOOQO1G.s1G.sOOOO-E6q-E6q",
@@ -1,5 +1,5 @@
1
- import { L as LRParser, E as ExternalTokenizer, C as ContextTracker } from "./index-reQfKGuJ.js";
2
- import { s as styleTags, t as tags, a as LanguageSupport, p as parseMixed, L as LRLanguage, i as indentNodeProp, h as delimitedIndent, f as foldNodeProp, j as foldInside } from "./createCrepeEditor-C9seqnzm.js";
1
+ import { L as LRParser, E as ExternalTokenizer, C as ContextTracker } from "./index-CN8d3yl1.js";
2
+ import { u as styleTags, v as tags, q as LanguageSupport, y as parseMixed, L as LRLanguage, r as indentNodeProp, z as delimitedIndent, t as foldNodeProp, A as foldInside } from "./code-palette-DAJUTnR-.js";
3
3
  const blockEnd = 63, eof = 64, DirectiveEnd = 1, DocEnd = 2, sequenceStartMark = 3, sequenceContinueMark = 4, explicitMapStartMark = 5, explicitMapContinueMark = 6, flowMapMark = 7, mapStartMark = 65, mapContinueMark = 66, Literal = 8, QuotedLiteral = 9, Anchor = 10, Alias = 11, Tag = 12, BlockLiteralContent = 13, BracketL = 19, FlowSequence = 20, Colon = 29, BraceL = 33, FlowMapping = 34, BlockLiteralHeader = 47;
4
4
  const type_Top = 0, type_Seq = 1, type_Map = 2, type_Flow = 3, type_Lit = 4;
5
5
  class Context {
@@ -1,5 +1,6 @@
1
- import { L as LRParser, E as ExternalTokenizer, a as LocalTokenGroup, C as ContextTracker } from "./index-reQfKGuJ.js";
2
- import { s as styleTags, t as tags, E as EditorView, e as syntaxTree, g as EditorSelection, a as LanguageSupport, b as ifNotIn, d as completeFromList, L as LRLanguage, i as indentNodeProp, m as flatIndent, c as continuedIndent, h as delimitedIndent, f as foldNodeProp, j as foldInside, J as sublanguageProp, n as snippetCompletion, z as defineLanguageFacet, o as NodeWeakMap, I as IterMode } from "./createCrepeEditor-C9seqnzm.js";
1
+ import { L as LRParser, E as ExternalTokenizer, a as LocalTokenGroup, C as ContextTracker } from "./index-CN8d3yl1.js";
2
+ import { u as styleTags, v as tags, E as EditorView, w as syntaxTree, x as EditorSelection, q as LanguageSupport, L as LRLanguage, r as indentNodeProp, a5 as flatIndent, s as continuedIndent, z as delimitedIndent, t as foldNodeProp, A as foldInside, ag as sublanguageProp, ab as defineLanguageFacet, a6 as NodeWeakMap, a4 as IterMode } from "./code-palette-DAJUTnR-.js";
3
+ import { i as ifNotIn, c as completeFromList, s as snippetCompletion } from "./index-D6ftdiLa.js";
3
4
  const noSemi = 316, noSemiType = 317, incdec = 1, incdecPrefix = 2, questionDot = 3, JSXStartTag = 4, insertSemi = 318, spaces = 320, newline = 321, LineComment = 5, BlockComment = 6, Dialect_jsx = 0;
4
5
  const space = [
5
6
  9,
@@ -1,7 +1,7 @@
1
- import { L as LRParser, E as ExternalTokenizer, C as ContextTracker } from "./index-reQfKGuJ.js";
2
- import { p as parseMixed, s as styleTags, t as tags, E as EditorView, e as syntaxTree, g as EditorSelection, a as LanguageSupport, L as LRLanguage, i as indentNodeProp, f as foldNodeProp, H as bracketMatchingHandle } from "./createCrepeEditor-C9seqnzm.js";
3
- import { cssLanguage, css } from "./index-8mYiDHFC.js";
4
- import { typescriptLanguage, jsxLanguage, tsxLanguage, javascriptLanguage, javascript } from "./index-DfvAv_Y2.js";
1
+ import { L as LRParser, E as ExternalTokenizer, C as ContextTracker } from "./index-CN8d3yl1.js";
2
+ import { y as parseMixed, u as styleTags, v as tags, E as EditorView, w as syntaxTree, x as EditorSelection, q as LanguageSupport, L as LRLanguage, r as indentNodeProp, t as foldNodeProp, af as bracketMatchingHandle } from "./code-palette-DAJUTnR-.js";
3
+ import { cssLanguage, css } from "./index-BhvbqYsK.js";
4
+ import { typescriptLanguage, jsxLanguage, tsxLanguage, javascriptLanguage, javascript } from "./index-DufAP1JF.js";
5
5
  const scriptText = 55, StartCloseScriptTag = 1, styleText = 56, StartCloseStyleTag = 2, textareaText = 57, StartCloseTextareaTag = 3, EndTag = 4, SelfClosingEndTag = 5, StartTag = 6, StartScriptTag = 7, StartStyleTag = 8, StartTextareaTag = 9, StartSelfClosingTag = 10, StartCloseTag = 11, NoMatchStartCloseTag = 12, MismatchedStartCloseTag = 13, missingCloseTag = 58, IncompleteTag = 14, IncompleteCloseTag = 15, commentContent$1 = 59, Element = 21, TagName = 23, Attribute = 24, AttributeName = 25, AttributeValue = 27, UnquotedAttributeValue = 28, ScriptText = 29, StyleText = 32, TextareaText = 35, OpenTag = 37, CloseTag = 38, Dialect_noMatch = 0, Dialect_selfClosing = 1;
6
6
  const selfClosers$1 = {
7
7
  area: true,
@@ -1,5 +1,6 @@
1
- import { L as LRParser, E as ExternalTokenizer, C as ContextTracker } from "./index-reQfKGuJ.js";
2
- import { s as styleTags, t as tags, b as ifNotIn, e as syntaxTree, a as LanguageSupport, L as LRLanguage, i as indentNodeProp, h as delimitedIndent, f as foldNodeProp, j as foldInside, o as NodeWeakMap, I as IterMode, d as completeFromList, n as snippetCompletion } from "./createCrepeEditor-C9seqnzm.js";
1
+ import { L as LRParser, E as ExternalTokenizer, C as ContextTracker } from "./index-CN8d3yl1.js";
2
+ import { u as styleTags, v as tags, w as syntaxTree, q as LanguageSupport, L as LRLanguage, r as indentNodeProp, z as delimitedIndent, t as foldNodeProp, A as foldInside, a6 as NodeWeakMap, a4 as IterMode } from "./code-palette-DAJUTnR-.js";
3
+ import { i as ifNotIn, c as completeFromList, s as snippetCompletion } from "./index-D6ftdiLa.js";
3
4
  const printKeyword = 1, indent = 194, dedent = 195, newline$1 = 196, blankLineStart = 197, newlineBracketed = 198, eof = 199, stringContent = 200, Escape = 2, replacementStart = 3, stringEnd = 201, ParenL = 24, ParenthesizedExpression = 25, TupleExpression = 49, ComprehensionExpression = 50, BracketL = 55, ArrayExpression = 56, ArrayComprehensionExpression = 57, BraceL = 59, DictionaryExpression = 60, DictionaryComprehensionExpression = 61, SetExpression = 62, SetComprehensionExpression = 63, ArgList = 65, subscript = 238, String$1 = 71, stringStart = 241, stringStartD = 242, stringStartL = 243, stringStartLD = 244, stringStartR = 245, stringStartRD = 246, stringStartRL = 247, stringStartRLD = 248, FormatString = 72, stringStartF = 249, stringStartFD = 250, stringStartFL = 251, stringStartFLD = 252, stringStartFR = 253, stringStartFRD = 254, stringStartFRL = 255, stringStartFRLD = 256, FormatReplacement = 73, nestedFormatReplacement = 77, importList = 263, TypeParamList = 112, ParamList = 130, SequencePattern = 151, MappingPattern = 152, PatternArgList = 155;
4
5
  const newline = 10, carriageReturn = 13, space = 32, tab = 9, hash = 35, parenOpen = 40, dot = 46, braceOpen = 123, braceClose = 125, singleQuote = 39, doubleQuote = 34, backslash = 92, letter_o = 111, letter_x = 120, letter_N = 78, letter_u = 117, letter_U = 85;
5
6
  const bracketed = /* @__PURE__ */ new Set([
@@ -1,5 +1,6 @@
1
- import { L as LRLanguage, a as LanguageSupport, i as indentNodeProp, c as continuedIndent, f as foldNodeProp, s as styleTags, t as tags, b as ifNotIn, d as completeFromList, e as syntaxTree } from "./createCrepeEditor-C9seqnzm.js";
2
- import { E as ExternalTokenizer, L as LRParser } from "./index-reQfKGuJ.js";
1
+ import { L as LRLanguage, q as LanguageSupport, r as indentNodeProp, s as continuedIndent, t as foldNodeProp, u as styleTags, v as tags, w as syntaxTree } from "./code-palette-DAJUTnR-.js";
2
+ import { E as ExternalTokenizer, L as LRParser } from "./index-CN8d3yl1.js";
3
+ import { i as ifNotIn, c as completeFromList } from "./index-D6ftdiLa.js";
3
4
  const whitespace = 36, LineComment = 1, BlockComment = 2, String$1 = 3, Number = 4, Bool = 5, Null = 6, ParenL = 7, ParenR = 8, BraceL = 9, BraceR = 10, BracketL = 11, BracketR = 12, Semi = 13, Dot = 14, Operator = 15, Punctuation = 16, SpecialVar = 17, Identifier = 18, QuotedIdentifier = 19, Keyword = 20, Type = 21, Bits = 22, Bytes = 23, Builtin = 24;
4
5
  function isAlpha(ch) {
5
6
  return ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122 || ch >= 48 && ch <= 57;
@@ -1,5 +1,5 @@
1
- import { L as LRParser } from "./index-reQfKGuJ.js";
2
- import { s as styleTags, t as tags, a as LanguageSupport, L as LRLanguage, i as indentNodeProp, m as flatIndent, c as continuedIndent, h as delimitedIndent, f as foldNodeProp, j as foldInside } from "./createCrepeEditor-C9seqnzm.js";
1
+ import { L as LRParser } from "./index-CN8d3yl1.js";
2
+ import { u as styleTags, v as tags, q as LanguageSupport, L as LRLanguage, r as indentNodeProp, a5 as flatIndent, s as continuedIndent, z as delimitedIndent, t as foldNodeProp, A as foldInside } from "./code-palette-DAJUTnR-.js";
3
3
  const javaHighlighting = styleTags({
4
4
  null: tags.null,
5
5
  instanceof: tags.operatorKeyword,
@@ -1,6 +1,6 @@
1
- import { E as EditorView, g as EditorSelection, a as LanguageSupport, p as parseMixed, e as syntaxTree, L as LRLanguage, s as styleTags, t as tags, i as indentNodeProp, h as delimitedIndent, f as foldNodeProp } from "./createCrepeEditor-C9seqnzm.js";
2
- import { html } from "./index-VbqLf82s.js";
3
- import { L as LRParser, E as ExternalTokenizer, a as LocalTokenGroup } from "./index-reQfKGuJ.js";
1
+ import { E as EditorView, x as EditorSelection, q as LanguageSupport, y as parseMixed, w as syntaxTree, L as LRLanguage, u as styleTags, v as tags, r as indentNodeProp, z as delimitedIndent, t as foldNodeProp } from "./code-palette-DAJUTnR-.js";
2
+ import { html } from "./index-DxTzaHLr.js";
3
+ import { L as LRParser, E as ExternalTokenizer, a as LocalTokenGroup } from "./index-CN8d3yl1.js";
4
4
  const interpolationStart = 1, commentTagStart = 2, tagStart = 3, text = 155, endrawTagStart = 4, rawText = 156;
5
5
  function wordChar(code) {
6
6
  return code >= 65 && code <= 90 || code >= 97 && code <= 122;
package/dist/index.d.ts CHANGED
@@ -6,8 +6,8 @@ export { useChat, useConversationSessions, useConversations, } from './composabl
6
6
  export type { ChatActions, ChatState, ConversationSession, CreateConversationInput, MessageHandler, MutationOptions, UseChatReturn, UseConversationSessionsReturn, UseConversationsOptions, UseConversationsReturn, } from './composables';
7
7
  export { SdkError, createDocumentUploadProvider, defaultDocumentUploadConfig, defaultEndpoints, useDocumentUploadWithDefaultConfig, } from './composables/fileUpload';
8
8
  export type { DocumentUploadConfig, DocumentUploadProvider, FileEntry, FileStatus, } from './composables/fileUpload';
9
- export { CkAgentMessage, CkAgentMessageHeader, CkHeaderActivityButton, CkCitation, CkCitationLabel, CkCitationCard, CkConversation, CkConversationLayout, CkCopyMessageButton, CkDropZoneOverlay, CkFeedbackButton, CkFeedbackDialog, CkFileItemsList, CkHistory, CkHistoryItem, CkHistoryWrapper, CkMarkdownRenderer, CkMessageButton, CkModelSelector, CkPromptSendButton, CkPromptMenuButton, CkPromptStopButton, CkPromptInput, CkPromptInputDisclaimer, CkRegenerateMessageButton, CkSendIcon, CkStopIcon, CkUserMessage, CkEditableUserMessage, CkMilkdownEditor, } from './components';
10
- export type { CkAgentMessageHeaderProps, CkHeaderActivityButtonProps, CkHeaderActivityButtonEmits, CkCitationProps, CkCitationEmits, CkCitationSource, CkCitationLabelProps, CkCitationCardProps, CkCitationCardEmits, CkConversationLayoutProps, CkConversationProps, CkDropZoneOverlayProps, CkDropZoneOverlayEmits, CkDropZoneRejection, CkDropZoneRejectionReason, CkFeedbackButtonProps, CkFeedbackDialogEmits, CkFeedbackDialogProps, CkFeedbackDialogSubmitPayload, CkFeedbackReason, CkFeedbackSentiment, CkFeedbackValue, CkFileEntry, CkFileItemsListEmits, CkFileItemsListProps, CkHistoryEmits, CkHistoryItemEmits, CkHistoryItemProps, CkHistoryProps, CkHistoryWrapperProps, CkMarkdownElementClasses, CkMarkdownRendererProps, CkMarkdownRendererEmits, CkModelOption, CkModelSelectorProps, CkModelSelectorEmits, CkPromptMenuButtonProps, CkUserMessageProps, CkEditableUserMessageProps, CkEditableUserMessageEmits, CkMilkdownEditorEmits, CkMilkdownEditorExposed, CkMilkdownEditorProps, } from './components';
9
+ export { CkAgentMessage, CkAgentMessageHeader, CkHeaderActivityButton, CkCitation, CkCitationLabel, CkCitationCard, CkConversation, CkConversationLayout, CkCopyMessageButton, CkDropZoneOverlay, CkFeedbackButton, CkFeedbackDialog, CkFileItemsList, CkHistory, CkHistoryItem, CkHistoryWrapper, CkMarkdownRenderer, CkMessageButton, CkModelSelector, CkPromptSendButton, CkPromptMenuButton, CkPromptStopButton, CkPromptInput, CkPromptInputDisclaimer, CkRegenerateMessageButton, CkSendIcon, CkStopIcon, CkUserMessage, CkEditableUserMessage, CkMilkdownEditor, CkCodeEditor, } from './components';
10
+ export type { CkAgentMessageHeaderProps, CkHeaderActivityButtonProps, CkHeaderActivityButtonEmits, CkCitationProps, CkCitationEmits, CkCitationSource, CkCitationLabelProps, CkCitationCardProps, CkCitationCardEmits, CkConversationLayoutProps, CkConversationProps, CkDropZoneOverlayProps, CkDropZoneOverlayEmits, CkDropZoneRejection, CkDropZoneRejectionReason, CkFeedbackButtonProps, CkFeedbackDialogEmits, CkFeedbackDialogProps, CkFeedbackDialogSubmitPayload, CkFeedbackReason, CkFeedbackSentiment, CkFeedbackValue, CkFileEntry, CkFileItemsListEmits, CkFileItemsListProps, CkHistoryEmits, CkHistoryItemEmits, CkHistoryItemProps, CkHistoryProps, CkHistoryWrapperProps, CkMarkdownElementClasses, CkMarkdownRendererProps, CkMarkdownRendererEmits, CkModelOption, CkModelSelectorProps, CkModelSelectorEmits, CkPromptMenuButtonProps, CkUserMessageProps, CkEditableUserMessageProps, CkEditableUserMessageEmits, CkMilkdownEditorEmits, CkMilkdownEditorExposed, CkMilkdownEditorProps, CkCodeEditorEmits, CkCodeEditorExposed, CkCodeEditorProps, } from './components';
11
11
  export { formatRelativeTime, markdownToPlainText } from './helpers';
12
12
  export type { ActiveComparison, BaseMessage, ComparisonLane, Conversation, ConversationTree, MessageContent, MessageContentStatus, MessageMetadata, MessageReasoningContent, MessageRole, MessageStatus, MessageTextContent, MessageToolContent, TreeMessage, } from './types';
13
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,iBAAiB,CAAC;AAGzB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,WAAW,GACjB,MAAM,YAAY,CAAC;AASpB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,OAAO,EACL,OAAO,EACP,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,EACd,eAAe,EACf,aAAa,EACb,6BAA6B,EAC7B,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,QAAQ,EACR,4BAA4B,EAC5B,2BAA2B,EAC3B,gBAAgB,EAChB,kCAAkC,GACnC,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,oBAAoB,EACpB,sBAAsB,EACtB,SAAS,EACT,UAAU,GACX,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,UAAU,EACV,eAAe,EACf,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,uBAAuB,EACvB,yBAAyB,EACzB,UAAU,EACV,UAAU,EACV,aAAa,EACb,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,yBAAyB,EACzB,2BAA2B,EAC3B,2BAA2B,EAC3B,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,6BAA6B,EAC7B,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAClB,0BAA0B,EAC1B,0BAA0B,EAC1B,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAGpE,YAAY,EACV,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,uBAAuB,EACvB,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,GACZ,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,iBAAiB,CAAC;AAGzB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,WAAW,GACjB,MAAM,YAAY,CAAC;AASpB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,OAAO,EACL,OAAO,EACP,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,EACd,eAAe,EACf,aAAa,EACb,6BAA6B,EAC7B,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,QAAQ,EACR,4BAA4B,EAC5B,2BAA2B,EAC3B,gBAAgB,EAChB,kCAAkC,GACnC,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,oBAAoB,EACpB,sBAAsB,EACtB,SAAS,EACT,UAAU,GACX,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,UAAU,EACV,eAAe,EACf,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,uBAAuB,EACvB,yBAAyB,EACzB,UAAU,EACV,UAAU,EACV,aAAa,EACb,qBAAqB,EACrB,gBAAgB,EAChB,YAAY,GACb,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,yBAAyB,EACzB,2BAA2B,EAC3B,2BAA2B,EAC3B,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,6BAA6B,EAC7B,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAClB,0BAA0B,EAC1B,0BAA0B,EAC1B,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAGpE,YAAY,EACV,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,uBAAuB,EACvB,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,GACZ,MAAM,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { u } from "./useMessageHandler-nnsort0-.js";
2
- import { C, d, p, u as u2, b } from "./useChatKitLabels-Bz58tas9.js";
2
+ import { C, d, p, u as u2, b } from "./useChatKitLabels-CatQSpfL.js";
3
3
  import { S, c, d as d2, f, u as u3, a, b as b2, e } from "./index-CZFx44C7.js";
4
- import { _, a as a2, b as b3, c as c2, C as C2, d as d3, e as e2, f as f2, g, h, i, j, k, l, m, n, o, p as p2, q, r, s, t, u as u4, v, w, x, y, z, A, B, D } from "./CkHistory.vue_vue_type_script_setup_true_lang-DPCpIxWc.js";
4
+ import { _, a as a2, b as b3, c as c2, C as C2, d as d3, e as e2, f as f2, g, h, i, j, k, l, m, n, o, p as p2, q, r, s, t, u as u4, v, w, x, y, z, A, B, D, E } from "./CkHistory.vue_vue_type_script_setup_true_lang-gV-lp0ZB.js";
5
5
  import { m as m2 } from "./markdownToPlainText-BOtlQ_BY.js";
6
6
  export {
7
7
  C as CHAT_KIT_LABELS,
@@ -10,37 +10,38 @@ export {
10
10
  b3 as CkCitation,
11
11
  c2 as CkCitationCard,
12
12
  C2 as CkCitationLabel,
13
- d3 as CkConversation,
14
- e2 as CkConversationLayout,
15
- f2 as CkCopyMessageButton,
16
- g as CkDropZoneOverlay,
17
- h as CkEditableUserMessage,
18
- i as CkFeedbackButton,
19
- j as CkFeedbackDialog,
20
- k as CkFileItemsList,
21
- l as CkHeaderActivityButton,
22
- m as CkHistory,
23
- n as CkHistoryItem,
24
- o as CkHistoryWrapper,
25
- p2 as CkMarkdownRenderer,
26
- q as CkMessageButton,
27
- r as CkMilkdownEditor,
28
- s as CkModelSelector,
29
- t as CkPromptInput,
30
- u4 as CkPromptInputDisclaimer,
31
- v as CkPromptMenuButton,
32
- w as CkPromptSendButton,
33
- x as CkPromptStopButton,
34
- y as CkRegenerateMessageButton,
35
- z as CkSendIcon,
36
- A as CkStopIcon,
37
- B as CkUserMessage,
13
+ d3 as CkCodeEditor,
14
+ e2 as CkConversation,
15
+ f2 as CkConversationLayout,
16
+ g as CkCopyMessageButton,
17
+ h as CkDropZoneOverlay,
18
+ i as CkEditableUserMessage,
19
+ j as CkFeedbackButton,
20
+ k as CkFeedbackDialog,
21
+ l as CkFileItemsList,
22
+ m as CkHeaderActivityButton,
23
+ n as CkHistory,
24
+ o as CkHistoryItem,
25
+ p2 as CkHistoryWrapper,
26
+ q as CkMarkdownRenderer,
27
+ r as CkMessageButton,
28
+ s as CkMilkdownEditor,
29
+ t as CkModelSelector,
30
+ u4 as CkPromptInput,
31
+ v as CkPromptInputDisclaimer,
32
+ w as CkPromptMenuButton,
33
+ x as CkPromptSendButton,
34
+ y as CkPromptStopButton,
35
+ z as CkRegenerateMessageButton,
36
+ A as CkSendIcon,
37
+ B as CkStopIcon,
38
+ D as CkUserMessage,
38
39
  S as SdkError,
39
40
  c as createDocumentUploadProvider,
40
41
  d as defaultChatKitLabels,
41
42
  d2 as defaultDocumentUploadConfig,
42
43
  f as defaultEndpoints,
43
- D as formatRelativeTime,
44
+ E as formatRelativeTime,
44
45
  m2 as markdownToPlainText,
45
46
  p as provideChatKitLabels,
46
47
  u3 as useChat,
@@ -19171,6 +19171,8 @@ const defaultChatKitLabels = {
19171
19171
  historyItemEditAction: "Edit",
19172
19172
  historyItemDeleteAction: "Delete",
19173
19173
  historyShowAll: "Show all",
19174
+ codeEditorCopy: "Copy code",
19175
+ codeEditorCopied: "Copied",
19174
19176
  markdownEditorBold: "Bold",
19175
19177
  markdownEditorItalic: "Italic",
19176
19178
  markdownEditorStrikethrough: "Strikethrough",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aleph-alpha/chat-kit",
3
- "version": "6.2.0",
3
+ "version": "6.3.0",
4
4
  "description": "Chat kit package for building chat interfaces with Vue",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -68,7 +68,9 @@
68
68
  },
69
69
  "dependencies": {
70
70
  "@aleph-alpha/ui-library": "^6.0.0",
71
+ "@codemirror/commands": "^6.11.1",
71
72
  "@codemirror/language": "^6.11.0",
73
+ "@codemirror/language-data": "^6.5.2",
72
74
  "@codemirror/state": "^6.5.0",
73
75
  "@codemirror/view": "^6.38.0",
74
76
  "@lezer/highlight": "^1.2.0",
@@ -114,8 +116,8 @@
114
116
  "vue-tsc": "^3.2.4",
115
117
  "wait-on": "9.0.3",
116
118
  "@aleph-alpha/prettier-config-frontend": "2.1.1",
117
- "@aleph-alpha/eslint-config-frontend": "0.7.1",
118
- "@aleph-alpha/tsconfig-frontend": "0.7.3"
119
+ "@aleph-alpha/tsconfig-frontend": "0.7.3",
120
+ "@aleph-alpha/eslint-config-frontend": "0.7.1"
119
121
  },
120
122
  "scripts": {
121
123
  "build": "vite build && vue-tsc --project tsconfig.build.json --declaration --emitDeclarationOnly --outDir dist",
@@ -0,0 +1,223 @@
1
+ import { render, screen, waitFor } from '@testing-library/vue';
2
+ import userEvent from '@testing-library/user-event';
3
+ import CkCodeEditor from './CkCodeEditor.vue';
4
+ import { resolveLanguage } from './createCodeMirror';
5
+
6
+ // CodeMirror measures its own layout on construction; jsdom has none of the
7
+ // geometry APIs it calls. The stubs stay in this spec rather than the global
8
+ // setup so every other spec keeps an unmodified jsdom.
9
+ const EMPTY_RECT = {
10
+ x: 0,
11
+ y: 0,
12
+ top: 0,
13
+ left: 0,
14
+ right: 0,
15
+ bottom: 0,
16
+ width: 0,
17
+ height: 0,
18
+ toJSON: () => ({}),
19
+ } as DOMRect;
20
+
21
+ beforeAll(() => {
22
+ Range.prototype.getBoundingClientRect = () => EMPTY_RECT;
23
+ Range.prototype.getClientRects = () =>
24
+ ({
25
+ length: 0,
26
+ item: () => null,
27
+ *[Symbol.iterator]() {
28
+ // no rects
29
+ },
30
+ }) as unknown as DOMRectList;
31
+ Element.prototype.scrollIntoView ??= () => undefined;
32
+ document.elementFromPoint ??= () => null;
33
+ });
34
+
35
+ async function renderEditor(
36
+ props: InstanceType<typeof CkCodeEditor>['$props'] = {},
37
+ ) {
38
+ const utils = render(CkCodeEditor, { props });
39
+ // The editor loads lazily, so wait for the ready flag rather than the shell.
40
+ await waitFor(() =>
41
+ expect(
42
+ utils.container.querySelector('.ck-code-editor--ready .cm-editor'),
43
+ ).toBeInTheDocument(),
44
+ );
45
+ return utils;
46
+ }
47
+
48
+ describe('CkCodeEditor', () => {
49
+ it('renders the initial code', async () => {
50
+ const { container } = await renderEditor({
51
+ modelValue: 'const answer = 42;',
52
+ language: 'javascript',
53
+ });
54
+
55
+ expect(container.querySelector('.cm-content')?.textContent).toContain(
56
+ 'const answer = 42;',
57
+ );
58
+ });
59
+
60
+ it('emits the new document when the user types', async () => {
61
+ const { emitted } = await renderEditor({ modelValue: '' });
62
+
63
+ const content = document.querySelector('.cm-content') as HTMLElement;
64
+ await userEvent.click(content);
65
+ await userEvent.type(content, 'hi');
66
+
67
+ await waitFor(() => expect(emitted()['update:modelValue']).toBeTruthy());
68
+ const updates = emitted()['update:modelValue'] as string[][];
69
+ expect(updates.at(-1)?.[0]).toBe('hi');
70
+ });
71
+
72
+ it('applies an external modelValue change without echoing it back', async () => {
73
+ const { container, rerender, emitted } = await renderEditor({
74
+ modelValue: 'one',
75
+ });
76
+
77
+ await rerender({ modelValue: 'two' });
78
+
79
+ await waitFor(() =>
80
+ expect(container.querySelector('.cm-content')?.textContent).toContain(
81
+ 'two',
82
+ ),
83
+ );
84
+ const updates = (emitted()['update:modelValue'] ?? []) as string[][];
85
+ expect(updates.map(([value]) => value)).not.toContain('two');
86
+ });
87
+
88
+ it('drops contenteditable when readonly, and restores it', async () => {
89
+ const { container, rerender } = await renderEditor({
90
+ modelValue: 'x',
91
+ readonly: true,
92
+ });
93
+
94
+ const content = () => container.querySelector('.cm-content');
95
+ expect(content()?.getAttribute('contenteditable')).toBe('false');
96
+
97
+ await rerender({ modelValue: 'x', readonly: false });
98
+ await waitFor(() =>
99
+ expect(content()?.getAttribute('contenteditable')).toBe('true'),
100
+ );
101
+ });
102
+
103
+ it('marks the root disabled and locks editing with `disabled`', async () => {
104
+ const { container } = await renderEditor({
105
+ modelValue: 'x',
106
+ disabled: true,
107
+ });
108
+
109
+ expect(
110
+ container.querySelector('.ck-code-editor')?.getAttribute('aria-disabled'),
111
+ ).toBe('true');
112
+ expect(
113
+ container.querySelector('.cm-content')?.getAttribute('contenteditable'),
114
+ ).toBe('false');
115
+ });
116
+
117
+ it('names the editable region for assistive tech', async () => {
118
+ const { container } = await renderEditor({
119
+ modelValue: 'x',
120
+ ariaLabel: 'Snippet',
121
+ });
122
+
123
+ const textbox = container.querySelector('[role="textbox"]');
124
+ expect(textbox).toBe(container.querySelector('.cm-content'));
125
+ expect(textbox?.getAttribute('aria-label')).toBe('Snippet');
126
+ });
127
+
128
+ it('shows the filename in the header when there is one', async () => {
129
+ await renderEditor({
130
+ modelValue: 'x',
131
+ language: 'python',
132
+ filename: 'main.py',
133
+ });
134
+
135
+ expect(screen.getByText('main.py')).toBeInTheDocument();
136
+ expect(screen.queryByText('python')).not.toBeInTheDocument();
137
+ });
138
+
139
+ it('falls back to the language, and labels plain text with nothing', async () => {
140
+ const withLanguage = await renderEditor({
141
+ modelValue: 'x',
142
+ language: 'python',
143
+ });
144
+ expect(screen.getByText('python')).toBeInTheDocument();
145
+ withLanguage.unmount();
146
+
147
+ // `text` is the "no language" value, which UiCodeBlock also leaves blank.
148
+ await renderEditor({ modelValue: 'x', language: 'text' });
149
+ expect(screen.queryByText('text')).not.toBeInTheDocument();
150
+ });
151
+
152
+ it('copies the current code through the injected writer', async () => {
153
+ const writeToClipboard = vi.fn().mockResolvedValue(undefined);
154
+ const { emitted } = await renderEditor({
155
+ modelValue: 'copy me',
156
+ writeToClipboard,
157
+ });
158
+
159
+ await userEvent.click(screen.getByRole('button', { name: 'Copy code' }));
160
+
161
+ expect(writeToClipboard).toHaveBeenCalledWith('copy me');
162
+ await waitFor(() => expect(emitted().copy).toEqual([[{ success: true }]]));
163
+ });
164
+
165
+ it('reports a failed copy rather than throwing', async () => {
166
+ const writeToClipboard = vi.fn().mockRejectedValue(new Error('denied'));
167
+ const { emitted } = await renderEditor({
168
+ modelValue: 'x',
169
+ writeToClipboard,
170
+ });
171
+
172
+ await userEvent.click(screen.getByRole('button', { name: 'Copy code' }));
173
+
174
+ await waitFor(() => expect(emitted().copy).toEqual([[{ success: false }]]));
175
+ });
176
+
177
+ it('hides the header when asked', async () => {
178
+ const { container } = await renderEditor({
179
+ modelValue: 'x',
180
+ language: 'python',
181
+ showHeader: false,
182
+ });
183
+
184
+ expect(container.querySelector('button')).toBeNull();
185
+ expect(screen.queryByText('python')).not.toBeInTheDocument();
186
+ });
187
+
188
+ it('toggles the line-number gutter', async () => {
189
+ const { container, rerender } = await renderEditor({
190
+ modelValue: 'a\nb',
191
+ showLineNumbers: true,
192
+ });
193
+
194
+ expect(container.querySelector('.cm-lineNumbers')).toBeInTheDocument();
195
+
196
+ await rerender({ modelValue: 'a\nb', showLineNumbers: false });
197
+ await waitFor(() =>
198
+ expect(container.querySelector('.cm-lineNumbers')).toBeNull(),
199
+ );
200
+ });
201
+
202
+ it('does not throw when unmounted before or after the editor is created', async () => {
203
+ const early = render(CkCodeEditor, { props: { modelValue: 'x' } });
204
+ expect(() => early.unmount()).not.toThrow();
205
+
206
+ const late = await renderEditor({ modelValue: 'y' });
207
+ expect(() => late.unmount()).not.toThrow();
208
+ });
209
+ });
210
+
211
+ describe('resolveLanguage', () => {
212
+ it('resolves by name, alias and extension, ignoring case', async () => {
213
+ await expect(resolveLanguage('TypeScript')).resolves.toBeTruthy();
214
+ await expect(resolveLanguage('ts')).resolves.toBeTruthy();
215
+ await expect(resolveLanguage('py')).resolves.toBeTruthy();
216
+ });
217
+
218
+ it('returns null for plain text and unknown languages', async () => {
219
+ await expect(resolveLanguage('text')).resolves.toBeNull();
220
+ await expect(resolveLanguage('')).resolves.toBeNull();
221
+ await expect(resolveLanguage('not-a-language')).resolves.toBeNull();
222
+ });
223
+ });