@iyulab/chat-components 0.12.0 → 0.12.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.12.2] - 2026-09-20
4
+
5
+ ### Fixed
6
+
7
+ - **A reference card's favicon announced itself as "favicon".** The image sits next to the title it
8
+ belongs to and carries no information of its own, so a screen reader repeated an English word for
9
+ every card. It is now marked decorative and skipped.
10
+
11
+ ## [0.12.1] - 2026-09-15
12
+
13
+ ### Fixed
14
+
15
+ - **`u-table-block` columns could not be sorted from the keyboard.** The sortable header cell only
16
+ listened for clicks, took no focus and exposed no sort state. Each header now holds a button that
17
+ fills the cell (the pointer target is unchanged), Enter or Space toggles the sort, and the header
18
+ carries `aria-sort`. The button is exposed as the `sort-button` part.
19
+ - **`u-images-block` thumbnails and `u-file-block` previews could not be opened from the
20
+ keyboard.** Both were click-only `div`s. A thumbnail is now a button (named by the image's `alt`,
21
+ or "Open image N"); a previewable file card's body is a button named "Preview <name>", exposed as
22
+ the `card-main` part, with the remove button kept outside it. Cards that cannot be previewed no
23
+ longer show a pointer cursor or hover state. New locale keys: `openImage`, `previewFile`.
24
+
3
25
  ## [0.12.0] - 2026-09-10
4
26
 
5
27
  ### Changed
package/README.md CHANGED
@@ -112,6 +112,22 @@ markedBlock.value = llmResponse;
112
112
 
113
113
  ---
114
114
 
115
+ ## Accessibility
116
+
117
+ The baseline is **WCAG 2.2**. The table lists what this package **measures in tests** — it is not a
118
+ conformance claim for the success criteria it does not list.
119
+
120
+ | Success criterion | Guarantee | Measured by |
121
+ |---|---|---|
122
+ | SC 2.5.8 Target Size (Minimum) | Every pointer target inside the registered blocks (`.` and `./extra` entries) is at least 24×24 CSS px or meets the spacing exception (24px between centers), and is actually hit at that position | `tests/browser/target-size.browser.test.ts` (real Chromium) |
123
+ | SC 2.1.1 Keyboard (pointer-cursor check) | Nothing a block renders shows a pointer cursor without being an interactive element — table sort headers, image thumbnails and previewable file cards are buttons | `tests/browser/target-size.browser.test.ts` · `tests/browser/table-block-sort-keyboard.browser.test.ts` |
124
+
125
+ `u-ref-tag` uses the SC's **inline exception** — it is a citation badge set inside a sentence, where
126
+ growing it to 24px would push the line height. It is still measured and reported.
127
+
128
+ Color contrast comes from the `@iyulab/components` tokens this package renders with — see that
129
+ package's Accessibility section.
130
+
115
131
  ## Documentation
116
132
 
117
133
  | File | Description |
@@ -1,4 +1,4 @@
1
- //#region \0@oxc-project+runtime@0.149.0/helpers/esm/decorate.js
1
+ //#region \0@oxc-project+runtime@0.150.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.149.0/helpers/esm/decorateMetadata.js
1
+ //#region \0@oxc-project+runtime@0.150.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,6 +1,6 @@
1
1
  import { styles } from "./UCodeBlock.styles.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorate.js";
4
4
  import { html } from "lit";
5
5
  import { customElement, property } from "lit/decorators.js";
