@appsbd/vue3-appsbd-ui 1.0.23 → 1.0.25
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/.ai/ai_ref_AbDropdownMenu.md +89 -0
- package/.ai/ai_ref_AbFilterPanel.md +10 -1
- package/.ai/ai_ref_AbInputField.md +8 -0
- package/.ai/ai_ref_AbMultiSelect.md +1 -1
- package/.ai/ai_ref_AbSettingsForm.md +24 -3
- package/AI_REFERENCE.md +1 -0
- package/CHANGELOG.md +26 -1
- package/dist/style.css +1 -1
- package/dist/vue3-appsbd-ui.cjs.js +79 -79
- package/dist/vue3-appsbd-ui.es.js +10670 -10383
- package/package.json +1 -1
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# AbDropdownMenu — AI Reference
|
|
2
|
+
|
|
3
|
+
A standalone dropdown **menu** (teleported to `body`). It has **no trigger of its own**: it attaches to whatever opens it — `AbButton`, `AbActionButton`, an icon, an avatar, any element. Build the menu from an `items` array (each item can have its own `onClick` and/or be reported via the `select` event) or put custom content in the default slot. Width: fixed via `width`, otherwise at least as wide as the element it is attached to (`matchWidth`) and never narrower than `minWidth`.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
Not globally registered — import explicitly.
|
|
8
|
+
|
|
9
|
+
```js
|
|
10
|
+
import { AbDropdownMenu } from "vue3-appsbd-ui";
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
Open it from the trigger through a template ref (`toggle($event)` anchors the menu to the clicked element):
|
|
16
|
+
|
|
17
|
+
```vue
|
|
18
|
+
<template>
|
|
19
|
+
<ab-button color="primary" @click="menu.toggle($event)">Actions</ab-button>
|
|
20
|
+
<ab-action-button action="edit" @action="(a, e) => menu.toggle(e)" />
|
|
21
|
+
<ab-dropdown-menu ref="menu" :items="items" @select="handle" />
|
|
22
|
+
</template>
|
|
23
|
+
|
|
24
|
+
<script setup>
|
|
25
|
+
import { ref } from "vue";
|
|
26
|
+
const menu = ref(null);
|
|
27
|
+
const items = [
|
|
28
|
+
{ label: "Edit", value: "edit", icon: Pencil },
|
|
29
|
+
{ divider: true },
|
|
30
|
+
{ label: "Delete", value: "delete", icon: Trash2, color: "danger", onClick: () => remove() },
|
|
31
|
+
];
|
|
32
|
+
</script>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
`v-model` + `target` (element, component instance or CSS selector):
|
|
36
|
+
|
|
37
|
+
```vue
|
|
38
|
+
<ab-button id="more-btn" @click="open = !open">More</ab-button>
|
|
39
|
+
<ab-dropdown-menu v-model="open" target="#more-btn" :items="items" />
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Slot mode:
|
|
43
|
+
|
|
44
|
+
```vue
|
|
45
|
+
<ab-dropdown-menu ref="menu" :width="240">
|
|
46
|
+
<template #default="{ close }">
|
|
47
|
+
<div class="apbd-dropdown-header">Account</div>
|
|
48
|
+
<button type="button" class="apbd-dropdown-item" @click="profile(); close()">Profile</button>
|
|
49
|
+
<div class="apbd-dropdown-divider"></div>
|
|
50
|
+
<button type="button" class="apbd-dropdown-item apbd-dropdown-item-danger" @click="logout(); close()">Log out</button>
|
|
51
|
+
</template>
|
|
52
|
+
</ab-dropdown-menu>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Props
|
|
56
|
+
|
|
57
|
+
| Name | Type | Default | Description |
|
|
58
|
+
| --- | --- | --- | --- |
|
|
59
|
+
| `modelValue` | `Boolean` | `false` | `v-model` open state. |
|
|
60
|
+
| `target` | `Object \| String` | `null` | Element, component instance or CSS selector to attach to. Optional if `toggle($event)` / `show(el)` is used. |
|
|
61
|
+
| `items` | `Array` | `[]` | `{ label, value?, icon?, color?, disabled?, show?, onClick?(item, event), children?, open? }`, `{ divider: true }` or `{ header: "Text" }`. `children` (same item shape, any depth) renders a collapsible sub tree like the sidebar (indent + vertical line + curved connectors); clicking the parent only toggles it (no `select`, menu stays open), `open: true` starts it expanded. `color` is a Bootstrap theme color name. `show: false` hides an item. Ignored when the default slot is used. |
|
|
62
|
+
| `placement` | `String` | `"bottom-start"` | `bottom-end`, `top-start`, …; flips when out of room. |
|
|
63
|
+
| `offset` | `Number \| String` | `4` | Gap (px) between the element and the menu. |
|
|
64
|
+
| `width` | `Number \| String` | `null` | Fixed width (number = px). When unset, `minWidth` / `matchWidth` apply. |
|
|
65
|
+
| `minWidth` | `Number \| String` | `160` | Minimum width when `width` is unset. |
|
|
66
|
+
| `matchWidth` | `Boolean` | `true` | Menu at least as wide as the element it is attached to (ignored when `width` is set). |
|
|
67
|
+
| `closeOnSelect` | `Boolean` | `true` | Close after an `items` entry is clicked. |
|
|
68
|
+
| `closeOnClickOutside` | `Boolean` | `true` | Close on a click outside the menu and its anchor. `Esc` always closes. |
|
|
69
|
+
| `contentClass` | `String` | `""` | Extra class on the menu element. |
|
|
70
|
+
| `bordered` | `Boolean` | `false` | Separator line under every item except the last, edge to edge. |
|
|
71
|
+
| `static` | `Boolean` | `false` | Render the menu inline where it is placed, always visible, instead of a popup (docs, sidebars, panels). |
|
|
72
|
+
|
|
73
|
+
## Events
|
|
74
|
+
|
|
75
|
+
| Event | Payload | Description |
|
|
76
|
+
| --- | --- | --- |
|
|
77
|
+
| `update:modelValue` | `Boolean` | Open state changed. |
|
|
78
|
+
| `select` | `(value, item, event)` | `items` entry clicked; `value` = `item.value ?? item.label`. The item's `onClick` also runs. |
|
|
79
|
+
| `show` / `hide` | — | Menu opened / closed. |
|
|
80
|
+
|
|
81
|
+
## Slots
|
|
82
|
+
|
|
83
|
+
| Name | Scope | Description |
|
|
84
|
+
| --- | --- | --- |
|
|
85
|
+
| `default` | `{ close }` | Custom menu content, replaces `items`. Style with `.apbd-dropdown-item` (+ `-danger` etc.), `.apbd-dropdown-divider`, `.apbd-dropdown-header`. |
|
|
86
|
+
|
|
87
|
+
## Exposed
|
|
88
|
+
|
|
89
|
+
`show(elementOrEvent?)`, `hide()`, `toggle(elementOrEvent?)` — the argument is the element to attach to (an element, component instance, selector or a DOM event, whose `currentTarget` is used).
|
|
@@ -10,6 +10,12 @@ Standard-search, advance-search, and quick-advance field layouts are all plain f
|
|
|
10
10
|
|
|
11
11
|
The standard-mode property-selector (and the scan field it swaps for) isn't part of `filterOptions` — it's not tied to one field, it lists all of them — so it has no `width`/`minWidth`/`maxWidth` key to set. It's also the only item in its row until a property is picked (or whenever `showScanFld` is on), so without sizing it it'll stretch to fill the row the same way an unsized `filterOptions` field would. Use the panel-level `propertySelectWidth`/`propertySelectMinWidth`/`propertySelectMaxWidth` props for that slot instead.
|
|
12
12
|
|
|
13
|
+
## Variations (modes)
|
|
14
|
+
|
|
15
|
+
Pick exactly one with `variant` (recommended): `"standard"` (property select + value input), `"single"`, `"advance"`, `"quick-advance"`, `"builder"`. `variant` overrides the legacy `isSingle` / `isAdvance` / `isQuickAdvance` / `isBuilderFilter` booleans, so mode props can never conflict. With no `variant` and none of those booleans, the panel is **standard**.
|
|
16
|
+
|
|
17
|
+
Props that only apply to one variation: standard — `defaultFilterId`, `alwaysShowValueField`, `propertySelectWidth`/`MinWidth`/`MaxWidth`; standard & single — `canScan`, `scanProps`, `showScanFld`; single — `isAutoSearch`; advance — `advanceContainerClass`; quick-advance — `isQuickAdvanceAutoSearch`, `mobileBuilder` (on <768px quick-advance turns into the builder layout); builder — `isBuilderAutoSearch`. `isAllowed` and `showDrGroupText` are declared but currently unused. Props from another variation are ignored.
|
|
18
|
+
|
|
13
19
|
## Usage
|
|
14
20
|
|
|
15
21
|
```vue
|
|
@@ -41,7 +47,8 @@ function handleSearch(data) {
|
|
|
41
47
|
|
|
42
48
|
| Name | Type | Default | Description |
|
|
43
49
|
| -------------------------- | --------- | --------------- | ---------------------------------------------------------- |
|
|
44
|
-
| `
|
|
50
|
+
| `variant` | `String` | `undefined` | Picks the variation: `"standard"` \| `"single"` \| `"advance"` \| `"quick-advance"` \| `"builder"`. When set, it **overrides** `isSingle` / `isAdvance` / `isQuickAdvance` / `isBuilderFilter` — only that variation is active and the other mode booleans are treated as `false`. When unset, the boolean props below decide (old behaviour; no mode prop set = standard). |
|
|
51
|
+
| `isAdvance` | `Boolean` | `false` | Show all filters in an expanded layout. Ignored when `variant` is set. |
|
|
45
52
|
| `isQuickAdvance` | `Boolean` | `false` | Quick advance mode. |
|
|
46
53
|
| `isBuilderFilter` | `Boolean` | `false` | Shopify-style "+" add-filter builder — see mode description above. |
|
|
47
54
|
| `isBuilderAutoSearch` | `Boolean` | `false` | In `isBuilderFilter` mode, automatically fire `searchFilter` on Apply/Remove chip (no Search button). Default is `false` (shows Search button). |
|
|
@@ -55,12 +62,14 @@ function handleSearch(data) {
|
|
|
55
62
|
| `showDrGroupText` | `Boolean` | `true` | Show date-range group label. |
|
|
56
63
|
| `dateFormat` | `String` | `"MMM DD,YYYY"` | Date display format. |
|
|
57
64
|
| `isSearchable` | `Boolean` | `false` | Allow searching within option lists. |
|
|
65
|
+
| `alwaysShowValueField` | `Boolean` | `false` | Standard mode only: show the value input even before a property is chosen (placeholder "Enter value", prefix "Value"; choosing a property swaps in that property's prefix/placeholder). Search stays disabled until both a property and a value are filled. |
|
|
58
66
|
| `isMaxDate` | `Boolean` | `true` | Limit date pickers to today as max. |
|
|
59
67
|
| `size` | `String` | `"xs"` | Control size. |
|
|
60
68
|
| `advanceContainerClass` | `String` | `""` | Extra class on each field's flex-item wrapper in advance mode (base sizing is `flex: 1 1 240px`, wraps as needed — not a Bootstrap grid). To fix a single field's width instead, use that field's own `width` prop (`AbInputField`/`AbMultiSelect`/`AbDateTimePicker`). |
|
|
61
69
|
| `propertySelectWidth` | `String` \| `Number` | `undefined` | Width of the standard-mode property-selector / scan-field slot (number = px). Applied as `min(<value>, 100%)`, so it shrinks on small screens instead of overflowing. |
|
|
62
70
|
| `propertySelectMinWidth` | `String` \| `Number` | `undefined` | `min-width` of that same slot (same `min(<value>, 100%)` clamp). |
|
|
63
71
|
| `propertySelectMaxWidth` | `String` \| `Number` | `undefined` | `max-width` of that same slot — it's the only item in its row until a property is picked (or in scan mode), so it stretches to fill it without one (same `min(<value>, 100%)` clamp). |
|
|
72
|
+
| `mobileBuilder` | `Boolean` | `true` | Quick-advance only: on screens narrower than 768px the panel renders as the builder filter (`+` button, chips, popover editor) using the same `filterOptions`; `isQuickAdvanceAutoSearch` then acts as the builder's auto-search. Wider screens, and every other variation, are unaffected. Set `false` to keep the quick layout on mobile. |
|
|
64
73
|
| `isQuickAdvanceAutoSearch` | `Boolean` | `false` | Fire search automatically on field change (quick advance). |
|
|
65
74
|
| `defaultFilterId` | `String` \| `Number` | `""` | Pre-selects a default filter property in standard search mode (when `!isSingle && !isAdvance && !isQuickAdvance`). |
|
|
66
75
|
|
|
@@ -131,6 +131,14 @@ Not a dedicated prop — pass the native `readonly` attribute (it falls through
|
|
|
131
131
|
<ab-input-field v-model="accountId" name="account_id" label="Account ID" readonly />
|
|
132
132
|
```
|
|
133
133
|
|
|
134
|
+
## Textarea mode
|
|
135
|
+
|
|
136
|
+
Not a dedicated prop or component — pass the `as` attribute (it falls through to VeeValidate's `<Field>` via `$attrs`, like `disabled`/`readonly`). `as="textarea"` renders a native `<textarea>` instead of `<input>`, with the same label, `rules`, `hints`, `size`, prefix/postfix slots and validation error as a normal field. Other textarea attributes (`rows`, `cols`) fall through the same way; `type` is ignored by the textarea. `v-model` works unchanged.
|
|
137
|
+
|
|
138
|
+
```vue
|
|
139
|
+
<ab-input-field v-model="description" name="description" label="Description" as="textarea" rows="4" rules="required" />
|
|
140
|
+
```
|
|
141
|
+
|
|
134
142
|
## Events
|
|
135
143
|
|
|
136
144
|
| Event | Payload | Description |
|
|
@@ -32,7 +32,7 @@ Searchable single/multi/tag select. Custom built-in replacement for `@vueform/mu
|
|
|
32
32
|
| `maxWidth` | `String \| Number` | `undefined` | `max-width` on the wrapper `<div>` (same number/string rules as `width`, same `min(<value>, 100%)` clamp) — caps growth inside a flex/grid parent without a fixed `width`. |
|
|
33
33
|
| `hints` | `String` | `""` | Helper text. |
|
|
34
34
|
| `multiple` | `Boolean` | `false` | Deprecated — use `mode` instead. |
|
|
35
|
-
| `searchable` | `Boolean` | `false` | Enable option search/filter. |
|
|
35
|
+
| `searchable` | `Boolean` | `false` | Enable option search/filter (single mode; `tags`/`multiple` always have a search input). Filters `options` locally by label (case-insensitive) unless `isAjaxSearch` is set. Focusing the input does not open the dropdown — it opens on click, typing, `ArrowDown` or `Enter`. |
|
|
36
36
|
| `mode` | `String` | `"single"` | `single`, `multiple`, or `tags`. |
|
|
37
37
|
| `size` | `String` | `undefined` | Adjusts component size (`xs`, `sm`, `md`, `lg`, `xl`, `xxl`). |
|
|
38
38
|
| `options` | `Array` | `[]` | Available options. |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# AbSettingsForm — AI Reference
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Settings-style form wrapper around VeeValidate's `<Form>`. Runs the fields' validation rules first, then calls `onSubmit` with the form values. While `onSubmit` runs the form shows a sending state (`is_sending`: submit buttons disabled + spinner). When nested inside an `AbWizardStep`, it auto-registers itself as the wizard step's validator — returning `false` from `onSubmit` blocks the wizard from advancing.
|
|
4
4
|
|
|
5
5
|
## Usage
|
|
6
6
|
|
|
@@ -29,11 +29,32 @@ async function validateProfile(values) {
|
|
|
29
29
|
</script>
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
+
Standalone (no wizard) — submit with a `type="submit"` button:
|
|
33
|
+
|
|
34
|
+
```vue
|
|
35
|
+
<ab-settings-form :on-submit="save">
|
|
36
|
+
<ab-card body-class="apbd-loading-target">
|
|
37
|
+
<template #body>
|
|
38
|
+
<ab-input-field v-model="form.name" name="name" label="Name" rules="required" />
|
|
39
|
+
</template>
|
|
40
|
+
<template #footer>
|
|
41
|
+
<ab-button class="btn-primary" type="submit">Save</ab-button>
|
|
42
|
+
</template>
|
|
43
|
+
</ab-card>
|
|
44
|
+
</ab-settings-form>
|
|
45
|
+
```
|
|
46
|
+
|
|
32
47
|
## Props
|
|
33
48
|
|
|
34
49
|
| Name | Type | Default | Description |
|
|
35
50
|
| --- | --- | --- | --- |
|
|
36
|
-
| `onSubmit` | `Function` | `() => {}` | Called
|
|
51
|
+
| `onSubmit` | `Function` | `() => {}` | Called as `onSubmit(values)` (`values` = the VeeValidate form values keyed by field `name`) only after every field's `rules` pass. May be `async` — the sending state lasts until the returned Promise settles. In a wizard step, returning `false` or throwing blocks progression to the next step (a throw is also logged with `console.error`). Standalone, the return value is ignored. |
|
|
52
|
+
|
|
53
|
+
## Behavior
|
|
54
|
+
|
|
55
|
+
- **Validation first** — `onSubmit` never runs while any field is invalid (standalone: VeeValidate blocks the submit; in a wizard: the step validator checks `validate()` before calling it).
|
|
56
|
+
- **Sending state** — while `onSubmit` runs the form gets the `apbd-form-sending` class: every `button[type=submit]` inside becomes non-clickable, semi-transparent and shows a spinner, and any `.apbd-loading-target` element gets an animated skeleton overlay (e.g. `AbCard` `body-class="apbd-loading-target"`). Fields themselves are not disabled. The class is removed when `onSubmit` finishes, even if it throws.
|
|
57
|
+
- **Wizard background** — inside an `AbWizard` with a custom `backgroundColor`, the form becomes transparent (`apbd-settings-form-transparent`) so the wizard background shows through. Standalone, or with the default wizard background, nothing changes.
|
|
37
58
|
|
|
38
59
|
## Slots
|
|
39
60
|
|
|
@@ -43,4 +64,4 @@ async function validateProfile(values) {
|
|
|
43
64
|
|
|
44
65
|
## Notes
|
|
45
66
|
|
|
46
|
-
Standalone use (outside a wizard) is supported — the component works as a plain VeeValidate `<Form>` wrapper.
|
|
67
|
+
Standalone use (outside a wizard) is supported — the component works as a plain VeeValidate `<Form>` wrapper with the sending state above.
|
package/AI_REFERENCE.md
CHANGED
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
| `AbSlider` | — | Single or range numeric slider. | [.ai/ai_ref_AbSlider.md](./.ai/ai_ref_AbSlider.md) |
|
|
48
48
|
| `AbColorPicker` | — | Radio-style color swatch picker. | [.ai/ai_ref_AbColorPicker.md](./.ai/ai_ref_AbColorPicker.md) |
|
|
49
49
|
| `AbColorChooser` | — | Round color swatch that opens a color-picking popover (saturation area, hue/opacity sliders, hex input, eyedropper, contrast ratio, preset swatches). `v-model` is a hex string. | [.ai/ai_ref_AbColorChooser.md](./.ai/ai_ref_AbColorChooser.md) |
|
|
50
|
+
| `AbDropdownMenu` | — | Standalone dropdown menu (no trigger) that attaches to any button/element via `menu.toggle($event)`, `v-model` + `target` — `items` array (per-item `onClick` + `select`) or default slot; fixed `width`, else matches the element width with a `minWidth`. | [.ai/ai_ref_AbDropdownMenu.md](./.ai/ai_ref_AbDropdownMenu.md) |
|
|
50
51
|
| `AbFileUploader` | — | File upload field with size validation; image mode (default, preview) or file mode (`allowedTypes` + extension icons); `variant="dropzone"` for a large icon/title/description/button card with drag & drop. | [.ai/ai_ref_AbFileUploader.md](./.ai/ai_ref_AbFileUploader.md) |
|
|
51
52
|
| `AbFilterPanel` | — | Advanced filter panel with search and scan modes. | [.ai/ai_ref_AbFilterPanel.md](./.ai/ai_ref_AbFilterPanel.md) |
|
|
52
53
|
| `AbSettingsForm` | — | Settings-style form that auto-registers as a wizard step validator. | [.ai/ai_ref_AbSettingsForm.md](./.ai/ai_ref_AbSettingsForm.md) |
|
package/CHANGELOG.md
CHANGED
|
@@ -2,7 +2,32 @@
|
|
|
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.
|
|
5
|
+
## [1.0.25] - Unreleased
|
|
6
|
+
|
|
7
|
+
- **Added**: `AbDropdownMenu` item `children` (+ optional `open`) — an item can now have sub items rendered as a collapsible sidebar-style tree (indented, vertical line with curved connectors, rotating chevron), nested to any depth. Clicking a parent only expands/collapses it (no `select`, menu stays open); leaf items behave as before. See `.ai/ai_ref_AbDropdownMenu.md`.
|
|
8
|
+
- **Added**: `AbFilterPanel` `alwaysShowValueField` (`Boolean`, default `false`) — standard-mode variation that shows both the property select and the value input from the start (before, the value input only appeared after a property was chosen). Choosing a property swaps the value input's prefix/placeholder to that property's; Search is disabled until both fields have data. See `.ai/ai_ref_AbFilterPanel.md`.
|
|
9
|
+
- **Added**: `AbFilterPanel` `variant` (`"standard"` | `"single"` | `"advance"` | `"quick-advance"` | `"builder"`, default unset) — picks the variation with one prop. When set it overrides `isSingle` / `isAdvance` / `isQuickAdvance` / `isBuilderFilter`, so only that variation is active and the other mode booleans are forced off. The boolean props still work unchanged when `variant` is unset. See `.ai/ai_ref_AbFilterPanel.md`.
|
|
10
|
+
- **Added**: `AbFilterPanel` `mobileBuilder` (`Boolean`, default `true`) — in quick-advance mode, screens narrower than 768px now render the builder filter (`+` button, chips, popover editor) from the same `filterOptions`; `isQuickAdvanceAutoSearch` acts as its auto-search and fields that already have a value show as chips. Wider screens and every other variation are unchanged. Set `:mobile-builder="false"` to keep the quick layout on mobile. See `.ai/ai_ref_AbFilterPanel.md`.
|
|
11
|
+
- **Docs**: `AbFilterPanel` playground page — a sizes example (`xs` … `xxl`, with full code) for every variation: Standard (existing "Sizes"), Single, Advance, Quick Advance and Builder Filter.
|
|
12
|
+
- **Fixed**: `AbFilterPanel` builder filter — on narrow screens a long value (e.g. a "Date Between" range like `২৪/১০/২০২৬ ↔ ২৬/১০/২০২৬`) was cut off inside the popover's input. The input's font size now shrinks automatically (down to 9px) only when the text doesn't fit, and returns to normal when it does.
|
|
13
|
+
- **Fixed**: `AbPopover` — when the popover's content changed size after opening (e.g. the `AbFilterPanel` builder popover switching from the property list to the wider value editor), it was not repositioned and could run off the right edge of a mobile screen. It now re-measures whenever its content resizes, and keeps itself inside the visible viewport width (scrollbar excluded).
|
|
14
|
+
- **Fixed**: `AbFilterPanel` builder filter — the `+` (add filter) button now matches the height of the chips, Search/Reset buttons and inputs for every `size` (it stays square).
|
|
15
|
+
- **Fixed**: `AbSettingsForm` — `onSubmit` was called with no arguments (both standalone and inside an `AbWizardStep`), so `onSubmit(values)` always got `undefined`. It now receives the form values. Standalone, `is_sending` is also reset if `onSubmit` throws (before, the form stayed in its sending state). See `.ai/ai_ref_AbSettingsForm.md`.
|
|
16
|
+
- **Fixed**: `AbSettingsForm` — the component's internal `name` was `AbForm`; it is now `AbSettingsForm`, so Vue devtools and `<KeepAlive include="AbSettingsForm">` match its real name.
|
|
17
|
+
- **Docs**: `AbSettingsForm` playground page — new "Submitted Values" and "Inside a Wizard" examples (live preview + full code), the Simple Example code is now `v-pre`, and the Usage code is properly indented and uses `onSubmit(values)`.
|
|
18
|
+
- **Docs**: `AbSettingsForm` AI reference and playground API table — `onSubmit(values)`, async handling, the sending state (`apbd-form-sending` / `.apbd-loading-target`), wizard blocking on `false`/throw, and the wizard background override.
|
|
19
|
+
- **Docs**: `AbInputField` AI reference — documented that passing `as="textarea"` renders a native `<textarea>` (with the same label, rules, hints and validation; `rows`/`cols` fall through). See `.ai/ai_ref_AbInputField.md`.
|
|
20
|
+
|
|
21
|
+
## [1.0.24] - 2026-10-27
|
|
22
|
+
|
|
23
|
+
- **Added**: `AbDropdownMenu` component — a standalone dropdown menu (no trigger of its own) that attaches to whatever opens it: an `AbButton`, `AbActionButton`, an icon, an avatar, any element. Open it from the trigger with `menu.toggle($event)` / `menu.show(elementOrEvent)` / `menu.hide()` (template ref), with `v-model` plus a `target` (element, component instance or CSS selector). Build the menu from an `items` array (`{ label, value?, icon?, color?, disabled?, show?, onClick? }`, `{ divider: true }`, `{ header }`; reported through `select` and/or each item's `onClick`) or put anything in the default slot (`{ close }`; style with `.apbd-dropdown-item` / `-divider` / `-header`). Width: fixed with `width`, otherwise at least as wide as the element it is attached to (`matchWidth`, default `true`) and never narrower than `minWidth` (default `160`). Closes on item click (`closeOnSelect`), outside click (`closeOnClickOutside`) and `Esc`. Also `placement` (default `"bottom-start"`), `offset`, `contentClass`, `bordered` (a separator line under every item except the last), and `static` (render the menu inline, always visible, instead of a popup). See `.ai/ai_ref_AbDropdownMenu.md`.
|
|
24
|
+
- **Fixed**: `AbMultiSelect` — focusing the search input (Tab key, a label, or code such as modal autofocus) no longer opens the dropdown by itself. Previously the next click on the field hit the open/close toggle and closed it, so the dropdown looked like it would not open. It now opens on click, typing, `ArrowDown` or `Enter`, like the rest of the keyboard handling. See `.ai/ai_ref_AbMultiSelect.md`.
|
|
25
|
+
- **Fixed**: `AbMultiSelect` `mode="tags"` / `"multiple"` — picking an option closed the dropdown (the picked option is removed from the list by `hideSelected`, and the outside-click check then treated the click as outside). The dropdown now stays open so several options can be picked in a row.
|
|
26
|
+
- **Docs**: playground pages — every example now has its live preview and its exact full code (`<script setup>` + `<template>`) together. `AbSidebar` gets a dedicated live "Submenus" section (and `popoverTrigger` in its API table) with Installation/Usage right under the first preview; `AbConfirmPopover`, `AbFormCheck` (Card Width, Custom Check Icon, Pill Variant), `AbTabs` (one code block per variant), `AbCustomField`, `AbProgressbar`, `AbToggle`, `AbBottomNav`, `useResponsive`, `AbModal` and `AbWizard` got the missing live previews / code blocks; code samples that contain `{{ }}` no longer get evaluated by Vue.
|
|
27
|
+
- **Docs**: `AbMainLayout` playground page — new "Body Header & Footer" (`#bodyHeader` / `#bodyFooter`), "Elevated Variation" (`variation="elevated"` without `gradient`) and "Bottom Navigation" (`bottom-nav` + `#bottomNav`) examples.
|
|
28
|
+
- **Docs**: `AbMultiSelect` playground page — new "Searchable" section showing local (non-ajax) search in `single`, `tags` and `multiple` modes.
|
|
29
|
+
|
|
30
|
+
## [1.0.23] - 2026-10-20
|
|
6
31
|
|
|
7
32
|
- **Fixed**: `AbCard` — `bgColorVariant` / `borderBottomVariant` default `""` failed their own validators, so every card that didn't set them logged `[Vue warn]: Invalid prop: custom validator check failed`. The validators now accept `""`.
|
|
8
33
|
- **Fixed**: `AbInputField` — `update:modelValue` on input sent the whole `InputEvent` instead of the field's value (the `input` event already sent the value). It now sends `event.target.value`.
|