@datametria/vue-components 2.3.0 → 2.4.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 (128) hide show
  1. package/README.md +625 -594
  2. package/dist/index.es.js +1962 -1887
  3. package/dist/index.umd.js +6 -6
  4. package/dist/src/components/DatametriaForm.vue.d.ts +1 -1
  5. package/dist/src/components/DatametriaInput.vue.d.ts +9 -1
  6. package/dist/src/components/DatametriaSelect.vue.d.ts +10 -1
  7. package/dist/vue-components.css +1 -1
  8. package/package.json +103 -105
  9. package/src/components/DatametriaAlert.vue +151 -133
  10. package/src/components/DatametriaAutocomplete.vue +250 -229
  11. package/src/components/DatametriaAvatar.vue +256 -238
  12. package/src/components/DatametriaBadge.vue +101 -96
  13. package/src/components/DatametriaBreadcrumb.vue +132 -128
  14. package/src/components/DatametriaButton.vue +191 -173
  15. package/src/components/DatametriaCard.vue +84 -66
  16. package/src/components/DatametriaCheckbox.vue +197 -193
  17. package/src/components/DatametriaCheckboxGroup.vue +56 -38
  18. package/src/components/DatametriaChip.vue +159 -141
  19. package/src/components/DatametriaContainer.vue +70 -52
  20. package/src/components/DatametriaDataTable.vue +318 -300
  21. package/src/components/DatametriaDatePicker.vue +396 -378
  22. package/src/components/DatametriaDialog.vue +297 -293
  23. package/src/components/DatametriaDivider.vue +105 -98
  24. package/src/components/DatametriaDropdown.vue +356 -350
  25. package/src/components/DatametriaEmpty.vue +155 -151
  26. package/src/components/DatametriaFileUpload.vue +413 -395
  27. package/src/components/DatametriaFloatingBar.vue +144 -126
  28. package/src/components/DatametriaForm.vue +174 -156
  29. package/src/components/DatametriaFormItem.vue +183 -179
  30. package/src/components/DatametriaGrid.vue +55 -37
  31. package/src/components/DatametriaInput.vue +314 -263
  32. package/src/components/DatametriaMenu.vue +618 -600
  33. package/src/components/DatametriaModal.vue +147 -129
  34. package/src/components/DatametriaNavbar.vue +277 -223
  35. package/src/components/DatametriaPagination.vue +375 -371
  36. package/src/components/DatametriaPasswordInput.vue +444 -426
  37. package/src/components/DatametriaPopconfirm.vue +240 -234
  38. package/src/components/DatametriaProgress.vue +228 -224
  39. package/src/components/DatametriaRadio.vue +151 -147
  40. package/src/components/DatametriaRadioGroup.vue +55 -37
  41. package/src/components/DatametriaResult.vue +135 -131
  42. package/src/components/DatametriaSelect.vue +311 -211
  43. package/src/components/DatametriaSidebar.vue +294 -222
  44. package/src/components/DatametriaSkeleton.vue +257 -234
  45. package/src/components/DatametriaSlider.vue +409 -391
  46. package/src/components/DatametriaSortableTable.vue +820 -802
  47. package/src/components/DatametriaSpinner.vue +114 -110
  48. package/src/components/DatametriaSteps.vue +318 -312
  49. package/src/components/DatametriaSwitch.vue +146 -142
  50. package/src/components/DatametriaTabPane.vue +94 -76
  51. package/src/components/DatametriaTable.vue +118 -100
  52. package/src/components/DatametriaTabs.vue +315 -297
  53. package/src/components/DatametriaTextarea.vue +213 -195
  54. package/src/components/DatametriaTimePicker.vue +317 -299
  55. package/src/components/DatametriaToast.vue +176 -176
  56. package/src/components/DatametriaTooltip.vue +421 -400
  57. package/src/components/DatametriaTree.vue +126 -122
  58. package/src/components/DatametriaTreeNode.vue +176 -172
  59. package/src/components/DatametriaUpload.vue +379 -361
  60. package/src/components/__tests__/DatametriaAlert.test.js +35 -35
  61. package/src/components/__tests__/DatametriaAlert.test.ts +190 -190
  62. package/src/components/__tests__/DatametriaAvatar.test.ts +151 -151
  63. package/src/components/__tests__/DatametriaBadge.test.js +29 -29
  64. package/src/components/__tests__/DatametriaBadge.test.ts +167 -167
  65. package/src/components/__tests__/DatametriaBreadcrumb.test.ts +187 -0
  66. package/src/components/__tests__/DatametriaButton.test.js +30 -30
  67. package/src/components/__tests__/DatametriaButton.test.ts +283 -283
  68. package/src/components/__tests__/DatametriaCard.test.ts +201 -201
  69. package/src/components/__tests__/DatametriaCheckbox.test.ts +204 -0
  70. package/src/components/__tests__/DatametriaChip.test.js +38 -38
  71. package/src/components/__tests__/DatametriaContainer.test.ts +52 -52
  72. package/src/components/__tests__/DatametriaDialog.test.ts +338 -0
  73. package/src/components/__tests__/DatametriaDivider.test.ts +54 -54
  74. package/src/components/__tests__/DatametriaDropdown.test.ts +357 -0
  75. package/src/components/__tests__/DatametriaEmpty.test.ts +261 -0
  76. package/src/components/__tests__/DatametriaFileUpload.test.ts +290 -290
  77. package/src/components/__tests__/DatametriaFloatingBar.test.ts +137 -137
  78. package/src/components/__tests__/DatametriaForm.test.ts +96 -0
  79. package/src/components/__tests__/DatametriaFormItem.test.ts +58 -0
  80. package/src/components/__tests__/DatametriaGrid.test.ts +31 -31
  81. package/src/components/__tests__/DatametriaInput.test.ts +72 -72
  82. package/src/components/__tests__/DatametriaMenu.test.ts +366 -366
  83. package/src/components/__tests__/DatametriaModal.test.ts +86 -86
  84. package/src/components/__tests__/DatametriaNavbar.test.js +48 -48
  85. package/src/components/__tests__/DatametriaNavbar.test.ts +203 -203
  86. package/src/components/__tests__/DatametriaPasswordInput.test.js +305 -305
  87. package/src/components/__tests__/DatametriaRadio.test.ts +195 -0
  88. package/src/components/__tests__/DatametriaSelect.test.ts +77 -77
  89. package/src/components/__tests__/DatametriaSidebar.test.ts +169 -169
  90. package/src/components/__tests__/DatametriaSlider.test.ts +261 -261
  91. package/src/components/__tests__/DatametriaSortableTable.test.js +168 -168
  92. package/src/components/__tests__/DatametriaSpinner.test.ts +156 -156
  93. package/src/components/__tests__/DatametriaSteps.test.ts +211 -0
  94. package/src/components/__tests__/DatametriaSwitch.test.ts +129 -0
  95. package/src/components/__tests__/DatametriaTabPane.test.ts +205 -0
  96. package/src/components/__tests__/DatametriaTable.test.ts +97 -97
  97. package/src/components/__tests__/DatametriaTabs.test.ts +232 -232
  98. package/src/components/__tests__/DatametriaToast.test.js +48 -48
  99. package/src/components/__tests__/DatametriaToast.test.ts +99 -99
  100. package/src/components/__tests__/DatametriaTree.test.ts +376 -0
  101. package/src/components/__tests__/index.test.ts +48 -0
  102. package/src/composables/useAccessibilityScale.ts +94 -94
  103. package/src/composables/useBreakpoints.ts +82 -82
  104. package/src/composables/useHapticFeedback.ts +439 -439
  105. package/src/composables/useRipple.ts +218 -218
  106. package/src/composables/useTheme.ts +5 -1
  107. package/src/index.ts +84 -84
  108. package/src/stories/Variants.stories.js +95 -95
  109. package/src/styles/design-tokens.css +623 -623
  110. package/src/theme/ThemeProvider.vue +96 -96
  111. package/src/theme/__tests__/ThemeProvider.test.ts +208 -208
  112. package/src/theme/__tests__/constants.test.ts +31 -31
  113. package/src/theme/__tests__/presets.test.ts +166 -166
  114. package/src/theme/__tests__/tokens.test.ts +155 -155
  115. package/src/theme/__tests__/types.test.ts +153 -153
  116. package/src/theme/__tests__/useTheme.test.ts +146 -146
  117. package/src/theme/constants.ts +14 -14
  118. package/src/theme/index.ts +12 -12
  119. package/src/theme/presets/datametria.ts +94 -94
  120. package/src/theme/presets/default.ts +94 -94
  121. package/src/theme/presets/index.ts +8 -8
  122. package/src/theme/tokens/colors.ts +28 -28
  123. package/src/theme/tokens/index.ts +47 -47
  124. package/src/theme/tokens/spacing.ts +21 -21
  125. package/src/theme/tokens/typography.ts +35 -35
  126. package/src/theme/types.ts +111 -111
  127. package/src/theme/useTheme.ts +28 -28
  128. package/src/types/index.ts +55 -55
