@appsbd/vue3-appsbd-ui 1.0.14 → 1.0.16

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.
@@ -0,0 +1,91 @@
1
+ # Migration Guide — AI Reference
2
+
3
+ > Read this file when upgrading a consuming project's `@appsbd/vue3-appsbd-ui` version. It exists to drive *automated* upgrades of consumer code — it does not replace `AI_REFERENCE.md` (current API surface) or [`CHANGELOG.md`](../CHANGELOG.md) (full human-readable prose per release). After applying an entry below, re-check the affected component's `.ai/ai_ref_<Name>.md` for its current API shape.
4
+
5
+ ## How to apply an upgrade
6
+
7
+ 1. Find the consuming project's currently installed version (`package.json` → `@appsbd/vue3-appsbd-ui` / `vue3-appsbd-ui`).
8
+ 2. Walk every version section below, **oldest to newest**, strictly after the current version up to and including the target version.
9
+ 3. For each **⚠️ Action Required** item: search the consuming project with its **Find** pattern and apply its **Replace** guidance to every match.
10
+ 4. **ℹ️ Also shipped** items need no consumer-side change to keep working — they're listed so an upgrade can optionally *adopt* the new capability. Skip them freely.
11
+ 5. After applying every version's Action Required items, build/typecheck the consuming project to confirm no remaining references to removed APIs.
12
+
13
+ ---
14
+
15
+ ## [1.0.15] - 2026-08-24
16
+
17
+ ### ⚠️ Action Required — Breaking
18
+
19
+ - **Global config `formatDigit` removed → `digits`.**
20
+ - Find: `formatDigit` inside any `AppsbdUIConfigure({...})` call, or a `formatDigit` / `:format-digit` prop on `<AbDateTimePicker>`.
21
+ - Replace: the `formatDigit: (val) => ...` function with a plain `digits: [...]` array of 10 characters (index 0 = digit `0`, ... index 9 = digit `9`). Example (Bangla): `digits: ['০','১','২','৩','৪','৫','৬','৭','৮','৯']`.
22
+ - Same rename applies to `AbDateTimePicker`'s own `formatDigit` prop → `digits` prop (now an array, not a function).
23
+
24
+ ### ℹ️ Also shipped (no action needed)
25
+
26
+ - New `formatCurrency`/`formatAmount` utils + matching global config keys (`currency`, `currencyPosition`, `thousandSeparator`, `decimalSeparator`, `numberOfDecimals`, `round`) — optional to adopt for consumer-side number/currency formatting.
27
+ - New `AbChatBox` component (wraps `AbChatInput` as a full chat UI) and new `AbScrollbar` exposed scroll methods.
28
+ - `AbFormCheck` checked-state label color and `description-text` truncation CSS fixes; a WordPress `.apbd-radio-input-container` margin conflict fix (covers all enhanced variants, not just `card-flat-check`).
29
+ - `AbSidebar` header no longer clamps to a fixed height and top-aligns its content instead of centering — lets multi-line header content grow the header instead of being clipped/centered.
30
+ - Several `AbChatInput` voice-input (Safari/Android/iOS) and narrow-viewport layout fixes.
31
+
32
+ ## [1.0.14] - 2026-08-19
33
+
34
+ ### ⚠️ Action Required — Breaking
35
+
36
+ - **`AbFormCheck` per-title dynamic slot names removed.**
37
+ - Find: slot names shaped `input-icon-${title}`, `option-label-${title}`, `description-${title}` used on `<AbFormCheck>`.
38
+ - Replace: use the static scoped slots `input-icon`, `option-label`, `description` instead — each now receives `{ check, index }`; branch inside the slot on `check.title` (or `index`) if per-option content is still needed.
39
+ - Note: the `description` slot's default content now renders as raw HTML (previously plain text) — escape any content that relied on literal `<`/`>` being displayed as text.
40
+
41
+ ### ℹ️ Also shipped (no action needed)
42
+
43
+ - `abDate` library (`formatDate`/`formatDateTime`/`formatTime`/`formatCustom`), driven by new `dateDisplayFormat`/`datetimeDisplayFormat`/`timeDisplayFormat` global config keys.
44
+ - `AbFileUploader` `type="file"` mode (`allowedTypes`, `showFileName`, `width`/`height` props).
45
+ - `AbFormCheck` `icon-card`/`card-flat-check`/`image-radio` variants, `selectorPosition`/`isBoxShadow` props; card-family/segmented/pill rows now fully clickable.
46
+ - `AbInputField` `input-group-text-border-both` layout (automatic).
47
+ - `useFileValidator().getFileInfo()` gained an optional `allowedExtensions` param.
48
+ - **Default value change (non-breaking but visible):** `AbChatInput`'s `borderRadius` prop default changed from `"1.5rem"` to `"2.5rem"` — only affects consumers who never explicitly set `borderRadius` and relied on the old default's look.
49
+ - `AbNumberField` increment/decrement disabled-state fix; `AbMainLayout` iPhone Safari full-height fix.
50
+
51
+ ## [1.0.13] - 2026-08-11
52
+
53
+ ### ℹ️ Also shipped (no action needed)
54
+
55
+ - New `AbChatInput` + `AbChatInputMenuItem` components (chat composer with attachments).
56
+ - `AbChatInput` scoped slots (`left`/`right`/`menu-trigger`/`single-input`/`multiple-input`) now hand back `addToAttach`/`addFiles`/`removeFile`/`clearFiles`/`updateText`/`focus`; also exposed as template-ref methods.
57
+ - `AbChatInput` `borderRadius`/`filePreviewWidth`/`filePreviewHeight`/`showFileName` props.
58
+ - `AbFilterPanel` async `isAjaxSearch`/`onSearch`, multi-select (`isMultiple`) quick-advance `dd` fields, range-filter fix, active-filter badge style change.
59
+ - `AbWizard` `backgroundColor` prop.
60
+ - `useFileValidator().getFileIconByExt()` fallback-icon fix; RTL styling for `AbProgressbar`.
61
+
62
+ ## [1.0.12] - 2026-08-09
63
+
64
+ ### ℹ️ Also shipped (no action needed)
65
+
66
+ - `AbCustomField` gained `CP`/`FU` field types and forwards `variant`/`card-width`/`icon-size`/`icon-gap` to radio/checkbox fields.
67
+ - `label` option for `AbColorPicker`/`AbFileUploader`; `AbFormCheck` variation cards support a custom width.
68
+ - `AbToggle` switch icon alignment/sizing fix.
69
+
70
+ ## [1.0.11] - 2026-07-30
71
+
72
+ ### ⚠️ Action Required — Breaking
73
+
74
+ - **Icon peer dependency migrated `lucide-vue-next` → `@lucide/vue`.**
75
+ - Find: `import { ... } from "lucide-vue-next"` anywhere in the consuming project, and the `lucide-vue-next` entry in its `package.json`.
76
+ - Replace: `import { ... } from "@lucide/vue"` (same named icon exports, requires `@lucide/vue >=1.28.0`); swap the npm dependency itself (`npm uninstall lucide-vue-next && npm install @lucide/vue`).
77
+ - The library ships a `/migrate-lucide-icons` slash command specifically to automate this rename in consuming projects — prefer running that over a manual find/replace.
78
+
79
+ ### ℹ️ Also shipped (no action needed)
80
+
81
+ - `AbFilterPanel` multi-variant support and documentation.
82
+
83
+ ## [1.0.10] and earlier
84
+
85
+ No breaking changes recorded for `1.0.0` through `1.0.10` — every release in that range was purely additive (new components: `AbInputField`, `AbSideMenuItem`, `AbButton`, `AbPopover`, `AbSidebar`, `AbField`, `AbFilterPanel`, `AbCustomField`, `AbBaseAlert`, `AbConfirmPopover`, `AbFileUploader`, `AbModal`, `AbMainLayout`, `AbSettingsForm`, `abVeeRules`, `AbToggle`, `AbResponseMsg`, `AbCard`, `AbChart`, and the initial component/theme/RTL scaffolding) plus docs/CI work. See [CHANGELOG.md](../CHANGELOG.md) for the full per-release prose if needed.
86
+
87
+ ---
88
+
89
+ ## Maintainer note
90
+
91
+ Whenever a new version is added to `CHANGELOG.md`, add a matching section here **only when that version contains a breaking change** (a renamed/removed prop, event, slot, exposed method, global config key, or peer dependency; a changed function signature; a default value change significant enough to alter rendered output) — give it a `### ⚠️ Action Required — Breaking` subsection with **Find**/**Replace** guidance concrete enough for an AI agent to apply mechanically in a consuming project, without needing to read the full CHANGELOG prose. Every version (breaking or not) should still get a one-line-per-item `### ℹ️ Also shipped (no action needed)` list summarizing what else landed, so an upgrading agent can spot optional new capabilities worth adopting. See [[update-ai-ref-with-component-changes]] in project memory for the full doc-sync checklist this file is part of.
package/AI_REFERENCE.md CHANGED
@@ -6,6 +6,8 @@
6
6
 
7
7
  **Version history**: see [CHANGELOG.md](./CHANGELOG.md) for release-by-release notes.
8
8
 
9
+ **Upgrading a consuming project?** Read [.ai/ai_ref_migration_guide.md](./.ai/ai_ref_migration_guide.md) — per-version breaking-change find/replace steps meant for an AI agent to apply mechanically when bumping this library's version in another project.
10
+
9
11
  ## Components & APIs
10
12
 
11
13
  ✅ = globally registered via `app.use(AppsbdUI)` — all others require `import { X } from "vue3-appsbd-ui"`.
@@ -58,6 +60,8 @@
58
60
  | `AbChart` | — | Flexible chart component powered by Apache ECharts. | [.ai/ai_ref_AbChart.md](./.ai/ai_ref_AbChart.md) |
59
61
  | `AbChatInput` | — | ChatGPT-style auto-growing composer with an item-count-driven add/more dropdown, internal file attachment preview, and built-in Web Speech API voice input. | [.ai/ai_ref_AbChatInput.md](./.ai/ai_ref_AbChatInput.md) |
60
62
  | `AbChatInputMenuItem` | — | Presentational row (icon/name/description/action) for `AbChatInput`'s add/more dropdown. | [.ai/ai_ref_AbChatInputMenuItem.md](./.ai/ai_ref_AbChatInputMenuItem.md) |
63
+ | `AbChatBox` | — | Full chat conversation container (header, message list, empty/typing states) built on `AbChatInput`; every part is slot-overridable. | [.ai/ai_ref_AbChatBox.md](./.ai/ai_ref_AbChatBox.md) |
64
+ | `AbVoiceButton` | — | Standalone Web Speech API voice-to-text mic button (v-model), no composer attached — same engine as `AbChatInput`'s built-in mic. | [.ai/ai_ref_AbVoiceButton.md](./.ai/ai_ref_AbVoiceButton.md) |
61
65
  | `AbDarkModeToggler` | — | Light / dark theme toggle (pairs with `useTheme`). | [.ai/ai_ref_AbDarkModeToggler.md](./.ai/ai_ref_AbDarkModeToggler.md) |
62
66
  | `useAlert` | — | Procedural API to trigger SweetAlert-based modal alerts, notifications, and confirmations. | [.ai/ai_ref_useAlert.md](./.ai/ai_ref_useAlert.md) |
63
67
  | `abEventBus` / `emitterObj` | — | Lightweight global event bus using `tiny-emitter`. | [.ai/ai_ref_abEventBus.md](./.ai/ai_ref_abEventBus.md) |
package/CHANGELOG.md CHANGED
@@ -2,6 +2,38 @@
2
2
 
3
3
  All notable changes to `@appsbd/vue3-appsbd-ui` are documented here. Format loosely follows [Keep a Changelog](https://keepachangelog.com/).
4
4
 
5
+ ## [1.0.16] - 2026-08-27
6
+
7
+ - **Fixed**: WordPress theme conflict — `AbFormCheck`'s enhanced (`.apbd-radio-input-container`) checkbox/radio inputs now reset `margin: 0` to counter WordPress's default form-control margin. (Previously targeted `.is-flat-check`, which only covers the `card-flat-check` variant and missed the other enhanced variants.)
8
+ - **Fixed**: `AbSidebar` header (`.apbd-sidebar-header`) no longer clamps to a fixed `min-height`/`max-height` (now `unset`) and aligns its content to the top (`align-items: start` instead of `center`) — the header can grow to fit multi-line content instead of clipping/centering it within a fixed band.
9
+ - **Changed**: `AbChatInput` voice recording on Android only — no longer swaps the composer for the full-width recording bar (every other platform keeps that unchanged: waveform + cancel/stop/submit buttons). On Android the textarea now stays visible and fully editable the whole time instead (typing/deleting mid-recording works normally) and fills with the transcribed text live, in place; the mic button gets a Google Assistant-style listening cue instead — its circle fills with the theme's primary color (icon turns white), with a few rings pulsing outward from behind it on a loop. Tap it to stop (keeps the text); the send button (and Enter) still submits immediately while listening by stopping first. There's no cancel button in this Android UI — `cancelRecording()` remains available programmatically via a template ref.
10
+ - **Fixed**: `AbChatInput` voice input on Android — text was only appearing once the user tapped stop, and could double up when it did (words repeating mid-recording, not just at the end). Android's `continuous`+`interimResults` combination turned out unreliable across builds in a way delta-tracking `e.results` (by `resultIndex` or by position) can't fully work around — it can restate/duplicate earlier words in a later result with no restart involved at all. Android now runs one utterance per internal recognition session (`continuous: false`) instead, relying on the existing transparent onend-restart (added earlier for a Safari quirk) to pick the next utterance back up automatically — so `onresult` only ever needs that session's latest result, with no cross-event bookkeeping to get wrong. Combined with the textarea staying editable during recording (see above), `onresult` now also reads the current text and swaps out only the exact suffix it last inserted, so a manual edit mid-recording is preserved instead of being silently overwritten.
11
+ - **Fixed**: `AbChatInput`'s Android listening cue (see above) — the solid circle and ring animation never actually rendered, in either light or dark mode. They referenced `--#{$prefix}apbd-primary`, a CSS variable that isn't defined anywhere in the project; with no fallback, `var()` resolves to nothing and the whole declaration is silently dropped. Now uses `--#{$prefix}theme` (the actual theme accent variable, defined per-skin for both modes), with a `#0d6efd` fallback for safety.
12
+ - **Changed**: `AbChatInput`'s Android listening rings scaled down slightly (max `2.4` → `1.7`) — the previous size read as too large next to the language badge and send button. The textarea also refocuses automatically now the moment listening ends, on every platform (stop, cancel, or a voice-triggered submit) — the cursor lands back in it immediately instead of requiring an extra tap.
13
+ - **Fixed**: `AbChatInput`'s mic button on touchscreens — its `:hover` background had no touch guard, so tapping it (e.g. to stop recording on Android) could leave a lingering gray circle behind, a well-known mobile quirk: touch has no real pointer to move away and clear `:hover` the way a mouse does. Wrapped in `@media (hover: hover)` so it only applies on devices with genuine hover capability.
14
+ - **Added**: `AbChatInput` `voicePunctuationCommands` and `voiceAutoPunctuate` props (both `Boolean`, default `true`, independently toggleable) for voice input punctuation. `voicePunctuationCommands`: saying a punctuation word inserts the actual mark — English `"period"`/`"full stop"` → `.`, `"comma"` → `,`, `"question mark"` → `?`; Bengali `"পূর্ণচ্ছেদ"` → `।`, `"কমা"` → `,`, `"প্রশ্নবোধক"` → `?` — matched against the transcript text itself, independent of the selected recognition language. `voiceAutoPunctuate`: a sentence-ending mark (`.`, or `।` when `voiceLang` starts with `bn`) is inserted between voice utterances (each final phrase on non-Android, each per-utterance restart on Android) whenever the existing text doesn't already end with one.
15
+ - **Fixed**: `AbChatInput`'s `voicePunctuationCommands` (see above) — command-word matching used `\b`, which only recognizes ASCII letters/digits as "word" characters and is effectively a no-op for Bengali script, so a Bengali trigger word could match as a substring inside an unrelated longer word (e.g. saying "দাঁড়িপাল্লা" — "scale/balance" — got mangled into "। পাল্লা"). Now uses script-agnostic lookaround instead, matching only when the word is actually standalone. `"দাড়ি"` was also dropped entirely as a trigger (not just boundary-guarded) — fixing the substring match doesn't fix it also being ordinary vocabulary (beard), so a sentence genuinely about a beard would still lose that word every time; `"পূর্ণচ্ছেদ"` (a purely technical term nobody says in normal conversation) remains as the sole Bengali trigger for `.`/`।`.
16
+ - **Added**: `AbVoiceButton` — a standalone voice-to-text mic button, the same recognition engine as `AbChatInput`'s built-in mic with no composer attached. `v-model` for the transcribed text; `voice-start`/`voice-stop`/`voice-cancel`/`voice-error` events; `startRecording()`/`stopRecording()`/`cancelRecording()` exposed methods. `size` (px, default `40`) and `lang` (BCP-47, auto-detected when unset — no built-in language picker here) props, plus the same `voicePunctuationCommands`/`voiceAutoPunctuate` props as `AbChatInput`. Unlike `AbChatInput`, the Google Assistant-style listening cue (solid theme-color circle + pulsing rings) and the live, per-utterance recognition architecture run on every platform here, not just Android — this component has no legacy full recording-bar behavior to preserve, so there was no reason to keep the two paths.
17
+ - **Changed**: `AbChatInput` voice recording — the Google Assistant-style listening cue (mic icon stays put with pulsing rings, textarea stays visible and live-editable the whole time) now runs on every platform, not just Android, matching `AbVoiceButton`'s architecture. The separate full-width recording bar (audio-reactive waveform + cancel/stop/submit buttons), previously kept for every platform except Android, is removed entirely — there's no dedicated cancel button in the UI anymore; `cancelRecording()` remains available programmatically via a template ref, and the default send button (or `submit()`/Enter) still stops-then-submits when used while listening.
18
+ - **Fixed**: `AbChatInput` voice-to-text not reliably converting speech on non-Android platforms — the old pipeline only ever committed text off a `SpeechRecognition` result's `isFinal` flag, which some browsers/builds hold back indefinitely instead of firing per pause segment, so speech could go untranscribed until — or even past — the point the user stopped recording. Every platform now runs the same per-utterance (`continuous: false`) + `interimResults: true` architecture already proven on Android, merging every recognized chunk into the text live instead of waiting on `isFinal`; the now-unused `getUserMedia`/`AnalyserNode` waveform pipeline (mic-hardware-exclusive, and irrelevant once the waveform UI it drove is gone) was removed along with it.
19
+ - **Fixed**: `AbChatInput` and `AbVoiceButton` mic button showing "Microphone permission denied" on Safari (desktop and iOS) after the `interimResults: true` change above — Safari's `SpeechRecognition` engine has a long-standing bug where turning on `interimResults` can fail to (re)start at all, surfacing as a generic `onerror('not-allowed')` indistinguishable from an actually-denied permission. Safari now keeps `interimResults: false` (final-only, its reliably-supported mode) while every other browser still gets live interim updates; `onresult`'s merge logic already handled final-only results correctly, so no other change was needed.
20
+ - **Fixed**: `AbChatInput` voice input transcribing sentences entirely lowercase (e.g. "hello how are you. hello" instead of "Hello how are you. Hello") — recognized speech was inserted as-is with no capitalization pass. Both existing punctuation props now also auto-capitalize the sentence they start: `voiceAutoPunctuate` capitalizes the first letter of a new utterance right after inserting a boundary mark (and the very first letter of the whole message unconditionally); `voicePunctuationCommands` capitalizes the letter right after any mark it inserts mid-utterance (`"hello period how are you"` → `"Hello. How are you"`). Applied only to the freshly recognized chunk, never to already-committed text, so it can't fight a manual edit made to an earlier sentence while still recording. Uses plain `toUpperCase()` on the matched letter — a safe no-op for scripts without letter case (Bengali, Arabic, CJK, …), so it needs no per-language list to work for any cased script.
21
+
22
+ ## [1.0.15] - 2026-08-24
23
+
24
+ - **Added**: `AbChatBox` — a full chat conversation container built on top of `AbChatInput`: header (title/subtitle/avatar, or fully custom via the `header`/`header-actions` slots), a scrollable message list with a default bubble renderer (overridable per-message via `message`/`message-avatar`), empty and typing states (`empty`/`typing` slots), and the composer docked at the bottom. `v-model:messages` holds the conversation, `v-model` holds the composer text; submitting auto-appends the user's message and fires `send`. Every `AbChatInput` prop, event, and slot (`left`/`right`/`send-button`/`menu-trigger`/`single-input`/`multiple-input`) is forwarded straight through to the inner composer.
25
+ - **Added**: `AbScrollbar` exposed methods — `scrollToBottom(behavior?)`, `scrollToTop(behavior?)`, `scrollTo(options)`, and a raw `scrollArea` ref — for programmatic scroll control via a template ref (used internally by `AbChatBox`'s auto-scroll-to-bottom behavior).
26
+ - **Added**: `formatCurrency`/`formatAmount` utils (`src/utils/formatCurrency.js`) — format a number with configurable `thousandSeparator`, `decimalSeparator`, `numberOfDecimals`, and (for `formatCurrency`) a `currency` symbol at `currencyPosition` (`'left'`, `'right'`, `'left_space'`, `'right_space'`). By default, extra decimals are truncated rather than rounded (`1234.499` at 2 decimals -> `1234.49`); pass `round: true` for standard rounding instead. New global config keys `currency`, `currencyPosition`, `thousandSeparator`, `decimalSeparator`, `numberOfDecimals`, `round` supply the defaults when not passed per call. Documented with a live demo in the `GlobalConfigTest` playground page.
27
+ - **Fixed**: `formatAmount`'s truncation used `Math.trunc(amount * 10**n) / 10**n`, which reintroduces floating-point noise the multiplication itself creates (e.g. `19.9 * 100 === 1989.9999999999998`), silently truncating one digit too far (`19.9` at 2 decimals showed `19.89` instead of `19.90`). Now truncates against the number's own shortest round-trip string representation instead of re-multiplying it.
28
+ - **Changed**: Global config's `formatDigit` (a `Function` consumers had to write themselves) replaced with `digits` — a plain 10-character array (e.g. `['০','১',...,'৯']`); the library now transliterates digits internally via the new `formatDigits` util. `AbDateTimePicker`'s `formatDigit` prop is likewise replaced with a `digits` prop. Breaking change for any consumer passing `formatDigit`.
29
+ - **Fixed**: `AbFormCheck` checked card-family label color now uses `--#{$prefix}theme` instead of `--#{$prefix}apbd-border-color-focus`, matching the selected-state accent elsewhere. `description-text` no longer forces `white-space: nowrap` (was clipping to a single line regardless of card width); truncation now relies on `overflow: hidden` instead of a duplicate nested `text-overflow: ellipsis` rule.
30
+ - **Fixed**: WordPress theme conflict — `.is-flat-check` checkbox/radio inputs now reset `margin: 0` to counter WordPress's default form-control margin.
31
+ - **Fixed**: `AbChatInput` voice input on Safari — `SpeechRecognition` was ending the session after the very first final result despite `continuous: true`, making the mic effectively stop working after one phrase; it now auto-restarts transparently when the browser ends the session on its own (skipped when the last error was permission/hardware-related, to avoid looping).
32
+ - **Fixed**: `AbChatInput` voice input on Android Chrome — the component's own `getUserMedia` call (used only to drive the waveform animation) held a second, concurrent mic-capture session alongside `SpeechRecognition`; Android only allows one exclusive capture session at a time, so the recognizer was starved of audio with no error and no results, even though it started listening. Requesting that stream *after* `recognition.start()` (previous attempt) wasn't sufficient — `.start()` returns before the engine actually acquires the mic, so the race remained. The waveform's `getUserMedia` call is now skipped entirely on Android (detected via user agent); recognition and transcription work normally there, just without the live waveform animation.
33
+ - **Fixed**: `AbChatInput` voice input on iOS browsers other than Safari (Chrome, Firefox, Edge, Opera) — these share Safari's WebKit engine and expose the same `webkitSpeechRecognition` constructor, so the mic button rendered enabled, but iOS never actually grants the mic permission for it outside Safari's own app: tapping it showed no permission prompt at all and immediately surfaced a confusing "Microphone permission denied" toast. Now detected via user agent and treated as unsupported up front (button disabled, tooltip explains why), matching the real platform capability.
34
+ - **Fixed**: `AbChatInput` — voice-transcribed text no longer grew the textarea's height. The recording UI and the normal composer (holding `<textarea ref="textareaRef">`) are mutually exclusive template branches, so the textarea is fully unmounted while listening; every resize triggered by a transcribed phrase silently no-op'd against a null ref, and nothing re-measured it once recording ended and the textarea remounted (typing anything afterward was the only thing that happened to trigger a resize). Now explicitly resizes the moment recording stops.
35
+ - **Fixed**: `AbChatInput` on narrow viewports (e.g. small mobile screens) — with an empty composer, the "grown" (stacked) layout could trigger on mount even with nothing typed. A `<textarea>`'s `scrollHeight` includes its wrapped *placeholder* text; when the left/right icon buttons leave little room, even a short placeholder can wrap onto multiple lines and inflate `scrollHeight` past `minHeight`. The grown/inline decision is now skipped entirely when there's no actual value — the compact single-row layout is forced instead.
36
+
5
37
  ## [1.0.14] - 2026-08-19
6
38
 
7
39
  - **Added**: `abDate` library — dependency-free date/datetime/time formatter (`formatDate`, `formatDateTime`, `formatTime`, `formatCustom`) with no timezone conversion; resolves its default format from the new `dateDisplayFormat`/`datetimeDisplayFormat`/`timeDisplayFormat` global config keys, falling back to MySQL-style defaults (`YYYY-MM-DD`, `YYYY-MM-DD HH:mm:ss`, `HH:mm:ss`). Same token set as `AbDateTimePicker`, plus real second support (`ss`/`s`). Documented in the new `AbDateTest` playground page.