@omnitend/dashboard-for-laravel 0.28.0 → 0.29.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 (32) hide show
  1. package/dist/charts.d.ts +19 -0
  2. package/dist/charts.js +225 -0
  3. package/dist/charts.js.map +1 -0
  4. package/dist/charts.umd.cjs +2 -0
  5. package/dist/charts.umd.cjs.map +1 -0
  6. package/dist/components/base/DAlert.vue.d.ts +6 -1
  7. package/dist/components/base/DFormCheckboxGroup.vue.d.ts +12 -0
  8. package/dist/components/extended/DXDashboardSidebar.vue.d.ts +2 -2
  9. package/dist/components/extended/DXField.vue.d.ts +4 -4
  10. package/dist/components/extended/DXForm.vue.d.ts +1 -1
  11. package/dist/dashboard-for-laravel.js +4371 -4554
  12. package/dist/dashboard-for-laravel.js.map +1 -1
  13. package/dist/dashboard-for-laravel.umd.cjs +7 -7
  14. package/dist/dashboard-for-laravel.umd.cjs.map +1 -1
  15. package/dist/index.d.ts +1 -3
  16. package/dist/style.css +1 -1
  17. package/dist/types/index.d.ts +1 -1
  18. package/docs/public/api-reference.json +33 -4
  19. package/docs/public/docs-map.md +1 -1
  20. package/docs/public/llms.txt +3 -2
  21. package/package.json +11 -5
  22. package/resources/css/theme.scss +21 -7
  23. package/resources/js/charts.ts +19 -0
  24. package/resources/js/components/base/DAlert.vue +19 -1
  25. package/resources/js/components/base/DFormCheckboxGroup.vue +22 -0
  26. package/resources/js/components/charts/DXBarChart.vue +0 -9
  27. package/resources/js/components/charts/DXDoughnutChart.vue +0 -9
  28. package/resources/js/components/charts/DXLineChart.vue +0 -9
  29. package/resources/js/components/extended/DXField.vue +12 -0
  30. package/resources/js/composables/useForm.ts +10 -1
  31. package/resources/js/index.ts +4 -3
  32. package/resources/js/types/index.ts +1 -0
@@ -1,5 +1,5 @@
1
1
  {
2
- "generated": "2026-07-18T13:55:43.374Z",
2
+ "generated": "2026-07-19T09:16:53.630Z",
3
3
  "package": {
4
4
  "name": "@omnitend/dashboard-for-laravel",
5
5
  "version": "0.28.0"
@@ -53,7 +53,15 @@
53
53
  "category": "base",
54
54
  "filePath": "resources/js/components/base/DAlert.vue",
55
55
  "description": "",
56
- "props": [],
56
+ "props": [
57
+ {
58
+ "name": "modelValue",
59
+ "type": "union",
60
+ "required": false,
61
+ "default": "true",
62
+ "description": ""
63
+ }
64
+ ],
57
65
  "events": [],
58
66
  "slots": [
59
67
  {
@@ -481,6 +489,27 @@
481
489
  ],
482
490
  "methods": []
483
491
  },
492
+ {
493
+ "name": "DFormCheckboxGroup",
494
+ "category": "base",
495
+ "filePath": "resources/js/components/base/DFormCheckboxGroup.vue",
496
+ "description": "Type-safe wrapper around Bootstrap Vue Next BFormCheckboxGroup component. Renders a group of checkboxes from an `options` array (or slot content); the `v-model` is the ARRAY of checked option values (\"pick any of N\").",
497
+ "props": [],
498
+ "events": [],
499
+ "slots": [
500
+ {
501
+ "name": "name",
502
+ "description": "",
503
+ "bindings": [
504
+ {
505
+ "name": "name",
506
+ "title": "binding"
507
+ }
508
+ ]
509
+ }
510
+ ],
511
+ "methods": []
512
+ },
484
513
  {
485
514
  "name": "DFormGroup",
486
515
  "category": "base",
@@ -3481,8 +3510,8 @@
3481
3510
  ]
3482
3511
  },
3483
3512
  "stats": {
3484
- "totalComponents": 75,
3485
- "baseComponents": 56,
3513
+ "totalComponents": 76,
3514
+ "baseComponents": 57,
3486
3515
  "extendedComponents": 19
3487
3516
  }
3488
3517
  }