@@ -1,230 +1,302 @@
1
- <template>
2
- <aside
3
- :class="sidebarClasses"
4
- role="complementary"
5
- :aria-label="ariaLabel"
6
- :aria-expanded="isOpen"
7
- >
8
- <div class="dm-sidebar__header" v-if="$slots.header">
9
- <slot name="header"></slot>
10
- <button
11
- v-if="collapsible"
12
- class="dm-sidebar__toggle"
13
- @click="toggle"
14
- :aria-label="isOpen ? 'Fechar sidebar' : 'Abrir sidebar'"
15
- >
16
- <span class="dm-sidebar__toggle-icon" :class="{ 'dm-sidebar__toggle-icon--open': isOpen }"></span>
17
- </button>
18
- </div>
19
-
20
- <nav class="dm-sidebar__content">
21
- <slot></slot>
22
- </nav>
23
-
24
- <div class="dm-sidebar__footer" v-if="$slots.footer">
25
- <slot name="footer"></slot>
26
- </div>
27
- </aside>
28
- </template>
29
-
30
- <script setup lang="ts">
31
- import { ref, computed, watch } from 'vue'
32
-
33
- interface Props {
34
- position?: 'left' | 'right'
35
- variant?: 'light' | 'dark' | 'primary'
36
- width?: string
37
- collapsible?: boolean
38
- defaultOpen?: boolean
39
- ariaLabel?: string
40
- }
41
-
42
- const props = withDefaults(defineProps<Props>(), {
43
- position: 'left',
44
- variant: 'light',
45
- width: '280px',
46
- collapsible: false,
47
- defaultOpen: true,
48
- ariaLabel: 'Sidebar navigation'
49
- })
50
-
51
- const emit = defineEmits<{
52
- toggle: [isOpen: boolean]
53
- open: []
54
- close: []
55
- }>()
56
-
57
- const isOpen = ref(props.defaultOpen)
58
-
59
- const sidebarClasses = computed(() => [
60
- 'dm-sidebar',
61
- `dm-sidebar--${props.position}`,
62
- `dm-sidebar--${props.variant}`,
63
- { 'dm-sidebar--collapsed': !isOpen.value && props.collapsible }
64
- ])
65
-
66
- const toggle = () => {
67
- isOpen.value = !isOpen.value
68
- emit('toggle', isOpen.value)
69
- if (isOpen.value) {
70
- emit('open')
71
- } else {
72
- emit('close')
1
+ <template>
2
+ <aside
3
+ :class="sidebarClasses"
4
+ role="complementary"
5
+ :aria-label="ariaLabel"
6
+ :aria-expanded="isOpen"
7
+ >
8
+ <div class="dm-sidebar__header" v-if="$slots.header">
9
+ <slot name="header"></slot>
10
+ <button
11
+ v-if="collapsible"
12
+ class="dm-sidebar__toggle"
13
+ @click="toggle"
14
+ :aria-label="isOpen ? 'Fechar sidebar' : 'Abrir sidebar'"
15
+ >
16
+ <span class="dm-sidebar__toggle-icon" :class="{ 'dm-sidebar__toggle-icon--open': isOpen }"></span>
17
+ </button>
18
+ </div>
19
+
20
+ <nav class="dm-sidebar__content">
21
+ <slot></slot>
22
+ </nav>
23
+
24
+ <div class="dm-sidebar__footer" v-if="$slots.footer">
25
+ <slot name="footer"></slot>
26
+ </div>
27
+ </aside>
28
+ </template>
29
+
30
+ <script setup lang="ts">
31
+ import { ref, computed, watch } from 'vue'
32
+
33
+ interface Props {
34
+ position?: 'left' | 'right'
35
+ variant?: 'light' | 'dark' | 'primary'
36
+ width?: string
37
+ collapsible?: boolean
38
+ defaultOpen?: boolean
39
+ ariaLabel?: string
40
+ }
41
+
42
+ const props = withDefaults(defineProps<Props>(), {
43
+ position: 'left',
44
+ variant: 'light',
45
+ width: '280px',
46
+ collapsible: false,
47
+ defaultOpen: true,
48
+ ariaLabel: 'Sidebar navigation'
49
+ })
50
+
51
+ const emit = defineEmits<{
52
+ toggle: [isOpen: boolean]
53
+ open: []
54
+ close: []
55
+ }>()
56
+
57
+ const isOpen = ref(props.defaultOpen)
58
+
59
+ const sidebarClasses = computed(() => [
60
+ 'dm-sidebar',
61
+ `dm-sidebar--${props.position}`,
62
+ `dm-sidebar--${props.variant}`,
63
+ { 'dm-sidebar--collapsed': !isOpen.value && props.collapsible }
64
+ ])
65
+
66
+ const toggle = () => {
67
+ isOpen.value = !isOpen.value
68
+ emit('toggle', isOpen.value)
69
+ if (isOpen.value) {
70
+ emit('open')
71
+ } else {
72
+ emit('close')
73
+ }
74
+ }
75
+
76
+ watch(() => props.defaultOpen, (newVal) => {
77
+ isOpen.value = newVal
78
+ })
79
+
80
+ defineExpose({ isOpen, toggle })
81
+ </script>
82
+
83
+ <style scoped>
84
+ .dm-sidebar {
85
+ height: 100vh;
86
+ background: var(--dm-neutral-50, #ffffff);
87
+ border-right: 1px solid var(--dm-neutral-200, #e5e7eb);
88
+ display: flex;
89
+ flex-direction: column;
90
+ transition: width 0.3s ease;
91
+ width: v-bind(width);
92
+ position: fixed;
93
+ top: 0;
94
+ z-index: 90;
95
+ }
96
+
97
+ .dm-sidebar--left {
98
+ left: 0;
99
+ }
100
+
101
+ .dm-sidebar--right {
102
+ right: 0;
103
+ border-right: none;
104
+ border-left: 1px solid var(--dm-neutral-200, #e5e7eb);
105
+ }
106
+
107
+ .dm-sidebar--dark {
108
+ background: var(--dm-neutral-900, #111827);
109
+ border-color: var(--dm-neutral-800, #1f2937);
110
+ color: var(--dm-neutral-50, #ffffff);
111
+ }
112
+
113
+ .dm-sidebar--primary {
114
+ background: var(--dm-primary, #0072CE);
115
+ border-color: color-mix(in srgb, var(--dm-primary, #0072CE) 90%, black);
116
+ color: var(--dm-neutral-50, #ffffff);
117
+ }
118
+
119
+ .dm-sidebar--collapsed {
120
+ width: 64px;
121
+ }
122
+
123
+ .dm-sidebar__header {
124
+ padding: var(--dm-spacing-4, 1rem);
125
+ border-bottom: 1px solid var(--dm-neutral-200, #e5e7eb);
126
+ display: flex;
127
+ align-items: center;
128
+ justify-content: space-between;
129
+ min-height: 64px;
130
+ }
131
+
132
+ .dm-sidebar--dark .dm-sidebar__header {
133
+ border-color: var(--dm-neutral-800, #1f2937);
134
+ }
135
+
136
+ .dm-sidebar--primary .dm-sidebar__header {
137
+ border-color: color-mix(in srgb, var(--dm-primary, #0072CE) 90%, black);
138
+ }
139
+
140
+ .dm-sidebar__toggle {
141
+ width: 32px;
142
+ height: 32px;
143
+ padding: 0;
144
+ border: none;
145
+ background: transparent;
146
+ cursor: pointer;
147
+ display: flex;
148
+ align-items: center;
149
+ justify-content: center;
150
+ border-radius: var(--dm-radius-md, 0.375rem);
151
+ transition: background 0.2s ease;
152
+ }
153
+
154
+ .dm-sidebar__toggle:hover {
155
+ background: var(--dm-neutral-100, #f3f4f6);
156
+ }
157
+
158
+ .dm-sidebar--dark .dm-sidebar__toggle:hover {
159
+ background: var(--dm-neutral-800, #1f2937);
160
+ }
161
+
162
+ .dm-sidebar__toggle-icon {
163
+ width: 16px;
164
+ height: 2px;
165
+ background: var(--dm-neutral-900, #111827);
166
+ position: relative;
167
+ transition: transform 0.3s ease;
168
+ }
169
+
170
+ .dm-sidebar--dark .dm-sidebar__toggle-icon,
171
+ .dm-sidebar--primary .dm-sidebar__toggle-icon {
172
+ background: var(--dm-neutral-50, #ffffff);
173
+ }
174
+
175
+ .dm-sidebar__toggle-icon::before,
176
+ .dm-sidebar__toggle-icon::after {
177
+ content: '';
178
+ position: absolute;
179
+ width: 16px;
180
+ height: 2px;
181
+ background: inherit;
182
+ transition: transform 0.3s ease;
183
+ }
184
+
185
+ .dm-sidebar__toggle-icon::before {
186
+ top: -5px;
187
+ }
188
+
189
+ .dm-sidebar__toggle-icon::after {
190
+ bottom: -5px;
191
+ }
192
+
193
+ .dm-sidebar__toggle-icon--open {
194
+ transform: rotate(180deg);
195
+ }
196
+
197
+ .dm-sidebar__content {
198
+ flex: 1;
199
+ overflow-y: auto;
200
+ padding: var(--dm-spacing-4, 1rem);
201
+ }
202
+
203
+ .dm-sidebar__footer {
204
+ padding: var(--dm-spacing-4, 1rem);
205
+ border-top: 1px solid var(--dm-neutral-200, #e5e7eb);
206
+ }
207
+
208
+ .dm-sidebar--dark .dm-sidebar__footer {
209
+ border-color: var(--dm-neutral-800, #1f2937);
210
+ }
211
+
212
+ .dm-sidebar--primary .dm-sidebar__footer {
213
+ border-color: color-mix(in srgb, var(--dm-primary, #0072CE) 90%, black);
214
+ }
215
+
216
+ @media (max-width: 768px) {
217
+ .dm-sidebar {
218
+ transform: translateX(0);
219
+ transition: transform 0.3s ease;
220
+ }
221
+
222
+ .dm-sidebar--left.dm-sidebar--collapsed {
223
+ transform: translateX(-100%);
224
+ }
225
+
226
+ .dm-sidebar--right.dm-sidebar--collapsed {
227
+ transform: translateX(100%);
228
+ }
229
+ }
230
+
231
+ /* Dark Mode Support - Hybrid Approach */
232
+
233
+ /* Fallback automático (sem JS) */
234
+ @media (prefers-color-scheme: dark) {
235
+ .dm-sidebar--light {
236
+ background: var(--dm-neutral-900, #111827);
237
+ border-color: var(--dm-neutral-800, #1f2937);
238
+ color: var(--dm-neutral-50, #ffffff);
239
+ }
240
+
241
+ .dm-sidebar--light .dm-sidebar__header,
242
+ .dm-sidebar--light .dm-sidebar__footer {
243
+ border-color: var(--dm-neutral-800, #1f2937);
244
+ }
245
+
246
+ .dm-sidebar--light .dm-sidebar__toggle:hover {
247
+ background: var(--dm-neutral-800, #1f2937);
248
+ }
249
+
250
+ .dm-sidebar--light .dm-sidebar__toggle-icon {
251
+ background: var(--dm-neutral-50, #ffffff);
252
+ }
253
+ }
254
+
255
+ /* Controle manual via useTheme() */
256
+ [data-theme="dark"] .dm-sidebar--light {
257
+ background: var(--dm-neutral-900, #111827);
258
+ border-color: var(--dm-neutral-800, #1f2937);
259
+ color: var(--dm-neutral-50, #ffffff);
260
+ }
261
+
262
+
263
+ /* Fallback automático (sem JS) */
264
+ @media (prefers-color-scheme: dark) {
265
+ .dm-sidebar--light .dm-sidebar__header,
266
+ [data-theme="dark"] .dm-sidebar--light .dm-sidebar__footer {
267
+ border-color: var(--dm-neutral-800, #1f2937);
73
268
  }
74
269
  }
75
270
 
76
- watch(() => props.defaultOpen, (newVal) => {
77
- isOpen.value = newVal
78
- })
79
-
80
- defineExpose({ isOpen, toggle })
81
- </script>
82
-
83
- <style scoped>
84
- .dm-sidebar {
85
- height: 100vh;
86
- background: var(--dm-neutral-50, #ffffff);
87
- border-right: 1px solid var(--dm-neutral-200, #e5e7eb);
88
- display: flex;
89
- flex-direction: column;
90
- transition: width 0.3s ease;
91
- width: v-bind(width);
92
- position: fixed;
93
- top: 0;
94
- z-index: 90;
95
- }
96
-
97
- .dm-sidebar--left {
98
- left: 0;
99
- }
100
-
101
- .dm-sidebar--right {
102
- right: 0;
103
- border-right: none;
104
- border-left: 1px solid var(--dm-neutral-200, #e5e7eb);
105
- }
106
-
107
- .dm-sidebar--dark {
108
- background: var(--dm-neutral-900, #111827);
109
- border-color: var(--dm-neutral-800, #1f2937);
110
- color: var(--dm-neutral-50, #ffffff);
111
- }
112
-
113
- .dm-sidebar--primary {
114
- background: var(--dm-primary, #0072CE);
115
- border-color: color-mix(in srgb, var(--dm-primary, #0072CE) 90%, black);
116
- color: var(--dm-neutral-50, #ffffff);
117
- }
118
-
119
- .dm-sidebar--collapsed {
120
- width: 64px;
121
- }
122
-
123
- .dm-sidebar__header {
124
- padding: var(--dm-spacing-4, 1rem);
125
- border-bottom: 1px solid var(--dm-neutral-200, #e5e7eb);
126
- display: flex;
127
- align-items: center;
128
- justify-content: space-between;
129
- min-height: 64px;
130
- }
131
-
132
- .dm-sidebar--dark .dm-sidebar__header {
133
- border-color: var(--dm-neutral-800, #1f2937);
134
- }
135
-
136
- .dm-sidebar--primary .dm-sidebar__header {
137
- border-color: color-mix(in srgb, var(--dm-primary, #0072CE) 90%, black);
138
- }
139
-
140
- .dm-sidebar__toggle {
141
- width: 32px;
142
- height: 32px;
143
- padding: 0;
144
- border: none;
145
- background: transparent;
146
- cursor: pointer;
147
- display: flex;
148
- align-items: center;
149
- justify-content: center;
150
- border-radius: var(--dm-radius-md, 0.375rem);
151
- transition: background 0.2s ease;
152
- }
153
-
154
- .dm-sidebar__toggle:hover {
155
- background: var(--dm-neutral-100, #f3f4f6);
156
- }
157
-
158
- .dm-sidebar--dark .dm-sidebar__toggle:hover {
159
- background: var(--dm-neutral-800, #1f2937);
160
- }
161
-
162
- .dm-sidebar__toggle-icon {
163
- width: 16px;
164
- height: 2px;
165
- background: var(--dm-neutral-900, #111827);
166
- position: relative;
167
- transition: transform 0.3s ease;
168
- }
169
-
170
- .dm-sidebar--dark .dm-sidebar__toggle-icon,
171
- .dm-sidebar--primary .dm-sidebar__toggle-icon {
172
- background: var(--dm-neutral-50, #ffffff);
173
- }
174
-
175
- .dm-sidebar__toggle-icon::before,
176
- .dm-sidebar__toggle-icon::after {
177
- content: '';
178
- position: absolute;
179
- width: 16px;
180
- height: 2px;
181
- background: inherit;
182
- transition: transform 0.3s ease;
183
- }
184
-
185
- .dm-sidebar__toggle-icon::before {
186
- top: -5px;
187
- }
188
-
189
- .dm-sidebar__toggle-icon::after {
190
- bottom: -5px;
191
- }
192
-
193
- .dm-sidebar__toggle-icon--open {
194
- transform: rotate(180deg);
195
- }
196
-
197
- .dm-sidebar__content {
198
- flex: 1;
199
- overflow-y: auto;
200
- padding: var(--dm-spacing-4, 1rem);
201
- }
202
-
203
- .dm-sidebar__footer {
204
- padding: var(--dm-spacing-4, 1rem);
205
- border-top: 1px solid var(--dm-neutral-200, #e5e7eb);
206
- }
207
-
208
- .dm-sidebar--dark .dm-sidebar__footer {
209
- border-color: var(--dm-neutral-800, #1f2937);
210
- }
211
-
212
- .dm-sidebar--primary .dm-sidebar__footer {
213
- border-color: color-mix(in srgb, var(--dm-primary, #0072CE) 90%, black);
214
- }
215
-
216
- @media (max-width: 768px) {
217
- .dm-sidebar {
218
- transform: translateX(0);
219
- transition: transform 0.3s ease;
271
+ /* Controle manual via useTheme() */
272
+ [data-theme="dark"] .dm-sidebar--light .dm-sidebar__header,
273
+ [data-theme="dark"] .dm-sidebar--light .dm-sidebar__footer {
274
+ border-color: var(--dm-neutral-800, #1f2937);
275
+ }
276
+
277
+
278
+ /* Fallback automático (sem JS) */
279
+ @media (prefers-color-scheme: dark) {
280
+ .dm-sidebar--light .dm-sidebar__toggle:hover {
281
+ background: var(--dm-neutral-800, #1f2937);
220
282
  }
283
+ }
221
284
 
222
- .dm-sidebar--left.dm-sidebar--collapsed {
223
- transform: translateX(-100%);
224
- }
285
+ /* Controle manual via useTheme() */
286
+ [data-theme="dark"] .dm-sidebar--light .dm-sidebar__toggle:hover {
287
+ background: var(--dm-neutral-800, #1f2937);
288
+ }
289
+
225
290
 
226
- .dm-sidebar--right.dm-sidebar--collapsed {
227
- transform: translateX(100%);
291
+ /* Fallback automático (sem JS) */
292
+ @media (prefers-color-scheme: dark) {
293
+ .dm-sidebar--light .dm-sidebar__toggle-icon {
294
+ background: var(--dm-neutral-50, #ffffff);
228
295
  }
229
296
  }
230
- </style>
297
+
298
+ /* Controle manual via useTheme() */
299
+ [data-theme="dark"] .dm-sidebar--light .dm-sidebar__toggle-icon {
300
+ background: var(--dm-neutral-50, #ffffff);
301
+ }
302
+ </style>