6
6
  import { unsafeHTML } from "lit/directives/unsafe-html.js";
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.150.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";
@@ -25,6 +25,8 @@ export declare class UFileBlock extends UElement {
25
25
  /** 클릭 시 오버레이로 미리볼 수 있는 타입인지 여부 */
26
26
  private get previewable();
27
27
  render(): import('lit-html').TemplateResult<1>;
28
+ /** 썸네일과 이름·메타 — 버튼 안에 들어가므로 구문 콘텐츠(`span`)로만 짓는다. */
29
+ private renderCardMain;
28
30
  private handleCardClick;
29
31
  private closePreview;
30
32
  private handleKeyDown;
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorate.js";
3
3
  import { messages } from "../../utilities/messages.js";
4
4
  import { styles } from "./UFileBlock.styles.js";
5
5
  import { html, nothing } from "lit";
@@ -52,22 +52,10 @@ var UFileBlock = class UFileBlock extends UElement {
52
52
  }
53
53
  render() {
54
54
  return html`
55
- <div class="card" @click=${this.handleCardClick}>
56
- <div class="thumbnail">
57
- ${this.isImage ? html`<img src=${this.url} alt=${this.name || ""} loading="lazy" />` : this.isVideo ? html`<video src="${this.url}#t=0.1" preload="metadata" muted playsinline></video>` : html`<u-icon lib="internal-chat" name=${this.resolveIcon(this.type)}></u-icon>`}
58
- </div>
59
-
60
- <div class="info">
61
- <div class="name">${this.name}</div>
62
- <div class="meta">
63
- <span class="type">
64
- ${this.resolveExt(this.name, this.type)}
65
- </span>
66
- <span class="size">
67
- ${this.formatSize(this.size || 0)}
68
- </span>
69
- </div>
70
- </div>
55
+ <div class="card" ?previewable=${this.previewable}>
56
+ ${this.previewable ? html`<button type="button" class="card-main" part="card-main"
57
+ aria-label=${messages.text("previewFile", { name: this.name || "" })}
58
+ @click=${this.handleCardClick}>${this.renderCardMain()}</button>` : html`<span class="card-main">${this.renderCardMain()}</span>`}
71
59
 
72
60
  <u-button class="remove-btn"
73
61
  ?hidden=${!this.removable}
@@ -91,6 +79,21 @@ var UFileBlock = class UFileBlock extends UElement {
91
79
  </div>
92
80
  </div>
93
81
  ` : nothing}
82
+ `;
83
+ }
84
+ /** 썸네일과 이름·메타 — 버튼 안에 들어가므로 구문 콘텐츠(`span`)로만 짓는다. */
85
+ renderCardMain() {
86
+ return html`
87
+ <span class="thumbnail">
88
+ ${this.isImage ? html`<img src=${this.url} alt=${this.name || ""} loading="lazy" />` : this.isVideo ? html`<video src="${this.url}#t=0.1" preload="metadata" muted playsinline></video>` : html`<u-icon lib="internal-chat" name=${this.resolveIcon(this.type)}></u-icon>`}
89
+ </span>
90
+ <span class="info">
91
+ <span class="name">${this.name}</span>
92
+ <span class="meta">
93
+ <span class="type">${this.resolveExt(this.name, this.type)}</span>
94
+ <span class="size">${this.formatSize(this.size || 0)}</span>
95
+ </span>
96
+ </span>
94
97
  `;
95
98
  }
96
99
  /** MIME 타입 → Tabler Icon 이름 */
@@ -15,20 +15,39 @@ var styles = css`
15
15
  flex-direction: row;
16
16
  align-items: center;
17
17
  min-width: 0;
18
- gap: 10px;
19
- padding: 8px 10px;
20
18
  border: 1px solid var(--u-border-color);
21
19
  border-radius: 8px;
22
20
  background-color: var(--u-neutral-50);
23
21
  overflow: visible;
24
- cursor: pointer;
25
22
  transition: background-color 0.12s ease, border-color 0.12s ease;
26
23
  }
