@iyulab/chat-components 0.7.1 → 0.9.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 (44) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/_virtual/{_@oxc-project_runtime@0.139.0 → _@oxc-project_runtime@0.142.0}/helpers/esm/decorate.js +1 -1
  3. package/dist/_virtual/{_@oxc-project_runtime@0.139.0 → _@oxc-project_runtime@0.142.0}/helpers/esm/decorateMetadata.js +1 -1
  4. package/dist/components/blocks/UCodeBlock.js +2 -2
  5. package/dist/components/blocks/UElementBlock.js +2 -2
  6. package/dist/components/blocks/UFileBlock.js +2 -2
  7. package/dist/components/blocks/UFileBlock.styles.js +1 -1
  8. package/dist/components/blocks/UMarkedBlock.js +3 -3
  9. package/dist/components/blocks/URefBlock.js +2 -2
  10. package/dist/components/blocks/UTableBlock.js +2 -2
  11. package/dist/components/blocks/UTextBlock.js +2 -2
  12. package/dist/components/message/UMessage.js +2 -2
  13. package/dist/components/message/UMessage.styles.js +1 -1
  14. package/dist/components/prompt/UPrompt.js +2 -2
  15. package/dist/components/references/URefCard.js +2 -2
  16. package/dist/components/references/URefCard.styles.js +3 -3
  17. package/dist/components/references/URefCardGroup.js +2 -2
  18. package/dist/components/references/URefTag.js +2 -2
  19. package/dist/components/references/URefTag.styles.js +4 -4
  20. package/dist/components-extra/UChartBlock.js +2 -2
  21. package/dist/components-extra/UChartBlock.styles.js +3 -3
  22. package/dist/components-extra/UImagesBlock.js +2 -2
  23. package/dist/components-extra/UMapBlock.js +2 -2
  24. package/dist/components-extra/UVideoBlock.js +2 -2
  25. package/dist/react/UCodeBlock.d.ts +4 -1
  26. package/dist/react/UElementBlock.d.ts +4 -1
  27. package/dist/react/UFileBlock.d.ts +4 -2
  28. package/dist/react/UImagesBlock.d.ts +4 -1
  29. package/dist/react/UMapBlock.d.ts +4 -1
  30. package/dist/react/UMarkedBlock.d.ts +4 -1
  31. package/dist/react/UMessage.d.ts +4 -1
  32. package/dist/react/UPrompt.d.ts +4 -1
  33. package/dist/react/URefBlock.d.ts +4 -1
  34. package/dist/react/URefCard.d.ts +4 -1
  35. package/dist/react/URefCardGroup.d.ts +4 -1
  36. package/dist/react/URefTag.d.ts +4 -1
  37. package/dist/react/UTableBlock.d.ts +4 -1
  38. package/dist/react/UTextBlock.d.ts +4 -1
  39. package/dist/react/UVideoBlock.d.ts +4 -1
  40. package/dist/types/BlockItem.d.ts +1 -1
  41. package/dist/types/Schema.d.ts +10 -3
  42. package/dist/utilities/sanitizers.d.ts +0 -4
  43. package/dist/utilities/sanitizers.js +22 -4
  44. package/package.json +10 -8
