@omnitend/dashboard-for-laravel 0.42.1 → 0.43.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 (30) hide show
  1. package/dist/components/extended/DXCurrencyInput.vue.d.ts +2 -2
  2. package/dist/components/extended/DXDashboard.vue.d.ts +14 -6
  3. package/dist/components/extended/DXDashboardNavbar.vue.d.ts +12 -3
  4. package/dist/components/extended/DXDashboardSidebar.vue.d.ts +21 -1
  5. package/dist/components/extended/DXStackingTable.vue.d.ts +25 -0
  6. package/dist/dashboard-for-laravel.js +10345 -10102
  7. package/dist/dashboard-for-laravel.js.map +1 -1
  8. package/dist/dashboard-for-laravel.umd.cjs +7 -7
  9. package/dist/dashboard-for-laravel.umd.cjs.map +1 -1
  10. package/dist/index.d.ts +2 -1
  11. package/dist/style.css +1 -1
  12. package/dist/types/navigation.d.ts +8 -0
  13. package/dist/utils/pageScrollLock.d.ts +9 -0
  14. package/docs/public/api-reference.json +82 -8
  15. package/docs/public/docs-map.md +3 -2
  16. package/docs/public/llms.txt +3 -2
  17. package/package.json +1 -1
  18. package/resources/css/theme.scss +452 -36
  19. package/resources/js/components/base/DModal.vue +20 -2
  20. package/resources/js/components/extended/DXCurrencyInput.vue +3 -1
  21. package/resources/js/components/extended/DXDashboard.vue +236 -43
  22. package/resources/js/components/extended/DXDashboardNavbar.vue +23 -13
  23. package/resources/js/components/extended/DXDashboardSidebar.vue +103 -29
  24. package/resources/js/components/extended/DXNumberStepper.vue +35 -13
  25. package/resources/js/components/extended/DXStackingTable.vue +264 -0
  26. package/resources/js/components/extended/DXTableEditorModal.vue +107 -93
  27. package/resources/js/composables/useContainerWidth.ts +12 -3
  28. package/resources/js/index.ts +2 -0
  29. package/resources/js/types/navigation.ts +9 -0
  30. package/resources/js/utils/pageScrollLock.ts +27 -0
@@ -34,6 +34,14 @@ export type Navigation = NavigationGroup[];
34
34
  * Shared by DXDashboard (which forwards it) and DXDashboardNavbar.
35
35
  */
36
36
  export type NavbarSearchAlign = "start" | "center";