27
- .card:hover {
24
+ .card[previewable]:hover {
28
25
  background-color: var(--u-neutral-100);
29
26
  border-color: var(--u-border-color-strong);
30
27
  }
31
28
 
29
+ /* 카드 본문 — 미리볼 수 있으면 버튼, 아니면 span. 둘 다 같은 배치를 갖는다.
30
+ 카드의 여백을 본문이 가져, 누를 면이 종전(카드 전체)과 같다 — 제거 버튼은 절대 배치라 흐름에 없다. */
31
+ .card-main {
32
+ all: unset;
33
+ box-sizing: border-box;
34
+ display: flex;
35
+ flex-direction: row;
36
+ align-items: center;
37
+ flex: 1;
38
+ min-width: 0;
39
+ gap: 10px;
40
+ padding: 8px 10px;
41
+ border-radius: 8px;
42
+ }
43
+ button.card-main {
44
+ cursor: pointer;
45
+ }
46
+ button.card-main:focus-visible {
47
+ outline: 2px solid var(--u-primary-color, #1976D2);
48
+ outline-offset: 1px;
49
+ }
50
+
32
51
  .thumbnail {
33
52
  position: relative;
34
53
  flex-shrink: 0;
@@ -62,6 +81,7 @@ var styles = css`
62
81
  }
63
82
 
64
83
  .name {
84
+ display: block;
65
85
  font-size: 13px;
66
86
  font-weight: 500;
67
87
  color: var(--u-txt-color-strong);
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorate.js";
3
3
  import "./UCodeBlock.js";
4
4
  import { escapeHtmlAttr, escapeHtmlHref, escapeHtmlText, stripZeroWidth } from "../../utilities/sanitizers.js";
5
5
  import { HtmlBuilder } from "../../utilities/HtmlBuilder.js";
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.150.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,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorate.js";
3
3
  import { UDataElement } from "../UDataElement.js";
4
4
  import { messages } from "../../utilities/messages.js";
5
5
  import { styles } from "./UTableBlock.styles.js";
@@ -69,14 +69,18 @@ var UTableBlock = class UTableBlock extends UDataElement {
69
69
  <th
70
70
  ?active=${isActive}
71
71
  align=${h.align ?? "left"}
72
- @click=${() => this.handleSortColumn(i)}
72
+ aria-sort=${isActive ? this.sort.dir === "asc" ? "ascending" : "descending" : "none"}
73
73
  >
74
- ${unsafeHTML(h.text)}
75
- <u-icon
76
- class="sort-icon"
77
- lib="internal-chat"
78
- name=${isActive ? this.sort.dir === "asc" ? "sort-ascending-letters" : "sort-descending-letters" : "arrows-sort"}
79
- ></u-icon>
74
+ <!-- 정렬은 머리 칸 전체를 채우는 버튼이다 — 클릭만 받는 th 는 키보드로 닿지 않았다. -->
75
+ <button type="button" class="sort-button" part="sort-button"
76
+ @click=${() => this.handleSortColumn(i)}>
77
+ ${unsafeHTML(h.text)}
78
+ <u-icon
79
+ class="sort-icon"
80
+ lib="internal-chat"
81
+ name=${isActive ? this.sort.dir === "asc" ? "sort-ascending-letters" : "sort-descending-letters" : "arrows-sort"}
82
+ ></u-icon>
83
+ </button>
80
84
  </th>
81
85
  `;
82
86
  })}
