@alaarab/ogrid-vue-vuetify 2.0.8 → 2.0.11

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.
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, h } from 'vue';
2
- import { VBtn, VIcon, VMenu, VTooltip } from 'vuetify/components';
2
+ import { VBtn, VIcon, VMenu, VTooltip, VCard } from 'vuetify/components';
3
3
  import { useColumnHeaderFilterState, } from '@alaarab/ogrid-vue';
4
4
  import { TextFilterPopover } from './TextFilterPopover';
5
5
  import { MultiSelectFilterPopover } from './MultiSelectFilterPopover';
@@ -9,6 +9,7 @@ const _VBtn = VBtn;
9
9
  const _VIcon = VIcon;
10
10
  const _VMenu = VMenu;
11
11
  const _VTooltip = VTooltip;
12
+ const _VCard = VCard;
12
13
  export const ColumnHeaderFilter = defineComponent({
13
14
  name: 'ColumnHeaderFilter',
14
15
  props: {
@@ -145,11 +146,14 @@ export const ColumnHeaderFilter = defineComponent({
145
146
  h(_VBtn, {
146
147
  icon: true,
147
148
  size: 'x-small',
148
- variant: 'text',
149
- color: props.isSorted ? 'primary' : undefined,
149
+ variant: props.isSorted ? 'tonal' : 'text',
150
+ color: props.isSorted ? 'primary' : 'default',
150
151
  'aria-label': `Sort by ${props.columnName}`,
151
152
  title: props.isSorted ? (props.isSortedDescending ? 'Sorted descending' : 'Sorted ascending') : 'Sort',
152
153
  onClick: state.handlers.handleSortClick,
154
+ style: {
155
+ opacity: props.isSorted ? '1' : '0.7',
156
+ },
153
157
  }, () => h(_VIcon, { size: '16' }, () => props.isSorted
154
158
  ? (props.isSortedDescending ? 'mdi-arrow-down' : 'mdi-arrow-up')
155
159
  : 'mdi-swap-vertical')),
@@ -167,10 +171,13 @@ export const ColumnHeaderFilter = defineComponent({
167
171
  ...menuProps,
168
172
  icon: true,
169
173
  size: 'x-small',
170
- variant: 'text',
171
- color: state.hasActiveFilter.value || state.isFilterOpen.value ? 'primary' : undefined,
174
+ variant: (state.hasActiveFilter.value || state.isFilterOpen.value) ? 'tonal' : 'text',
175
+ color: (state.hasActiveFilter.value || state.isFilterOpen.value) ? 'primary' : 'default',
172
176
  'aria-label': `Filter ${props.columnName}`,
173
177
  title: `Filter ${props.columnName}`,
178
+ style: {
179
+ opacity: (state.hasActiveFilter.value || state.isFilterOpen.value) ? '1' : '0.7',
180
+ },
174
181
  }, () => h(_VIcon, { size: '16' }, () => 'mdi-filter-variant')),
175
182
  ...(state.hasActiveFilter.value ? [
176
183
  h('div', {
@@ -182,20 +189,23 @@ export const ColumnHeaderFilter = defineComponent({
182
189
  height: '6px',
183
190
  borderRadius: '50%',
184
191
  backgroundColor: 'rgb(var(--v-theme-primary))',
192
+ zIndex: '1',
185
193
  },
186
194
  }),
187
195
  ] : []),
188
196
  ]),
189
- default: () => h('div', {
197
+ default: () => h(_VCard, {
198
+ elevation: 8,
190
199
  ref: (el) => { state.popoverRef.value = el; },
191
200
  onClick: (e) => e.stopPropagation(),
192
- }, [
201
+ }, () => [
193
202
  h('div', {
194
203
  style: {
195
204
  borderBottom: '1px solid rgba(0,0,0,0.12)',
196
205
  padding: '8px 12px',
197
206
  fontWeight: '600',
198
207
  fontSize: '0.875rem',
208
+ backgroundColor: '#fff',
199
209
  },
200
210
  }, `Filter: ${props.columnName}`),
201
211
  renderPopoverContent(),
@@ -1,6 +1,6 @@
1
- import { defineComponent, h } from 'vue';
2
- import { VMenu, VList, VListItem } from 'vuetify/components';
3
- import { COLUMN_HEADER_MENU_ITEMS } from '@alaarab/ogrid-vue';
1
+ import { defineComponent, h, computed } from 'vue';
2
+ import { VMenu, VList, VListItem, VDivider } from 'vuetify/components';
3
+ import { getColumnHeaderMenuItems } from '@alaarab/ogrid-vue';
4
4
  export const ColumnHeaderMenu = defineComponent({
5
5
  name: 'ColumnHeaderMenu',
6
6
  props: {
@@ -10,9 +10,17 @@ export const ColumnHeaderMenu = defineComponent({
10
10
  onPinLeft: { type: Function, required: true },
11
11
  onPinRight: { type: Function, required: true },
12
12
  onUnpin: { type: Function, required: true },
13
+ onSortAsc: { type: Function, required: true },
14
+ onSortDesc: { type: Function, required: true },
15
+ onClearSort: { type: Function, required: true },
16
+ onAutosizeThis: { type: Function, required: true },
17
+ onAutosizeAll: { type: Function, required: true },
13
18
  canPinLeft: { type: Boolean, required: true },
14
19
  canPinRight: { type: Boolean, required: true },
15
20
  canUnpin: { type: Boolean, required: true },
21
+ currentSort: { type: String, default: null },
22
+ isSortable: { type: Boolean, default: true },
23
+ isResizable: { type: Boolean, default: true },
16
24
  },
17
25
  setup(props) {
18
26
  const handleOpenChange = (open) => {
@@ -20,36 +28,52 @@ export const ColumnHeaderMenu = defineComponent({
20
28
  props.onClose();
21
29
  }
22
30
  };
23
- const items = COLUMN_HEADER_MENU_ITEMS;
24
- const getDisabled = (index) => {
25
- if (index === 0)
26
- return !props.canPinLeft;
27
- if (index === 1)
28
- return !props.canPinRight;
29
- if (index === 2)
30
- return !props.canUnpin;
31
- return false;
31
+ const items = computed(() => getColumnHeaderMenuItems({
32
+ canPinLeft: props.canPinLeft,
33
+ canPinRight: props.canPinRight,
34
+ canUnpin: props.canUnpin,
35
+ currentSort: props.currentSort,
36
+ isSortable: props.isSortable,
37
+ isResizable: props.isResizable,
38
+ }));
39
+ const handlers = {
40
+ pinLeft: props.onPinLeft,
41
+ pinRight: props.onPinRight,
42
+ unpin: props.onUnpin,
43
+ sortAsc: props.onSortAsc,
44
+ sortDesc: props.onSortDesc,
45
+ clearSort: props.onClearSort,
46
+ autosizeThis: props.onAutosizeThis,
47
+ autosizeAll: props.onAutosizeAll,
32
48
  };
33
- const getHandler = (index) => {
34
- if (index === 0)
35
- return props.onPinLeft;
36
- if (index === 1)
37
- return props.onPinRight;
38
- if (index === 2)
39
- return props.onUnpin;
40
- return () => { };
49
+ const getHandler = (itemId) => handlers[itemId] || (() => { });
50
+ return () => {
51
+ // If no anchor element or menu is closed, don't render
52
+ if (!props.anchorElement)
53
+ return null;
54
+ return h(VMenu, {
55
+ modelValue: props.isOpen,
56
+ 'onUpdate:modelValue': handleOpenChange,
57
+ location: 'bottom start',
58
+ // Use target prop instead of activator for programmatic positioning
59
+ target: props.anchorElement,
60
+ }, {
61
+ default: () => h(VList, { density: 'compact', 'aria-label': 'Column options' }, () => {
62
+ const children = [];
63
+ items.value.forEach((item, index) => {
64
+ // Add divider before item if needed (but not at the start)
65
+ if (item.divider && index > 0) {
66
+ children.push(h(VDivider, { key: `divider-${item.id}` }));
67
+ }
68
+ children.push(h(VListItem, {
69
+ key: item.id,
70
+ disabled: item.disabled,
71
+ onClick: () => { getHandler(item.id)(); },
72
+ }, () => item.label));
73
+ });
74
+ return children;
75
+ }),
76
+ });
41
77
  };
42
- return () => h(VMenu, {
43
- modelValue: props.isOpen,
44
- 'onUpdate:modelValue': handleOpenChange,
45
- activator: props.anchorElement || undefined,
46
- location: 'bottom start',
47
- }, {
48
- default: () => h(VList, { density: 'compact', 'aria-label': 'Column options' }, () => items.map((item, index) => h(VListItem, {
49
- key: item.id,
50
- disabled: getDisabled(index),
51
- onClick: () => { getHandler(index)(); },
52
- }, () => item.label))),
53
- });
54
78
  },
55
79
  });
@@ -0,0 +1,51 @@
1
+ /* OGrid Vue Vuetify – DataGridTable styles */
2
+
3
+ /* Remove focus outline from scrollable wrapper (keyboard nav is handled via cell outlines) */
4
+ [role="region"][tabindex="0"] {
5
+ outline: none !important;
6
+ }
7
+
8
+ /* Cell selection highlighting - matches React implementation */
9
+ .ogrid-cell-in-range {
10
+ background: var(--ogrid-bg-range, rgba(33, 115, 70, 0.12)) !important;
11
+ }
12
+
13
+ /* Cut range highlighting */
14
+ .ogrid-cell-cut {
15
+ background: var(--ogrid-bg-hover, rgba(0, 0, 0, 0.04)) !important;
16
+ opacity: 0.7;
17
+ }
18
+
19
+ /* Drag-range highlight applied via DOM attributes during drag (bypasses Vue for performance) */
20
+ [data-drag-range] {
21
+ background: var(--ogrid-bg-range, rgba(33, 115, 70, 0.12)) !important;
22
+ }
23
+
24
+ /* Anchor cell during drag: white/transparent background (like Excel) */
25
+ [data-drag-anchor] {
26
+ background: var(--ogrid-bg, #fff) !important;
27
+ }
28
+
29
+ /* Accessibility: Focus visible styles */
30
+ .v-table th:focus-visible,
31
+ .v-table td:focus-visible {
32
+ outline: 2px solid rgb(var(--v-theme-primary));
33
+ outline-offset: -2px;
34
+ z-index: 11;
35
+ }
36
+
37
+ .v-btn:focus-visible {
38
+ outline: 2px solid rgb(var(--v-theme-primary));
39
+ outline-offset: 2px;
40
+ }
41
+
42
+ .v-checkbox:focus-visible {
43
+ outline: 2px solid rgb(var(--v-theme-primary));
44
+ outline-offset: 2px;
45
+ }
46
+
47
+ .ogrid-cell-content:focus-visible {
48
+ outline: 2px solid rgb(var(--v-theme-primary));
49
+ outline-offset: -2px;
50
+ z-index: 3;
51
+ }
@@ -5,6 +5,7 @@ import { ColumnHeaderFilter } from '../ColumnHeaderFilter';
5
5
  import { ColumnHeaderMenu } from '../ColumnHeaderMenu/ColumnHeaderMenu';
6
6
  import { InlineCellEditor } from './InlineCellEditor';
7
7
  import { GridContextMenu } from './GridContextMenu';
8
+ import './DataGridTable.css';
8
9
  const NOOP = () => { };
9
10
  export const DataGridTable = defineComponent({
10
11
  name: 'DataGridTable',
@@ -147,18 +148,20 @@ export const DataGridTable = defineComponent({
147
148
  cellInlineStyle.position = 'relative';
148
149
  cellInlineStyle.overflow = 'visible';
149
150
  }
151
+ // Apply range/cut highlighting via CSS classes + data attributes for proper precedence
152
+ let highlightClass = '';
150
153
  if (descriptor.isInRange) {
151
- cellInlineStyle.backgroundColor = 'var(--ogrid-bg-range, rgba(33, 115, 70, 0.12))';
154
+ highlightClass = 'ogrid-cell-in-range';
152
155
  }
153
156
  if (descriptor.isInCutRange) {
154
- cellInlineStyle.backgroundColor = 'rgba(0,0,0,0.04)';
155
- cellInlineStyle.opacity = '0.7';
157
+ highlightClass = 'ogrid-cell-cut';
156
158
  }
157
159
  const styledContent = cellStyle
158
160
  ? h('span', { style: cellStyle }, content)
159
161
  : content;
160
162
  return h('div', {
161
163
  ...interactionProps,
164
+ class: highlightClass || undefined,
162
165
  style: cellInlineStyle,
163
166
  }, [
164
167
  styledContent,
@@ -183,6 +186,13 @@ export const DataGridTable = defineComponent({
183
186
  ] : []),
184
187
  ]);
185
188
  };
189
+ // Compute pinning offsets
190
+ const columnWidthsMap = {};
191
+ visibleCols.forEach((col) => {
192
+ columnWidthsMap[col.columnId] = getColumnWidth(col);
193
+ });
194
+ const leftOffsets = pinning.computeLeftOffsets(visibleCols, columnWidthsMap, DEFAULT_MIN_COLUMN_WIDTH, hasCheckboxCol, CHECKBOX_COLUMN_WIDTH);
195
+ const rightOffsets = pinning.computeRightOffsets(visibleCols, columnWidthsMap, DEFAULT_MIN_COLUMN_WIDTH);
186
196
  // Build column layouts
187
197
  const columnLayouts = visibleCols.map((col, colIdx) => {
188
198
  const isFreezeCol = freezeCols != null && freezeCols >= 1 && colIdx < freezeCols;
@@ -196,14 +206,14 @@ export const DataGridTable = defineComponent({
196
206
  };
197
207
  if (isPinnedLeft || (isFreezeCol && colIdx === 0)) {
198
208
  tdStyle.position = 'sticky';
199
- tdStyle.left = '0';
209
+ tdStyle.left = `${leftOffsets[col.columnId] ?? 0}px`;
200
210
  tdStyle.zIndex = '6';
201
211
  tdStyle.backgroundColor = '#fff';
202
212
  tdStyle.willChange = 'transform';
203
213
  }
204
214
  else if (isPinnedRight) {
205
215
  tdStyle.position = 'sticky';
206
- tdStyle.right = '0';
216
+ tdStyle.right = `${rightOffsets[col.columnId] ?? 0}px`;
207
217
  tdStyle.zIndex = '6';
208
218
  tdStyle.backgroundColor = '#fff';
209
219
  tdStyle.willChange = 'transform';
@@ -215,12 +225,14 @@ export const DataGridTable = defineComponent({
215
225
  const isFreezeCol = freezeCols != null && freezeCols >= 1 && colIdx < freezeCols;
216
226
  const isPinnedLeft = col.pinned === 'left';
217
227
  const isPinnedRight = col.pinned === 'right';
218
- const base = { fontWeight: '600', position: 'relative' };
228
+ const base = { fontWeight: '600', position: 'sticky', top: '0', backgroundColor: 'rgba(0,0,0,0.04)', zIndex: '8' };
219
229
  if (isPinnedLeft || (isFreezeCol && colIdx === 0)) {
220
- return { ...base, position: 'sticky', left: '0', top: '0', zIndex: '9', backgroundColor: 'rgba(0,0,0,0.04)', willChange: 'transform' };
230
+ const leftOffset = leftOffsets[col.columnId] ?? 0;
231
+ return { ...base, position: 'sticky', left: `${leftOffset}px`, top: '0', zIndex: '10', backgroundColor: 'rgba(0,0,0,0.04)', willChange: 'transform' };
221
232
  }
222
233
  if (isPinnedRight) {
223
- return { ...base, position: 'sticky', right: '0', top: '0', zIndex: '9', backgroundColor: 'rgba(0,0,0,0.04)', willChange: 'transform' };
234
+ const rightOffset = rightOffsets[col.columnId] ?? 0;
235
+ return { ...base, position: 'sticky', right: `${rightOffset}px`, top: '0', zIndex: '10', backgroundColor: 'rgba(0,0,0,0.04)', willChange: 'transform' };
224
236
  }
225
237
  return base;
226
238
  };
@@ -278,7 +290,6 @@ export const DataGridTable = defineComponent({
278
290
  style: {
279
291
  width: '100%',
280
292
  borderCollapse: 'collapse',
281
- overflow: 'hidden',
282
293
  minWidth: `${minTableWidth}px`,
283
294
  fontSize: '0.875rem',
284
295
  },
@@ -286,7 +297,7 @@ export const DataGridTable = defineComponent({
286
297
  'data-freeze-cols': freezeCols != null && freezeCols >= 1 ? freezeCols : undefined,
287
298
  }, [
288
299
  // Header
289
- h('thead', { style: { position: 'sticky', top: '0', zIndex: '8', backgroundColor: 'rgba(0,0,0,0.04)' } }, headerRows.map((row, rowIdx) => h('tr', { key: rowIdx, style: { backgroundColor: 'rgba(0,0,0,0.04)' } }, [
300
+ h('thead', { style: { zIndex: '8', backgroundColor: 'rgba(0,0,0,0.04)' } }, headerRows.map((row, rowIdx) => h('tr', { key: rowIdx, style: { backgroundColor: 'rgba(0,0,0,0.04)' } }, [
290
301
  // Checkbox header cell (last leaf row only)
291
302
  ...(rowIdx === headerRows.length - 1 && hasCheckboxCol ? [
292
303
  h('th', {
@@ -539,9 +550,17 @@ export const DataGridTable = defineComponent({
539
550
  onPinLeft: headerMenu.handlePinLeft,
540
551
  onPinRight: headerMenu.handlePinRight,
541
552
  onUnpin: headerMenu.handleUnpin,
553
+ onSortAsc: headerMenu.handleSortAsc,
554
+ onSortDesc: headerMenu.handleSortDesc,
555
+ onClearSort: headerMenu.handleClearSort,
556
+ onAutosizeThis: headerMenu.handleAutosizeThis,
557
+ onAutosizeAll: headerMenu.handleAutosizeAll,
542
558
  canPinLeft: headerMenu.canPinLeft,
543
559
  canPinRight: headerMenu.canPinRight,
544
560
  canUnpin: headerMenu.canUnpin,
561
+ currentSort: headerMenu.currentSort,
562
+ isSortable: headerMenu.isSortable,
563
+ isResizable: headerMenu.isResizable,
545
564
  }),
546
565
  // Status bar
547
566
  ...(statusBarConfig ? [
@@ -6,9 +6,17 @@ export interface ColumnHeaderMenuProps {
6
6
  onPinLeft: () => void;
7
7
  onPinRight: () => void;
8
8
  onUnpin: () => void;
9
+ onSortAsc: () => void;
10
+ onSortDesc: () => void;
11
+ onClearSort: () => void;
12
+ onAutosizeThis: () => void;
13
+ onAutosizeAll: () => void;
9
14
  canPinLeft: boolean;
10
15
  canPinRight: boolean;
11
16
  canUnpin: boolean;
17
+ currentSort: 'asc' | 'desc' | null;
18
+ isSortable: boolean;
19
+ isResizable: boolean;
12
20
  }
13
21
  export declare const ColumnHeaderMenu: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
14
22
  isOpen: {
@@ -35,6 +43,26 @@ export declare const ColumnHeaderMenu: import("vue").DefineComponent<import("vue
35
43
  type: PropType<() => void>;
36
44
  required: true;
37
45
  };
46
+ onSortAsc: {
47
+ type: PropType<() => void>;
48
+ required: true;
49
+ };
50
+ onSortDesc: {
51
+ type: PropType<() => void>;
52
+ required: true;
53
+ };
54
+ onClearSort: {
55
+ type: PropType<() => void>;
56
+ required: true;
57
+ };
58
+ onAutosizeThis: {
59
+ type: PropType<() => void>;
60
+ required: true;
61
+ };
62
+ onAutosizeAll: {
63
+ type: PropType<() => void>;
64
+ required: true;
65
+ };
38
66
  canPinLeft: {
39
67
  type: BooleanConstructor;
40
68
  required: true;
@@ -47,9 +75,21 @@ export declare const ColumnHeaderMenu: import("vue").DefineComponent<import("vue
47
75
  type: BooleanConstructor;
48
76
  required: true;
49
77
  };
78
+ currentSort: {
79
+ type: PropType<"asc" | "desc" | null>;
80
+ default: null;
81
+ };
82
+ isSortable: {
83
+ type: BooleanConstructor;
84
+ default: boolean;
85
+ };
86
+ isResizable: {
87
+ type: BooleanConstructor;
88
+ default: boolean;
89
+ };
50
90
  }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
51
91
  [key: string]: any;
52
- }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
92
+ }> | null, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
53
93
  isOpen: {
54
94
  type: BooleanConstructor;
55
95
  required: true;
@@ -74,6 +114,26 @@ export declare const ColumnHeaderMenu: import("vue").DefineComponent<import("vue
74
114
  type: PropType<() => void>;
75
115
  required: true;
76
116
  };
117
+ onSortAsc: {
118
+ type: PropType<() => void>;
119
+ required: true;
120
+ };
121
+ onSortDesc: {
122
+ type: PropType<() => void>;
123
+ required: true;
124
+ };
125
+ onClearSort: {
126
+ type: PropType<() => void>;
127
+ required: true;
128
+ };
129
+ onAutosizeThis: {
130
+ type: PropType<() => void>;
131
+ required: true;
132
+ };
133
+ onAutosizeAll: {
134
+ type: PropType<() => void>;
135
+ required: true;
136
+ };
77
137
  canPinLeft: {
78
138
  type: BooleanConstructor;
79
139
  required: true;
@@ -86,6 +146,21 @@ export declare const ColumnHeaderMenu: import("vue").DefineComponent<import("vue
86
146
  type: BooleanConstructor;
87
147
  required: true;
88
148
  };
149
+ currentSort: {
150
+ type: PropType<"asc" | "desc" | null>;
151
+ default: null;
152
+ };
153
+ isSortable: {
154
+ type: BooleanConstructor;
155
+ default: boolean;
156
+ };
157
+ isResizable: {
158
+ type: BooleanConstructor;
159
+ default: boolean;
160
+ };
89
161
  }>> & Readonly<{}>, {
90
162
  anchorElement: HTMLElement | null;
163
+ currentSort: "asc" | "desc" | null;
164
+ isSortable: boolean;
165
+ isResizable: boolean;
91
166
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -1,5 +1,6 @@
1
1
  import { type PropType, type VNode } from 'vue';
2
2
  import { type IOGridDataGridProps } from '@alaarab/ogrid-vue';
3
+ import './DataGridTable.css';
3
4
  export declare const DataGridTable: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
4
5
  gridProps: {
5
6
  type: PropType<IOGridDataGridProps<unknown>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alaarab/ogrid-vue-vuetify",
3
- "version": "2.0.8",
3
+ "version": "2.0.11",
4
4
  "description": "OGrid Vuetify – Vuetify-based data grid with sorting, filtering, pagination, column chooser, and CSV export.",
5
5
  "main": "dist/esm/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -13,7 +13,7 @@
13
13
  }
14
14
  },
15
15
  "scripts": {
16
- "build": "rimraf dist && tsc -p tsconfig.build.json",
16
+ "build": "rimraf dist && tsc -p tsconfig.build.json && node scripts/copy-css.js",
17
17
  "test": "jest --passWithNoTests",
18
18
  "storybook": "storybook dev -p 6011 --no-open",
19
19
  "build-storybook": "storybook build"
@@ -37,13 +37,14 @@
37
37
  "node": ">=18"
38
38
  },
39
39
  "dependencies": {
40
- "@alaarab/ogrid-vue": "2.0.7"
40
+ "@alaarab/ogrid-vue": "2.0.11"
41
41
  },
42
42
  "peerDependencies": {
43
43
  "vue": "^3.3.0",
44
44
  "vuetify": "^3.0.0"
45
45
  },
46
46
  "devDependencies": {
47
+ "@mdi/font": "^7.4.47",
47
48
  "@storybook/vue3-vite": "^10.2.8",
48
49
  "@vitejs/plugin-vue": "^6.0.4",
49
50
  "storybook": "^10.2.8",
@@ -53,7 +54,9 @@
53
54
  "vue": "^3.5.28",
54
55
  "vuetify": "^3.11.8"
55
56
  },
56
- "sideEffects": false,
57
+ "sideEffects": [
58
+ "**/*.css"
59
+ ],
57
60
  "publishConfig": {
58
61
  "access": "public"
59
62
  }