37
+ /**
38
+ * Colour scheme of the dashboard sidebar: `"light"` (the default: a white pane,
39
+ * tinted group headers, a green active item, Poppins) or `"dark"` (the navy
40
+ * rail dfl shipped before). Every colour comes from a `--dx-sidebar-*` custom
41
+ * property, so either can be rebranded in CSS. Shared by DXDashboard (which
42
+ * forwards it as `sidebarVariant`) and DXDashboardSidebar (`variant`).
43
+ */
44
+ export type SidebarVariant = "light" | "dark";
37
45
  /**
38
46
  * What the navbar actions slot does below the `md` breakpoint: `"wrap"` moves
39
47
  * it to its own full-width row (the bar grows), `"hide"` removes it entirely
@@ -0,0 +1,9 @@
1
+ /**
2
+ * The class on <html> that stops the page scrolling behind DXDashboard's open
3
+ * phone menu (styled in theme.scss, below `sm` only).
4
+ */
5
+ export declare const PAGE_SCROLL_LOCK_CLASS = "dx-dashboard-menu-open";
6
+ /** Hold the page scroll lock for `owner`. Idempotent. */
7
+ export declare const acquirePageScrollLock: (owner: object) => void;
8
+ /** Release `owner`'s hold; the page unlocks once no owner holds it. Idempotent. */
9
+ export declare const releasePageScrollLock: (owner: object) => void;
@@ -1,8 +1,8 @@
1
1
  {
2
- "generated": "2026-10-05T05:06:30.259Z",
2
+ "generated": "2026-10-06T10:54:58.446Z",
3
3
  "package": {
4
4
  "name": "@omnitend/dashboard-for-laravel",
5
- "version": "0.42.1"
5
+ "version": "0.43.0"
6
6
  },
7
7
  "components": {
8
8
  "base": [
@@ -907,7 +907,7 @@
907
907
  "name": "DModal",
908
908
  "category": "base",
909
909
  "filePath": "resources/js/components/base/DModal.vue",
910
- "description": "",
910
+ "description": "Wrapper around bootstrap-vue-next's BModal. Two defaults differ from bvn's: `size=\"lg\"` (room for horizontal form labels on desktop) and `fullscreen=\"sm\"`: below 576px the modal covers the whole screen, with the header and footer pinned and the body scrolling between them (Bootstrap's `.modal-fullscreen-sm-down`). A `size=\"sm\"` modal (a short confirmation) keeps the centred small dialog on phones too. Pass `fullscreen` explicitly to override either way, e.g. `:fullscreen=\"false\"` to opt out.",
911
911
  "props": [],
912
912
  "events": [],
913
913
  "slots": [
@@ -1649,6 +1649,13 @@
1649
1649
  "default": "true",
1650
1650
  "description": "Only relevant when `collapsibleGroups` is on. `true` (default): only the\nactive-route group starts open and opening one closes the others\n(single-open accordion). `false`: all groups start open, toggled independently."
1651
1651
  },
1652
+ {
1653
+ "name": "sidebarVariant",
1654
+ "type": "SidebarVariant",
1655
+ "required": false,
1656
+ "default": "'light'",
1657
+ "description": "Sidebar colour scheme, forwarded to DXDashboardSidebar as `variant`:\n`'light'` (default: white pane, tinted group headers, green active item,\nPoppins) or `'dark'` (the navy rail). Colours come from the\n`--dx-sidebar-*` custom properties, so either can be rebranded in CSS."
1658
+ },
1652
1659
  {
1653
1660
  "name": "storageKey",
1654
1661
  "type": "string",
@@ -1725,7 +1732,7 @@
1725
1732
  "type": "NavbarSearchAlign",
1726
1733
  "required": false,
1727
1734
  "default": "\"start\"",
1728
- "description": "Horizontal alignment of the search slot content within its region\n(`\"start\"` = flush left, `\"center\"` = centred). Applies at every size:\nthe region sits inline after the title from `md` up, and is its own\nfull-width row below."
1735
+ "description": "Horizontal alignment of the search slot content within its region\n(`\"start\"` = flush left, `\"center\"` = centred). The region sits inline\nbetween the toggle/title and the user menu at every width."
1729
1736
  },
1730
1737
  {
1731
1738
  "name": "actionsOnMobile",
@@ -1740,6 +1747,20 @@
1740
1747
  "required": false,
1741
1748
  "default": "\"User menu\"",
1742
1749
  "description": "Accessible name for the user-menu trigger. Without one, a screen reader\nannounces the trigger as the avatar's initial (\"J\") rather than as a menu."
1750
+ },
1751
+ {
1752
+ "name": "sidebarExpanded",
1753
+ "type": "boolean",
1754
+ "required": false,
1755
+ "default": "undefined",
1756
+ "description": "Whether the sidebar the toggle controls is showing, exposed as the\ntoggle's `aria-expanded`. Left unset, the toggle carries none.\nDXDashboard sets it."
1757
+ },
1758
+ {
1759
+ "name": "sidebarId",
1760
+ "type": "string",
1761
+ "required": false,
1762
+ "default": "\"\"",
1763
+ "description": "`id` of the sidebar the toggle controls (its `aria-controls`)."
1743
1764
  }
1744
1765
  ],
1745
1766
  "events": [
@@ -1757,7 +1778,7 @@
1757
1778
  },
1758
1779
  {
1759
1780
  "name": "search",
1760
- "description": "Search input or component. Aligned per `searchAlign` within its region (inline in the bar from `md` up; its own full-width row below).",
1781
+ "description": "Search input or component. Fills the middle of the bar at every width, aligned per `searchAlign`. The region is a size container named `dx-navbar-search`; a `<kbd>` hint inside it is hidden when it is narrower than 16rem.",
1761
1782
  "bindings": []
1762
1783
  },
1763
1784
  {
@@ -1879,13 +1900,37 @@
1879
1900
  "required": false,
1880
1901
  "default": "true",
1881
1902
  "description": "Only relevant when `collapsibleGroups` is on.\n`true` (default): only the active-route group starts open, and opening one\ngroup closes the others (single-open accordion).\n`false`: all groups start open and toggle independently."
1903
+ },
1904
+ {
1905
+ "name": "variant",
1906
+ "type": "SidebarVariant",
1907
+ "required": false,
1908
+ "default": "'light'",
1909
+ "description": "Colour scheme: `'light'` (default) or `'dark'`. Colours come from the\n`--dx-sidebar-*` custom properties (see the theming guide), so either\nscheme can be rebranded in CSS."
1910
+ },
1911
+ {
1912
+ "name": "phoneMenu",
1913
+ "type": "boolean",
1914
+ "required": false,
1915
+ "default": "false",
1916
+ "description": "Below `sm`, show the open sidebar as a full-screen menu over the page,\nwith a close button (which emits `close`), instead of a rail beside it;\nhidden there until opened. The owner must answer `close`, Escape and\n`navigate`: DXDashboard sets this and does. Off by default, so a\nstandalone sidebar keeps its rail on phones."
1882
1917
  }
1883
1918
  ],
1884
1919
  "events": [
1920
+ {
1921
+ "name": "close",
1922
+ "description": "Emitted by the close button shown below `sm`, where the open sidebar covers the screen.",
1923
+ "properties": []
1924
+ },
1885
1925
  {
1886
1926
  "name": "toggle",
1887
1927
  "description": "Emitted to request toggling the sidebar's collapsed/expanded state.",
1888
1928
  "properties": []
1929
+ },
1930
+ {
1931
+ "name": "navigate",
1932
+ "description": "Emitted when a link anywhere in the sidebar is followed (a plain click,\nnot one that opens a new tab): the navigation, including links rendered\nthrough the `link` slot, and the `brand` and `footer` slots. DXDashboard\nuses it to close the full-screen menu on a phone.",
1933
+ "properties": []
1889
1934
  }
1890
1935
  ],
1891
1936
  "slots": [
@@ -2806,7 +2851,7 @@
2806
2851
  "name": "DXNumberStepper",
2807
2852
  "category": "extended",
2808
2853
  "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`.",
2854
+ "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. - Controlled: steps, the bound checks and blur all read `modelValue`. A parent may decline an emitted value (keep 2 when 2.5 is typed): blur then shows 2, + goes to 3, and a declined step is not left on screen. - 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
2855
  "props": [
2811
2856
  {
2812
2857
  "name": "modelValue",
@@ -3157,6 +3202,35 @@
3157
3202
  ],
3158
3203
  "methods": []
3159
3204
  },
3205
+ {
3206
+ "name": "DXStackingTable",
3207
+ "category": "extended",
3208
+ "filePath": "resources/js/components/extended/DXStackingTable.vue",
3209
+ "description": "",
3210
+ "props": [
3211
+ {
3212
+ "name": "stackBelow",
3213
+ "type": "number",
3214
+ "required": false,
3215
+ "default": "576",
3216
+ "description": "Stack when the wrapper's content width is below this many px. 576 is\nBootstrap's `sm` breakpoint, but measured on the container."
3217
+ }
3218
+ ],
3219
+ "events": [],
3220
+ "slots": [
3221
+ {
3222
+ "name": "default",
3223
+ "description": "The consumer's own `<table>`, as the wrapper's direct child.",
3224
+ "bindings": [
3225
+ {
3226
+ "name": "stacked",
3227
+ "title": "binding"
3228
+ }
3229
+ ]
3230
+ }
3231
+ ],
3232
+ "methods": []
3233
+ },
3160
3234
  {
3161
3235
  "name": "DXStatCard",
3162
3236
  "category": "extended",
@@ -4365,8 +4439,8 @@
4365
4439
  ]
4366
4440
  },
4367
4441
  "stats": {
4368
- "totalComponents": 88,
4442
+ "totalComponents": 89,
4369
4443
  "baseComponents": 60,
4370
- "extendedComponents": 28
4444
+ "extendedComponents": 29
4371
4445
  }
4372
4446
  }