package/CHANGELOG.md CHANGED
@@ -1,5 +1,36 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.9.0] - 2026-08-01
4
+
5
+ ### Changed
6
+
7
+ - **강조·상태·텍스트 색이 역할 토큰을 경유한다**(팔레트 직접 참조 33 → 21).
8
+ 종전에는 팔레트(`--u-blue-600` 등)를 직접 읽어, 소비자가 브랜드를 다른 색으로 잡아도
9
+ 참조 카드의 링크 강조나 배지 색이 따라오지 않았다. 팔레트는 **이름이 곧 값의 약속**이라
10
+ 소비자가 그것을 덮으면 *진짜 그 색*이 필요한 곳까지 오염된다.
11
+
12
+ ⚠**남은 21곳은 의도적이다** — 표면 단계(`--u-neutral-{0,50,100,200,600}`)와 상태 표면
13
+ 틴트(`--u-{blue,green,red}-0`)에는 역할 층에 등가물이 없다. 상호작용 상태 이름
14
+ (`--u-bg-color-hover` 등)에 면 높이를 얹으면 의미가 어긋나므로 옮기지 않았다.
15
+ 대조 테스트가 예외 목록을 고정한다.
16
+
17
+ ### Fixed
18
+
19
+ - **소스 규약 테스트가 실행되지 않던 설정 문제 수정** — `vitest.config.ts` 의 `include` 가
20
+ `tests/browser/**` 뿐이라 그 밖의 테스트 파일은 **실패가 아니라 부재로** 조용히 빠졌다.
21
+ `unit` 프로젝트를 추가했다.
22
+
23
+ ## [0.8.0] - 2026-07-19
24
+
25
+ ### Fixed
26
+ - **채팅 메시지의 이모지가 조용히 분해되던 결함 수정** — `stripZeroWidth` 가 보이지 않는 문자를 제거하면서 ZWJ(U+200D)까지 지웠다. ZWJ 는 이모지 시퀀스를 결합하는 조판 문자이므로, `UMarkedBlock` 이 메시지 본문에 이 함수를 적용할 때 가족·직업 이모지가 낱개로 쪼개졌다(👨‍👩‍👧 → 👨👩👧). 이제 표시 경로는 ZWJ 를 보존하고, URL 위생 경로(`escapeHtmlHref`)는 종전대로 ZWJ 까지 제거해 `java<ZWJ>script:` 형태의 protocol 우회를 계속 차단한다. 두 경로의 요구가 반대이므로 문자 집합을 분리했다. 회귀 테스트 7건 추가.
27
+
28
+ ### Changed
29
+ - **이 패키지의 eslint 가 실제로 동작하기 시작했다.** `eslint.config.js` 의 두 결함 — (1) `files: ["src/**/*"]` 가 ESLint 9 에서 universal 패턴이라 `.ts` 를 opt-in 하지 못함, (2) 배열 프리셋(`tseslint.configs.recommended`)을 객체 스프레드해 프리셋이 무력화됨 — 을 수정했다. `build` 스크립트의 `eslint &&` 게이트는 매칭 파일이 0개라 항상 통과하고 있었다. 위 이모지 결함은 이 복구로 처음 드러났다.
30
+ - `npm run lint` / `npm run lint:fix` 스크립트 추가.
31
+ - **타입 정밀화(소비자 영향 가능)**: `BaseJsonSchema` 의 `default`/`enum`/`examples` 가 `any` → 새 `JsonValue` 타입으로, `FileBlockItem.data` 가 `any` → `unknown` 으로 좁혀졌다. 값을 그대로 사용하던 코드는 좁히기(narrowing)나 캐스팅이 필요할 수 있다.
32
+ - `UMarkedBlock`: 재할당 없는 `let` → `const`.
33
+
3
34
  ## [0.7.1] - 2026-07-12
4
35
 
5
36
  ### Fixed