@@ -1,7 +1,7 @@
1
1
  # Documentation Map
2
2
 
3
3
  > Auto-generated hierarchical overview of all documentation
4
- > Last updated: 2026-07-18T13:55:43.432Z
4
+ > Last updated: 2026-07-19T09:16:53.689Z
5
5
 
6
6
  This file provides a complete map of all available documentation for AI agents and developers.
7
7
 
@@ -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 68 Vue 3 components for building Laravel dashboards with Bootstrap Vue Next.
5
+ > A dual-package library (NPM + Composer) providing 69 Vue 3 components for building Laravel dashboards with Bootstrap Vue Next.
6
6
 
7
7
  ## Installation
8
8
 
@@ -19,7 +19,7 @@
19
19
  - [Theming](/guide/theming): Customize appearance with CSS variables
20
20
  - [TypeScript](/guide/typescript): TypeScript types and best practices
21
21
 
22
- ## Base Components (56 components)
22
+ ## Base Components (57 components)
23
23
 
24
24
  Lightweight type-safe wrappers around Bootstrap Vue Next components providing API stability and consistent theming.
25
25
 
@@ -43,6 +43,7 @@ Lightweight type-safe wrappers around Bootstrap Vue Next components providing AP
43
43
  - [DDropdownItem](/components/base/ddropdownitem): Bootstrap Vue Next DropdownItem wrapper
44
44
  - [DForm](/components/base/dform): Bootstrap Vue Next Form wrapper
45
45
  - [DFormCheckbox](/components/base/dformcheckbox): Bootstrap Vue Next FormCheckbox wrapper
46
+ - [DFormCheckboxGroup](/components/base/dformcheckboxgroup): Bootstrap Vue Next FormCheckboxGroup wrapper
46
47
  - [DFormGroup](/components/base/dformgroup): Bootstrap Vue Next FormGroup wrapper
47
48
  - [DFormInput](/components/base/dforminput): Bootstrap Vue Next FormInput wrapper
48
49
  - [DFormInvalidFeedback](/components/base/dforminvalidfeedback): Bootstrap Vue Next FormInvalidFeedback wrapper
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omnitend/dashboard-for-laravel",
3
- "version": "0.28.0",
3
+ "version": "0.29.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",
@@ -15,6 +15,11 @@
15
15
  "import": "./dist/dashboard-for-laravel.js",
16
16
  "require": "./dist/dashboard-for-laravel.umd.cjs"
17
17
  },
18
+ "./charts": {
19
+ "types": "./dist/charts.d.ts",
20
+ "import": "./dist/charts.js",
21
+ "require": "./dist/charts.umd.cjs"
22
+ },
18
23
  "./style.css": "./dist/style.css",
19
24
  "./theme.css": "./dist/style.css",
20
25
  "./theme.scss": "./resources/css/theme.scss"
@@ -29,13 +34,14 @@
29
34
  ],