@@ -1,7 +1,7 @@
1
1
  # Documentation Map
2
2
 
3
3
  > Auto-generated hierarchical overview of all documentation
4
- > Last updated: 2026-10-05T05:06:30.315Z
4
+ > Last updated: 2026-10-06T10:54:58.500Z
5
5
 
6
6
  This file provides a complete map of all available documentation for AI agents and developers.
7
7
 
@@ -82,6 +82,7 @@ This file provides a complete map of all available documentation for AI agents a
82
82
  - [DXNumberStepper](/components/extended/DXNumberStepper): A number input between a decrease and an increase button, `[ − ][ 12 ][ + ]`,
83
83
  - [DXRepeater](/components/extended/DXRepeater): A repeatable sub-form (field array) primitive for nested, dynamic collections —
84
84
  - [DXSaveButton](/components/extended/DXSaveButton): A save button that confirms the save in place. While saving it shows
85
+ - [DXStackingTable](/components/extended/DXStackingTable): A wrapper for a table you write yourself (an order's lines with price and
85
86
  - [DXStatCard](/components/extended/DXStatCard): A KPI / stat tile: a big formatted value with a title, optional subtitle, an
86
87
  - [DXSwitch](/components/extended/DXSwitch): A "filled box" toggle switch built on `DFormCheckbox`: a bordered box sized like
87
88
  - [DXTable](/components/extended/DXTable): A comprehensive data table component with built-in pagination, sorting, filtering, and CRUD operatio
@@ -104,4 +105,4 @@ This file provides a complete map of all available documentation for AI agents a
104
105
 
105
106
  ---
106
107
 
107
- **Total Pages**: 80
108
+ **Total Pages**: 81
@@ -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 78 Vue 3 components for building Laravel dashboards with Bootstrap Vue Next.
5
+ > A dual-package library (NPM + Composer) providing 79 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 (18 components)
87
+ ## Extended Components (19 components)
88
88
 
89
89
  Custom dashboard components with advanced functionality beyond Bootstrap Vue Next.
90
90
 
@@ -101,6 +101,7 @@ Custom dashboard components with advanced functionality beyond Bootstrap Vue Nex
101
101
  - [DXNumberStepper](/components/extended/dxnumberstepper): Extended dashboard component
102
102
  - [DXRepeater](/components/extended/dxrepeater): Repeatable nested sub-form (field array) primitive
103
103
  - [DXSaveButton](/components/extended/dxsavebutton): Extended dashboard component
104
+ - [DXStackingTable](/components/extended/dxstackingtable): Extended dashboard component
104
105
  - [DXStatCard](/components/extended/dxstatcard): Extended dashboard component
105
106
  - [DXSwitch](/components/extended/dxswitch): Extended dashboard component
106
107
  - [DXTable](/components/extended/dxtable): Data table with pagination, filtering, and sorting
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omnitend/dashboard-for-laravel",
3
- "version": "0.42.1",
3
+ "version": "0.43.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",