@m3ui-vue/m3ui-vue 0.1.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 (185) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +102 -0
  3. package/dist/components/MAlert.vue.d.ts +27 -0
  4. package/dist/components/MAppBar.vue.d.ts +24 -0
  5. package/dist/components/MAvatar.vue.d.ts +9 -0
  6. package/dist/components/MBadge.vue.d.ts +22 -0
  7. package/dist/components/MBottomSheet.vue.d.ts +26 -0
  8. package/dist/components/MBreadcrumbs.vue.d.ts +19 -0
  9. package/dist/components/MButton.vue.d.ts +32 -0
  10. package/dist/components/MCalendar.vue.d.ts +23 -0
  11. package/dist/components/MCard.vue.d.ts +28 -0
  12. package/dist/components/MChart.vue.d.ts +13 -0
  13. package/dist/components/MCheckbox.vue.d.ts +26 -0
  14. package/dist/components/MChip.vue.d.ts +33 -0
  15. package/dist/components/MCodeEditor.vue.d.ts +35 -0
  16. package/dist/components/MColorPicker.vue.d.ts +18 -0
  17. package/dist/components/MCommandPalette.vue.d.ts +29 -0
  18. package/dist/components/MConfirmDialog.vue.d.ts +23 -0
  19. package/dist/components/MContainer.vue.d.ts +24 -0
  20. package/dist/components/MContextMenu.vue.d.ts +35 -0
  21. package/dist/components/MDataTable.vue.d.ts +83 -0
  22. package/dist/components/MDatePicker.vue.d.ts +21 -0
  23. package/dist/components/MDateRangePicker.vue.d.ts +24 -0
  24. package/dist/components/MDialog.vue.d.ts +30 -0
  25. package/dist/components/MDivider.vue.d.ts +11 -0
  26. package/dist/components/MDragDropList.vue.d.ts +40 -0
  27. package/dist/components/MEmptyState.vue.d.ts +21 -0
  28. package/dist/components/MExpansionPanel.vue.d.ts +28 -0
  29. package/dist/components/MFab.vue.d.ts +28 -0
  30. package/dist/components/MFileUpload.vue.d.ts +25 -0
  31. package/dist/components/MGrid.vue.d.ts +26 -0
  32. package/dist/components/MHotkeys.vue.d.ts +16 -0
  33. package/dist/components/MIcon.vue.d.ts +9 -0
  34. package/dist/components/MIconButton.vue.d.ts +14 -0
  35. package/dist/components/MInfiniteScroll.vue.d.ts +34 -0
  36. package/dist/components/MJsonEditor.vue.d.ts +17 -0
  37. package/dist/components/MJsonViewer.vue.d.ts +14 -0
  38. package/dist/components/MKanban.vue.d.ts +53 -0
  39. package/dist/components/MLoadingOverlay.vue.d.ts +28 -0
  40. package/dist/components/MMarkdown.vue.d.ts +11 -0
  41. package/dist/components/MMasonry.vue.d.ts +23 -0
  42. package/dist/components/MMenu.vue.d.ts +27 -0
  43. package/dist/components/MMenuItem.vue.d.ts +16 -0
  44. package/dist/components/MMultiSelect.vue.d.ts +34 -0
  45. package/dist/components/MNavigationBar.vue.d.ts +18 -0
  46. package/dist/components/MNavigationDrawer.vue.d.ts +41 -0
  47. package/dist/components/MNavigationRail.vue.d.ts +32 -0
  48. package/dist/components/MPagination.vue.d.ts +12 -0
  49. package/dist/components/MProgressBar.vue.d.ts +13 -0
  50. package/dist/components/MRadio.vue.d.ts +17 -0
  51. package/dist/components/MRadioGroup.vue.d.ts +24 -0
  52. package/dist/components/MRating.vue.d.ts +23 -0
  53. package/dist/components/MResult.vue.d.ts +20 -0
  54. package/dist/components/MRichTextEditor.vue.d.ts +17 -0
  55. package/dist/components/MScheduler.vue.d.ts +35 -0
  56. package/dist/components/MSegmentedButton.vue.d.ts +24 -0
  57. package/dist/components/MSelect.vue.d.ts +29 -0
  58. package/dist/components/MSideSheet.vue.d.ts +28 -0
  59. package/dist/components/MSkeleton.vue.d.ts +14 -0
  60. package/dist/components/MSlider.vue.d.ts +24 -0
  61. package/dist/components/MSnackbar.vue.d.ts +3 -0
  62. package/dist/components/MSpinner.vue.d.ts +10 -0
  63. package/dist/components/MSplitter.vue.d.ts +26 -0
  64. package/dist/components/MSpotlightSearch.vue.d.ts +34 -0
  65. package/dist/components/MStack.vue.d.ts +30 -0
  66. package/dist/components/MStatCard.vue.d.ts +24 -0
  67. package/dist/components/MStepper.vue.d.ts +33 -0
  68. package/dist/components/MSwitch.vue.d.ts +14 -0
  69. package/dist/components/MTable.vue.d.ts +73 -0
  70. package/dist/components/MTabs.vue.d.ts +20 -0
  71. package/dist/components/MTerminal.vue.d.ts +25 -0
  72. package/dist/components/MTextField.vue.d.ts +41 -0
  73. package/dist/components/MTimePicker.vue.d.ts +20 -0
  74. package/dist/components/MTimeline.vue.d.ts +31 -0
  75. package/dist/components/MTooltip.vue.d.ts +21 -0
  76. package/dist/components/MTopAppBar.vue.d.ts +29 -0
  77. package/dist/components/MTour.vue.d.ts +19 -0
  78. package/dist/components/MTransferList.vue.d.ts +23 -0
  79. package/dist/components/MTree.vue.d.ts +68 -0
  80. package/dist/components/MTreeTable.vue.d.ts +57 -0
  81. package/dist/components/MVirtualTable.vue.d.ts +40 -0
  82. package/dist/components/_MContextMenuPanel.vue.d.ts +13 -0
  83. package/dist/components/_MTreeNode.vue.d.ts +26 -0
  84. package/dist/composables/useColorPalette.d.ts +11 -0
  85. package/dist/composables/useFieldBg.d.ts +13 -0
  86. package/dist/composables/useTheme.d.ts +5 -0
  87. package/dist/composables/useToast.d.ts +59 -0
  88. package/dist/index.d.ts +112 -0
  89. package/dist/m3ui.css +2 -0
  90. package/dist/m3ui.js +7432 -0
  91. package/dist/m3ui.js.map +1 -0
  92. package/dist/plugin.d.ts +9 -0
  93. package/dist/styles/palettes.css +1253 -0
  94. package/dist/styles/theme.css +249 -0
  95. package/package.json +166 -0
  96. package/src/components/MAlert.vue +69 -0
  97. package/src/components/MAppBar.vue +40 -0
  98. package/src/components/MAvatar.vue +21 -0
  99. package/src/components/MBadge.vue +46 -0
  100. package/src/components/MBottomSheet.vue +113 -0
  101. package/src/components/MBreadcrumbs.vue +52 -0
  102. package/src/components/MButton.vue +111 -0
  103. package/src/components/MCalendar.vue +173 -0
  104. package/src/components/MCard.vue +56 -0
  105. package/src/components/MChart.vue +158 -0
  106. package/src/components/MCheckbox.vue +48 -0
  107. package/src/components/MChip.vue +87 -0
  108. package/src/components/MCodeEditor.vue +179 -0
  109. package/src/components/MColorPicker.vue +305 -0
  110. package/src/components/MCommandPalette.vue +213 -0
  111. package/src/components/MConfirmDialog.vue +43 -0
  112. package/src/components/MContainer.vue +36 -0
  113. package/src/components/MContextMenu.vue +66 -0
  114. package/src/components/MDataTable.vue +376 -0
  115. package/src/components/MDatePicker.vue +253 -0
  116. package/src/components/MDateRangePicker.vue +265 -0
  117. package/src/components/MDialog.vue +90 -0
  118. package/src/components/MDivider.vue +26 -0
  119. package/src/components/MDragDropList.vue +111 -0
  120. package/src/components/MEmptyState.vue +40 -0
  121. package/src/components/MExpansionPanel.vue +112 -0
  122. package/src/components/MFab.vue +220 -0
  123. package/src/components/MFileUpload.vue +206 -0
  124. package/src/components/MGrid.vue +99 -0
  125. package/src/components/MHotkeys.vue +122 -0
  126. package/src/components/MIcon.vue +9 -0
  127. package/src/components/MIconButton.vue +49 -0
  128. package/src/components/MInfiniteScroll.vue +68 -0
  129. package/src/components/MJsonEditor.vue +118 -0
  130. package/src/components/MJsonViewer.vue +106 -0
  131. package/src/components/MKanban.vue +147 -0
  132. package/src/components/MLoadingOverlay.vue +52 -0
  133. package/src/components/MMarkdown.vue +123 -0
  134. package/src/components/MMasonry.vue +87 -0
  135. package/src/components/MMenu.vue +113 -0
  136. package/src/components/MMenuItem.vue +15 -0
  137. package/src/components/MMultiSelect.vue +306 -0
  138. package/src/components/MNavigationBar.vue +62 -0
  139. package/src/components/MNavigationDrawer.vue +157 -0
  140. package/src/components/MNavigationRail.vue +80 -0
  141. package/src/components/MPagination.vue +37 -0
  142. package/src/components/MProgressBar.vue +200 -0
  143. package/src/components/MRadio.vue +89 -0
  144. package/src/components/MRadioGroup.vue +41 -0
  145. package/src/components/MRating.vue +108 -0
  146. package/src/components/MResult.vue +62 -0
  147. package/src/components/MRichTextEditor.vue +199 -0
  148. package/src/components/MScheduler.vue +225 -0
  149. package/src/components/MSegmentedButton.vue +75 -0
  150. package/src/components/MSelect.vue +259 -0
  151. package/src/components/MSideSheet.vue +112 -0
  152. package/src/components/MSkeleton.vue +60 -0
  153. package/src/components/MSlider.vue +188 -0
  154. package/src/components/MSnackbar.vue +244 -0
  155. package/src/components/MSpinner.vue +122 -0
  156. package/src/components/MSplitter.vue +97 -0
  157. package/src/components/MSpotlightSearch.vue +244 -0
  158. package/src/components/MStack.vue +67 -0
  159. package/src/components/MStatCard.vue +56 -0
  160. package/src/components/MStepper.vue +161 -0
  161. package/src/components/MSwitch.vue +63 -0
  162. package/src/components/MTable.vue +404 -0
  163. package/src/components/MTabs.vue +97 -0
  164. package/src/components/MTerminal.vue +146 -0
  165. package/src/components/MTextField.vue +180 -0
  166. package/src/components/MTimePicker.vue +227 -0
  167. package/src/components/MTimeline.vue +117 -0
  168. package/src/components/MTooltip.vue +82 -0
  169. package/src/components/MTopAppBar.vue +62 -0
  170. package/src/components/MTour.vue +226 -0
  171. package/src/components/MTransferList.vue +181 -0
  172. package/src/components/MTree.vue +164 -0
  173. package/src/components/MTreeTable.vue +159 -0
  174. package/src/components/MVirtualTable.vue +155 -0
  175. package/src/components/_MContextMenuPanel.vue +129 -0
  176. package/src/components/_MTreeNode.vue +171 -0
  177. package/src/composables/useColorPalette.ts +60 -0
  178. package/src/composables/useFieldBg.ts +91 -0
  179. package/src/composables/useTheme.ts +55 -0
  180. package/src/composables/useToast.ts +51 -0
  181. package/src/env.d.ts +1 -0
  182. package/src/index.ts +119 -0
  183. package/src/plugin.ts +18 -0
  184. package/src/styles/palettes.css +1253 -0
  185. package/src/styles/theme.css +249 -0