30
35
  "scripts": {
31
36
  "dev": "vite build --watch",
32
- "build": "vite build && node scripts/extract-icon-font.mjs && vue-tsc --declaration --emitDeclarationOnly --outDir dist",
37
+ "build:lib": "vite build && vite build --config vite.config.charts.ts && node scripts/extract-icon-font.mjs",
38
+ "build": "npm run build:lib && vue-tsc --declaration --emitDeclarationOnly --outDir dist",
33
39
  "typecheck": "vue-tsc --noEmit",
34
- "pretest": "vite build",
40
+ "pretest": "npm run build:lib",
35
41
  "test": "vitest",
36
- "pretest:ui": "vite build",
42
+ "pretest:ui": "npm run build:lib",
37
43
  "test:ui": "vitest --ui",
38
- "pretest:headless": "vite build",
44
+ "pretest:headless": "npm run build:lib",
39
45
  "test:headless": "vitest --run --browser.headless",
40
46
  "docs:dev": "astro dev",
41
47
  "docs:build": "npm run docs:generate:ai && astro build && node scripts/check-docs-base-links.mjs",
@@ -436,14 +436,17 @@ $bootstrap-icons-font-src: url("bootstrap-icons/font/fonts/bootstrap-icons.woff2
436
436
 
437
437
  // Semantic variants: subtle tinted surface, driven through the CSS variable
438
438
  // the base `.toast` rule (above, and Bootstrap's own) already reads.
439
- @each $name, $color in (
440
- "success": $success,
441
- "danger": $danger,
442
- "warning": $warning,
443
- "info": $info
444
- ) {
439
+ //
440
+ // Sourced from each variant's `soft-bg` in $dx-variants (#143) — the same
441
+ // vivid-derived soft family badges/alerts use — so the toast hue tracks the
442
+ // palette and editing a `soft-bg` moves toasts too. Previously these mixed the
443
+ // dark *emphasis* base colours (greyer success/warning) and danger's saturated
444
+ // red (a pink, not the soft system's plum). Mixed 50% with white so a large
445
+ // toast surface stays fainter than a small badge while keeping the hue.
446
+ @each $name in ("success", "danger", "warning", "info") {
447
+ $variant: map.get($dx-variants, $name);
445
448
  &.toast-#{$name} {
446
- --bs-toast-bg: #{color.mix($color, $white, 8%)};
449
+ --bs-toast-bg: #{color.mix(map.get($variant, "soft-bg"), $white, 50%)};
447
450
  }
448
451
  }
449
452
  }
@@ -581,6 +584,17 @@ $dx-chart-palette: (#2563eb, #65a30d, #7c3aed, #0d9488, #ea580c, #0891b2, #d9770
581
584
  }
582
585
  }
583
586
 
587
+ // The chart container used by DXBarChart/DXLineChart/DXDoughnutChart (shipped
588
+ // from the `@omnitend/dashboard-for-laravel/charts` entry, #142). Global rather
589
+ // than a component scoped style so the charts entry emits NO CSS — chart
590
+ // consumers already import this stylesheet for the theme + palette variables.
591
+ .dx-chart {
592
+ position: relative;
593
+ width: 100%;
594
+ height: 100%;
595
+ min-height: 240px;
596
+ }
597
+
584
598
  // ----------------------------------------------------------------------------
585
599
  // Autocomplete