@@ -83,14 +83,32 @@ var styles = css`
83
83
  }
84
84
 
85
85
  th {
86
- padding: 8px 12px;
86
+ padding: 0;
87
87
  font-weight: 600;
88
88
  text-align: left;
89
89
  border-bottom: 2px solid var(--u-border-color);
90
90
  white-space: nowrap;
91
- cursor: pointer;
92
91
  user-select: none;
93
92
  }
93
+
94
+ /* 칸 전체가 누를 면이다 — 여백을 th 가 아니라 버튼이 갖는다. */
95
+ .sort-button {
96
+ all: unset;
97
+ box-sizing: border-box;
98
+ display: flex;
99
+ align-items: center;
100
+ inline-size: 100%;
101
+ padding: 8px 12px;
102
+ font: inherit;
103
+ color: inherit;
104
+ cursor: pointer;
105
+ }
106
+ th[align="center"] .sort-button { justify-content: center; }
107
+ th[align="right"] .sort-button { justify-content: flex-end; }
108
+ .sort-button:focus-visible {
109
+ outline: 2px solid var(--u-primary-color, #1976D2);
110
+ outline-offset: -2px;
111
+ }
94
112
  th:hover {
95
113
  background-color: var(--u-neutral-200);
96
114
  }
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.150.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.149.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.150.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";
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorate.js";
3
3
  import { messages } from "../../utilities/messages.js";
4
4
  import "../blocks/UFileBlock.js";
5
5
  import { styles } from "./UPrompt.styles.js";
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorate.js";
3
3
  import { UDataElement } from "../UDataElement.js";
4
4
  import { styles } from "./URefCard.styles.js";
5
5
  import { html } from "lit";
@@ -24,7 +24,8 @@ var URefCard = class URefCard extends UDataElement {
24
24
  <div class="header">
25
25
  <img class="favicon"
26
26
  src="${this.getFaviconUrl(this.url)}"
27
- alt="favicon"
27
+ alt=""
28
+ aria-hidden="true"
28
29
  />
29
30
  <div class="title">
30
31
  ${this.title || this.getDomainName(this.url)}
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorate.js";
3
3
  import { messages } from "../../utilities/messages.js";
4
4
  import { URefCard } from "./URefCard.js";
5
5
  import { styles } from "./URefCardGroup.styles.js";
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorate.js";
3
3
  import { styles } from "./URefTag.styles.js";
4
4
  import { html } from "lit";
5
5
  import { customElement, property } from "lit/decorators.js";
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorate.js";
3
3
  import { messages } from "../utilities/messages.js";
4
4
  import { styles } from "./UChartBlock.styles.js";
5
5
  import { html, nothing } from "lit";
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorate.js";
3
3
  import { messages } from "../utilities/messages.js";
4
4
  import { styles } from "./UImagesBlock.styles.js";
5
5
  import { html, nothing } from "lit";
@@ -65,18 +65,21 @@ var UImagesBlock = class UImagesBlock extends UElement {
65
65
  .gap=${8}
66
66
  >
67
67
  ${repeat(this.items, (item, i) => html`
68
- <div class="slide"
68
+ <!-- 썸네일은 라이트박스를 여는 버튼이다 — 클릭만 받는 div 는 키보드로 열 수 없었다.
69
+ 대체 텍스트가 있으면 그것이 이름이고, 없으면 «이미지 N 열기» 로 이름을 준다. -->
70
+ <button type="button" class="slide"
71
+ aria-label=${item.alt ? nothing : messages.text("openImage", { index: i + 1 })}
69
72
  @click=${() => this.open(i)}>
70
73
  <img
71
74
  src=${item.src}
72
75
  alt=${item.alt || ""}
73
76
  loading="lazy"
74
77
  />
75
- <div class="caption"
78
+ <span class="caption"
76
79
  ?hidden=${!item.caption}>
77
80
  ${item.caption}
78
- </div>
79
- </div>
81
+ </span>
82
+ </button>
80
83
  `)}
81
84
  </u-carousel>
82
85
 
@@ -9,11 +9,24 @@ var styles = css`
9
9
 
10
10
  .slide {
11
11
  position: relative;
12
+ display: block;
13
+ inline-size: 100%;
14
+ margin: 0;
15
+ padding: 0;
16
+ border: 0;
17
+ background: none;
18
+ font: inherit;
19
+ color: inherit;
20
+ text-align: start;
12
21
  border-radius: 10px;
13
22
  overflow: hidden;
14
23
  cursor: pointer;
15
24
  aspect-ratio: 4 / 3;
16
25
  }