@@ -0,0 +1,91 @@
1
+ import { ref, computed, onMounted, onBeforeUnmount, type Ref } from 'vue'
2
+
3
+ const M3_BG_CLASSES = [
4
+ 'bg-surface-container-highest',
5
+ 'bg-surface-container-high',
6
+ 'bg-surface-container-low',
7
+ 'bg-surface-container-lowest',
8
+ 'bg-surface-container',
9
+ 'bg-surface-variant',
10
+ 'bg-surface-bright',
11
+ 'bg-surface-dim',
12
+ 'bg-surface',
13
+ 'bg-background',
14
+ 'bg-inverse-surface',
15
+ 'bg-primary-container',
16
+ 'bg-secondary-container',
17
+ 'bg-tertiary-container',
18
+ 'bg-error-container',
19
+ 'bg-primary',
20
+ 'bg-secondary',
21
+ 'bg-tertiary',
22
+ 'bg-error',
23
+ ] as const
24
+
25
+ function findM3BgVar(el: HTMLElement): string | null {
26
+ for (const cls of M3_BG_CLASSES) {
27
+ if (el.classList.contains(cls)) return `var(--color-${cls.slice(3)})`
28
+ }
29
+ return null
30
+ }
31
+
32
+ function isTransparent(color: string): boolean {
33
+ if (!color || color === 'transparent') return true
34
+ const m = color.match(/^rgba?\(([^)]+)\)$/)
35
+ if (m) {
36
+ const parts = m[1]!.split(',').map((s) => s.trim())
37
+ if (parts.length === 4 && parseFloat(parts[3]!) === 0) return true
38
+ }
39
+ return false
40
+ }
41
+
42
+ /**
43
+ * Auto-detects the background behind `containerEl` and exposes it as `--field-bg`.
44
+ * Prefers a CSS variable reference (e.g. var(--color-surface-container-low)) over a
45
+ * raw computed color so the outlined label cutout transitions in sync with the rest
46
+ * of the theme switch instead of lagging behind.
47
+ *
48
+ * @param containerEl The element that receives `--field-bg` as an inline style.
49
+ * @param fieldBgProp Getter for the explicit `fieldBg` prop (overrides auto-detect).
50
+ */
51
+ export function useFieldBg(
52
+ containerEl: Ref<HTMLElement | null>,
53
+ fieldBgProp: () => string | undefined,
54
+ ) {
55
+ const detectedBg = ref<string>('var(--color-surface)')
56
+
57
+ function applyFieldBg(value: string) {
58
+ detectedBg.value = value
59
+ containerEl.value?.style.setProperty('--field-bg', fieldBgProp() ?? value)
60
+ }
61
+
62
+ function resolveBg() {
63
+ let el: HTMLElement | null = containerEl.value?.parentElement ?? null
64
+ while (el) {
65
+ const cssVar = findM3BgVar(el)
66
+ if (cssVar) { applyFieldBg(cssVar); return }
67
+ if (el === document.body) { applyFieldBg('var(--color-surface)'); return }
68
+ const bg = getComputedStyle(el).backgroundColor
69
+ if (!isTransparent(bg)) { applyFieldBg(bg); return }
70
+ el = el.parentElement
71
+ }
72
+ applyFieldBg('var(--color-surface)')
73
+ }
74
+
75
+ let observer: MutationObserver | null = null
76
+
77
+ onMounted(() => {
78
+ resolveBg()
79
+ observer = new MutationObserver(() => resolveBg())
80
+ observer.observe(document.documentElement, {
81
+ attributes: true,
82
+ attributeFilter: ['class', 'style', 'data-theme'],
83
+ })
84
+ })
85
+
86
+ onBeforeUnmount(() => observer?.disconnect())
87
+
88
+ const resolvedFieldBg = computed(() => fieldBgProp() ?? detectedBg.value)
89
+
90
+ return { resolvedFieldBg }
91
+ }
@@ -0,0 +1,55 @@
1
+ import { ref, watchEffect, onMounted, onUnmounted } from 'vue'
2
+
3
+ export type Theme = 'light' | 'dark' | 'system'
4
+
5
+ const theme = ref<Theme>((localStorage.getItem('m3-theme') as Theme) ?? 'system')
6
+
7
+ let _appliedDark: boolean | null = null
8
+
9
+ function applyTheme(t: Theme) {
10
+ const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches
11
+ const isDark = t === 'dark' || (t === 'system' && prefersDark)
12
+
13
+ const isChange = _appliedDark !== null && _appliedDark !== isDark
14
+
15
+ if (isChange) {
16
+ // Force reflow so transition property takes effect before the color change
17
+ document.documentElement.classList.add('theme-transitioning')
18
+ void document.documentElement.offsetHeight
19
+ }
20
+
21
+ document.documentElement.classList.toggle('dark', isDark)
22
+
23
+ if (isChange) {
24
+ setTimeout(() => document.documentElement.classList.remove('theme-transitioning'), 300)
25
+ }
26
+
27
+ _appliedDark = isDark
28
+ }
29
+
30
+ // Apply immediately on module load (before any component mounts) — no animation
31
+ applyTheme(theme.value)
32
+
33
+ export function useTheme() {
34
+ const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')
35
+
36
+ function onSystemChange() {
37
+ if (theme.value === 'system') applyTheme('system')
38
+ }
39
+
40
+ watchEffect(() => {
41
+ localStorage.setItem('m3-theme', theme.value)
42
+ applyTheme(theme.value)
43
+ })
44
+
45
+ onMounted(() => mediaQuery.addEventListener('change', onSystemChange))
46
+ onUnmounted(() => mediaQuery.removeEventListener('change', onSystemChange))
47
+
48
+ function cycle() {
49
+ const order: Theme[] = ['light', 'dark', 'system']
50
+ const idx = order.indexOf(theme.value)
51
+ theme.value = order[(idx + 1) % order.length]!
52
+ }
53
+
54
+ return { theme, cycle }
55
+ }
@@ -0,0 +1,51 @@
1
+ import { ref } from 'vue'
2
+
3
+ export type ToastVariant = 'info' | 'success' | 'warning' | 'error'
4
+ export type ToastPosition =
5
+ | 'top-left' | 'top-center' | 'top-right'
6
+ | 'bottom-left' | 'bottom-center' | 'bottom-right'
7
+
8
+ export interface ToastAction { label: string; onClick: () => void }
9
+
10
+ export interface Toast {
11
+ id: number
12
+ message: string
13
+ variant: ToastVariant
14
+ duration: number
15
+ action?: ToastAction
16
+ }
17
+
18
+ let nextId = 1
19
+
20
+ const toasts = ref<Toast[]>([])
21
+ const position = ref<ToastPosition>('bottom-center')
22
+
23
+ function dismiss(id: number) {
24
+ toasts.value = toasts.value.filter((t) => t.id !== id)
25
+ }
26
+
27
+ function show(
28
+ message: string,
29
+ variant: ToastVariant = 'info',
30
+ options: number | { duration?: number; action?: ToastAction } = {},
31
+ ) {
32
+ const id = nextId++
33
+ const opts = typeof options === 'number' ? { duration: options } : options
34
+ const duration = opts.duration ?? (variant === 'error' ? 6000 : 4000)
35
+ toasts.value.push({ id, message, variant, duration, action: opts.action })
36
+ if (duration > 0) setTimeout(() => dismiss(id), duration)
37
+ return id
38
+ }
39
+
40
+ const success = (msg: string, opts?: { duration?: number; action?: ToastAction }) =>
41
+ show(msg, 'success', opts ?? {})
42
+ const error = (msg: string, opts?: { duration?: number; action?: ToastAction }) =>
43
+ show(msg, 'error', opts ?? {})
44
+ const warning = (msg: string, opts?: { duration?: number; action?: ToastAction }) =>
45
+ show(msg, 'warning', opts ?? {})
46
+ const info = (msg: string, opts?: { duration?: number; action?: ToastAction }) =>
47
+ show(msg, 'info', opts ?? {})
48
+
49
+ export function useToast() {
50
+ return { toasts, position, show, success, error, warning, info, dismiss }
51
+ }
package/src/env.d.ts ADDED
@@ -0,0 +1 @@
1
+ declare module '@xterm/xterm/css/xterm.css'
package/src/index.ts ADDED
@@ -0,0 +1,119 @@
1
+ // Plugin
2
+ export { createM3UI } from './plugin'
3
+ export type { M3UIOptions } from './plugin'
4
+
5
+ // Composables
6
+ export { useTheme } from './composables/useTheme'
7
+ export type { Theme } from './composables/useTheme'
8
+ export { useColorPalette, palettes } from './composables/useColorPalette'
9
+ export type { Palette } from './composables/useColorPalette'
10
+ export { useToast } from './composables/useToast'
11
+ export type { Toast, ToastVariant, ToastPosition, ToastAction } from './composables/useToast'
12
+ export { useFieldBg } from './composables/useFieldBg'
13
+
14
+ // Components
15
+ export { default as MAlert } from './components/MAlert.vue'
16
+ export { default as MAppBar } from './components/MAppBar.vue'
17
+ export { default as MAvatar } from './components/MAvatar.vue'
18
+ export { default as MBadge } from './components/MBadge.vue'
19
+ export { default as MBottomSheet } from './components/MBottomSheet.vue'
20
+ export { default as MBreadcrumbs } from './components/MBreadcrumbs.vue'
21
+ export { default as MButton } from './components/MButton.vue'
22
+ export { default as MCalendar } from './components/MCalendar.vue'
23
+ export { default as MCard } from './components/MCard.vue'
24
+ export { default as MChart } from './components/MChart.vue'
25
+ export { default as MCheckbox } from './components/MCheckbox.vue'
26
+ export { default as MChip } from './components/MChip.vue'
27
+ export { default as MCodeEditor } from './components/MCodeEditor.vue'
28
+ export { default as MColorPicker } from './components/MColorPicker.vue'
29
+ export { default as MCommandPalette } from './components/MCommandPalette.vue'
30
+ export { default as MConfirmDialog } from './components/MConfirmDialog.vue'
31
+ export { default as MContainer } from './components/MContainer.vue'
32
+ export { default as MContextMenu } from './components/MContextMenu.vue'
33
+ export { default as MDataTable } from './components/MDataTable.vue'
34
+ export { default as MDatePicker } from './components/MDatePicker.vue'
35
+ export { default as MDateRangePicker } from './components/MDateRangePicker.vue'
36
+ export { default as MDialog } from './components/MDialog.vue'
37
+ export { default as MDivider } from './components/MDivider.vue'
38
+ export { default as MDragDropList } from './components/MDragDropList.vue'
39
+ export { default as MEmptyState } from './components/MEmptyState.vue'
40
+ export { default as MExpansionPanel } from './components/MExpansionPanel.vue'
41
+ export { default as MFab } from './components/MFab.vue'
42
+ export { default as MFileUpload } from './components/MFileUpload.vue'
43
+ export { default as MGrid } from './components/MGrid.vue'
44
+ export { default as MHotkeys } from './components/MHotkeys.vue'
45
+ export { default as MIcon } from './components/MIcon.vue'
46
+ export { default as MIconButton } from './components/MIconButton.vue'
47
+ export { default as MInfiniteScroll } from './components/MInfiniteScroll.vue'
48
+ export { default as MJsonEditor } from './components/MJsonEditor.vue'
49
+ export { default as MJsonViewer } from './components/MJsonViewer.vue'
50
+ export { default as MKanban } from './components/MKanban.vue'
51
+ export { default as MLoadingOverlay } from './components/MLoadingOverlay.vue'
52
+ export { default as MMarkdown } from './components/MMarkdown.vue'
53
+ export { default as MMasonry } from './components/MMasonry.vue'
54
+ export { default as MMenu } from './components/MMenu.vue'
55
+ export { default as MMenuItem } from './components/MMenuItem.vue'
56
+ export { default as MMultiSelect } from './components/MMultiSelect.vue'
57
+ export { default as MNavigationBar } from './components/MNavigationBar.vue'
58
+ export { default as MNavigationDrawer } from './components/MNavigationDrawer.vue'
59
+ export { default as MNavigationRail } from './components/MNavigationRail.vue'
60
+ export { default as MPagination } from './components/MPagination.vue'
61
+ export { default as MProgressBar } from './components/MProgressBar.vue'
62
+ export { default as MRadio } from './components/MRadio.vue'
63
+ export { default as MRadioGroup } from './components/MRadioGroup.vue'
64
+ export { default as MRating } from './components/MRating.vue'
65
+ export { default as MResult } from './components/MResult.vue'
66
+ export { default as MRichTextEditor } from './components/MRichTextEditor.vue'
67
+ export { default as MScheduler } from './components/MScheduler.vue'
68
+ export { default as MSegmentedButton } from './components/MSegmentedButton.vue'
69
+ export { default as MSelect } from './components/MSelect.vue'
70
+ export { default as MSideSheet } from './components/MSideSheet.vue'
71
+ export { default as MSkeleton } from './components/MSkeleton.vue'
72
+ export { default as MSlider } from './components/MSlider.vue'
73
+ export { default as MSnackbar } from './components/MSnackbar.vue'
74
+ export { default as MSpinner } from './components/MSpinner.vue'
75
+ export { default as MSplitter } from './components/MSplitter.vue'
76
+ export { default as MSpotlightSearch } from './components/MSpotlightSearch.vue'
77
+ export { default as MStack } from './components/MStack.vue'
78
+ export { default as MStatCard } from './components/MStatCard.vue'
79
+ export { default as MStepper } from './components/MStepper.vue'
80
+ export { default as MSwitch } from './components/MSwitch.vue'
81
+ export { default as MTable } from './components/MTable.vue'
82
+ export { default as MTabs } from './components/MTabs.vue'
83
+ export { default as MTerminal } from './components/MTerminal.vue'
84
+ export { default as MTextField } from './components/MTextField.vue'
85
+ export { default as MTimeline } from './components/MTimeline.vue'
86
+ export { default as MTimePicker } from './components/MTimePicker.vue'
87
+ export { default as MTooltip } from './components/MTooltip.vue'
88
+ export { default as MTopAppBar } from './components/MTopAppBar.vue'
89
+ export { default as MTour } from './components/MTour.vue'
90
+ export { default as MTransferList } from './components/MTransferList.vue'
91
+ export { default as MTree } from './components/MTree.vue'
92
+ export { default as MTreeTable } from './components/MTreeTable.vue'
93
+ export { default as MVirtualTable } from './components/MVirtualTable.vue'
94
+
95
+ // Re-export types from components that define them
96
+ export type { CalendarEvent } from './components/MCalendar.vue'
97
+ export type { ContextMenuItem } from './components/MContextMenu.vue'
98
+ export type { DataTableColumn } from './components/MDataTable.vue'
99
+ export type { DateRange } from './components/MDateRangePicker.vue'
100
+ export type { DragDropItem } from './components/MDragDropList.vue'
101
+ export type { UploadFile } from './components/MFileUpload.vue'
102
+ export type { HotkeyBinding } from './components/MHotkeys.vue'
103
+ export type { KanbanColumn, KanbanCard } from './components/MKanban.vue'
104
+ export type { NavBarItem } from './components/MNavigationBar.vue'
105
+ export type { DrawerSection } from './components/MNavigationDrawer.vue'
106
+ export type { NavRailItem } from './components/MNavigationRail.vue'
107
+ export type { SchedulerEvent } from './components/MScheduler.vue'
108
+ export type { SegmentedOption } from './components/MSegmentedButton.vue'
109
+ export type { SpotlightResult } from './components/MSpotlightSearch.vue'
110
+ export type { StepItem } from './components/MStepper.vue'
111
+ export type { CommandItem } from './components/MCommandPalette.vue'
112
+ export type { TableFetchParams } from './components/MTable.vue'
113
+ export type { TimelineItem } from './components/MTimeline.vue'
114
+ export type { TourStep } from './components/MTour.vue'
115
+ export type { TransferItem } from './components/MTransferList.vue'
116
+ export type { TreeNode } from './components/MTree.vue'
117
+ export type { TreeTableColumn, TreeTableRow } from './components/MTreeTable.vue'
118
+ export type { VTableColumn } from './components/MVirtualTable.vue'
119
+ export type { BreadcrumbItem } from './components/MBreadcrumbs.vue'
package/src/plugin.ts ADDED
@@ -0,0 +1,18 @@
1
+ import type { App } from 'vue'
2
+ import type { Palette } from './composables/useColorPalette'
3
+
4
+ export interface M3UIOptions {
5
+ palette?: string
6
+ customPalettes?: Palette[]
7
+ }
8
+
9
+ export function createM3UI(options: M3UIOptions = {}) {
10
+ return {
11
+ install(_app: App) {
12
+ if (options.palette && options.palette !== 'purple') {
13
+ document.documentElement.setAttribute('data-palette', options.palette)
14
+ localStorage.setItem('m3-palette', options.palette)
15
+ }
16
+ },
17
+ }
18
+ }