@appsbd/vue3-appsbd-ui 1.0.17 → 1.0.19

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.
@@ -2,13 +2,18 @@
2
2
 
3
3
  Bootstrap badge wrapper for statuses or counts with size, variant, shape, and icon variations.
4
4
 
5
+ **Default variant is `solid`** — when asked to generate `AbBadge` with no specific style requested, generate it as-is (don't pass `variant` at all) and it renders as a plain filled badge, the way it's used everywhere in this library.
6
+
5
7
  ## Usage
6
8
 
7
9
  ```vue
8
10
  <template>
11
+ <!-- Default: solid variant (no variant prop needed) -->
9
12
  <ab-badge color="primary">New</ab-badge>
10
13
  <ab-badge color="success" is-rounded-pill>12</ab-badge>
11
- <ab-badge color="warning" is-outline>Pending</ab-badge>
14
+
15
+ <!-- Outline variant -->
16
+ <ab-badge color="warning" variant="outline">Pending</ab-badge>
12
17
  </template>
13
18
  ```
14
19
 
@@ -18,7 +23,8 @@ Bootstrap badge wrapper for statuses or counts with size, variant, shape, and ic
18
23
  | --- | --- | --- | --- |
19
24
  | `size` | `String` | `"md"` | Size of the badge (`sm`, `md`, `lg`). |
20
25
  | `color` | `String` | `"primary"` | Color theme (`primary`, `secondary`, `danger`, `warning`, `success`, `info`). |
21
- | `isOutline` | `Boolean` | `false` | Outlined style with transparent background. |
26
+ | `variant` | `String` | `"solid"` | Design variant — `"solid"` (plain filled badge) or `"outline"` (bordered, transparent background; matches `isOutline`). |
27
+ | `isOutline` | `Boolean` | `false` | Deprecated — equivalent to `variant="outline"`, kept for backward compatibility. Prefer `variant="outline"` in new code. |
22
28
  | `isRoundedPill` | `Boolean` | `false` | Transforms badge to a fully rounded pill shape. |
23
29
  | `isDot` | `Boolean` | `false` | Prepends a dot indicator layout. |
24
30
  | `isAdd` | `Boolean` | `false` | Adjusts styling for an add/plus icon badge. |
@@ -2,13 +2,17 @@
2
2
 
3
3
  Customizable button with optional loader animation and leading icon slot.
4
4
 
5
+ **Default variant is `solid`** — when asked to generate `AbButton` with no specific style requested, generate it as-is (don't pass `variant` at all) and it renders as a plain filled button, the way it's used everywhere in this library.
6
+
5
7
  ## Usage
6
8
 
7
9
  ```vue
8
10
  <template>
11
+ <!-- Default: solid variant (no variant prop needed) -->
9
12
  <ab-button color="primary">Save</ab-button>
10
13
 
11
- <ab-button color="secondary" is-outline show-icon-divider>
14
+ <!-- Outline variant -->
15
+ <ab-button color="secondary" variant="outline" show-icon-divider>
12
16
  <template #icon><i class="bi bi-plus-lg"></i></template>
13
17
  New Item
14
18
  </ab-button>
@@ -31,8 +35,9 @@ const isSaving = ref(false);
31
35
  | `mode` | `String` | `"button"` | Sets the root tag (`button`, `link`, `router-link`). |
32
36
  | `type` | `String` | `"button"` | Native button type (`button`, `submit`, `reset`). |
33
37
  | `color` | `String` | `"primary"` | Color variant (primary, secondary, success, danger, warning, info, light, dark). |
38
+ | `variant` | `String` | `"solid"` | Design variant — `"solid"` (plain filled button) or `"outline"` (border-only, matches `isOutline`). Drives which class is generated for `color` (e.g. `"outline"` → `btn-outline-{color}`). |
34
39
  | `size` | `String` | `"md"` | Button size (`xs`, `sm`, `md`, `lg`, `xl`, `xxl`). |
35
- | `isOutline` | `Boolean` | `false` | Applies the outline style for the selected color. |
40
+ | `isOutline` | `Boolean` | `false` | Deprecated — equivalent to `variant="outline"`, kept for backward compatibility. Prefer `variant="outline"` in new code. |
36
41
  | `isIconBtn` | `Boolean` | `false` | Formats the button styling for a single icon. |
37
42
  | `isRounded` | `Boolean` | `false` | Applies a fully rounded, pill-like border radius to the button. |
38
43
  | `isAnimated` | `Boolean` | `false` | When `true`, renders the loader SVG and optionally hides the label. |
@@ -1,33 +1,30 @@
1
1
  # AbCard — AI Reference
2
2
 
3
- Bootstrap-style card container with `header`, `body`, and `footer` slots. Visual variations (`tile-card`, `item-card`, `insight-card`, …) are applied through CSS classes on `containerClass` rather than separate components.
3
+ Bootstrap-style card container with `header`, `body`, and `footer` slots. Visual variations (`tile-card`, `item-card`, `insight-card`, …) are applied through CSS classes rather than separate components.
4
+
5
+ **Default variant is `default`** (a plain card, no layout class) — when asked to generate `AbCard` with no specific style requested, generate it as-is (don't pass `variant` at all).
4
6
 
5
7
  ## Props
6
8
 
7
9
  | Name | Type | Default | Description |
8
10
  | --- | --- | --- | --- |
9
- | `containerClass` | `String` | `undefined` | CSS class applied to the card root. |
11
+ | `containerClass` | `String` | `undefined` | CSS class applied to the card root. General-purpose — also still the way to reach a custom, one-off class that isn't one of the built-in `variant` values. |
10
12
  | `headerClass` | `String` | `""` | CSS class for the header section. |
11
13
  | `bodyClass` | `String` | `""` | CSS class for the body section. |
12
14
  | `footerClass` | `String` | `""` | CSS class for the footer section. |
15
+ | `variant` | `String` | `"default"` | Design variant — `"default"` (plain card), `"tile"` (→ `.tile-card`, stat blocks), `"item"` (→ `.item-card`, list rows), or `"insight"` (→ `.insight-card`, insight panels). |
13
16
  | `isBorderCard` | `Boolean` | `true` | Whether to display the default card border. |
14
17
  | `bgColorVariant` | `String` | `""` | Bootstrap color variant for background (`primary`, `success`, etc.). |
15
18
  | `borderBottomVariant` | `String` | `""` | Adds a colored bottom border with the specified variant. |
16
- | `isTileCard` | `Boolean` | `false` | Applies the `.tile-card` layout styles. |
19
+ | `isTileCard` | `Boolean` | `false` | Deprecated — equivalent to `variant="tile"`, kept for backward compatibility. Prefer `variant="tile"` in new code. |
17
20
  | `showBorder` | `Boolean` | `false` | Whether to display the header and footer borders. |
18
- | `variation` | `String` | `""` | Generic variation class to append to the root. |
21
+ | `variation` | `String` | `""` | Generic escape hatch: any string passed here is appended as a raw class on the root, unvalidated — for one-off/custom classes beyond the four `variant` values. |
19
22
 
20
23
  ## Usage
21
24
 
22
25
  ```vue
23
26
  <template>
24
- <ab-card is-tile-card :is-border-card="false">
25
- <template #body>
26
- <span class="tile-title">Total Revenue</span>
27
- <span class="tile-value">$12,480</span>
28
- </template>
29
- </ab-card>
30
-
27
+ <!-- Default: plain card (no variant prop needed) -->
31
28
  <ab-card container-class="shadow-sm" border-bottom-variant="primary" header-class="bg-light">
32
29
  <template #header>Card Title</template>
33
30
  <template #body>Card Content</template>
@@ -35,6 +32,25 @@ Bootstrap-style card container with `header`, `body`, and `footer` slots. Visual
35
32
  <ab-button size="sm">Action</ab-button>
36
33
  </template>
37
34
  </ab-card>
35
+
36
+ <!-- Tile variant: high-level stat blocks -->
37
+ <ab-card variant="tile" :is-border-card="false">
38
+ <template #body>
39
+ <span class="tile-title">Total Revenue</span>
40
+ <span class="tile-value">$12,480</span>
41
+ </template>
42
+ </ab-card>
43
+
44
+ <!-- Item variant: flexible list-row layout -->
45
+ <ab-card variant="item">
46
+ <template #body>...</template>
47
+ </ab-card>
48
+
49
+ <!-- Insight variant: insight/suggestion panel -->
50
+ <ab-card variant="insight">
51
+ <template #header>...</template>
52
+ <template #body>...</template>
53
+ </ab-card>
38
54
  </template>
39
55
  ```
40
56
 
@@ -48,4 +64,4 @@ Bootstrap-style card container with `header`, `body`, and `footer` slots. Visual
48
64
 
49
65
  ## Notes
50
66
 
51
- Do **not** create a new `.vue` file for card variations — define the variant as a CSS class in `src/styles/components/_card.scss` and pass it via `containerClass`.
67
+ Do **not** create a new `.vue` file for card variations — define the variant as a CSS class in `src/styles/components/_card.scss` and expose it through the `variant` enum (or `containerClass`/`variation` for a one-off class).
@@ -21,11 +21,26 @@ Confirmation popover with an async `onConfirm` handler and built-in loader. Usef
21
21
  <script setup>
22
22
  async function handleDelete(record) {
23
23
  await api.delete(record.id);
24
- // loader and popover close handled by the component
24
+ // loader is handled by the component; returning nothing here closes the
25
+ // popover automatically — see "onConfirm return contract" below for the
26
+ // other return shapes (chaining a second confirm step, a success/error alert).
25
27
  }
26
28
  </script>
27
29
  ```
28
30
 
31
+ ## `onConfirm` return contract
32
+
33
+ `onConfirm(itemData)` is awaited; what it resolves to (or throws) decides what happens next:
34
+
35
+ | Resolves to | Result |
36
+ | --- | --- |
37
+ | Nothing (`undefined`/`null`) — the common case, a plain `async () => { await doWork(); }` | Popover closes. |
38
+ | `{ next: 'close' }` | Popover closes (same as returning nothing; use when you also want to pass through other fields, but no other field is read here). |
39
+ | `{ next: 'confirm', title?, message?, icon?, confirmText?, cancelText?, onConfirm? }` | Popover swaps to a new `type: "confirm"` step (Cancel button shown) — for a secondary confirmation. |
40
+ | `{ next: 'confirm-ajax', ...same fields, onConfirm }` | Same as above but `type: "confirm-ajax"` for the next step. |
41
+ | Any other truthy object, e.g. `{ status: true \| false, message? }` | Popover swaps to a terminal `type: "alert"` panel (icon/color from `status`, message from `message`/`msg`, default "Completed successfully" / falls back to "Something went wrong" when `status === false`) — the user must click OK to dismiss. Use this only when you deliberately want that extra confirmation screen. |
42
+ | Throws | Popover shows an `type: "alert"` error panel ("Unexpected error"), dismissed by OK. |
43
+
29
44
  ## Props
30
45
 
31
46
  | Name | Type | Default | Description |
@@ -1,6 +1,6 @@
1
1
  # AbField — AI Reference
2
2
 
3
- Polymorphic field wrapper — renders text, textarea, select, multiselect, tag, checkbox, radio, toggle, or switch based on the `type` prop.
3
+ Polymorphic field wrapper — renders text, textarea, select, multiselect, tag, checkbox, radio, toggle, or switch based on the `type` prop. For `type="number"` it renders `AbInputField` (a plain native number input by default); add `variant="stepper"` to get `AbInputField`'s numeric-stepper behavior (min/max/step clamping, +/- buttons) instead.
4
4
 
5
5
  ## Usage
6
6
 
@@ -29,6 +29,26 @@ Polymorphic field wrapper — renders text, textarea, select, multiselect, tag,
29
29
  </template>
30
30
  ```
31
31
 
32
+ Number field — plain by default, stepper via `variant`:
33
+
34
+ ```vue
35
+ <template>
36
+ <!-- Plain native number input (default) -->
37
+ <ab-field type="number" v-model="form.age" name="age" label="Age" />
38
+
39
+ <!-- Numeric stepper: +/- buttons, min/max/step clamping -->
40
+ <ab-field
41
+ type="number"
42
+ variant="stepper"
43
+ v-model="form.qty"
44
+ name="qty"
45
+ label="Quantity"
46
+ :min="1"
47
+ :max="10"
48
+ />
49
+ </template>
50
+ ```
51
+
32
52
  ## Props
33
53
 
34
54
  | Name | Type | Default | Description |
@@ -50,7 +70,7 @@ Polymorphic field wrapper — renders text, textarea, select, multiselect, tag,
50
70
  | `options` | `Array` | `[]` | Options for select / checkbox / radio. |
51
71
  | `labelKey` | `String` | `"title"` | Option label property. |
52
72
  | `valueKey` | `String` | `"val"` | Option value property. |
53
- | `max` | `Number` | `-1` | Max selections (multiselect/tag); `-1` = unlimited. |
73
+ | `max` | `Number` | `-1` | Max selections (multiselect/tag); `-1` = unlimited. For a `type="number"` field, this doubles as the stepper's numeric ceiling (`min`/`max`/`step` clamping) — `-1`/unset means no ceiling. |
54
74
  | `size` | `String` | `undefined` | Field size. |
55
75
  | `object` | `Boolean` | `false` | Return full objects instead of values (multiselect). |
56
76
  | `searchable` | `Boolean` | `false` | Enable search (select). |
@@ -70,6 +90,11 @@ Polymorphic field wrapper — renders text, textarea, select, multiselect, tag,
70
90
  | `hideSelected` | `Boolean` | `true` | Hide already-selected items from dropdown. |
71
91
  | `loading` | `Boolean` | `false` | Show a loading spinner. |
72
92
  | `appendToBody` | `Boolean` | `true` | Teleport the dropdown to `<body>`. |
93
+ | `variant` | `String` | `undefined` | `type="number"` only. `"stepper"` renders `AbInputField`'s numeric stepper (forces a native number input, shows minus/plus buttons, enables `min`/`max`/`step` clamping) instead of a plain number input. |
94
+ | `min` | `Number \| String` | `null` | `type="number"` only. Minimum allowed value (native constraint always; also clamped + disables the minus button when `variant="stepper"`). |
95
+ | `step` | `Number \| String` | `1` | `type="number"` only. Increment/decrement amount (stepper variant) / native `step` attribute. |
96
+ | `showButtons` | `Boolean` | `true` | `type="number"` + `variant="stepper"` only. Whether to render the minus/plus buttons. |
97
+ | `isBorder` | `Boolean` | `false` | `type="number"` + `variant="stepper"` only. Show inner borders between minus/input/plus. Default is a seamless pill. |
73
98
 
74
99
  ## Events
75
100
 
@@ -4,7 +4,7 @@ Advanced filter panel for list and table views. Supports quick/advance modes, si
4
4
 
5
5
  `isMultiple` is functional in `isQuickAdvance` mode for `dd` fields: selections toggle on/off and render as removable tag chips on the popover trigger (no `AbMultiSelect` involved). The popover's option list is searchable — locally against `options`, or via `isAjaxSearch` + `onSearch` for server-side search.
6
6
 
7
- `isBuilderFilter` is a Shopify-style filter builder: no field is visible until the user clicks the `+` button. That opens a popover which first lists every not-yet-applied `filterOptions` entry by `name`; picking one swaps the same popover to a value editor matching that field's `type` (`dd`→`AbMultiSelect`, `t`→`AbInputField`, `tr`→min/max inputs, `d`/`dr`→`AbDateTimePicker`) plus Cancel/Apply Filter buttons. Apply pushes it in as a removable chip (e.g. "Email contains gmail") and immediately fires `searchFilter` — there's no global Search button in this mode, only Reset (clears every applied chip and value at once). A field's `operators` is fixed by its schema entry, same as other modes — this mode does not add an is/is-not/contains operator picker, only the value input changes per `type`.
7
+ `isBuilderFilter` is a Shopify-style filter builder: no field is visible until the user clicks the `+` button. That opens a popover which first lists every not-yet-applied `filterOptions` entry by `name`; picking one swaps the same popover to a value editor matching that field's `type` (`dd`→`AbMultiSelect`, `t`→`AbInputField`, `tr`→min/max inputs, `d`/`dr`→`AbDateTimePicker`) plus Cancel/Apply Filter buttons. A `"t"` (plain text/number) field also applies on `Enter` in its input — same no-op-when-empty guard as clicking Apply Filter. Apply pushes it in as a removable chip (e.g. "Email : gmail" — see `builderChipSeparator` slot below). By default (`isBuilderAutoSearch: false`), a global Search button is shown so search fires only on clicking Search, and Reset clears all applied chips. When `isBuilderAutoSearch: true`, every Apply and chip removal immediately fires `searchFilter` without showing a Search button. A field's `operators` is fixed by its schema entry, same as other modes — this mode does not add an is/is-not/contains operator picker, only the value input changes per `type`.
8
8
 
9
9
  Standard-search, advance-search, and quick-advance field layouts are all plain flex (`d-flex flex-wrap gap-2`) — no Bootstrap grid. Each field grows/shrinks on its own, which means a field left alone on the last row will stretch to fill the remaining row width; give a `filterOptions` entry a `width`, `minWidth`, and/or `maxWidth` key (`String | Number` — a number is px, e.g. `maxWidth: 280`, or a CSS string like `"50%"`) to control that specific field's size. All three are forwarded straight to the underlying `AbInputField`/`AbMultiSelect`/`AbDateTimePicker`'s own same-named props, and also constrain that field's flex-item wrapper directly (`width` sets `flex: 0 0 <width>` so it stops growing/shrinking; `minWidth`/`maxWidth` clamp it while it keeps growing/shrinking with its siblings).
10
10
 
@@ -44,6 +44,7 @@ function handleSearch(data) {
44
44
  | `isAdvance` | `Boolean` | `false` | Show all filters in an expanded layout. |
45
45
  | `isQuickAdvance` | `Boolean` | `false` | Quick advance mode. |
46
46
  | `isBuilderFilter` | `Boolean` | `false` | Shopify-style "+" add-filter builder — see mode description above. |
47
+ | `isBuilderAutoSearch` | `Boolean` | `false` | In `isBuilderFilter` mode, automatically fire `searchFilter` on Apply/Remove chip (no Search button). Default is `false` (shows Search button). |
47
48
  | `isSingle` | `Boolean` | `false` | Single-field search mode. |
48
49
  | `isAutoSearch` | `Boolean` | `false` | Auto search on input change (single mode). |
49
50
  | `isAllowed` | `Boolean` | `false` | Permission flag consumed by the template. |
@@ -73,9 +74,11 @@ function handleSearch(data) {
73
74
 
74
75
  ## Slots
75
76
 
76
- | Name | Description |
77
- | --------- | --------------- |
78
- | `prefix` | Filter prefix. |
79
- | `postfix` | Filter postfix. |
80
- | `icon` | Filter icon. |
81
- | `hints` | Helper text. |
77
+ | Name | Description |
78
+ | ---------------------- | --------------- |
79
+ | `prefix` | Filter prefix. |
80
+ | `postfix` | Filter postfix. |
81
+ | `icon` | Filter icon. |
82
+ | `hints` | Helper text. |
83
+ | `builderChipSeparator` | `isBuilderFilter` mode only. Overrides the connector text rendered between an applied chip's field name and its value (e.g. "Email **:** gmail", "Revenue **:** 12 - 23" for `tr`/`dr` range fields). Receives `{ field }`. Default content is `:`. |
84
+ | `builderAddLabel` | `isBuilderFilter` mode only. Renders before the static `+` icon inside the "Add filter" button — use it to add a label next to the icon. Not scoped. Empty by default. |
@@ -101,7 +101,7 @@ item). If different options need different content, branch inside the template o
101
101
  <ab-form-check variant="card" :options="plans" v-model="plan" type="radio" name="plan">
102
102
  <template #option-label="{ check }">
103
103
  <template v-if="check.val === 'pro'">
104
- <ab-badge variant="danger">Popular</ab-badge> {{ check.title }}
104
+ <ab-badge color="danger">Popular</ab-badge> {{ check.title }}
105
105
  </template>
106
106
  <template v-else>{{ check.title }}</template>
107
107
  </template>
@@ -1,6 +1,6 @@
1
1
  # AbInputField — AI Reference
2
2
 
3
- Core text input with VeeValidate integration, localized feedback, and prefix/postfix/hint slots. Use for single-line text inputs; use `AbField` for a polymorphic field that can render selects, toggles, etc.
3
+ Core text input with VeeValidate integration, localized feedback, and prefix/postfix/hint slots. Use for single-line text inputs; use `AbField` for a polymorphic field that can render selects, toggles, etc. Pass `variant="stepper"` to turn it into a numeric stepper input (min/max/step clamping, +/- buttons) — this replaces the deprecated `AbNumberField`.
4
4
 
5
5
  ## Usage
6
6
 
@@ -24,6 +24,54 @@ const form = reactive({ email: '' });
24
24
  </script>
25
25
  ```
26
26
 
27
+ Stepper variant:
28
+
29
+ ```vue
30
+ <template>
31
+ <ab-input-field
32
+ v-model="qty"
33
+ variant="stepper"
34
+ name="quantity"
35
+ label="Quantity"
36
+ :min="1"
37
+ :max="10"
38
+ :step="1"
39
+ hints="Clamped between 1 and 10"
40
+ />
41
+
42
+ <!-- Inner borders between minus/input/plus -->
43
+ <ab-input-field v-model="qty" variant="stepper" name="quantity2" label="Quantity" is-border />
44
+ </template>
45
+
46
+ <script setup>
47
+ import { ref } from 'vue';
48
+ const qty = ref(1);
49
+ </script>
50
+ ```
51
+
52
+ Copyable (read-only value with a copy-to-clipboard button — no built-in confirmation UI, wire your own via the `copy-success`/`copy-error` events):
53
+
54
+ ```vue
55
+ <template>
56
+ <ab-input-field
57
+ v-model="apiKey"
58
+ name="api_key"
59
+ label="API Key"
60
+ readonly
61
+ copyable
62
+ @copy-success="(msg) => toast.success(msg)"
63
+ @copy-error="(msg) => toast.error(msg)"
64
+ />
65
+ </template>
66
+
67
+ <script setup>
68
+ import { ref } from 'vue';
69
+ import { useToast } from 'vue3-appsbd-ui';
70
+ const apiKey = ref('sk_live_...');
71
+ const { toast } = useToast();
72
+ </script>
73
+ ```
74
+
27
75
  ## Props
28
76
 
29
77
  | Name | Type | Default | Description |
@@ -33,7 +81,7 @@ const form = reactive({ email: '' });
33
81
  | `placeholder` | `String` | `""` | Input placeholder. |
34
82
  | `type` | `String` | `"text"` | Native input type (`text`, `email`, `password`, `number`, `tel`, …). |
35
83
  | `name` | `String` | `""` | VeeValidate field name. |
36
- | `isCodeInput` | `Boolean` | `false` | Applies monospace / code-input styling. |
84
+ | `isCodeInput` | `Boolean` | `false` | Renders a small, fixed-size, large-type single-character box — the same `.mega-input-field` style `AbPinInput` uses per digit. For one OTP/PIN digit only; pair with `maxlength="1"` yourself (not set automatically). Not a monospace/code-display style — too narrow for a token, key, or URL, which will visually scroll inside the box. |
37
85
  | `size` | `String` | `undefined` | Adjusts component size (`xs`, `sm`, `md`, `lg`, `xl`, `xxl`). |
38
86
  | `rules` | `String \| Object` | `""` | VeeValidate rules. |
39
87
  | `containerClass` | `String` | `undefined` | Class on the wrapper `<div>`. |
@@ -53,6 +101,15 @@ const form = reactive({ email: '' });
53
101
  | `iconPosition` | `String` | `undefined` | Position of the custom `#icon` slot (`"left"`, `"right"`). |
54
102
  | `inputClass` | `String \| Object \| Array` | `undefined` | Additional class(es) for the input element. |
55
103
  | `inputStyle` | `String \| Object \| Array` | `undefined` | Additional style(s) for the input element. |
104
+ | `variant` | `String` | `undefined` | Layout variant. `"stepper"` renders a numeric stepper (forces `type="number"`, shows +/- buttons, enables `min`/`max`/`step` clamping). |
105
+ | `min` | `Number \| String` | `null` | *(stepper variant)* Minimum allowed value. Clamps input and disables the minus button at the floor. |
106
+ | `max` | `Number \| String` | `null` | *(stepper variant)* Maximum allowed value. Clamps input and disables the plus button at the ceiling. |
107
+ | `step` | `Number \| String` | `1` | *(stepper variant)* Increment/decrement amount. |
108
+ | `showButtons` | `Boolean` | `true` | *(stepper variant)* Render the minus/plus controls. |
109
+ | `isBorder` | `Boolean` | `false` | *(stepper variant)* Show inner borders between minus/input/plus. Default is a seamless pill. |
110
+ | `copyable` | `Boolean` | `false` | Renders a plain, borderless postfix button that copies the current value to the clipboard (via the Clipboard API). No built-in confirmation UI — listen for `copy-success`/`copy-error` to show your own (e.g. `useToast()`). Pair with a native `readonly` attribute for a display-only copyable value — there is no built-in read-only mode, `readonly`/`disabled` fall through to the native input via `$attrs`. |
111
+ | `copySuccessMsg` | `String` | `"Copied to clipboard"` | Message text passed to the `copy-success` event after a successful copy (`copyable` only). Runs through the same translation pipeline as `label`/`hints`. |
112
+ | `copyErrorMsg` | `String` | `"Failed to copy"` | Message text passed to the `copy-error` event when copying fails, e.g. the Clipboard API is unavailable outside a secure context (`copyable` only). |
56
113
 
57
114
  ## Events
58
115
 
@@ -63,6 +120,8 @@ const form = reactive({ email: '' });
63
120
  | `keyup` | `KeyboardEvent` | Forwarded native event. |
64
121
  | `keydown` | `KeyboardEvent` | Forwarded native event. |
65
122
  | `paste` | `ClipboardEvent` | Forwarded native event. |
123
+ | `copy-success` | `(message: String, value: String)` | *(`copyable` only)* Fired after a successful clipboard write. `message` is the already-translated `copySuccessMsg` — hand it directly to your own confirmation UI. |
124
+ | `copy-error` | `(message: String, error: Error)` | *(`copyable` only)* Fired when the clipboard write fails (e.g. Clipboard API unavailable outside a secure context). `message` is the already-translated `copyErrorMsg`. |
66
125
 
67
126
  ## Slots
68
127
 
@@ -83,7 +83,7 @@ On mobile, call `toggleLeftSidebar()` via the template ref to open/close the dra
83
83
  | `body` | — | Main scrollable content area. |
84
84
  | `bodyFooter` | — | Content rendered below the scrollable body area. |
85
85
  | `pageFooter` | — | Bottom footer bar. |
86
- | `rightSidebar` | — | Right sidebar panel. Only rendered when `isRightSidebarOpen` is `true`. |
86
+ | `rightSidebar` | — | Right sidebar panel. Only rendered when `isRightSidebarOpen` is `true`; has no mobile/overlay treatment, so it's hidden entirely below `1199.98px` (Bootstrap's `xl` breakpoint). |
87
87
 
88
88
  ## Exposed methods
89
89
 
@@ -9,8 +9,8 @@ Full-featured dialog with a built-in VeeValidate `<Form>`, loader overlay, and "
9
9
  <ab-button class="btn-primary" @click="isOpen = true">Open</ab-button>
10
10
 
11
11
  <ab-modal
12
+ v-if="isOpen"
12
13
  ref="modal"
13
- v-model:is-modal-visible="isOpen"
14
14
  modal-size="modal-lg"
15
15
  @on-submit="handleSubmit"
16
16
  @close="isOpen = false"
@@ -47,7 +47,6 @@ async function handleSubmit(values, { resetForm }) {
47
47
 
48
48
  | Name | Type | Default | Description |
49
49
  | --- | --- | --- | --- |
50
- | `isModalVisible` | `Boolean` | — | Visibility state (`v-model:is-modal-visible`). |
51
50
  | `modalSize` | `String` | `""` | Bootstrap size class (`modal-sm`, `modal-lg`, `modal-xl`). |
52
51
  | `modalMsg` | `[String, Object]` | `{}` | Default message for message-only mode. |
53
52
  | `hideHeader` | `Boolean` | `false` | Hide the header section. |
@@ -92,9 +91,13 @@ async function handleSubmit(values, { resetForm }) {
92
91
  | `close()` | Close the modal. |
93
92
  | `clearForm()` | Reset the VeeValidate form and close. |
94
93
  | `returnClear()` | Reset the form without closing. |
95
- | `showMsgOnly(msg, isHideFooter?)` | Switch to message-only mode. |
94
+ | `showMsgOnly(msg, isHideFooter?)` | Switch to message-only mode, replacing the body with `AbResponseMsg` rendering `msg`. `isHideFooter: true` swaps the footer for a single static "Close" button (`close()`) instead of the default/slotted footer — it does **not** auto-dismiss the modal; without user action the modal stays open indefinitely. |
96
95
  | `setMessageOnly(status)` | Toggle message-only mode programmatically. |
97
96
 
97
+ ## v-model
98
+
99
+ None — there is no internal show/hide state. Mount/unmount the whole component with `v-if` (or `v-show`) on a boolean in the parent, as shown in Usage above.
100
+
98
101
  ## Notes
99
102
 
100
103
  Use `AbEasyModal` when you only need a simple trigger-and-close dialog without a form.
@@ -1,5 +1,7 @@
1
1
  # AbNumberField — AI Reference
2
2
 
3
+ > **Deprecated.** `AbNumberField` is now a thin wrapper around [`AbInputField`](./ai_ref_AbInputField.md) with `variant="stepper"`. It is kept for backward compatibility and still works exactly as documented below, but prefer `<ab-input-field variant="stepper" ... />` in new code.
4
+
3
5
  Numeric input with minus/plus buttons, min/max clamping, custom step, and VeeValidate integration. Renders as a seamless pill by default; pass `is-border` to show internal dividers between buttons and input.
4
6
 
5
7
  ## Usage
@@ -2,16 +2,25 @@
2
2
 
3
3
  Parent container for tabbed interfaces. Pair with `AbTab` children. Supports content-switching mode (default) and router-link mode for navigation-driven tabs.
4
4
 
5
+ **Default variation is `outline`** — when asked to generate `AbTabs` with no specific style requested, generate it as-is (don't pass `variation` at all) and it renders with the outlined design.
6
+
5
7
  ## Usage
6
8
 
7
9
  ```vue
8
10
  <template>
9
- <ab-tabs nav-class="nav-pills">
11
+ <!-- Default: outline variation (no props needed) -->
12
+ <ab-tabs>
10
13
  <ab-tab title="Overview" selected>Overview content</ab-tab>
11
14
  <ab-tab title="Billing">Billing content</ab-tab>
12
15
  <ab-tab title="Security">Security content</ab-tab>
13
16
  </ab-tabs>
14
17
 
18
+ <!-- Other variation -->
19
+ <ab-tabs variation="pills">
20
+ <ab-tab title="Overview" selected>Overview content</ab-tab>
21
+ <ab-tab title="Billing">Billing content</ab-tab>
22
+ </ab-tabs>
23
+
15
24
  <ab-tabs is-route-mode>
16
25
  <ab-tab title="Users" :to="{ name: 'users' }" />
17
26
  <ab-tab title="Teams" :to="{ name: 'teams' }" />
@@ -26,7 +35,8 @@ Parent container for tabbed interfaces. Pair with `AbTab` children. Supports con
26
35
  | `tabContainerClass` | `String` | — | Root wrapper class. |
27
36
  | `navContainerClass` | `String` | — | Wrapper around the nav list. |
28
37
  | `tabDetailsClass` | `String` | — | Wrapper around the tab content. |
29
- | `navClass` | `String` | `"nav-pills"` | Class on the nav list itself (e.g. `nav-tabs`, `nav-pills`). |
38
+ | `variation` | `String` | `"outline"` | Design variation of the nav. Generates a `nav-{variation}` class automatically — e.g. `"outline"` → `nav-outline`, `"pills"` → `nav-pills`, `"underline"` → `nav-underline`, `"bg-secondary"` → `nav-bg-secondary`. Pass `""` to skip auto-generation and rely on `navClass` only. |
39
+ | `navClass` | `String` | `""` | Extra classes on the nav list, merged after the `variation` class — use for size (`nav-xs`/`nav-md`/`nav-lg`/`nav-xl`), layout (`nav-fill`, `nav-vertical`), or color (`nav-secondary`) modifiers. |
30
40
  | `tabClass` | `String` | `""` | Class on each individual tab link. |
31
41
  | `isRouteMode` | `Boolean` | `false` | When `true`, tab clicks perform router navigation. |
32
42