586
600
  // ----------------------------------------------------------------------------
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Chart entry point — `@omnitend/dashboard-for-laravel/charts` (#142).
3
+ *
4
+ * The chart components are the ONLY ones that need `chart.js` / `vue-chartjs`,
5
+ * so they live behind this separate subpath entry. The main entry
6
+ * (`@omnitend/dashboard-for-laravel`) never references the chart libraries, so
7
+ * they are genuinely OPTIONAL peers: a consumer that renders no charts installs
8
+ * neither and their build no longer fails resolving them.
9
+ *
10
+ * import { DXBarChart } from '@omnitend/dashboard-for-laravel/charts';
11
+ *
12
+ * Chart containers are styled by `.dx-chart` in the main stylesheet
13
+ * (`@omnitend/dashboard-for-laravel/style.css`), which chart consumers already
14
+ * import for the theme and the `--dx-chart-*` palette variables — so this entry
15
+ * ships no CSS of its own.
16
+ */
17
+ export { default as DXBarChart } from "./components/charts/DXBarChart.vue";
18
+ export { default as DXLineChart } from "./components/charts/DXLineChart.vue";
19
+ export { default as DXDoughnutChart } from "./components/charts/DXDoughnutChart.vue";
@@ -2,11 +2,29 @@
2
2
  import { BAlert } from "bootstrap-vue-next";
3
3
  import { useSlots } from "vue";
4
4
 
5
+ /*
6
+ * bootstrap-vue-next's BAlert defaults `modelValue` to `false`, so a bare static
7
+ * `<DAlert variant="info">…</DAlert>` silently renders NOTHING — a footgun that
8
+ * bit our own docs repeatedly (#144). Default it to `true` (visible) at the
9
+ * wrapper; every call site that already passes `v-model`/`:model-value` is
10
+ * unaffected — only the bare-static case (which was always a bug) changes.
11
+ *
12
+ * Care (see DIVERGENCES.md): declaring `modelValue` as a prop strips it from
13
+ * `$attrs`, so it is re-bound explicitly below. `emits` is left UNDECLARED so an
14
+ * `update:modelValue` listener keeps flowing through `$attrs` to BAlert — that's
15
+ * what lets `v-model` dismissal (and the auto-dismiss countdown) still
16
+ * round-trip. The type stays `boolean | number` (a number is the auto-dismiss
17
+ * duration in ms) — don't narrow it.
18
+ */
19
+ const props = withDefaults(defineProps<{ modelValue?: boolean | number }>(), {
20
+ modelValue: true,
21
+ });
22
+
5
23
  const slots = useSlots();
6
24
  </script>
7
25
 
8
26
  <template>
9
- <BAlert v-bind="$attrs">
27
+ <BAlert :model-value="props.modelValue" v-bind="$attrs">
10
28
  <template v-for="(_, name) in slots" :key="name" #[name]>
11
29
  <slot :name="name" />
12
30
  </template>
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @component
3
+ * Type-safe wrapper around Bootstrap Vue Next BFormCheckboxGroup component.
4
+ * Renders a group of checkboxes from an `options` array (or slot content); the
5
+ * `v-model` is the ARRAY of checked option values ("pick any of N").
6
+ */
7
+ <script setup lang="ts">
8
+ import { BFormCheckboxGroup } from "bootstrap-vue-next";
9
+
10
+ defineOptions({
11
+ inheritAttrs: false,
12
+ });
13
+ </script>
14
+
15
+ <template>
16
+ <BFormCheckboxGroup v-bind="$attrs">
17
+ <!-- Dynamically pass through all named slots with their props -->
18
+ <template v-for="(_, name) in $slots" :key="name" #[name]="slotProps">
19
+ <slot :name="name" v-bind="slotProps" />
20
+ </template>
21
+ </BFormCheckboxGroup>
22
+ </template>
@@ -68,12 +68,3 @@ const mergedOptions = computed(() =>
68
68
  ),
69
69
  );
70
70
  </script>
71
-
72
- <style scoped>
73
- .dx-chart {
74
- position: relative;
75
- width: 100%;
76
- height: 100%;
77
- min-height: 240px;
78
- }
79
- </style>
@@ -74,12 +74,3 @@ const mergedOptions = computed(() =>
74
74
  ),
75
75
  );
76
76
  </script>
77
-
78
- <style scoped>
79
- .dx-chart {
80
- position: relative;
81
- width: 100%;
82
- height: 100%;
83
- min-height: 240px;
84
- }
85
- </style>
@@ -68,12 +68,3 @@ const mergedOptions = computed(() =>
68
68
  ),
69
69
  );
70
70
  </script>
71
-
72
- <style scoped>
73
- .dx-chart {
74
- position: relative;
75
- width: 100%;
76
- height: 100%;
77
- min-height: 240px;
78
- }
79
- </style>
@@ -370,6 +370,17 @@
370
370
  v-bind="controlPropsWithGuards"
371
371
  />
372
372
 
373
+ <!-- Checkbox group: "pick any of N" — the model is an ARRAY of the
374
+ checked option values (default the field to []). -->
375
+ <DFormCheckboxGroup
376
+ v-else-if="field.type === 'checkbox-group'"
377
+ v-model="fieldValue"
378
+ :options="resolvedOptions"
379
+ :state="fieldState"
380
+ :disabled="isDisabled || isReadonly || isPlaintext"
381
+ v-bind="controlPropsWithGuards"
382
+ />
383
+
373
384
  <!-- File / image upload -->