26
+ .slide:focus-visible {
27
+ outline: 2px solid var(--u-primary-color, #1976D2);
28
+ outline-offset: 2px;
29
+ }
17
30
  .slide img {
18
31
  display: block;
19
32
  width: 100%;
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../_virtual/_@oxc-project_runtime@0.150.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.149.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../_virtual/_@oxc-project_runtime@0.150.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../_virtual/_@oxc-project_runtime@0.150.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";
@@ -5,5 +5,5 @@
5
5
  * 이 리포가 채택한 표준이 *"영어 기본 **+ 레지스트리**"* 이기 때문이다 — 영어 리터럴만으로는
6
6
  * 한국어 앱이 그 문구를 되돌릴 방법이 없다. 다음 문자열은 여기로 온다.
7
7
  */
8
- export type ChatMessageKey = 'canvasUnavailable' | 'previousReference' | 'nextReference' | 'closePreview' | 'closeLightbox' | 'previousImage' | 'nextImage' | 'sendMessage' | 'stopGenerating' | 'fullScreen' | 'remove' | 'pngDownload' | 'jsonDownload' | 'search' | 'rowCount' | 'excelDownload' | 'csvDownload';
8
+ export type ChatMessageKey = 'canvasUnavailable' | 'previousReference' | 'nextReference' | 'closePreview' | 'closeLightbox' | 'previousImage' | 'nextImage' | 'sendMessage' | 'stopGenerating' | 'fullScreen' | 'remove' | 'pngDownload' | 'jsonDownload' | 'search' | 'rowCount' | 'excelDownload' | 'csvDownload' | 'openImage' | 'previewFile';
9
9
  export declare const messages: import('@iyulab/components/dist/utilities/Locale.js').LocaleNamespace<ChatMessageKey>;
@@ -18,7 +18,9 @@ messages.register("en", {
18
18
  search: "Search...",
19
19
  rowCount: "{shown} / {total} Rows",
20
20
  excelDownload: "Excel Download",
21
- csvDownload: "CSV Download"
21
+ csvDownload: "CSV Download",
22
+ openImage: "Open image {index}",
23
+ previewFile: "Preview {name}"
22
24
  });
23
25
  messages.register("ko", {
24
26
  canvasUnavailable: "Canvas 2D context를 가져올 수 없습니다.",
@@ -37,7 +39,9 @@ messages.register("ko", {
37
39
  search: "검색...",
38
40
  rowCount: "{shown} / {total} 행",
39
41
  excelDownload: "Excel 다운로드",
40
- csvDownload: "CSV 다운로드"
42
+ csvDownload: "CSV 다운로드",
43
+ openImage: "이미지 {index} 열기",
44
+ previewFile: "{name} 미리보기"
41
45
  });
42
46
  //#endregion
43
47
  export { messages };
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.12.0",
4
+ "version": "0.12.2",
5
5
  "author": "iyulab",
6
6
  "license": "MIT",
7
7
  "keywords": [
@@ -86,17 +86,17 @@
86
86
  "devDependencies": {
87
87
  "@eslint/js": "^10.0.1",
88
88
  "@types/node": "^26.1.1",
89
- "@vitest/browser-playwright": "^4.1.10",
89
+ "@vitest/browser-playwright": "^5.0.0",
90
90
  "chart.js": "^4.5.1",
91
91
  "eslint": "^10.1.0",
92
92
  "eslint-plugin-lit": "^2.3.1",
93
93
  "glob": "^13.0.6",
94
94
  "globals": "^17.7.0",
95
- "openai": "^6.47.0",
95
+ "openai": "^7.15.0",
96
96
  "typescript": "^6.0.2",
97
97
  "typescript-eslint": "^8.64.0",
98
98
  "vite": "^8.1.4",
99
99
  "vite-plugin-dts": "^5.0.3",
100
- "vitest": "^4.1.10"
100
+ "vitest": "^5.0.0"
101
101
  }
102
102
  }