@omnitend/dashboard-for-laravel 0.41.1 → 0.42.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.
Files changed (62) hide show
  1. package/README.md +2 -1
  2. package/dist/assets/MavenPro-Bold-35b16f06.woff2 +0 -0
  3. package/dist/assets/MavenPro-Medium-febc8674.woff2 +0 -0
  4. package/dist/assets/MavenPro-Regular-aee3df9e.woff2 +0 -0
  5. package/dist/assets/MavenPro-SemiBold-c555dbfa.woff2 +0 -0
  6. package/dist/assets/Poppins-Medium-5800fa57.woff2 +0 -0
  7. package/dist/assets/Poppins-SemiBold-94a36267.woff2 +0 -0
  8. package/dist/charts.js +148 -130
  9. package/dist/charts.js.map +1 -1
  10. package/dist/charts.umd.cjs +1 -1
  11. package/dist/charts.umd.cjs.map +1 -1
  12. package/dist/components/base/DModal.vue.d.ts +26 -2
  13. package/dist/components/charts/chartTheme.d.ts +14 -2
  14. package/dist/components/extended/DXField.vue.d.ts +16 -5
  15. package/dist/components/extended/DXForm.vue.d.ts +25 -9
  16. package/dist/components/extended/DXLoading.vue.d.ts +9 -0
  17. package/dist/components/extended/DXModalActions.vue.d.ts +12 -0
  18. package/dist/components/extended/DXNumberStepper.vue.d.ts +33 -0
  19. package/dist/components/extended/DXSaveButton.vue.d.ts +38 -0
  20. package/dist/components/extended/DXSwitch.vue.d.ts +1 -1
  21. package/dist/components/extended/DXTable.vue.d.ts +8 -2
  22. package/dist/composables/useForm.d.ts +7 -0
  23. package/dist/dashboard-for-laravel.js +9547 -9246
  24. package/dist/dashboard-for-laravel.js.map +1 -1
  25. package/dist/dashboard-for-laravel.umd.cjs +7 -7
  26. package/dist/dashboard-for-laravel.umd.cjs.map +1 -1
  27. package/dist/index.d.ts +5 -0
  28. package/dist/style.css +2 -2
  29. package/dist/types/index.d.ts +20 -3
  30. package/docs/public/api-reference.json +219 -17
  31. package/docs/public/docs-map.md +4 -2
  32. package/docs/public/llms.txt +7 -2
  33. package/package.json +1 -1
  34. package/resources/css/theme.scss +524 -103
  35. package/resources/fonts/maven-pro/MavenPro-Bold.woff2 +0 -0
  36. package/resources/fonts/maven-pro/MavenPro-Medium.woff2 +0 -0
  37. package/resources/fonts/maven-pro/MavenPro-Regular.woff2 +0 -0
  38. package/resources/fonts/maven-pro/MavenPro-SemiBold.woff2 +0 -0
  39. package/resources/fonts/maven-pro/OFL.txt +93 -0
  40. package/resources/fonts/poppins/OFL.txt +93 -0
  41. package/resources/fonts/poppins/Poppins-Medium.woff2 +0 -0
  42. package/resources/fonts/poppins/Poppins-SemiBold.woff2 +0 -0
  43. package/resources/js/components/base/DModal.vue +13 -2
  44. package/resources/js/components/charts/DXBarChart.vue +2 -1
  45. package/resources/js/components/charts/DXDoughnutChart.vue +2 -1
  46. package/resources/js/components/charts/DXLineChart.vue +2 -1
  47. package/resources/js/components/charts/chartTheme.ts +68 -21
  48. package/resources/js/components/extended/DXDashboard.vue +4 -2
  49. package/resources/js/components/extended/DXDashboardSidebar.vue +52 -20
  50. package/resources/js/components/extended/DXField.vue +59 -28
  51. package/resources/js/components/extended/DXForm.vue +122 -21
  52. package/resources/js/components/extended/DXLoading.vue +47 -0
  53. package/resources/js/components/extended/DXModalActions.vue +13 -0
  54. package/resources/js/components/extended/DXNumberStepper.vue +243 -0
  55. package/resources/js/components/extended/DXSaveButton.vue +82 -0
  56. package/resources/js/components/extended/DXSwitch.vue +8 -5
  57. package/resources/js/components/extended/DXTable.vue +58 -22
  58. package/resources/js/components/extended/DXTablePagination.vue +1 -1
  59. package/resources/js/composables/useForm.ts +11 -0
  60. package/resources/js/composables/useToast.ts +1 -1
  61. package/resources/js/index.ts +5 -0
  62. package/resources/js/types/index.ts +21 -3