374
385
  <div v-else-if="field.type === 'image' || field.type === 'file'">
375
386
  <DFormInput
@@ -554,6 +565,7 @@ import DFormInput from "../base/DFormInput.vue";
554
565
  import DFormTextarea from "../base/DFormTextarea.vue";
555
566
  import DFormSelect from "../base/DFormSelect.vue";
556
567
  import DFormRadioGroup from "../base/DFormRadioGroup.vue";
568
+ import DFormCheckboxGroup from "../base/DFormCheckboxGroup.vue";
557
569
  import DFormCheckbox from "../base/DFormCheckbox.vue";
558
570
  import DXSwitch from "./DXSwitch.vue";
559
571
  import DFormInvalidFeedback from "../base/DFormInvalidFeedback.vue";
@@ -255,7 +255,16 @@ export function useForm<TData extends Record<string, any>>(
255
255
 
256
256
  const payloadRaw = (
257
257
  options.transform
258
- ? options.transform(state.data as TData)
258
+ ? // Give `transform` a COPY of the form data (#150), so a transform
259
+ // that MUTATES what it receives — `data.allergens = assemble();
260
+ // return data` — shapes the outbound payload WITHOUT corrupting
261
+ // form state. (This is why consumers reach for a transform instead
262
+ // of mutating `form.data` in a validation guard.) A shallow copy:
263
+ // returning a new object is still the tidiest style, and a
264
+ // deeply-nested field should be replaced, not mutated in place.
265
+ options.transform({
266
+ ...(toRaw(state.data) as Record<string, any>),
267
+ } as TData)
259
268
  : (state.data as TData)
260
269
  ) as any;
261
270
 
@@ -11,9 +11,9 @@ export { default as DXField } from "./components/extended/DXField.vue";
11
11
  export { default as DXFieldLabel } from "./components/extended/DXFieldLabel.vue";
12
12
  export { default as DXSwitch } from "./components/extended/DXSwitch.vue";
13
13
  export { default as DXStatCard } from "./components/extended/DXStatCard.vue";
14
- export { default as DXBarChart } from "./components/charts/DXBarChart.vue";
15
- export { default as DXLineChart } from "./components/charts/DXLineChart.vue";
16
- export { default as DXDoughnutChart } from "./components/charts/DXDoughnutChart.vue";
14
+ // Chart components moved to the `@omnitend/dashboard-for-laravel/charts` entry
15
+ // (#142) so chart.js / vue-chartjs stay genuinely optional peers — the main
16
+ // entry no longer references them. See resources/js/charts.ts.
17
17
  export { default as DXRepeater } from "./components/extended/DXRepeater.vue";
18
18
  /**
19
19
  * @deprecated Use `DXForm`. `DXBasicForm` is a thin wrapper around `DXForm`
@@ -53,6 +53,7 @@ export { default as DDropdownDivider } from "./components/base/DDropdownDivider.
53
53
  export { default as DDropdownItem } from "./components/base/DDropdownItem.vue";
54
54
  export { default as DForm } from "./components/base/DForm.vue";
55
55
  export { default as DFormCheckbox } from "./components/base/DFormCheckbox.vue";
56
+ export { default as DFormCheckboxGroup } from "./components/base/DFormCheckboxGroup.vue";
56
57
  export { default as DFormGroup } from "./components/base/DFormGroup.vue";
57
58
  export { default as DFormInput } from "./components/base/DFormInput.vue";
58
59
  export { default as DFormInvalidFeedback } from "./components/base/DFormInvalidFeedback.vue";
@@ -31,6 +31,7 @@ export type FieldType =
31
31
  | "select"
32
32
  | "autocomplete"
33
33
  | "checkbox"
34
+ | "checkbox-group"
34
35
  | "switch"
35
36
  | "radio"
36
37
  | "image"