@hidemikimura/chit-ui 0.1.0 → 0.2.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.
- package/CHANGELOG.md +58 -0
- package/README.md +206 -9
- package/dist/chit-ui.iife.min.js +287 -60
- package/dist/chit-ui.iife.min.js.map +1 -1
- package/dist/chit-ui.min.js +287 -60
- package/dist/chit-ui.min.js.map +1 -1
- package/dist/types/bundle.d.ts +1 -0
- package/dist/types/chit-ui.d.ts +25 -0
- package/dist/types/events.d.ts +2 -0
- package/dist/types/global.d.ts +2 -0
- package/dist/types/i18n/labels.d.ts +8 -0
- package/dist/types/render/composer.d.ts +0 -1
- package/dist/types/theme/default-theme.d.ts +22 -1
- package/dist/types/themes/green.d.ts +16 -0
- package/dist/types/themes/index.d.ts +1 -0
- package/dist/types/types.d.ts +65 -4
- package/package.json +6 -1
- package/src/bundle.js +1 -0
- package/src/chit-ui.js +37 -0
- package/src/events.js +2 -0
- package/src/global.d.ts +2 -0
- package/src/i18n/labels.js +6 -0
- package/src/render/composer.js +58 -0
- package/src/render/message.js +13 -4
- package/src/render/panel.js +56 -10
- package/src/styles/composer.css.js +39 -0
- package/src/styles/host.css.js +2 -0
- package/src/styles/message.css.js +117 -3
- package/src/styles/panel.css.js +21 -2
- package/src/theme/default-theme.js +21 -2
- package/src/theme/theme-to-css.js +5 -0
- package/src/themes/green.js +47 -0
- package/src/themes/index.js +15 -0
- package/src/types.js +20 -6
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# 変更履歴
|
|
2
|
+
|
|
3
|
+
[Keep a Changelog](https://keepachangelog.com/ja/1.1.0/) にならい、新しい版を上に置きます。
|
|
4
|
+
バージョンは [Semantic Versioning](https://semver.org/lang/ja/) に従いますが、0.x の間は
|
|
5
|
+
マイナー更新に破壊的変更が入ることがあります。
|
|
6
|
+
|
|
7
|
+
## 0.2.0 — 2026-09-19
|
|
8
|
+
|
|
9
|
+
### 追加
|
|
10
|
+
|
|
11
|
+
- **吹き出しのしっぽ**。`open.bubble = { radius, tail }` で角丸としっぽ(`'none'` /
|
|
12
|
+
`'top'` / `'bottom'`)を指定できます。しっぽは根元を吹き出しの内側に潜り込ませて描くので、
|
|
13
|
+
角丸をいくつにしても継ぎ目が見えません。入力中インジケーターにも同じしっぽが付きます。
|
|
14
|
+
- **付属テーマ**。`@hidemikimura/chit-ui/themes.js` から `greenTheme` を読み込めます
|
|
15
|
+
(緑系メッセンジャー風、しっぽ付き)。ただの `Theme` オブジェクトなので、スプレッドで
|
|
16
|
+
好きに上書きできます。単一バンドルからは `window.ChitUI.greenTheme` です。
|
|
17
|
+
- **発言者の名前とアイコン**。`open.speaker.assistant` / `.user` に `name` と `avatar` を
|
|
18
|
+
書くと、その側の発言すべてに出ます。発言ごとの `name` / `avatar` が優先され、発言に `null`
|
|
19
|
+
を書くとテーマの指定を打ち消せます(続けての発言でアイコンを省く用途)。
|
|
20
|
+
- **タイトルバーのホームボタン**。`open.header.home: true` で閉じるボタンの手前に出ます。
|
|
21
|
+
押すと `chat-home` を発火するだけで、会話の巻き戻しは利用者側で行います。`home()` から
|
|
22
|
+
同じ合図を出せます。
|
|
23
|
+
- **タイトルバーの表示切り替え**。`open.header.visible: false` でタイトルバーごと消せます。
|
|
24
|
+
LIFF のように外側がタイトルを持つ画面で、タイトルが二重になるのを避けるためのものです。
|
|
25
|
+
`title` は表示されなくても `role="dialog"` の読み上げ名としては使われます。
|
|
26
|
+
- **添付ボタン**。`open.input.attach: true` で入力欄の左に出ます。`accept`(既定
|
|
27
|
+
`image/*,video/*`)と `multiple` はファイル選択にそのまま渡ります。選ばれたファイルは
|
|
28
|
+
`chat-attach` で受け取り、アップロードや表示は利用者側で行います。`openAttach()` から
|
|
29
|
+
同じダイアログを開けます。
|
|
30
|
+
- CSS カスタムプロパティ `--chit-bubble-radius`。
|
|
31
|
+
- CSS パーツ `header-title` `home-button` `attach-button` `attach-input`。
|
|
32
|
+
- ラベル `home` / `attach`(ja / en)。
|
|
33
|
+
|
|
34
|
+
### 変更
|
|
35
|
+
|
|
36
|
+
- 発言者アイコンの位置を行の下揃えから上揃えに変えました。名前の行(名前がなければ吹き出しの
|
|
37
|
+
1 行目)に並びます。下揃えだと時刻の横に来てしまい、何を示すアイコンか読み取りにくいためです。
|
|
38
|
+
- タイトルバーの画像と見出しを `[part~='header-title']` でひとまとめにしました。以前は
|
|
39
|
+
`logo` を指定すると画像が左端、タイトルが中央に離れて表示されていました。
|
|
40
|
+
- 長いタイトルは省略記号で切り詰めます。閉じるボタンが押し出されなくなりました。
|
|
41
|
+
|
|
42
|
+
### 削除
|
|
43
|
+
|
|
44
|
+
- `open.header.avatar`。型にはありましたが何も描画していませんでした。タイトルバーの画像は
|
|
45
|
+
`open.header.logo` ひとつです。
|
|
46
|
+
|
|
47
|
+
## 0.1.0 — 2026-09-18
|
|
48
|
+
|
|
49
|
+
最初の公開版。
|
|
50
|
+
|
|
51
|
+
- 3 つの状態(閉じた状態 / 開いた状態 / 非表示)と遷移アニメーション、`chat-*` イベント。
|
|
52
|
+
- 状態ごとのテーマ(色・画像・アニメーション・大きさ)。閉じた状態は PC とスマホで分けられます。
|
|
53
|
+
- 発言の中身は `text` / `html` / `template` / `element` / `component` の 5 形式。`component`
|
|
54
|
+
では LitElement を継承したコンポーネントをそのまま渡せます。
|
|
55
|
+
- どんな HTML を入れてもレイアウトが崩れないための封じ込め CSS。
|
|
56
|
+
- 入力欄(IME 対応、自動伸縮、文字数カウンタ)、ストリーミング表示、入力中インジケーター、
|
|
57
|
+
スクロール追従。
|
|
58
|
+
- npm パッケージ(ESM)と単一バンドル(ESM / IIFE)の両方。
|
package/README.md
CHANGED
|
@@ -52,6 +52,12 @@ npm install @hidemikimura/chit-ui lit
|
|
|
52
52
|
import '@hidemikimura/chit-ui'; // <chit-ui> を登録する
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
+
付属テーマは別のエントリから読み込みます(ウィジェット本体は付いてきません)。
|
|
56
|
+
|
|
57
|
+
```js
|
|
58
|
+
import { greenTheme } from '@hidemikimura/chit-ui/themes.js';
|
|
59
|
+
```
|
|
60
|
+
|
|
55
61
|
タグ名を自分で決めたい場合は、登録しないエントリを使います。
|
|
56
62
|
|
|
57
63
|
```js
|
|
@@ -97,7 +103,7 @@ chat.messages = [
|
|
|
97
103
|
| 中身 | ○ | `text` / `html` / `template` / `element` / `component` のいずれか 1 つ |
|
|
98
104
|
| `props` | | `component` に渡すプロパティ |
|
|
99
105
|
| `time` | | ISO 文字列または `Date`。`formatTime` で表示を差し替えられます |
|
|
100
|
-
| `name` / `avatar` | |
|
|
106
|
+
| `name` / `avatar` | | 発言者名とアイコン画像 URL。テーマの `open.speaker` より優先され、`null` でその発言だけ打ち消せます |
|
|
101
107
|
| `status` | | `sending` / `sent` / `error` |
|
|
102
108
|
| `streaming` | | `true` の間はカーソルを出し、スクロールを追従させます |
|
|
103
109
|
| `meta` | | ライブラリは触りません。イベントでそのまま返ってきます |
|
|
@@ -206,6 +212,7 @@ chat.theme = {
|
|
|
206
212
|
open: {
|
|
207
213
|
width: 380, height: 600,
|
|
208
214
|
colors: { accent: '#2563eb', userBubble: '#2563eb' },
|
|
215
|
+
bubble: { radius: 14, tail: 'none' }, // 吹き出しの角丸としっぽ
|
|
209
216
|
header: { title: 'サポート' },
|
|
210
217
|
},
|
|
211
218
|
};
|
|
@@ -218,6 +225,184 @@ chat.theme = {
|
|
|
218
225
|
- スマホ幅では `open` は常に全画面です(`width` / `height` は無視されます)
|
|
219
226
|
- 実行中に差し替えると即座に反映されます(ダークモードの切り替えなど)
|
|
220
227
|
|
|
228
|
+
### 付属テーマ
|
|
229
|
+
|
|
230
|
+
見た目を一から決めたくないときは、ライブラリ同梱のプリセットをそのまま渡せます。
|
|
231
|
+
|
|
232
|
+
```js
|
|
233
|
+
import { greenTheme } from '@hidemikimura/chit-ui/themes.js';
|
|
234
|
+
|
|
235
|
+
chat.theme = greenTheme;
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
`greenTheme` は淡いブルーグレーの会話背景に、相手は白・自分は黄緑の吹き出し、しっぽは
|
|
239
|
+
上向き、という緑系メッセンジャーの配色です。特定のサービスのロゴや素材は含みません。
|
|
240
|
+
配色は Chit UI 独自のもので、読む必要のある文字と背景の組み合わせはすべて WCAG AA
|
|
241
|
+
(4.5:1)を満たしています。テストが全プリセットのコントラストを毎回検証します。
|
|
242
|
+
|
|
243
|
+
プリセットはただの `Theme` オブジェクトなので、上から重ねて調整できます。
|
|
244
|
+
|
|
245
|
+
```js
|
|
246
|
+
chat.theme = { ...greenTheme, open: { ...greenTheme.open, width: 420 } };
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
`<script>` 1 本で使っている場合は、バンドルから同じ名前で取り出せます。
|
|
250
|
+
|
|
251
|
+
```js
|
|
252
|
+
const { greenTheme } = window.ChitUI; // IIFE 版
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### タイトルバー
|
|
256
|
+
|
|
257
|
+
`open.header` にタイトル文字列とロゴ画像を渡せます。
|
|
258
|
+
|
|
259
|
+
```js
|
|
260
|
+
chat.theme = {
|
|
261
|
+
open: {
|
|
262
|
+
header: { title: 'ecx サポート', logo: '/logo.png' },
|
|
263
|
+
},
|
|
264
|
+
};
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
画像とタイトルは左側にひとまとまりで並び、右側に閉じるボタンが残ります。長いタイトルは
|
|
268
|
+
省略記号で切り詰められるので、閉じるボタンが押し出されることはありません。`title` は
|
|
269
|
+
`role="dialog"` の読み上げ名にも使われます(未指定なら「チャット」/「Chat」)。ロゴは
|
|
270
|
+
装飾扱い(`alt=""`)です。隣にタイトルがあり、画像に読み上げ名を重ねても冗長なためです。
|
|
271
|
+
|
|
272
|
+
バー全体を自分で描くなら `header-title` スロット、ボタンを足すなら `header-actions`
|
|
273
|
+
スロット、まるごと差し替えるなら `header` スロットを使ってください。
|
|
274
|
+
|
|
275
|
+
#### タイトルバーを消す
|
|
276
|
+
|
|
277
|
+
`header.visible` を `false` にすると、タイトルバーごと出しません。LINE の LIFF のように
|
|
278
|
+
外側のアプリが既にタイトルを持っている画面で、タイトルが二重に並ぶのを避けるための設定です。
|
|
279
|
+
|
|
280
|
+
```js
|
|
281
|
+
chat.theme = { open: { header: { visible: false } } };
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
会話はパネルの上端から始まります。`title` を書いておけば、表示はされなくても
|
|
285
|
+
`role="dialog"` の読み上げ名としては使われるので、外側のタイトルと別の名前を付けられます。
|
|
286
|
+
|
|
287
|
+
閉じるボタンもバーごと消える点にご注意ください。Esc とランチャーのクリックでは閉じられますし、
|
|
288
|
+
LIFF のように外側が閉じる手段を持っているなら問題になりません。自前の閉じるボタンを置くなら
|
|
289
|
+
`footer` スロットか、発言の中のボタンから `chat.close()` を呼んでください。
|
|
290
|
+
|
|
291
|
+
#### ホームボタン
|
|
292
|
+
|
|
293
|
+
`header.home` を `true` にすると、閉じるボタンの手前にホームボタンが出ます。シナリオ型の
|
|
294
|
+
チャットで、会話を最初からやり直す入口を想定しています。
|
|
295
|
+
|
|
296
|
+
```js
|
|
297
|
+
chat.theme = { open: { header: { title: 'ecx サポート', home: true } } };
|
|
298
|
+
|
|
299
|
+
chat.addEventListener('chat-home', (event) => {
|
|
300
|
+
chat.messages = scenarioStart; // 巻き戻すのは利用者側
|
|
301
|
+
chat.typing = false;
|
|
302
|
+
});
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
押されても**ウィジェットは何も消しません**。`chat-home`(`detail: { trigger }`)を出すだけです。
|
|
306
|
+
`messages` の持ち主は利用者側なので、どこまで巻き戻すか、確認を挟むか、パネルを閉じるかは
|
|
307
|
+
そちらで決められます。コードから同じ合図を出すなら `chat.home()` です(`trigger` は `'api'`)。
|
|
308
|
+
|
|
309
|
+
見た目を変えるなら `::part(home-button)`、別のアイコンにしたいなら `header-actions` スロットに
|
|
310
|
+
自前のボタンを置いてください(その場合 `home: false` のままで構いません)。読み上げ名は
|
|
311
|
+
ロケールに応じて「最初に戻る」/「Back to the start」になります。
|
|
312
|
+
|
|
313
|
+
### 添付ボタン
|
|
314
|
+
|
|
315
|
+
`open.input.attach` を `true` にすると、入力欄の左に添付ボタンが出ます。押すとファイル選択が
|
|
316
|
+
開き、選ばれたファイルは `chat-attach` で渡ってきます。
|
|
317
|
+
|
|
318
|
+
```js
|
|
319
|
+
chat.theme = {
|
|
320
|
+
open: {
|
|
321
|
+
input: {
|
|
322
|
+
attach: true,
|
|
323
|
+
accept: 'image/*,video/*', // 既定。file input にそのまま渡ります
|
|
324
|
+
multiple: false, // 既定
|
|
325
|
+
},
|
|
326
|
+
},
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
chat.addEventListener('chat-attach', (event) => {
|
|
330
|
+
for (const file of event.detail.files) upload(file); // 送るのは利用者側
|
|
331
|
+
});
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
ウィジェットがやるのは選ばせるところまでです。アップロードもプレビューも発言の追加もしません。
|
|
335
|
+
`messages` の持ち主は利用者側で、バイト列の送り先もライブラリは知らないためです。選択後は
|
|
336
|
+
file input を空に戻すので、同じファイルを続けて選んでも毎回イベントが出ます。ダイアログを
|
|
337
|
+
閉じただけのときは何も起きません。
|
|
338
|
+
|
|
339
|
+
`busy` と `inputDisabled` の間はボタンも無効になります。コードから開くなら
|
|
340
|
+
`chat.openAttach()`、見た目を変えるなら `::part(attach-button)` です。自前の添付フローが
|
|
341
|
+
あるなら `attach: false` のまま `input-before` スロットに自分のボタンを置いてください。
|
|
342
|
+
|
|
343
|
+
### 発言者の名前とアイコン
|
|
344
|
+
|
|
345
|
+
`open.speaker` に書いておくと、その側の発言すべてに名前とアイコンが出ます。発言ごとに
|
|
346
|
+
書く必要はありません。
|
|
347
|
+
|
|
348
|
+
```js
|
|
349
|
+
chat.theme = {
|
|
350
|
+
open: {
|
|
351
|
+
speaker: {
|
|
352
|
+
assistant: { name: 'サポート', avatar: '/support.png' },
|
|
353
|
+
user: { name: null, avatar: null }, // 既定(何も出さない)
|
|
354
|
+
},
|
|
355
|
+
},
|
|
356
|
+
};
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
発言側の指定が勝ちます。担当者ごとに顔を変えるなら発言に書いてください。
|
|
360
|
+
|
|
361
|
+
```js
|
|
362
|
+
chat.messages = [
|
|
363
|
+
{ id: 'a', role: 'assistant', text: 'お待たせしました', name: '田中', avatar: '/tanaka.png' },
|
|
364
|
+
];
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
`null` を渡すとその発言だけテーマの指定を打ち消せます。同じ人が続けて話すときに、
|
|
368
|
+
2 件目以降のアイコンを省く使い方ができます。このときアイコンの場所は空けたまま残るので、
|
|
369
|
+
吹き出しの左端は揃います。
|
|
370
|
+
|
|
371
|
+
```js
|
|
372
|
+
chat.messages = [
|
|
373
|
+
{ id: 'a', role: 'assistant', text: '承知しました' },
|
|
374
|
+
{ id: 'b', role: 'assistant', text: '少々お待ちください', avatar: null, name: null },
|
|
375
|
+
];
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
`system` の発言は中央寄せの連絡行なので、名前もアイコンも出ません。会話の参加者ではなく
|
|
379
|
+
ウィジェットが会話について述べている行、という位置づけのためです。
|
|
380
|
+
|
|
381
|
+
### 吹き出しのしっぽ
|
|
382
|
+
|
|
383
|
+
`open.bubble` で吹き出しの角丸としっぽを決めます。
|
|
384
|
+
|
|
385
|
+
```js
|
|
386
|
+
chat.theme = { open: { bubble: { radius: 18, tail: 'top' } } };
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
| 値 | 意味 |
|
|
390
|
+
| --- | --- |
|
|
391
|
+
| `tail: 'none'`(既定) | しっぽなし。話し手側の角だけ小さく落とした形になります |
|
|
392
|
+
| `tail: 'top'` | 吹き出しの上寄りに三角のしっぽを付けます |
|
|
393
|
+
| `tail: 'bottom'` | 下寄りに付けます |
|
|
394
|
+
|
|
395
|
+
しっぽは話し手の側(相手は左、自分は右)に、その吹き出しと同じ色の葉のような形で描かれます。
|
|
396
|
+
根元は吹き出しの内側に潜り込ませてあるので、継ぎ目は吹き出しの地色に隠れます。角丸はどの角も
|
|
397
|
+
そのままで、角丸の値をいくつにしても隙間は出ません。付く高さは角丸に合わせて少し下げてあり、
|
|
398
|
+
縁がまっすぐになったところに根元が乗ります。入力中インジケーターにも同じしっぽが付きます。
|
|
399
|
+
|
|
400
|
+
しっぽを出すと、話し手側の角を落とす既定の形はなくなります。ひとつの吹き出しに話し手を示す印が
|
|
401
|
+
ふたつあると読みにくいためです。
|
|
402
|
+
|
|
403
|
+
しっぽの形は `clip-path: path()` で描いています。これに対応していないブラウザでは、変な形が
|
|
404
|
+
はみ出すよりはと考えて、しっぽを出さず既定の吹き出しのままにしています。
|
|
405
|
+
|
|
221
406
|
### 閉じた状態を自分で描く
|
|
222
407
|
|
|
223
408
|
`closed.component` に `LitElement` を継承したコンポーネント(またはタグ名)を渡すと、
|
|
@@ -275,7 +460,7 @@ chit-ui {
|
|
|
275
460
|
}
|
|
276
461
|
```
|
|
277
462
|
|
|
278
|
-
公開しているカスタムプロパティは次の
|
|
463
|
+
公開しているカスタムプロパティは次の 33 個です。
|
|
279
464
|
|
|
280
465
|
色: `--chit-color-bg` `--chit-color-text` `--chit-color-accent` `--chit-color-border`
|
|
281
466
|
`--chit-color-user-bg` `--chit-color-user-text` `--chit-color-assistant-bg`
|
|
@@ -287,6 +472,8 @@ chit-ui {
|
|
|
287
472
|
`--chit-launcher-offset-y` `--chit-launcher-bg` `--chit-launcher-text`
|
|
288
473
|
`--chit-launcher-shadow` `--chit-launcher-image`
|
|
289
474
|
|
|
475
|
+
吹き出し: `--chit-bubble-radius`
|
|
476
|
+
|
|
290
477
|
パネル: `--chit-panel-width` `--chit-panel-height` `--chit-panel-radius`
|
|
291
478
|
`--chit-panel-offset-x` `--chit-panel-offset-y` `--chit-panel-shadow`
|
|
292
479
|
`--chit-panel-bg-image`
|
|
@@ -331,6 +518,8 @@ chit-ui {
|
|
|
331
518
|
| `focusInput()` / `clearInput()` | 入力欄の操作 |
|
|
332
519
|
| `scrollToBottom({ smooth })` | 最新の発言までスクロール。`smooth` 省略時はテーマの設定に従う |
|
|
333
520
|
| `getMessageElement(id)` | その発言のコンテナ DOM(未描画なら `null`) |
|
|
521
|
+
| `home()` | `chat-home` を発火します(ホームボタンと同じ合図) |
|
|
522
|
+
| `openAttach()` | 添付のファイル選択を開きます(添付ボタンと同じ) |
|
|
334
523
|
|
|
335
524
|
## イベント
|
|
336
525
|
|
|
@@ -349,6 +538,8 @@ chit-ui {
|
|
|
349
538
|
| `chat-message-click` | 発言の中がクリックされた | `{ message, target, originalEvent }` | ○ |
|
|
350
539
|
| `chat-scroll-top` | 一覧が最上部に達した | `{}` | |
|
|
351
540
|
| `chat-breakpoint-change` | PC / スマホの判定が変わった | `{ device }` | |
|
|
541
|
+
| `chat-home` | ホームボタンが押された(または `home()`) | `{ trigger }` | |
|
|
542
|
+
| `chat-attach` | 添付ファイルが選ばれた | `{ files }`(`File[]`) | |
|
|
352
543
|
|
|
353
544
|
`trigger` は `'user'`(クリックや Esc)か `'api'`(メソッドやプロパティ代入)です。
|
|
354
545
|
|
|
@@ -381,7 +572,8 @@ chat.addEventListener('chat-message-click', (event) => {
|
|
|
381
572
|
|
|
382
573
|
`::part()` で外部からスタイルを当てられます。
|
|
383
574
|
|
|
384
|
-
`launcher` `launcher-icon` `launcher-label` `panel` `header` `header-heading` `header-logo`
|
|
575
|
+
`launcher` `launcher-icon` `launcher-label` `panel` `header` `header-title` `header-heading` `header-logo`
|
|
576
|
+
`home-button` `attach-button` `attach-input`
|
|
385
577
|
`header-actions` `close-button` `messages` `messages-inner` `message` `message-user`
|
|
386
578
|
`message-assistant` `message-system` `bubble` `message-content` `avatar` `name` `meta` `time`
|
|
387
579
|
`status` `cursor` `typing` `to-latest` `composer` `input` `counter` `send-button` `spinner`
|
|
@@ -403,6 +595,9 @@ chat.addEventListener('chat-message-click', (event) => {
|
|
|
403
595
|
|
|
404
596
|
Chrome / Edge / Firefox / Safari の最新 2 バージョンと iOS Safari 16 以降。IE は非対応です。
|
|
405
597
|
|
|
598
|
+
吹き出しのしっぽだけは `clip-path: path()` を使っています。対応していないブラウザでは
|
|
599
|
+
しっぽを出さず、通常の吹き出しとして表示します(他の機能には影響しません)。
|
|
600
|
+
|
|
406
601
|
## 開発
|
|
407
602
|
|
|
408
603
|
```sh
|
|
@@ -422,18 +617,20 @@ IME の実挙動は合成イベントでは再現しきれないため、リリ
|
|
|
422
617
|
- macOS Safari + 日本語 IME: 変換確定の Enter で誤送信しないこと
|
|
423
618
|
- iOS Safari: パネルが全画面になり、キーボード表示中も入力欄が隠れないこと
|
|
424
619
|
- Android Chrome: 変換中の Enter で誤送信しないこと
|
|
620
|
+
- iOS Safari / Android Chrome: 添付ボタンからカメラとフォトライブラリが開けること
|
|
621
|
+
(`accept` はブラウザによって扱いが違うため)
|
|
425
622
|
|
|
426
|
-
|
|
623
|
+
### 公開
|
|
427
624
|
|
|
428
625
|
```sh
|
|
429
626
|
npm login
|
|
430
|
-
npm run check
|
|
431
|
-
npm publish
|
|
627
|
+
npm run check # typecheck + test + axe 監査
|
|
628
|
+
npm publish # prepublishOnly がビルドとテストを流し直します
|
|
432
629
|
```
|
|
433
630
|
|
|
434
|
-
`
|
|
435
|
-
|
|
436
|
-
|
|
631
|
+
`publishConfig` に `access: public` を入れてあるので `--access public` は不要です。
|
|
632
|
+
公開したら `git tag v0.2.0 && git push --tags` を忘れずに。変更点は
|
|
633
|
+
[CHANGELOG.md](./CHANGELOG.md) にまとめています。
|
|
437
634
|
|
|
438
635
|
## ライセンス
|
|
439
636
|
|