@@ -44,8 +44,9 @@ export type OptionsLoader = (model: any) => Promise<FieldOption[]>;
44
44
  * Deliberately excludes `boolean` (which BFormGroup's own `labelCols` prop
45
45
  * accepts): Vue's type-based `defineProps` auto-defaults an omitted prop to
46
46
  * `false` (not `undefined`) whenever its declared type includes `boolean`,
47
- * which would silently break the `field.labelCols ?? formLabelCols ?? 3`
48
- * fallback chain used to resolve this value.
47
+ * which would silently break the `field.labelCols ?? formLabelCols` fallback
48
+ * chain used to resolve this value (`undefined` at the end of it means the
49
+ * default 45% label column, `--dx-form-label-width`).
49
50
  */
50
51
  export type LabelCols = number | {
51
52
  sm?: number;
@@ -187,7 +188,8 @@ export interface FieldDefinition {
187
188
  layout?: "vertical" | "horizontal";
188
189
  /**
189
190
  * Per-field override of DXForm's `labelCols` prop, for horizontal
190
- * layout. Falls back to the form-level `labelCols` when omitted.
191
+ * layout. Falls back to the form-level `labelCols` when omitted, and to
192
+ * the default 45% label column (`--dx-form-label-width`) when neither is set.
191
193
  */
192
194
  labelCols?: LabelCols;
193
195
  /**
@@ -474,4 +476,19 @@ export interface FormTab {
474
476
  /** Lazily mount tab content until first activated */
475
477
  lazy?: boolean;
476
478
  }
479
+ /**
480
+ * The theme's extra colour variant, `pending`: waiting, and the next move is
481
+ * not yours ("awaiting payment", "sent to printer, not yet confirmed").
482
+ * theme.scss paints it everywhere a stock variant is painted (badge, soft and
483
+ * outline button, alert, text, subtle utilities, table row, list-group item,
484
+ * toast). Registering it on bootstrap-vue-next's `BaseColorVariant` adds it to
485
+ * every variant union derived from that interface (`ColorVariant`,
486
+ * `ButtonVariant` incl. `outline-pending`, the `-subtle` and `-emphasis`
487
+ * forms), so `<DBadge variant="pending">` type-checks.
488
+ */
489
+ declare module "bootstrap-vue-next" {
490
+ interface BaseColorVariant {
491
+ pending: unknown;
492
+ }
493
+ }
477
494
  export {};
@@ -1,8 +1,8 @@
1
1
  {
2
- "generated": "2026-09-27T10:14:02.393Z",
2
+ "generated": "2026-10-04T09:15:57.974Z",
3
3
  "package": {
4
4
  "name": "@omnitend/dashboard-for-laravel",
5
- "version": "0.41.1"
5
+ "version": "0.42.0"
6
6
  },
7
7
  "components": {
8
8
  "base": [
@@ -911,6 +911,16 @@
911
911
  "props": [],
912
912
  "events": [],
913
913
  "slots": [
914
+ {
915
+ "name": "default",
916
+ "description": "",
917
+ "bindings": []
918
+ },
919
+ {
920
+ "name": "actions",
921
+ "description": "",
922
+ "bindings": []
923
+ },
914
924
  {
915
925
  "name": "name",
916
926
  "description": "",
@@ -1350,7 +1360,7 @@
1350
1360
  "name": "DXBarChart",
1351
1361
  "category": "extended",
1352
1362
  "filePath": "resources/js/components/charts/DXBarChart.vue",
1353
- "description": "A themed bar chart. Thin wrapper around vue-chartjs (chart.js) with the theme's dedicated chart palette (--dx-chart-1..8) applied and dashboard-friendly defaults (no x gridlines, formatted value ticks, responsive, legend hidden for a single series). Pass `labels` + `datasets`; `options` deep-merges over the defaults. Requires the optional peer deps `chart.js` and `vue-chartjs`.",
1363
+ "description": "A themed bar chart. Thin wrapper around vue-chartjs (chart.js) with the theme's dedicated chart palette (--dx-chart-1..8 fills, a 1px --dx-chart-edge outline) applied and dashboard-friendly defaults (no x gridlines, formatted value ticks, responsive, legend hidden for a single series). Pass `labels` + `datasets`; `options` deep-merges over the defaults. Requires the optional peer deps `chart.js` and `vue-chartjs`.",
1354
1364
  "props": [
1355
1365
  {
1356
1366
  "name": "labels",
@@ -1960,7 +1970,7 @@
1960
1970
  "name": "DXDoughnutChart",
1961
1971
  "category": "extended",
1962
1972
  "filePath": "resources/js/components/charts/DXDoughnutChart.vue",
1963
- "description": "A themed doughnut chart. Thin wrapper around vue-chartjs (chart.js) with one chart-palette colour (--dx-chart-1..8) per slice and dashboard-friendly defaults. Pass `labels` + either `data` (a number array) or full `datasets`; `options` deep-merges over the defaults. Requires the optional peer deps `chart.js` and `vue-chartjs`.",
1973
+ "description": "A themed doughnut chart. Thin wrapper around vue-chartjs (chart.js) with one chart-palette colour (--dx-chart-1..8) per slice, a 1px --dx-chart-edge outline, and dashboard-friendly defaults. Pass `labels` + either `data` (a number array) or full `datasets`; `options` deep-merges over the defaults. Requires the optional peer deps `chart.js` and `vue-chartjs`.",
1964
1974
  "props": [
1965
1975
  {
1966
1976
  "name": "labels",
@@ -2063,7 +2073,7 @@
2063
2073
  "name": "labelCols",
2064
2074
  "type": "LabelCols",
2065
2075
  "required": false,
2066
- "description": "Label column width for horizontal layout (mirrors BFormGroup)."
2076
+ "description": "Label column width for horizontal layout (mirrors BFormGroup's\n`labelCols`/`labelCols*`). Omitted: the label takes\n`--dx-form-label-width` (45%) from `sm` up and stacks below."
2067
2077
  },
2068
2078
  {
2069
2079
  "name": "hideLabel",
@@ -2158,7 +2168,7 @@
2158
2168
  },
2159
2169
  {
2160
2170
  "name": "value",
2161
- "description": "Replaces the built-in control with a custom value editor.",
2171
+ "description": "Replaces the built-in control with a custom value editor. On a `plaintext` field the content is wrapped in `.dx-form-plaintext` so display-only content lines up with the label.",
2162
2172
  "bindings": [
2163
2173
  {
2164
2174
  "title": "binding",
@@ -2414,6 +2424,20 @@
2414
2424
  "default": "\"Submitting...\"",
2415
2425
  "description": "Submit button loading text"
2416
2426
  },
2427
+ {
2428
+ "name": "submitSavedText",
2429
+ "type": "string",
2430
+ "required": false,
2431
+ "default": "\"Saved\"",
2432
+ "description": "Submit button label once the form's contents are saved."
2433
+ },
2434
+ {
2435
+ "name": "savedState",
2436
+ "type": "boolean",
2437
+ "required": false,
2438
+ "default": "true",
2439
+ "description": "After a successful submission through the form (`form.post/put/…`,\nread from `form.wasSuccessful`), turn the submit button into a\ndisabled \"✓ Saved\" until any field changes. On by default; set\n`false` for forms whose submit is not a save (search, filter)."
2440
+ },
2417
2441
  {
2418
2442
  "name": "showSubmit",
2419
2443
  "type": "boolean",
@@ -2447,20 +2471,20 @@
2447
2471
  "type": "union",
2448
2472
  "required": false,
2449
2473
  "default": "\"vertical\"",
2450
- "description": "Form-wide field layout:\n\n- `\"vertical\"` (default) — label above input, always.\n- `\"horizontal\"` — label left, input right, always.\n- `\"auto\"` — horizontal when the form's **own container** is at least\n `layoutThreshold` px wide, vertical below that. Container-driven, not\n viewport-driven: a page narrowed by the dashboard sidebar, or a form\n inside a modal, stacks even though the window is wide (which no\n Bootstrap media query can see).\n\nOverridable per-field via `field.layout`. A field with `span: true`\nalways renders full-width, regardless of layout."
2474
+ "description": "Form-wide field layout:\n\n- `\"vertical\"` (default) — label above input, always.\n- `\"horizontal\"` — label left, input right, whatever the container\n width. With the default label column that holds from the `sm`\n viewport breakpoint up (the label stacks on a phone); a numeric\n `labelCols` keeps the split at every width.\n- `\"auto\"` — horizontal when the form's **own container** is at least\n `layoutThreshold` px wide, vertical below that. Container-driven, not\n viewport-driven: a page narrowed by the dashboard sidebar, or a form\n inside a modal, stacks even though the window is wide (which no\n Bootstrap media query can see).\n\nOverridable per-field via `field.layout`. A field with `span: true`\nalways renders full-width, regardless of layout."
2451
2475
  },
2452
2476
  {
2453
2477
  "name": "layoutThreshold",
2454
2478
  "type": "number",
2455
2479
  "required": false,
2456
2480
  "default": "640",
2457
- "description": "Container width (px) at or above which `layout: \"auto\"` goes horizontal.\nIgnored for the explicit `\"vertical\"`/`\"horizontal\"` layouts.\n\nDefault 640, measured rather than guessed: with the default 3-column\nlabel the label's text area is `containerWidth / 4 - 18` px, so 640 gives\nit 142px — enough for a ~20-character label (\"Unit price (ex VAT)\"\nmeasures 128px at the theme's label font) to stay on one line, with the\ncontrol column still 474px. Below ~584px that label starts wrapping,\nwhich is the cramped-label symptom this exists to avoid. Raise it if your\nlabels run longer, or lower `labelCols` instead."
2481
+ "description": "Container width (px) at or above which `layout: \"auto\"` goes horizontal.\nIgnored for the explicit `\"vertical\"`/`\"horizontal\"` layouts.\n\nDefault 640, measured when the default label was 3 columns: that gave\nthe label 142px of text at 640px, just enough for a ~20-character label\n(\"Unit price (ex VAT)\" measures 128px at the theme's label font) to stay\non one line. With the 45% default label column the same 640px gives the\nlabel ~275px and the control ~341px, so the threshold now mostly keeps\nthe control column usable. Raise it if your controls need more room, or\nset a narrower `labelCols`."
2458
2482
  },
2459
2483
  {
2460
2484
  "name": "labelCols",
2461
2485
  "type": "LabelCols",
2462
2486
  "required": false,
2463
- "description": "Label column width for horizontal layout (mirrors BFormGroup's\n`labelCols`/`labelCols*` props). Overridable per-field via\n`field.labelCols`. Ignored when `layout` is \"vertical\"."
2487
+ "description": "Label column width for horizontal layout (mirrors BFormGroup's\n`labelCols`/`labelCols*` props). Overridable per-field via\n`field.labelCols`. Ignored when `layout` is \"vertical\". Omitted (here\nand on the field): the label takes `--dx-form-label-width` (45%) from\n`sm` up and stacks above the input below `sm`."
2464
2488
  }
2465
2489
  ],
2466
2490
  "events": [
@@ -2686,7 +2710,7 @@
2686
2710
  "name": "DXLineChart",
2687
2711
  "category": "extended",
2688
2712
  "filePath": "resources/js/components/charts/DXLineChart.vue",
2689
- "description": "A themed line chart. Thin wrapper around vue-chartjs (chart.js) with the theme's dedicated chart palette applied (--dx-chart-1..8 stroke + translucent fill, smoothed line) and dashboard-friendly defaults. Pass `labels` + `datasets`; `options` deep-merges over the defaults. Requires the optional peer deps `chart.js` and `vue-chartjs`.",
2713
+ "description": "A themed line chart. Thin wrapper around vue-chartjs (chart.js) with the theme's dedicated chart palette applied (--dx-chart-line-1..8 stroke and point outline, --dx-chart-1..8 point centre and translucent area fill, smoothed line) and dashboard-friendly defaults. Pass `labels` + `datasets`; `options` deep-merges over the defaults. Requires the optional peer deps `chart.js` and `vue-chartjs`.",
2690
2714
  "props": [
2691
2715
  {
2692
2716
  "name": "labels",
@@ -2737,6 +2761,120 @@
2737
2761
  "slots": [],
2738
2762
  "methods": []
2739
2763
  },
2764
+ {
2765
+ "name": "DXLoading",
2766
+ "category": "extended",
2767
+ "filePath": "resources/js/components/extended/DXLoading.vue",
2768
+ "description": "",
2769
+ "props": [
2770
+ {
2771
+ "name": "text",
2772
+ "type": "string",
2773
+ "required": false,
2774
+ "default": "\"Loading…\"",
2775
+ "description": ""
2776
+ },
2777
+ {
2778
+ "name": "delay",
2779
+ "type": "number",
2780
+ "required": false,
2781
+ "default": "300",
2782
+ "description": ""
2783
+ }
2784
+ ],
2785
+ "events": [],
2786
+ "slots": [],
2787
+ "methods": []
2788
+ },
2789
+ {
2790
+ "name": "DXModalActions",
2791
+ "category": "extended",
2792
+ "filePath": "resources/js/components/extended/DXModalActions.vue",
2793
+ "description": "Shared secondary modal actions; distinct from the modal footer controls.",
2794
+ "props": [],
2795
+ "events": [],
2796
+ "slots": [
2797
+ {
2798
+ "name": "default",
2799
+ "description": "",
2800
+ "bindings": []
2801
+ }
2802
+ ],
2803
+ "methods": []
2804
+ },
2805
+ {
2806
+ "name": "DXNumberStepper",
2807
+ "category": "extended",
2808
+ "filePath": "resources/js/components/extended/DXNumberStepper.vue",
2809
+ "description": "DXNumberStepper — a number input between a decrease and an increase button. `[ − ][ 12 ][ + ]` as one input group, for quantities that are usually nudged rather than typed (cases on an order line, covers on a booking). - The model is a number, or `null` when the input is empty (never `NaN`, never `\"\"`). Every step and every valid keystroke emits `update:modelValue`; debounce on the consumer's side if each change saves. - A step adds or subtracts `step` from the current value and clamps to `min`/`max`. It does not snap to a grid, so 1.05 + 0.1 is 1.15. The sum is rounded to the decimal places of the value and step, so 0.1 three times is 0.3, not 0.30000000000000004. From empty, a step goes to the in-range value nearest zero. - The button at a bound is disabled (decrease at `min`, increase at `max`). - Typing is free: the value is emitted as typed, even out of range, and is CLAMPED ON BLUR to `min`/`max` (emitting the clamped value). Half-typed input the browser cannot parse (\"-\", \"1e\") emits nothing until it parses. - ArrowUp/ArrowDown on the input go through the same step as the buttons (the browser's own spin-button stepping snaps to a grid; this does not). The native spin arrows are hidden. The buttons are `tabindex=\"-1\"`, so a list of steppers is one Tab stop each; keyboard users step with the arrows. - The buttons are square icon buttons at the input's height (never narrower than tall), soft `secondary` like other in-row actions, labelled \"Decrease\"/\"Increase\" plus the input's `aria-label` when it has one. `class` and `style` go on the group; every other attribute (`aria-label`, `name`, `id`, `placeholder`, `required`, `state`, listeners…) goes on the input. Styles live in theme.scss under `.dx-number-stepper`.",
2810
+ "props": [
2811
+ {
2812
+ "name": "modelValue",
2813
+ "type": "union",
2814
+ "required": false,
2815
+ "default": "null",
2816
+ "description": "The value (v-model). `null` when the input is empty."
2817
+ },
2818
+ {
2819
+ "name": "min",
2820
+ "type": "number",
2821
+ "required": false,
2822
+ "default": "undefined",
2823
+ "description": "Lowest value; the decrease button disables here and blur clamps to it."
2824
+ },
2825
+ {
2826
+ "name": "max",
2827
+ "type": "number",
2828
+ "required": false,
2829
+ "default": "undefined",
2830
+ "description": "Highest value; the increase button disables here and blur clamps to it."
2831
+ },
2832
+ {
2833
+ "name": "step",
2834
+ "type": "number",
2835
+ "required": false,
2836
+ "default": "1",
2837
+ "description": "How much one press (or ArrowUp/ArrowDown) changes the value. @default 1"
2838
+ },
2839
+ {
2840
+ "name": "size",
2841
+ "type": "union",
2842
+ "required": false,
2843
+ "default": "\"md\"",
2844
+ "description": "Control size, matching the other inputs. @default 'md'"
2845
+ },
2846
+ {
2847
+ "name": "disabled",
2848
+ "type": "boolean",
2849
+ "required": false,
2850
+ "default": "false",
2851
+ "description": "Disable the input and both buttons."
2852
+ },
2853
+ {
2854
+ "name": "decreaseLabel",
2855
+ "type": "string",
2856
+ "required": false,
2857
+ "default": "undefined",
2858
+ "description": "Override the decrease button's accessible label. Default: \"Decrease\", plus the input's aria-label."
2859
+ },
2860
+ {
2861
+ "name": "increaseLabel",
2862
+ "type": "string",
2863
+ "required": false,
2864
+ "default": "undefined",
2865
+ "description": "Override the increase button's accessible label. Default: \"Increase\", plus the input's aria-label."
2866
+ }
2867
+ ],
2868
+ "events": [
2869
+ {
2870
+ "name": "update:modelValue",
2871
+ "description": "",
2872
+ "properties": []
2873
+ }
2874
+ ],
2875
+ "slots": [],
2876
+ "methods": []
2877
+ },
2740
2878
  {
2741
2879
  "name": "DXNumericField",
2742
2880
  "category": "extended",
@@ -2955,6 +3093,70 @@
2955
3093
  ],
2956
3094
  "methods": []
2957
3095
  },
3096
+ {
3097
+ "name": "DXSaveButton",
3098
+ "category": "extended",
3099
+ "filePath": "resources/js/components/extended/DXSaveButton.vue",
3100
+ "description": "DXSaveButton — a save button that confirms the save in place. Three states, driven by two booleans the consumer owns: - idle (`saving` and `saved` both false) — the normal Save button. - saving (`saving`) — DButton's busy state: disabled at once, spinner after the anti-flash delay, `savingText` if given. - saved (`saved` and not `saving`) — \"✓ Saved\" (tick icon) and genuinely `disabled`, until the consumer clears `saved` (typically on the next edit to the form). The colour does not change: the button keeps its own variant (navy primary by default) at full strength, neither the neutral grey of a disabled button nor a faded one. Only the label and the disabled state say it is saved. `saving` wins over `saved`, so re-saving from the saved state shows busy. The label change is announced: the button itself is a polite live region, and while it is `aria-busy` (saving) announcements wait until it settles, so a screen reader hears \"Saved\" once the save lands. Every other attribute (type, block, size, class, listeners…) passes through to DButton. DXForm uses this for its submit button.",
3101
+ "props": [
3102
+ {
3103
+ "name": "saving",
3104
+ "type": "boolean",
3105
+ "required": false,
3106
+ "default": "false",
3107
+ "description": "A save is in flight: busy/spinner state (DButton's `loading`)."
3108
+ },
3109
+ {
3110
+ "name": "saved",
3111
+ "type": "boolean",
3112
+ "required": false,
3113
+ "default": "false",
3114
+ "description": "The form's current contents have been saved: show `savedText` with a\ntick and disable the button. Clear it when the form changes."
3115
+ },
3116
+ {
3117
+ "name": "savedText",
3118
+ "type": "string",
3119
+ "required": false,
3120
+ "default": "\"Saved\"",
3121
+ "description": "Label for the saved state. @default 'Saved'"
3122
+ },
3123
+ {
3124
+ "name": "savingText",
3125
+ "type": "string",
3126
+ "required": false,
3127
+ "description": "Label shown beside the spinner while saving (DButton's `loadingText`)."
3128
+ },
3129
+ {
3130
+ "name": "variant",
3131
+ "type": "union",
3132
+ "required": false,
3133
+ "default": "\"primary\"",
3134
+ "description": "Variant in every state; the saved state keeps it. @default 'primary'"
3135
+ },
3136
+ {
3137
+ "name": "icon",
3138
+ "type": "string",
3139
+ "required": false,
3140
+ "description": "Leading icon when not saved. The saved state shows `check-lg`."
3141
+ },
3142
+ {
3143
+ "name": "disabled",
3144
+ "type": "boolean",
3145
+ "required": false,
3146
+ "default": "false",
3147
+ "description": "Disable the button regardless of state."
3148
+ }
3149
+ ],
3150
+ "events": [],
3151
+ "slots": [
3152
+ {
3153
+ "name": "default",
3154
+ "description": "",
3155
+ "bindings": []
3156
+ }
3157
+ ],
3158
+ "methods": []
3159
+ },
2958
3160
  {
2959
3161
  "name": "DXStatCard",
2960
3162
  "category": "extended",
@@ -3079,7 +3281,7 @@
3079
3281
  "name": "DXSwitch",
3080
3282
  "category": "extended",
3081
3283
  "filePath": "resources/js/components/extended/DXSwitch.vue",
3082
- "description": "DXSwitch — a \"filled box\" toggle switch. An opinionated switch built on `DFormCheckbox` (`switch`): a bordered box sized like a `.form-control` with the label on the left and the toggle on the right, colour-coding its state. By default (`onVariant=\"success\"`) it reads the house green-on / red-off style: a light-red box with a grey toggle when off, a soft-green box with a muted green-grey toggle when on. `onVariant=\"neutral\"` (brand primary on / grey off) is for semantically-mixed switches that shouldn't imply good/bad (#158). Used standalone or, internally, by `DXField`'s `switch` field type so a form switch and a lone switch share one look. Usage: ```vue <DXSwitch v-model=\"isCurrent\" label=\"Product is current\" /> ``` For a form field, prefer a `DXField`/`DXForm` `type: 'switch'`; reach for `DXSwitch` directly when you want the styled toggle outside a form. Pass a `label` prop for simple text, or the default slot for richer label content.",
3284
+ "description": "DXSwitch — a \"filled box\" toggle switch. An opinionated switch built on `DFormCheckbox` (`switch`): a bordered box sized like a `.form-control` with the label on the left and the toggle on the right, colour-coding its state. By default (`onVariant=\"success\"`) it reads the house green-on / red-off style: a light-red box with a muted red-grey toggle when off, a soft-green box with a muted green-grey toggle when on. `onVariant=\"neutral\"` (brand primary on / grey off) is for semantically-mixed switches that shouldn't imply good/bad (#158). Used standalone or, internally, by `DXField`'s `switch` field type so a form switch and a lone switch share one look. Usage: ```vue <DXSwitch v-model=\"isCurrent\" label=\"Product is current\" /> ``` For a form field, prefer a `DXField`/`DXForm` `type: 'switch'`; reach for `DXSwitch` directly when you want the styled toggle outside a form. Pass a `label` prop for simple text, or the default slot for richer label content.",
3083
3285
  "props": [
3084
3286
  {
3085
3287
  "name": "modelValue",
@@ -3117,7 +3319,7 @@
3117
3319
  "name": "size",
3118
3320
  "type": "\"sm\"",
3119
3321
  "required": false,
3120
- "description": "`\"sm\"` renders a compact box (a few px shorter than the default, which\nmatches the input height) for dense rows that repeat the switch per item (a\nper-line visibility toggle in a modal). Omit for the standard size, which\nlines the switch up with the `.form-control`\nheight so a switch lines up with inputs beside it."
3322
+ "description": "`\"sm\"` renders a compact rounded pill (a few px shorter than the default, which\nmatches the input height) for dense rows that repeat the switch per item (a\nper-line visibility toggle in a modal). Omit for the standard size, which\nlines the switch up with the `.form-control`\nheight so a switch lines up with inputs beside it."
3121
3323
  }
3122
3324
  ],
3123
3325
  "events": [
@@ -3257,7 +3459,7 @@
3257
3459
  "type": "PaginationData",
3258
3460
  "required": false,
3259
3461
  "default": "() => ({\n current_page: 1,\n per_page: 15,\n total: 0,\n from: 0,\n to: 0,\n})",
3260
- "description": "Pagination data (Inertia mode)"
3462
+ "description": "Pagination data (Inertia mode). Omit it on a plain `items` table and the\nfooter counts the rows given as one page."
3261
3463
  },
3262
3464
  {
3263
3465
  "name": "showPagination",
@@ -3385,7 +3587,7 @@
3385
3587
  "name": "editLabelCols",
3386
3588
  "type": "LabelCols",
3387
3589
  "required": false,
3388
- "description": "Label column width for the edit modal's horizontal layout, forwarded to\n`DXForm`'s `labelCols` (a single width or a per-breakpoint object). Only\nmeaningful when `editLayout` is \"horizontal\"."
3590
+ "description": "Label column width for the edit modal's horizontal layout, forwarded to\n`DXForm`'s `labelCols` (a single width or a per-breakpoint object). Only\nmeaningful when `editLayout` is \"horizontal\". Omitted: DXForm's default\n45% label column."
3389
3591
  },
3390
3592
  {
3391
3593
  "name": "editCard",
@@ -4000,7 +4202,7 @@
4000
4202
  "name": "DXTablePagination",
4001
4203
  "category": "extended",
4002
4204
  "filePath": "resources/js/components/extended/DXTablePagination.vue",
4003
- "description": "Internal pagination + per-page footer for `DXTable`. Renders the pager, the per-page selector, and the \"X to Y out of Z items\" info line (with the \"Filtered from N\" note when a column filter is active). Extracted because `DXTable` used to carry three byte-identical copies of this footer — one per data mode (client-side / inertia / provider) — that differed only in which `PaginationData` object and page-change handler they used, so every footer fix had to be written three times (#123). `DXTable` now derives the active pagination + handler and renders this once. It owns its own `:deep(.pagination …)` styling (rather than leaving it in `DXTable`), because a scoped `:deep()` in `DXTable` would not reach the pager once it lives in a child component — the scope-id doesn't cross the boundary. Anchoring the rules on this component's own `.dx-table-pagination` root (a plain element it owns) gives the scope-id a deterministic host. In a row too narrow for the full windowed pager, the number strip collapses to a \"current / last\" status with Previous/Next either side (#162). The decision is CONTAINER-driven, not viewport-driven — see `compactThreshold`.",
4205
+ "description": "Pagination + per-page footer shared by `DXTable` and standalone tables. Renders the pager, the per-page selector, and the \"X to Y out of Z items\" info line (with the \"Filtered from N\" note when a column filter is active). Extracted because `DXTable` used to carry three byte-identical copies of this footer — one per data mode (client-side / inertia / provider) — that differed only in which `PaginationData` object and page-change handler they used, so every footer fix had to be written three times (#123). `DXTable` now derives the active pagination + handler and renders this once. It owns its own `:deep(.pagination …)` styling (rather than leaving it in `DXTable`), because a scoped `:deep()` in `DXTable` would not reach the pager once it lives in a child component — the scope-id doesn't cross the boundary. Anchoring the rules on this component's own `.dx-table-pagination` root (a plain element it owns) gives the scope-id a deterministic host. In a row too narrow for the full windowed pager, the number strip collapses to a \"current / last\" status with Previous/Next either side (#162). The decision is CONTAINER-driven, not viewport-driven — see `compactThreshold`.",
4004
4206
  "props": [
4005
4207
  {
4006
4208
  "name": "pagination",
@@ -4163,8 +4365,8 @@
4163
4365
  ]
4164
4366
  },
4165
4367
  "stats": {
4166
- "totalComponents": 84,
4368
+ "totalComponents": 88,
4167
4369
  "baseComponents": 60,
4168
- "extendedComponents": 24
4370
+ "extendedComponents": 28
4169
4371
  }
4170
4372
  }
@@ -1,7 +1,7 @@
1
1
  # Documentation Map
2
2
 
3
3
  > Auto-generated hierarchical overview of all documentation
4
- > Last updated: 2026-09-27T10:14:02.445Z
4
+ > Last updated: 2026-10-04T09:15:58.053Z
5
5
 
6
6
  This file provides a complete map of all available documentation for AI agents and developers.
7
7
 
@@ -79,7 +79,9 @@ This file provides a complete map of all available documentation for AI agents a
79
79
  - [DXDashboardSidebar](/components/extended/DXDashboardSidebar): A collapsible sidebar navigation component for Laravel dashboards with support for navigation groups
80
80
  - [DXField](/components/extended/DXField): The single-field renderer that powers `DXForm` and
81
81
  - [DXForm](/components/extended/DXForm): The canonical form renderer. Drive it with field definitions; add `tabs` when
82
+ - [DXNumberStepper](/components/extended/DXNumberStepper): A number input between a decrease and an increase button, `[ − ][ 12 ][ + ]`,
82
83
  - [DXRepeater](/components/extended/DXRepeater): A repeatable sub-form (field array) primitive for nested, dynamic collections —
84
+ - [DXSaveButton](/components/extended/DXSaveButton): A save button that confirms the save in place. While saving it shows
83
85
  - [DXStatCard](/components/extended/DXStatCard): A KPI / stat tile: a big formatted value with a title, optional subtitle, an
84
86
  - [DXSwitch](/components/extended/DXSwitch): A "filled box" toggle switch built on `DFormCheckbox`: a bordered box sized like
85
87
  - [DXTable](/components/extended/DXTable): A comprehensive data table component with built-in pagination, sorting, filtering, and CRUD operatio
@@ -102,4 +104,4 @@ This file provides a complete map of all available documentation for AI agents a
102
104
 
103
105
  ---
104
106
 
105
- **Total Pages**: 78
107
+ **Total Pages**: 80
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Vue 3 dashboard components for Laravel with Bootstrap Vue Next
4
4
  >
5
- > A dual-package library (NPM + Composer) providing 73 Vue 3 components for building Laravel dashboards with Bootstrap Vue Next.
5
+ > A dual-package library (NPM + Composer) providing 78 Vue 3 components for building Laravel dashboards with Bootstrap Vue Next.
6
6
 
7
7
  ## Installation
8
8
 
@@ -84,7 +84,7 @@ Lightweight type-safe wrappers around Bootstrap Vue Next components providing AP
84
84
  - [DToaster](/components/base/dtoaster): Bootstrap Vue Next Toaster wrapper
85
85
  - [DTooltip](/components/base/dtooltip): Bootstrap Vue Next Tooltip wrapper
86
86
 
87
- ## Extended Components (13 components)
87
+ ## Extended Components (18 components)
88
88
 
89
89
  Custom dashboard components with advanced functionality beyond Bootstrap Vue Next.
90
90
 
@@ -96,10 +96,15 @@ Custom dashboard components with advanced functionality beyond Bootstrap Vue Nex
96
96
  - [DXField](/components/extended/dxfield): Single-field renderer for any field type with value/span/info/hint slots
97
97
  - [DXFieldLabel](/components/extended/dxfieldlabel): Extended dashboard component
98
98
  - [DXForm](/components/extended/dxform): Form renderer driven by field definitions, with optional tabs, conditional fields, per-field slots, async options, nested repeaters, and auto error-tab switching
99
+ - [DXLoading](/components/extended/dxloading): Extended dashboard component
100
+ - [DXModalActions](/components/extended/dxmodalactions): Extended dashboard component
101
+ - [DXNumberStepper](/components/extended/dxnumberstepper): Extended dashboard component
99
102
  - [DXRepeater](/components/extended/dxrepeater): Repeatable nested sub-form (field array) primitive
103
+ - [DXSaveButton](/components/extended/dxsavebutton): Extended dashboard component
100
104
  - [DXStatCard](/components/extended/dxstatcard): Extended dashboard component
101
105
  - [DXSwitch](/components/extended/dxswitch): Extended dashboard component
102
106
  - [DXTable](/components/extended/dxtable): Data table with pagination, filtering, and sorting
107
+ - [DXTablePagination](/components/extended/dxtablepagination): Extended dashboard component
103
108
  - [DXUserAvatar](/components/extended/dxuseravatar): Extended dashboard component
104
109
 
105
110
  ## Composables
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omnitend/dashboard-for-laravel",
3
- "version": "0.41.1",
3
+ "version": "0.42.0",
4
4
  "description": "Vue 3 dashboard components for Laravel with Bootstrap Vue Next",
5
5
  "type": "module",
6
6
  "main": "./dist/dashboard-for-laravel.umd.cjs",