@@ -1,4 +1,4 @@
1
- //#region \0@oxc-project+runtime@0.139.0/helpers/esm/decorate.js
1
+ //#region \0@oxc-project+runtime@0.142.0/helpers/esm/decorate.js
2
2
  function __decorate(decorators, target, key, desc) {
3
3
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
4
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -1,4 +1,4 @@
1
- //#region \0@oxc-project+runtime@0.139.0/helpers/esm/decorateMetadata.js
1
+ //#region \0@oxc-project+runtime@0.142.0/helpers/esm/decorateMetadata.js
2
2
  function __decorateMetadata(k, v) {
3
3
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
4
4
  }
@@ -1,7 +1,7 @@
1
1
  import "../../utilities/icons.js";
2
2
  import { styles } from "./UCodeBlock.styles.js";
3
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorateMetadata.js";
4
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorate.js";
3
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
4
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
5
5
  import { html } from "lit";
6
6
  import { customElement, property } from "lit/decorators.js";
7
7
  import { unsafeHTML } from "lit/directives/unsafe-html.js";
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
3
3
  import { UDataElement } from "../UDataElement.js";
4
4
  import { styles } from "./UElementBlock.styles.js";
5
5
  import { html, nothing } from "lit";
@@ -1,6 +1,6 @@
1
1
  import "../../utilities/icons.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
4
4
  import { styles } from "./UFileBlock.styles.js";
5
5
  import { html, nothing } from "lit";
6
6
  import { customElement, property, state } from "lit/decorators.js";
@@ -110,7 +110,7 @@ var styles = css`
110
110
  pointer-events: auto;
111
111
  }
112
112
  .remove-btn:hover {
113
- background-color: var(--u-red-600);
113
+ background-color: var(--u-danger-color, #E53935);
114
114
  }
115
115
 
116
116
  /* ─── 미리보기 오버레이 ─── */
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
3
3
  import "./UCodeBlock.js";
4
4
  import { escapeHtmlText, stripZeroWidth } from "../../utilities/sanitizers.js";
5
5
  import { HtmlBuilder } from "../../utilities/HtmlBuilder.js";
@@ -68,7 +68,7 @@ var UMarkedBlock = class UMarkedBlock extends UElement {
68
68
  this.placeholder.reset();
69
69
  value = stripZeroWidth(value);
70
70
  if (this.refs?.length) value = this.insertRefs(value, this.refs);
71
- let html = this.parser.parse(value, { async: false });
71
+ const html = this.parser.parse(value, { async: false });
72
72
  return unsafeHTML(this.placeholder.restore(html));
73
73
  }
74
74
  /**
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
3
3
  import "../references/URefCard.js";
4
4
  import { styles } from "./URefBlock.styles.js";
5
5
  import { html } from "lit";
@@ -1,6 +1,6 @@
1
1
  import "../../utilities/icons.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
4
4
  import { UDataElement } from "../UDataElement.js";
5
5
  import { styles } from "./UTableBlock.styles.js";
6
6
  import { html } from "lit";
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
3
3
  import { styles } from "./UTextBlock.styles.js";
4
4
  import { html } from "lit";
5
5
  import { customElement, property, query } from "lit/decorators.js";
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
3
3
  import { styles } from "./UMessage.styles.js";
4
4
  import { html } from "lit";
5
5
  import { customElement, property } from "lit/decorators.js";
@@ -41,7 +41,7 @@ var styles = css`
41
41
  .dot-loader {
42
42
  width: 24px;
43
43
  height: 24px;
44
- fill: var(--u-neutral-800, #6b7280);
44
+ fill: var(--u-txt-color, #212121);
45
45
  }
46
46
  .dot-loader circle {
47
47
  animation: bounce 1.05s infinite;
@@ -1,6 +1,6 @@
1
1
  import "../../utilities/icons.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
4
4
  import "../blocks/UFileBlock.js";
5
5
  import { styles } from "./UPrompt.styles.js";
6
6
  import { html } from "lit";
@@ -1,6 +1,6 @@
1
1
  import "../../utilities/icons.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
4
4
  import { UDataElement } from "../UDataElement.js";
5
5
  import { styles } from "./URefCard.styles.js";
6
6
  import { html } from "lit";
@@ -19,7 +19,7 @@ var styles = css`
19
19
  transition: all 0.2s ease;
20
20
  }
21
21
  a:hover {
22
- color: var(--u-blue-600);
22
+ color: var(--u-txt-color-hover, #1E88E5);
23
23
  background-color: var(--u-neutral-50);
24
24
  }
25
25
 
@@ -59,11 +59,11 @@ var styles = css`
59
59
  white-space: nowrap;
60
60
  }
61
61
  .badge[type="web"] {
62
- color: var(--u-blue-700);
62
+ color: var(--u-info-color-strong, #1976D2);
63
63
  background: var(--u-blue-0);
64
64
  }
65
65
  .badge[type="document"] {
66
- color: var(--u-green-700);
66
+ color: var(--u-success-color-strong, #388E3C);
67
67
  background: var(--u-green-0);
68
68
  }
69
69
  .badge u-icon {
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
3
3
  import { URefCard } from "./URefCard.js";
4
4
  import { styles } from "./URefCardGroup.styles.js";
5
5
  import { html } from "lit";
@@ -1,6 +1,6 @@
1
1
  import "../../utilities/icons.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
4
4
  import { styles } from "./URefTag.styles.js";
5
5
  import { html } from "lit";
6
6
  import { customElement, property } from "lit/decorators.js";
@@ -6,9 +6,9 @@ var styles = css`
6
6
  flex-direction: row;
7
7
  align-items: center;
8
8
  gap: 4px;
9
- color: var(--u-neutral-800);
9
+ color: var(--u-txt-color, #212121);
10
10
  font-size: 10px;
11
- border: 1px solid var(--u-neutral-300);
11
+ border: 1px solid var(--u-border-color, #E0E0E0);
12
12
  border-radius: 9999px;
13
13
  background-color: var(--u-neutral-100);
14
14
  padding: 2px 6px;
@@ -16,8 +16,8 @@ var styles = css`
16
16
  cursor: pointer;
17
17
  }
18
18
  :host(:hover) {
19
- color: var(--u-neutral-100);
20
- background-color: var(--u-neutral-900);
19
+ color: var(--u-txt-color-inverse, #FFFFFF);
20
+ background-color: var(--u-bg-color-inverse, #212121);
21
21
  }
22
22
 
23
23
  a {
@@ -1,6 +1,6 @@
1
1
  import "../utilities/icons.js";
2
- import __decorateMetadata from "../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
4
4
  import { styles } from "./UChartBlock.styles.js";
5
5
  import { html, nothing } from "lit";
6
6
  import { customElement, property, query, state } from "lit/decorators.js";
@@ -70,15 +70,15 @@ var styles = css`
70
70
  gap: 6px;
71
71
  padding: 6px 10px;
72
72
  background: var(--u-red-0);
73
- border: 1px solid var(--u-red-200);
73
+ border: 1px solid var(--u-danger-color-weakest, #EF9A9A);
74
74
  border-radius: 6px;
75
- color: var(--u-red-800);
75
+ color: var(--u-danger-color-strong, #D32F2F);
76
76
  font-size: 12px;
77
77
  pointer-events: none;
78
78
  }
79
79
 
80
80
  .error-overlay u-icon {
81
- color: var(--u-red-600);
81
+ color: var(--u-danger-color, #E53935);
82
82
  flex-shrink: 0;
83
83
  }
84
84
  `;
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
3
3
  import { styles } from "./UImagesBlock.styles.js";
4
4
  import { html, nothing } from "lit";
5
5
  import { customElement, property, state } from "lit/decorators.js";
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
3
3
  import { styles } from "./UMapBlock.styles.js";
4
4
  import { html, nothing } from "lit";
5
5
  import { customElement, property } from "lit/decorators.js";
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
3
3
  import { styles } from "./UVideoBlock.styles.js";
4
4
  import { html, nothing } from "lit";
5
5
  import { customElement, property } from "lit/decorators.js";
@@ -2,7 +2,10 @@ import React from 'react';
2
2
  import { UCodeBlock as UCodeBlockElement } from '../components/blocks/UCodeBlock';
3
3
 
4
4
  export declare const UCodeBlock: React.ForwardRefExoticComponent<
5
- Partial<UCodeBlockElement> & React.HTMLAttributes<UCodeBlockElement> & {
5
+ Omit<Partial<UCodeBlockElement>, keyof React.HTMLAttributes<UCodeBlockElement>>
6
+ & Omit<React.HTMLAttributes<UCodeBlockElement>, never>
7
+ & React.RefAttributes<UCodeBlockElement>
8
+ & {
6
9
  }
7
10
  >;
8
11
 
@@ -2,7 +2,10 @@ import React from 'react';
2
2
  import { UElementBlock as UElementBlockElement } from '../components/blocks/UElementBlock';
3
3
 
4
4
  export declare const UElementBlock: React.ForwardRefExoticComponent<
5
- Partial<UElementBlockElement> & React.HTMLAttributes<UElementBlockElement> & {
5
+ Omit<Partial<UElementBlockElement>, keyof React.HTMLAttributes<UElementBlockElement>>
6
+ & Omit<React.HTMLAttributes<UElementBlockElement>, never>
7
+ & React.RefAttributes<UElementBlockElement>
8
+ & {
6
9
  }
7
10
  >;
8
11
 
@@ -1,9 +1,11 @@
1
1
  import React from 'react';
2
2
  import { UFileBlock as UFileBlockElement } from '../components/blocks/UFileBlock';
3
- import { type RemoveEventDetail } from '../components/blocks/@iyulab/components/dist/events/RemoveEvent';
4
3
 
5
4
  export declare const UFileBlock: React.ForwardRefExoticComponent<
6
- Partial<UFileBlockElement> & React.HTMLAttributes<UFileBlockElement> & {
5
+ Omit<Partial<UFileBlockElement>, keyof React.HTMLAttributes<UFileBlockElement>>
6
+ & Omit<React.HTMLAttributes<UFileBlockElement>, 'onRemove'>
7
+ & React.RefAttributes<UFileBlockElement>
8
+ & {
7
9
  onRemove?: (event: CustomEvent<RemoveEventDetail>) => void;
8
10
  }
9
11
  >;
@@ -2,7 +2,10 @@ import React from 'react';
2
2
  import { UImagesBlock as UImagesBlockElement } from '../components-extra/UImagesBlock';
3
3
 
4
4
  export declare const UImagesBlock: React.ForwardRefExoticComponent<
5
- Partial<UImagesBlockElement> & React.HTMLAttributes<UImagesBlockElement> & {
5
+ Omit<Partial<UImagesBlockElement>, keyof React.HTMLAttributes<UImagesBlockElement>>
6
+ & Omit<React.HTMLAttributes<UImagesBlockElement>, never>
7
+ & React.RefAttributes<UImagesBlockElement>
8
+ & {
6
9
  }
7
10
  >;
8
11
 
@@ -2,7 +2,10 @@ import React from 'react';
2
2
  import { UMapBlock as UMapBlockElement } from '../components-extra/UMapBlock';
3
3
 
4
4
  export declare const UMapBlock: React.ForwardRefExoticComponent<
5
- Partial<UMapBlockElement> & React.HTMLAttributes<UMapBlockElement> & {
5
+ Omit<Partial<UMapBlockElement>, keyof React.HTMLAttributes<UMapBlockElement>>
6
+ & Omit<React.HTMLAttributes<UMapBlockElement>, never>
7
+ & React.RefAttributes<UMapBlockElement>
8
+ & {
6
9
  }
7
10
  >;
8
11
 
@@ -2,7 +2,10 @@ import React from 'react';
2
2
  import { UMarkedBlock as UMarkedBlockElement } from '../components/blocks/UMarkedBlock';
3
3
 
4
4
  export declare const UMarkedBlock: React.ForwardRefExoticComponent<
5
- Partial<UMarkedBlockElement> & React.HTMLAttributes<UMarkedBlockElement> & {
5
+ Omit<Partial<UMarkedBlockElement>, keyof React.HTMLAttributes<UMarkedBlockElement>>
6
+ & Omit<React.HTMLAttributes<UMarkedBlockElement>, never>
7
+ & React.RefAttributes<UMarkedBlockElement>
8
+ & {
6
9
  }
7
10
  >;
8
11
 
@@ -2,7 +2,10 @@ import React from 'react';
2
2
  import { UMessage as UMessageElement } from '../components/message/UMessage';
3
3
 
4
4
  export declare const UMessage: React.ForwardRefExoticComponent<
5
- Partial<UMessageElement> & React.HTMLAttributes<UMessageElement> & {
5
+ Omit<Partial<UMessageElement>, keyof React.HTMLAttributes<UMessageElement>>
6
+ & Omit<React.HTMLAttributes<UMessageElement>, never>
7
+ & React.RefAttributes<UMessageElement>
8
+ & {
6
9
  }
7
10
  >;
8
11
 
@@ -4,7 +4,10 @@ import { type StopEventDetail } from '../events/StopEvent';
4
4
  import { type SendEventDetail } from '../events/SendEvent';
5
5
 
6
6
  export declare const UPrompt: React.ForwardRefExoticComponent<
7
- Partial<UPromptElement> & React.HTMLAttributes<UPromptElement> & {
7
+ Omit<Partial<UPromptElement>, keyof React.HTMLAttributes<UPromptElement>>
8
+ & Omit<React.HTMLAttributes<UPromptElement>, 'onStop' | 'onSend'>
9
+ & React.RefAttributes<UPromptElement>
10
+ & {
8
11
  onStop?: (event: CustomEvent<StopEventDetail>) => void;
9
12
  onSend?: (event: CustomEvent<SendEventDetail>) => void;
10
13
  }
@@ -2,7 +2,10 @@ import React from 'react';
2
2
  import { URefBlock as URefBlockElement } from '../components/blocks/URefBlock';
3
3
 
4
4
  export declare const URefBlock: React.ForwardRefExoticComponent<
5
- Partial<URefBlockElement> & React.HTMLAttributes<URefBlockElement> & {
5
+ Omit<Partial<URefBlockElement>, keyof React.HTMLAttributes<URefBlockElement>>
6
+ & Omit<React.HTMLAttributes<URefBlockElement>, never>
7
+ & React.RefAttributes<URefBlockElement>
8
+ & {
6
9
  }
7
10
  >;
8
11
 
@@ -2,7 +2,10 @@ import React from 'react';
2
2
  import { URefCard as URefCardElement } from '../components/references/URefCard';
3
3
 
4
4
  export declare const URefCard: React.ForwardRefExoticComponent<
5
- Partial<URefCardElement> & React.HTMLAttributes<URefCardElement> & {
5
+ Omit<Partial<URefCardElement>, keyof React.HTMLAttributes<URefCardElement>>
6
+ & Omit<React.HTMLAttributes<URefCardElement>, never>
7
+ & React.RefAttributes<URefCardElement>
8
+ & {
6
9
  }
7
10
  >;
8
11
 
@@ -2,7 +2,10 @@ import React from 'react';
2
2
  import { URefCardGroup as URefCardGroupElement } from '../components/references/URefCardGroup';
3
3
 
4
4
  export declare const URefCardGroup: React.ForwardRefExoticComponent<
5
- Partial<URefCardGroupElement> & React.HTMLAttributes<URefCardGroupElement> & {
5
+ Omit<Partial<URefCardGroupElement>, keyof React.HTMLAttributes<URefCardGroupElement>>
6
+ & Omit<React.HTMLAttributes<URefCardGroupElement>, never>
7
+ & React.RefAttributes<URefCardGroupElement>
8
+ & {
6
9
  }
7
10
  >;
8
11
 
@@ -2,7 +2,10 @@ import React from 'react';
2
2
  import { URefTag as URefTagElement } from '../components/references/URefTag';
3
3
 
4
4
  export declare const URefTag: React.ForwardRefExoticComponent<
5
- Partial<URefTagElement> & React.HTMLAttributes<URefTagElement> & {
5
+ Omit<Partial<URefTagElement>, keyof React.HTMLAttributes<URefTagElement>>
6
+ & Omit<React.HTMLAttributes<URefTagElement>, never>
7
+ & React.RefAttributes<URefTagElement>
8
+ & {
6
9
  }
7
10
  >;
8
11
 
@@ -2,7 +2,10 @@ import React from 'react';
2
2
  import { UTableBlock as UTableBlockElement } from '../components/blocks/UTableBlock';
3
3
 
4
4
  export declare const UTableBlock: React.ForwardRefExoticComponent<
5
- Partial<UTableBlockElement> & React.HTMLAttributes<UTableBlockElement> & {
5
+ Omit<Partial<UTableBlockElement>, keyof React.HTMLAttributes<UTableBlockElement>>
6
+ & Omit<React.HTMLAttributes<UTableBlockElement>, never>
7
+ & React.RefAttributes<UTableBlockElement>
8
+ & {
6
9
  }
7
10
  >;
8
11
 
@@ -2,7 +2,10 @@ import React from 'react';
2
2
  import { UTextBlock as UTextBlockElement } from '../components/blocks/UTextBlock';
3
3
 
4
4
  export declare const UTextBlock: React.ForwardRefExoticComponent<
5
- Partial<UTextBlockElement> & React.HTMLAttributes<UTextBlockElement> & {
5
+ Omit<Partial<UTextBlockElement>, keyof React.HTMLAttributes<UTextBlockElement>>
6
+ & Omit<React.HTMLAttributes<UTextBlockElement>, 'onInput'>
7
+ & React.RefAttributes<UTextBlockElement>
8
+ & {
6
9
  onInput?: (event: CustomEvent) => void;
7
10
  }
8
11
  >;
@@ -2,7 +2,10 @@ import React from 'react';
2
2
  import { UVideoBlock as UVideoBlockElement } from '../components-extra/UVideoBlock';
3
3
 
4
4
  export declare const UVideoBlock: React.ForwardRefExoticComponent<
5
- Partial<UVideoBlockElement> & React.HTMLAttributes<UVideoBlockElement> & {
5
+ Omit<Partial<UVideoBlockElement>, keyof React.HTMLAttributes<UVideoBlockElement>>
6
+ & Omit<React.HTMLAttributes<UVideoBlockElement>, never>
7
+ & React.RefAttributes<UVideoBlockElement>
8
+ & {
6
9
  }
7
10
  >;
8
11
 
@@ -25,7 +25,7 @@ export interface FileBlockItem {
25
25
  /** 다운로드 URL */
26
26
  url?: string;
27
27
  /** 실제 파일 데이터 (선택적, 필요에 따라 사용) */
28
- data?: any;
28
+ data?: unknown;
29
29
  }
30
30
  /** 출처 정보 */
31
31
  export interface ReferenceBlockItem {
@@ -11,15 +11,22 @@
11
11
  * - 조건부 스키마 if/then/else (위젯 속성에 불필요)
12
12
  * - 고급 object/array 검증들 (단순한 구조만으로 충분)
13
13
  */
14
+ /**
15
+ * JSON 으로 표현 가능한 임의의 값.
16
+ * 스키마의 default/enum/examples 는 임의 JSON 을 담으므로 `any` 대신 이 타입을 쓴다.
17
+ */
18
+ export type JsonValue = string | number | boolean | null | JsonValue[] | {
19
+ [key: string]: JsonValue;
20
+ };
14
21
  export interface BaseJsonSchema {
15
22
  /** 속성에 대한 설명 (LLM용) */
16
23
  description?: string;
17
24
  /** 기본값 */
18
- default?: any;
25
+ default?: JsonValue;
19
26
  /** 허용 가능한 값들 (제한된 선택지) */
20
- enum?: any[];
27
+ enum?: JsonValue[];
21
28
  /** 예시 값들 (LLM이 이해하기 쉽도록) */
22
- examples?: any[];
29
+ examples?: JsonValue[];
23
30
  }
24
31
  export interface BooleanJsonSchema extends BaseJsonSchema {
25
32
  type: 'boolean';
@@ -7,10 +7,6 @@
7
7
  * - escapeHtmlAttr : HTML attribute 값에 삽입할 때
8
8
  * - escapeHtmlHref : href/src 같은 URL attribute에 삽입할 때
9
9
  */
10
- /**
11
- * Zero Width Space / LTR / RTL mark / BOM 등
12
- * 화면에 표시되지 않는 유니코드 문자를 제거합니다.
13
- */
14
10
  export declare function stripZeroWidth(value: string): string;
15
11
  /**
16
12
  * HTML 텍스트 노드(context)에 삽입할 문자열을 escape합니다.
@@ -12,9 +12,24 @@
12
12
  * Zero Width Space / LTR / RTL mark / BOM 등
13
13
  * 화면에 표시되지 않는 유니코드 문자를 제거합니다.
14
14
  */
15
+ /**
16
+ * \uD45C\uC2DC \uACBD\uB85C\uC5D0\uC11C \uC81C\uAC70\uD560 zero-width \uBB38\uC790.
17
+ *
18
+ * ZWJ(U+200D)\uB294 **\uC758\uB3C4\uC801\uC73C\uB85C \uC81C\uC678**\uD55C\uB2E4. ZWJ \uB294 \uC774\uBAA8\uC9C0 \uC2DC\uD000\uC2A4\uB97C \uACB0\uD569\uD558\uB294
19
+ * \uC870\uD310 \uBB38\uC790\uB77C, \uC81C\uAC70\uD558\uBA74 \uC0AC\uC6A9\uC790\uAC00 \uC785\uB825\uD55C \uAC00\uC871\u00B7\uC9C1\uC5C5 \uC774\uBAA8\uC9C0\uAC00 \uB0B1\uAC1C\uB85C \uBD84\uD574\uB41C\uB2E4
20
+ * (\uD83D\uDC68\u200D\uD83D\uDC69\u200D\uD83D\uDC67 \u2192 \uD83D\uDC68\uD83D\uDC69\uD83D\uDC67). \uD45C\uC2DC \uACBD\uB85C\uC5D0\uC11C\uB294 \uCF58\uD150\uCE20 \uBCF4\uC874\uC774 \uC6B0\uC120\uC774\uB2E4.
21
+ */
22
+ var ZERO_WIDTH_DISPLAY_REGEX = /[\u200B\u200C\u200E\u200F\uFEFF]/gu;
23
+ /**
24
+ * URL \uC704\uC0DD \uACBD\uB85C\uC5D0\uC11C \uC81C\uAC70\uD560 zero-width \uBB38\uC790.
25
+ *
26
+ * URL \uC548\uC5D0\uC11C\uB294 zero-width \uBB38\uC790\uC5D0 \uC815\uB2F9\uD55C \uC870\uD310 \uC758\uBBF8\uAC00 \uC5C6\uACE0 protocol \uC6B0\uD68C
27
+ * \uB09C\uB3C5\uD654\uC5D0 \uC4F0\uC77C \uC218 \uC788\uC73C\uBBC0\uB85C ZWJ \uAE4C\uC9C0 \uC804\uBD80 \uC81C\uAC70\uD55C\uB2E4 \u2014 \uACB0\uD569 \uC2DC\uD000\uC2A4 \uD574\uCCB4\uAC00
28
+ * \uC5EC\uAE30\uC11C\uB294 \uC758\uB3C4\uB41C \uB3D9\uC791\uC774\uBBC0\uB85C \uADDC\uCE59\uC744 \uBA85\uC2DC\uC801\uC73C\uB85C \uD574\uC81C\uD55C\uB2E4.
29
+ */
30
+ var ZERO_WIDTH_STRICT_REGEX = /[\u200B\u200C\u200D\u200E\u200F\uFEFF]/gu;
15
31
  function stripZeroWidth(value) {
16
- const ZERO_WIDTH_REGEX = /[\u200B\u200C\u200D\u200E\u200F\uFEFF]/g;
17
- return ZERO_WIDTH_REGEX.test(value) ? value.replace(ZERO_WIDTH_REGEX, "") : value;
32
+ return ZERO_WIDTH_DISPLAY_REGEX.test(value) ? value.replace(ZERO_WIDTH_DISPLAY_REGEX, "") : value;
18
33
  }
19
34
  /** HTML text context escape 대상 문자 */
20
35
  var HTML_TEXT_ESCAPE_REGEX = /[&<>"']/g;
@@ -53,7 +68,10 @@ var HTML_ATTR_ESCAPE_MAP = {
53
68
  function escapeHtmlAttr(value) {
54
69
  return HTML_ATTR_ESCAPE_REGEX.test(value) ? value.replace(HTML_ATTR_ESCAPE_REGEX, (ch) => HTML_ATTR_ESCAPE_MAP[ch]) : value;
55
70
  }
56
- /** protocol 우회 공격 방지를 위한 공백/제어문자 제거 */
71
+ /**
72
+ * protocol 우회 공격 방지를 위한 공백/제어문자 제거.
73
+ * 제어문자 매칭이 이 상수의 목적 자체이므로 no-control-regex 를 의도적으로 해제한다.
74
+ */
57
75
  var HREF_STRIP_CHARS_REGEX = /[\u0000-\u001F\u007F\s]+/g;
58
76
  /** href/src에서 차단해야 하는 위험 protocol */
59
77
  var HREF_UNSAFE_PROTOCOL_REGEX = /^(?:javascript|data|vbscript):/i;
@@ -64,7 +82,7 @@ var HREF_UNSAFE_PROTOCOL_REGEX = /^(?:javascript|data|vbscript):/i;
64
82
  * <a href="{value}">
65
83
  */
66
84
  function escapeHtmlHref(value) {
67
- let normalized = stripZeroWidth(value).trim();
85
+ let normalized = value.replace(ZERO_WIDTH_STRICT_REGEX, "").trim();
68
86
  if (HREF_STRIP_CHARS_REGEX.test(normalized)) normalized = normalized.replace(HREF_STRIP_CHARS_REGEX, "");
69
87
  normalized = normalized.replace(/\\/g, "/");
70
88
  if (normalized.startsWith("//")) return "#";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@iyulab/chat-components",
3
3
  "description": "llm chat components for building chat interfaces",
4
- "version": "0.7.1",
4
+ "version": "0.9.0",
5
5
  "author": "iyulab",
6
6
  "license": "MIT",
7
7
  "keywords": [
@@ -40,14 +40,16 @@
40
40
  "start": "vite",
41
41
  "build": "eslint && vite build",
42
42
  "test": "vitest run",
43
- "test:watch": "vitest"
43
+ "test:watch": "vitest",
44
+ "lint": "eslint src/",
45
+ "lint:fix": "eslint src/ --fix"
44
46
  },
45
47
  "dependencies": {
46
- "@iyulab/components": "^1.5.0",
48
+ "@iyulab/components": "^1.8.0",
47
49
  "highlight.js": "^11.11.1",
48
50
  "katex": "^0.17.0",
49
51
  "lit": "^3.3.3",
50
- "marked": "^18.0.5",
52
+ "marked": "^18.0.6",
51
53
  "marked-katex-extension": "^5.1.10"
52
54
  },
53
55
  "peerDependencies": {
@@ -68,17 +70,17 @@
68
70
  },
69
71
  "devDependencies": {
70
72
  "@eslint/js": "^9.39.4",
71
- "@types/node": "^26.1.0",
73
+ "@types/node": "^26.1.1",
72
74
  "@vitest/browser-playwright": "^4.1.10",
73
75
  "chart.js": "^4.5.1",
74
76
  "eslint": "^9.39.4",
75
77
  "eslint-plugin-lit": "^2.3.1",
76
78
  "glob": "^13.0.6",
77
79
  "globals": "^17.7.0",
78
- "openai": "^6.45.0",
80
+ "openai": "^6.47.0",
79
81
  "typescript": "^5.9.3",
80
- "typescript-eslint": "^8.63.0",
81
- "vite": "^8.1.3",
82
+ "typescript-eslint": "^8.64.0",
83
+ "vite": "^8.1.4",
82
84
  "vite-plugin-dts": "^5.0.3",
83
85
  "vitest": "^4.1.10"
84
86
  }