dashforge-ui 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.
package/README.md ADDED
@@ -0,0 +1,136 @@
1
+ # Dashforge UI — Framework Skeleton
2
+
3
+ This repository contains a production-ready skeleton for a Vue 3 UI framework focused on dashboard applications. It provides:
4
+
5
+ - Plugin-based core (`createDashboardUI`)
6
+ - Theme engine with Light & Dark themes and runtime switching
7
+ - SCSS design tokens and CSS variable generation
8
+ - A typed `useTheme` composable and TypeScript theme types
9
+ - One initial component: `VButton`
10
+ - Vite library build configuration and playground app
11
+ - Vitest test setup
12
+
13
+ See `playground` for a demo app. Build the library with `npm run build:lib` and run the playground with `npm run play`.
14
+
15
+ Scalability notes: keep components small, rely on token-driven styling, expose plugin hooks, use per-component entry points for tree-shaking.
16
+
17
+ ## Public exports
18
+
19
+ The package exposes the following API from `src/index.ts`:
20
+
21
+ - `createDashboardUI(options?)`: Plugin factory to install the framework into a Vue app. Accepts `DashboardUIOptions` (see types).
22
+ - `DashboardUIKey`: Symbol used for provide/inject to access the dashboard UI context.
23
+ - `useDashboardUI()`: Composable to access the plugin state after installing `createDashboardUI`.
24
+ - `useTheme()`: Composable to read/change the active theme at runtime.
25
+ - Theme types: exported TypeScript types are available from the root (e.g. `Theme`, `PartialTheme`).
26
+ - `VButton`: Example component (default export) with an install method for global registration.
27
+
28
+ Example usage:
29
+
30
+ ```ts
31
+ import { createApp } from 'vue'
32
+ import App from './App.vue'
33
+ import { createDashboardUI, useTheme, VButton } from 'dashforge-ui'
34
+
35
+ const app = createApp(App)
36
+ app.use(createDashboardUI({ theme: 'light' }))
37
+ app.component('VButton', VButton)
38
+ app.mount('#app')
39
+
40
+ // inside components
41
+ // const theme = useTheme()
42
+ // theme.setTheme('dark')
43
+ ```
44
+
45
+ ## 🎨 Theme Customization
46
+
47
+ Create custom themes using TypeScript helpers:
48
+
49
+ ```ts
50
+ import { createTheme, createDarkTheme, applyTheme } from 'dashforge-ui'
51
+
52
+ // Create a custom light theme
53
+ const myTheme = createTheme({
54
+ name: 'my-brand',
55
+ colors: {
56
+ primary: '#ff6b35',
57
+ 'on-primary': '#ffffff',
58
+ 'primary-container': '#ffd4c4',
59
+ 'on-primary-container': '#4a0000',
60
+ // ... more colors
61
+ }
62
+ })
63
+
64
+ // Create a custom dark theme
65
+ const myDarkTheme = createDarkTheme({
66
+ name: 'my-dark-brand',
67
+ colors: {
68
+ primary: '#ffa366',
69
+ // ... dark mode colors
70
+ }
71
+ })
72
+
73
+ // Apply theme at runtime
74
+ applyTheme(myTheme)
75
+
76
+ // With dynamic utility classes for new colors
77
+ applyTheme(myTheme, { generateUtilities: true })
78
+ // Now .bg-*, .text-*, .border-* classes work with your custom colors
79
+ ```
80
+
81
+ ### Utility Classes
82
+
83
+ Pre-built utility classes use CSS variables and automatically adapt to theme changes:
84
+ - `.bg-primary`, `.text-primary`, `.border-primary`
85
+ - Works for all base token colors
86
+
87
+ For **new custom colors**, enable dynamic generation:
88
+ ```ts
89
+ app.use(createDashboardUI({
90
+ theme: myTheme,
91
+ generateUtilities: true // Creates utilities for ALL colors
92
+ }))
93
+ ```
94
+
95
+ See **[CUSTOM-THEMES.md](./docs/CUSTOM-THEMES.md)** for complete guide and examples.
96
+
97
+ ## 📚 Documentation
98
+
99
+ ### Getting Started
100
+ - **[QUICK-START.md](./docs/QUICK-START.md)** - Complete guide: install, create themes, generate utility classes
101
+
102
+ ### Architecture & Patterns
103
+ - **[TOKEN-ARCHITECTURE.md](./TOKEN-ARCHITECTURE.md)** - Sistema de tokens y arquitectura de temas
104
+ - **[COMPONENT-GUIDELINES.md](./COMPONENT-GUIDELINES.md)** - Guía de diseño de componentes (union types, CSS variables, mejores prácticas)
105
+ - **[DESIGN-SYSTEM.md](./DESIGN-SYSTEM.md)** - Token structure and design system overview
106
+ - **[CUSTOM-THEMES.md](./docs/CUSTOM-THEMES.md)** - Create and customize themes with TypeScript
107
+
108
+ ### Components
109
+ - **[VButton Color System](./src/components/VButton/COLOR-SYSTEM.md)** - Sistema de colores dinámicos con CSS variables
110
+
111
+ ### Scripts
112
+ - `npm run gen:utils` - Regenera archivos SCSS desde `tokens.ts` (ejecutar después de modificar tokens)
113
+ - `npm run typecheck` - Validación TypeScript
114
+ - `npm run test` - Tests con Vitest
115
+ - `npm run build:lib` - Build de la librería
116
+ - `npm run play` - Playground de desarrollo
117
+
118
+ ## 🎨 Design Principles
119
+
120
+ 1. **Single Source of Truth**: Todos los valores de diseño en `src/theme/tokens.ts`
121
+ 2. **CSS Variables**: Runtime customization sin recompilar
122
+ 3. **Type-Safe Props**: Union types sobre props booleanas múltiples
123
+ 4. **Token-Driven**: Componentes consumen valores desde tokens via CSS variables
124
+ 5. **Dark Mode**: Automático via `@media (prefers-color-scheme: dark)`
125
+
126
+ ## 🚀 Creating New Components
127
+
128
+ Sigue la guía en [COMPONENT-GUIDELINES.md](./COMPONENT-GUIDELINES.md):
129
+
130
+ 1. Define props con union types (`size?: 'small' | 'default' | 'large'`)
131
+ 2. Agrega tokens necesarios a `tokens.ts` y ejecuta `npm run gen:utils`
132
+ 3. Inyecta CSS variables en `computed style()`
133
+ 4. Usa `var(--df-*)` en SCSS con fallbacks
134
+ 5. Exporta types en `src/types/` y component en `src/index.ts`
135
+
136
+ **Ejemplo de referencia:** [VButton](./src/components/VButton/VButton.vue)
@@ -0,0 +1 @@
1
+ .v-icon{overflow:hidden;align-items:center;display:inline-flex;font-feature-settings:"liga";justify-content:center;letter-spacing:normal;line-height:1;position:relative;text-indent:0;transition:.3s cubic-bezier(.25,.8,.5,1),visibility 0s;vertical-align:middle;-webkit-user-select:none;-ms-user-select:none;-moz-user-select:none;user-select:none;opacity:1}.v-icon--size-x-small{font-size:var(--df-icon-font-size-x-small)}.v-icon--size-x-small .v-icon__svg{height:var(--df-icon-font-size-x-small);width:var(--df-icon-font-size-x-small)}.v-icon--size-small{font-size:var(--df-icon-font-size-small)}.v-icon--size-small .v-icon__svg{height:var(--df-icon-font-size-small);width:var(--df-icon-font-size-small)}.v-icon--size-default{font-size:var(--df-icon-font-size-default)}.v-icon--size-default .v-icon__svg{height:var(--df-icon-font-size-default);width:var(--df-icon-font-size-default)}.v-icon--size-large{font-size:var(--df-icon-font-size-large)}.v-icon--size-large .v-icon__svg{height:var(--df-icon-font-size-large);width:var(--df-icon-font-size-large)}.v-icon--size-x-large{font-size:var(--df-icon-font-size-x-large)}.v-icon--size-x-large .v-icon__svg{height:var(--df-icon-font-size-x-large);width:var(--df-icon-font-size-x-large)}.v-icon--disabled{pointer-events:none}.v-btn{border:none;align-items:center;display:inline-flex;flex:0 0 auto;justify-content:center;outline:0;cursor:pointer;position:relative;padding:0 1em;min-width:4em;box-shadow:var(--df-btn-shadow, 0 3px 1px -2px rgba(0, 0, 0, .2), 0 2px 2px 0 rgba(0, 0, 0, .14), 0 1px 5px 0 rgba(0, 0, 0, .12));height:var(--df-btn-height, var(--df-btn-height-default, unset));font-size:var(--df-btn-font-size, var(--df-btn-font-size-default, inherit));font-weight:var(--df-btn-font-weight);letter-spacing:var(--df-btn-letter-spacing);text-transform:var(--df-btn-text-transform);transition-duration:var(--df-btn-transition-duration);border-radius:var(--df-btn-border-radius);font-family:var(--df-font-family);background-color:var(--df-btn-bg-color);color:var(--df-btn-text-color);border-color:var(--df-btn-border-color)}.v-btn .v-icon__svg{fill:currentColor}.v-btn__content{line-height:initial;flex-direction:column}.v-btn{-webkit-user-select:none;-ms-user-select:none;-moz-user-select:none;user-select:none;text-decoration:none;transition-property:box-shadow,transform,opacity,background-color;transition-timing-function:cubic-bezier(.4,0,.2,1);vertical-align:middle;white-space:nowrap}.v-btn:before{content:"";background-color:currentColor;border-radius:inherit;opacity:0;inset:0;color:inherit;pointer-events:none;position:absolute;transition:opacity .2s cubic-bezier(.4,0,.6,1)}.v-btn:focus,.v-btn:active{text-decoration:none}.v-btn:active:not(.v-btn--text):not(.v-btn--depressed):not(.v-btn--disabled){transform:translateY(1px);box-shadow:var(--df-btn-shadow-active, 0 1px 2px 0 rgba(0, 0, 0, .18))}.v-btn.v-btn--icon,.v-btn.v-btn--fab{padding:0;min-width:0;border-radius:50%}.v-btn--depressed,.v-btn--disabled,.v-btn--text{box-shadow:none}.v-btn--block:not(.v-btn--fab):not(.v-btn--icon){display:flex;flex:1 0 auto;min-width:100%!important}.v-btn--outlined{border:1px solid var(--df-btn-bg-color, var(--df-color-primary));color:var(--df-btn-bg-color, var(--df-color-primary));background-color:transparent}.v-btn--text{background-color:transparent;color:var(--df-btn-bg-color, var(--df-color-primary));box-shadow:none}.v-btn--stacked{flex-direction:column}.v-btn--stacked .v-btn__prepend{margin:0 0 .25rem}.v-btn--stacked .v-btn__append{margin:.25rem 0 0}.v-btn--icon{background-color:transparent;padding:0}.v-btn--fab{border-radius:100%}.v-btn--fab .v-btn__content,.v-btn--icon .v-btn__content{display:flex;justify-content:center;align-items:center}.v-btn--loading{pointer-events:none}.v-btn--loading .v-btn__content,.v-btn--loading .v-btn__append,.v-btn--loading .v-btn__prepend{opacity:0}.v-btn--disabled{pointer-events:none;cursor:not-allowed}.v-btn__loader{align-items:center;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.v-btn:focus:before{opacity:var(--df-btn-state-focus, .1)}.v-btn:hover:before{opacity:var(--df-btn-state-hover, .1)}.v-btn:active:before{opacity:var(--df-btn-state-active, .1)}.v-btn--size-x-small{height:var(--df-btn-height, var(--df-btn-height-x-small));font-size:var(--df-btn-font-size, var(--df-btn-font-size-x-small))}.v-btn--size-x-small.v-btn--fab{height:var(--df-btn-height, var(--df-fab-height-x-small));width:var(--df-btn-height, var(--df-fab-height-x-small));font-size:var(--df-btn-font-size, var(--df-fab-font-sizes-x-small))}.v-btn--size-x-small.v-btn--icon{width:var(--df-btn-height, var(--df-btn-height-x-small))}.v-btn--size-x-small.v-btn--stacked{height:var(--df-btn-height, var(--df-stacked-height-x-small))}.v-btn--size-small{height:var(--df-btn-height, var(--df-btn-height-small));font-size:var(--df-btn-font-size, var(--df-btn-font-size-small))}.v-btn--size-small.v-btn--fab{height:var(--df-btn-height, var(--df-fab-height-small));width:var(--df-btn-height, var(--df-fab-height-small));font-size:var(--df-btn-font-size, var(--df-fab-font-sizes-small))}.v-btn--size-small.v-btn--icon{width:var(--df-btn-height, var(--df-btn-height-small))}.v-btn--size-small.v-btn--stacked{height:var(--df-btn-height, var(--df-stacked-height-small))}.v-btn--size-default{height:var(--df-btn-height, var(--df-btn-height-default));font-size:var(--df-btn-font-size, var(--df-btn-font-size-default))}.v-btn--size-default.v-btn--fab{height:var(--df-btn-height, var(--df-fab-height-default));width:var(--df-btn-height, var(--df-fab-height-default));font-size:var(--df-btn-font-size, var(--df-fab-font-sizes-default))}.v-btn--size-default.v-btn--icon{width:var(--df-btn-height, var(--df-btn-height-default))}.v-btn--size-default.v-btn--stacked{height:var(--df-btn-height, var(--df-stacked-height-default))}.v-btn--size-large{height:var(--df-btn-height, var(--df-btn-height-large));font-size:var(--df-btn-font-size, var(--df-btn-font-size-large))}.v-btn--size-large.v-btn--fab{height:var(--df-btn-height, var(--df-fab-height-large));width:var(--df-btn-height, var(--df-fab-height-large));font-size:var(--df-btn-font-size, var(--df-fab-font-sizes-large))}.v-btn--size-large.v-btn--icon{width:var(--df-btn-height, var(--df-btn-height-large))}.v-btn--size-large.v-btn--stacked{height:var(--df-btn-height, var(--df-stacked-height-large))}.v-btn--size-x-large{height:var(--df-btn-height, var(--df-btn-height-x-large));font-size:var(--df-btn-font-size, var(--df-btn-font-size-x-large))}.v-btn--size-x-large.v-btn--fab{height:var(--df-btn-height, var(--df-fab-height-x-large));width:var(--df-btn-height, var(--df-fab-height-x-large));font-size:var(--df-btn-font-size, var(--df-fab-font-sizes-x-large))}.v-btn--size-x-large.v-btn--icon{width:var(--df-btn-height, var(--df-btn-height-x-large))}.v-btn--size-x-large.v-btn--stacked{height:var(--df-btn-height, var(--df-stacked-height-x-large))}.v-btn__prepend{margin-right:var(--df-btn-icon-spacing, .5rem)}.v-btn__append{margin-left:var(--df-btn-icon-spacing, .5rem)}
@@ -0,0 +1,746 @@
1
+ import { reactive as N, provide as Z, inject as V, computed as p, defineComponent as j, ref as E, useAttrs as D, onMounted as K, openBlock as b, createElementBlock as h, normalizeClass as F, renderSlot as L, Fragment as X, renderList as Y, mergeProps as m, createCommentVNode as _, useSlots as q, watchEffect as G, withDirectives as B, createBlock as I, resolveDynamicComponent as J, withCtx as Q, createElementVNode as k, vShow as ee, createVNode as W } from "vue";
2
+ let d = null;
3
+ function C(e, n) {
4
+ return n ? {
5
+ name: n.name ?? e.name,
6
+ colors: {
7
+ ...e.colors,
8
+ ...n.colors || {}
9
+ },
10
+ spacing: e.spacing && n.spacing ? { ...e.spacing, ...n.spacing } : n.spacing || e.spacing,
11
+ typography: e.typography && n.typography ? { ...e.typography, ...n.typography } : n.typography || e.typography,
12
+ shape: e.shape && n.shape ? { ...e.shape, ...n.shape } : n.shape || e.shape,
13
+ elevation: e.elevation && n.elevation ? { ...e.elevation, ...n.elevation } : n.elevation || e.elevation,
14
+ tokens: {
15
+ ...e.tokens,
16
+ ...n.tokens || {}
17
+ }
18
+ } : e;
19
+ }
20
+ function ne(e) {
21
+ const n = {};
22
+ return e.colors && Object.entries(e.colors).forEach(([t, o]) => {
23
+ n[`--df-color-${t}`] = o;
24
+ }), e.spacing && Object.entries(e.spacing).forEach(([t, o]) => {
25
+ n[`--df-spacing-${t}`] = o;
26
+ }), e.typography && Object.entries(e.typography).forEach(([t, o]) => {
27
+ n[`--df-font-size-${t}`] = o.fontSize, n[`--df-font-weight-${t}`] = String(o.fontWeight), n[`--df-line-height-${t}`] = o.lineHeight, n[`--df-letter-spacing-${t}`] = o.letterSpacing;
28
+ }), e.shape && Object.entries(e.shape).forEach(([t, o]) => {
29
+ n[`--df-${t}`] = o;
30
+ }), e.elevation && Object.entries(e.elevation).forEach(([t, o]) => {
31
+ n[`--df-${t}`] = o;
32
+ }), e.tokens && Object.entries(e.tokens).forEach(([t, o]) => {
33
+ n[`--df-${t}`] = o;
34
+ }), n;
35
+ }
36
+ function te(e, n = {}) {
37
+ if (typeof document > "u") return;
38
+ (!(d && document.head.contains(d)) || n.replace) && (d && document.head.contains(d) && d.remove(), d = document.createElement("style"), d.setAttribute("data-dashforge-utilities", "true"), d.setAttribute("type", "text/css"), document.head.appendChild(d));
39
+ const o = [];
40
+ e.colors && Object.entries(e.colors).forEach(([r, i]) => {
41
+ o.push(`.bg-${r}{background-color:var(--df-color-${r},${i})!important}`), o.push(`.text-${r}{color:var(--df-color-${r},${i})!important}`), o.push(`.border-${r}{border-color:var(--df-color-${r},${i})!important}`);
42
+ }), d && (d.textContent = o.join(`
43
+ `));
44
+ }
45
+ function M(e, n = {}) {
46
+ if (typeof document > "u") return;
47
+ const t = ne(e), o = document.documentElement;
48
+ for (const r in t)
49
+ o.style.setProperty(r, t[r]);
50
+ n.generateUtilities && te(e, { replace: !0 });
51
+ }
52
+ function A(e) {
53
+ const n = Object.keys(e).filter(
54
+ (t) => !t.startsWith("on-") && !t.includes("-container")
55
+ );
56
+ for (const t of n) {
57
+ const o = `on-${t}` in e, r = `${t}-container` in e, i = `on-${t}-container` in e;
58
+ o || console.warn(`ColorPalette: Color "${t}" falta "on-${t}"`), r || console.warn(`ColorPalette: Color "${t}" falta "${t}-container"`), i || console.warn(`ColorPalette: Color "${t}" falta "on-${t}-container"`);
59
+ }
60
+ return e;
61
+ }
62
+ const oe = A({
63
+ primary: "#00af67",
64
+ "on-primary": "#ffffff",
65
+ "primary-container": "#b1f5db",
66
+ "on-primary-container": "#00291b",
67
+ secondary: "#625b71",
68
+ "on-secondary": "#ffffff",
69
+ "secondary-container": "#e8def8",
70
+ "on-secondary-container": "#1d192b",
71
+ success: "#4caf50",
72
+ "on-success": "#ffffff",
73
+ "success-container": "#c8e6c9",
74
+ "on-success-container": "#1b5e20",
75
+ warning: "#ffb300",
76
+ "on-warning": "#000000",
77
+ "warning-container": "#ffe082",
78
+ "on-warning-container": "#ff6f00",
79
+ error: "#b3261e",
80
+ "on-error": "#ffffff",
81
+ "error-container": "#f9dedc",
82
+ "on-error-container": "#410e0b",
83
+ info: "#2196f3",
84
+ "on-info": "#ffffff",
85
+ "info-container": "#bbdefb",
86
+ "on-info-container": "#0d47a1",
87
+ input: "#eaddff",
88
+ "on-input": "#000000",
89
+ "input-container": "#fffbfe",
90
+ "on-input-container": "#1c1b1f",
91
+ grey: "#79747e",
92
+ "on-grey": "#ffffff",
93
+ "grey-container": "#cac7d0",
94
+ "on-grey-container": "#1c1b1f",
95
+ disabled: "#e0e0e0",
96
+ "on-disabled": "#9e9e9e",
97
+ "disabled-container": "#ded8e1",
98
+ "on-disabled-container": "#1c1b1f",
99
+ neutral: "#1c1b1f",
100
+ "on-neutral": "#ffffff",
101
+ "neutral-container": "#fffbfe",
102
+ "on-neutral-container": "#1c1b1f",
103
+ "neutral-variant": "#49454e",
104
+ "on-neutral-variant": "#ffffff",
105
+ "neutral-variant-container": "#cac7d0",
106
+ "on-neutral-variant-container": "#1c1b1f",
107
+ background: "#fffbfe",
108
+ "on-background": "#1c1b1f",
109
+ "background-container": "#fffbfe",
110
+ "on-background-container": "#1c1b1f",
111
+ surface: "#fffbfe",
112
+ "on-surface": "#1c1b1f",
113
+ "surface-container": "#fffbfe",
114
+ "on-surface-container": "#1c1b1f",
115
+ "surface-dim": "#ded8e1",
116
+ "on-surface-dim": "#1c1b1f",
117
+ "surface-dim-container": "#ded8e1",
118
+ "on-surface-dim-container": "#1c1b1f",
119
+ "surface-bright": "#fffbfe",
120
+ "on-surface-bright": "#1c1b1f",
121
+ "surface-bright-container": "#fffbfe",
122
+ "on-surface-bright-container": "#1c1b1f",
123
+ "on-surface-variant": "#49454e",
124
+ text: "#1c1b1f",
125
+ "on-text": "#fffbfe",
126
+ "text-container": "#fffbfe",
127
+ "on-text-container": "#1c1b1f",
128
+ "text-secondary": "#49454e",
129
+ "on-text-secondary": "#fffbfe",
130
+ "text-secondary-container": "#fffbfe",
131
+ "on-text-secondary-container": "#1c1b1f",
132
+ "text-tertiary": "#79747e",
133
+ "on-text-tertiary": "#fffbfe",
134
+ "text-tertiary-container": "#fffbfe",
135
+ "on-text-tertiary-container": "#1c1b1f",
136
+ outline: "#79747e",
137
+ "on-outline": "#1c1b1f",
138
+ "outline-container": "#ded8e1",
139
+ "on-outline-container": "#1c1b1f",
140
+ "outline-variant": "#cac7d0",
141
+ "on-outline-variant": "#1c1b1f",
142
+ "outline-variant-container": "#ded8e1",
143
+ "on-outline-variant-container": "#1c1b1f",
144
+ white: "#ffffff",
145
+ "on-white": "#000000",
146
+ "white-container": "#fffbfe",
147
+ "on-white-container": "#1c1b1f",
148
+ black: "#000000",
149
+ "on-black": "#ffffff",
150
+ "black-container": "#1c1b1f",
151
+ "on-black-container": "#ffffff"
152
+ }), re = A({
153
+ primary: "#7dffad",
154
+ "on-primary": "#004d32",
155
+ "primary-container": "#007348",
156
+ "on-primary-container": "#b1f5db",
157
+ secondary: "#ccc7d8",
158
+ "on-secondary": "#312e42",
159
+ "secondary-container": "#4a4458",
160
+ "on-secondary-container": "#e8def8",
161
+ success: "#81c784",
162
+ "on-success": "#1b5e20",
163
+ "success-container": "#388e3c",
164
+ "on-success-container": "#c8e6c9",
165
+ warning: "#ffb300",
166
+ "on-warning": "#ff6f00",
167
+ "warning-container": "#ff8f00",
168
+ "on-warning-container": "#ffe082",
169
+ error: "#f2b8b5",
170
+ "on-error": "#601410",
171
+ "error-container": "#8c1d18",
172
+ "on-error-container": "#f9dedc",
173
+ info: "#64b5f6",
174
+ "on-info": "#0d47a1",
175
+ "info-container": "#1976d2",
176
+ "on-info-container": "#bbdefb",
177
+ input: "#523f7f",
178
+ "on-input": "#eaddff",
179
+ "input-container": "#1c1b1f",
180
+ "on-input-container": "#e6e1e5",
181
+ grey: "#cac7d0",
182
+ "on-grey": "#313033",
183
+ "grey-container": "#49454e",
184
+ "on-grey-container": "#e6e1e5",
185
+ disabled: "#616161",
186
+ "on-disabled": "#757575",
187
+ "disabled-container": "#0f0d13",
188
+ "on-disabled-container": "#e6e1e5",
189
+ neutral: "#e6e1e5",
190
+ "on-neutral": "#313033",
191
+ "neutral-container": "#1c1b1f",
192
+ "on-neutral-container": "#e6e1e5",
193
+ "neutral-variant": "#cac7d0",
194
+ "on-neutral-variant": "#49454e",
195
+ "neutral-variant-container": "#49454e",
196
+ "on-neutral-variant-container": "#e6e1e5",
197
+ background: "#1c1b1f",
198
+ "on-background": "#e6e1e5",
199
+ "background-container": "#1c1b1f",
200
+ "on-background-container": "#e6e1e5",
201
+ surface: "#1c1b1f",
202
+ "on-surface": "#e6e1e5",
203
+ "surface-container": "#36343b",
204
+ "on-surface-container": "#e6e1e5",
205
+ "surface-dim": "#0f0d13",
206
+ "on-surface-dim": "#e6e1e5",
207
+ "surface-dim-container": "#0f0d13",
208
+ "on-surface-dim-container": "#e6e1e5",
209
+ "surface-bright": "#36343b",
210
+ "on-surface-bright": "#e6e1e5",
211
+ "surface-bright-container": "#36343b",
212
+ "on-surface-bright-container": "#e6e1e5",
213
+ "on-surface-variant": "#cac7d0",
214
+ text: "#e6e1e5",
215
+ "on-text": "#1c1b1f",
216
+ "text-container": "#1c1b1f",
217
+ "on-text-container": "#e6e1e5",
218
+ "text-secondary": "#cac7d0",
219
+ "on-text-secondary": "#1c1b1f",
220
+ "text-secondary-container": "#1c1b1f",
221
+ "on-text-secondary-container": "#e6e1e5",
222
+ "text-tertiary": "#b0adb8",
223
+ "on-text-tertiary": "#1c1b1f",
224
+ "text-tertiary-container": "#1c1b1f",
225
+ "on-text-tertiary-container": "#e6e1e5",
226
+ outline: "#938f99",
227
+ "on-outline": "#e6e1e5",
228
+ "outline-container": "#36343b",
229
+ "on-outline-container": "#e6e1e5",
230
+ "outline-variant": "#49454e",
231
+ "on-outline-variant": "#e6e1e5",
232
+ "outline-variant-container": "#36343b",
233
+ "on-outline-variant-container": "#e6e1e5",
234
+ white: "#ffffff",
235
+ "on-white": "#000000",
236
+ "white-container": "#1c1b1f",
237
+ "on-white-container": "#e6e1e5",
238
+ black: "#000000",
239
+ "on-black": "#ffffff",
240
+ "black-container": "#1c1b1f",
241
+ "on-black-container": "#ffffff"
242
+ }), ae = {
243
+ xs: "4px",
244
+ sm: "8px",
245
+ md: "16px",
246
+ lg: "24px",
247
+ xl: "32px",
248
+ "2xl": "48px"
249
+ }, ie = {
250
+ "display-large": {
251
+ fontSize: "57px",
252
+ fontWeight: 400,
253
+ lineHeight: "64px",
254
+ letterSpacing: "0px"
255
+ },
256
+ "display-medium": {
257
+ fontSize: "45px",
258
+ fontWeight: 400,
259
+ lineHeight: "52px",
260
+ letterSpacing: "0px"
261
+ },
262
+ "display-small": {
263
+ fontSize: "36px",
264
+ fontWeight: 400,
265
+ lineHeight: "44px",
266
+ letterSpacing: "0px"
267
+ },
268
+ "headline-large": {
269
+ fontSize: "32px",
270
+ fontWeight: 400,
271
+ lineHeight: "40px",
272
+ letterSpacing: "0px"
273
+ },
274
+ "headline-medium": {
275
+ fontSize: "28px",
276
+ fontWeight: 400,
277
+ lineHeight: "36px",
278
+ letterSpacing: "0px"
279
+ },
280
+ "headline-small": {
281
+ fontSize: "24px",
282
+ fontWeight: 400,
283
+ lineHeight: "32px",
284
+ letterSpacing: "0px"
285
+ },
286
+ "title-large": {
287
+ fontSize: "22px",
288
+ fontWeight: 500,
289
+ lineHeight: "28px",
290
+ letterSpacing: "0px"
291
+ },
292
+ "title-medium": {
293
+ fontSize: "16px",
294
+ fontWeight: 500,
295
+ lineHeight: "24px",
296
+ letterSpacing: "0.15px"
297
+ },
298
+ "title-small": {
299
+ fontSize: "14px",
300
+ fontWeight: 500,
301
+ lineHeight: "20px",
302
+ letterSpacing: "0.1px"
303
+ },
304
+ "body-large": {
305
+ fontSize: "16px",
306
+ fontWeight: 400,
307
+ lineHeight: "24px",
308
+ letterSpacing: "0.5px"
309
+ },
310
+ "body-medium": {
311
+ fontSize: "14px",
312
+ fontWeight: 400,
313
+ lineHeight: "20px",
314
+ letterSpacing: "0.25px"
315
+ },
316
+ "body-small": {
317
+ fontSize: "12px",
318
+ fontWeight: 400,
319
+ lineHeight: "16px",
320
+ letterSpacing: "0.4px"
321
+ },
322
+ "label-large": {
323
+ fontSize: "14px",
324
+ fontWeight: 500,
325
+ lineHeight: "20px",
326
+ letterSpacing: "0.1px"
327
+ },
328
+ "label-medium": {
329
+ fontSize: "12px",
330
+ fontWeight: 500,
331
+ lineHeight: "16px",
332
+ letterSpacing: "0.5px"
333
+ },
334
+ "label-small": {
335
+ fontSize: "11px",
336
+ fontWeight: 500,
337
+ lineHeight: "16px",
338
+ letterSpacing: "0.5px"
339
+ }
340
+ }, ce = {
341
+ "corner-none": "0px",
342
+ "corner-extra-small": "4px",
343
+ "corner-small": "8px",
344
+ "corner-medium": "12px",
345
+ "corner-large": "16px",
346
+ "corner-extra-large": "28px",
347
+ "corner-full": "9999px"
348
+ }, se = {
349
+ "level-0": "none",
350
+ "level-1": "0px 1px 3px rgba(0, 0, 0, 0.12), 0px 1px 2px rgba(0, 0, 0, 0.24)",
351
+ "level-2": "0px 3px 6px rgba(0, 0, 0, 0.16), 0px 3px 6px rgba(0, 0, 0, 0.23)",
352
+ "level-3": "0px 10px 20px rgba(0, 0, 0, 0.19), 0px 6px 6px rgba(0, 0, 0, 0.23)",
353
+ "level-4": "0px 15px 25px rgba(0, 0, 0, 0.15), 0px 10px 10px rgba(0, 0, 0, 0.05)",
354
+ "level-5": "0px 20px 40px rgba(0, 0, 0, 0.2)"
355
+ }, le = {
356
+ states: {
357
+ focus: 0.12,
358
+ hover: 0.08,
359
+ active: 0.12
360
+ },
361
+ fontSizes: {
362
+ "x-small": "0.6875rem",
363
+ small: "0.75rem",
364
+ default: "0.875rem",
365
+ large: "1rem",
366
+ "x-large": "1.125rem"
367
+ },
368
+ height: {
369
+ "x-small": "2rem",
370
+ small: "2.25rem",
371
+ default: "2.5rem",
372
+ large: "3rem",
373
+ "x-large": "3.5rem"
374
+ },
375
+ // Button styles (Border & Shape)
376
+ borderRadius: "4px",
377
+ roundedBorderRadius: "28px",
378
+ borderStyle: "solid",
379
+ borderWidth: "1px",
380
+ // Typography
381
+ fontWeight: 500,
382
+ letterSpacing: "0.1em",
383
+ textTransform: "uppercase",
384
+ // Transition
385
+ transitionDuration: "0.28s"
386
+ }, fe = {
387
+ class: "df-icon",
388
+ prefix: "df-icon-",
389
+ fontSizes: {
390
+ "x-small": "1rem",
391
+ small: "1.125rem",
392
+ default: "1.5rem",
393
+ large: "2rem",
394
+ "x-large": "3rem"
395
+ }
396
+ }, s = {
397
+ light: oe,
398
+ dark: re,
399
+ spacing: ae,
400
+ typography: ie,
401
+ shape: ce,
402
+ elevation: se,
403
+ btn: le,
404
+ icon: fe,
405
+ fontFamily: {
406
+ body: 'Roboto, ui-sans-serif, system-ui, -apple-system, "Segoe UI", "Helvetica Neue", Arial, sans-serif'
407
+ }
408
+ }, v = {
409
+ name: "light",
410
+ colors: s.light,
411
+ spacing: s.spacing,
412
+ typography: s.typography,
413
+ shape: s.shape,
414
+ elevation: s.elevation
415
+ }, H = {
416
+ name: "dark",
417
+ colors: s.dark,
418
+ spacing: s.spacing,
419
+ typography: s.typography,
420
+ shape: s.shape,
421
+ elevation: s.elevation
422
+ }, z = /* @__PURE__ */ Symbol("DashboardUI");
423
+ function ke(e = {}) {
424
+ const n = typeof e.theme == "string" ? e.theme === "dark" ? H : v : C(v, e.theme || {}), t = N({
425
+ theme: n,
426
+ generateUtilities: e.generateUtilities ?? !1
427
+ });
428
+ return M(t.theme, { generateUtilities: t.generateUtilities }), {
429
+ install(o) {
430
+ Z(z, t), o.config.globalProperties.$dashboardUI = t;
431
+ }
432
+ };
433
+ }
434
+ function Se() {
435
+ const e = V(z);
436
+ if (!e) throw new Error("createDashboardUI plugin is not installed");
437
+ return e;
438
+ }
439
+ function $e() {
440
+ const e = V(z, null);
441
+ function n(o) {
442
+ let r;
443
+ o === "light" ? r = v : o === "dark" ? r = H : (o.colors, r = C(v, o));
444
+ const i = e?.generateUtilities ?? !1;
445
+ return M(r, { generateUtilities: i }), e && (e.theme = r), r;
446
+ }
447
+ return {
448
+ current: p(() => e ? e.theme : null),
449
+ setTheme: n
450
+ };
451
+ }
452
+ const U = {
453
+ disabled: "v-btn--disabled",
454
+ icon: "v-btn--icon",
455
+ depressed: "v-btn--depressed",
456
+ text: "v-btn--text",
457
+ fab: "v-btn--fab",
458
+ block: "v-btn--block",
459
+ loading: "v-btn--loading",
460
+ outlined: "v-btn--outlined",
461
+ rounded: "v-btn--rounded",
462
+ stacked: "v-btn--stacked"
463
+ };
464
+ function de(e, n = v) {
465
+ return {
466
+ name: e.name ?? n.name,
467
+ colors: {
468
+ ...n.colors,
469
+ ...e.colors || {}
470
+ },
471
+ spacing: e.spacing ?? n.spacing ?? s.spacing,
472
+ typography: e.typography ?? n.typography ?? s.typography,
473
+ shape: e.shape ?? n.shape ?? s.shape,
474
+ elevation: e.elevation ?? n.elevation ?? s.elevation,
475
+ tokens: {
476
+ ...n.tokens || {},
477
+ ...e.tokens || {}
478
+ }
479
+ };
480
+ }
481
+ function Le(e) {
482
+ return de(e, H);
483
+ }
484
+ const Ce = {
485
+ arrowLeft: {
486
+ d: "M14,7L9,12L14,17V7Z"
487
+ },
488
+ arrowRight: {
489
+ d: "M10,17L15,12L10,7V17Z"
490
+ },
491
+ arrowDown: {
492
+ d: "M7,10L12,15L17,10H7Z"
493
+ },
494
+ arrowUp: {
495
+ d: "M7,15L12,10L17,15H7Z"
496
+ },
497
+ chevronDown: {
498
+ d: "M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z"
499
+ },
500
+ clear: {
501
+ d: "M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"
502
+ }
503
+ }, O = (e, n) => (t) => {
504
+ if (n?.value?.disabled || t instanceof KeyboardEvent && t.key !== "Enter" && t.key !== " " && t.key !== "Spacebar")
505
+ return;
506
+ e.classList.contains("v-ripple-element") || e.classList.add("v-ripple-element");
507
+ const o = document.createElement("span");
508
+ o.classList.add("v-ripple"), e.appendChild(o);
509
+ const r = e.getBoundingClientRect(), i = Math.max(r.width, r.height), u = i / 2, x = n?.value?.color || getComputedStyle(e).color || "rgb(255, 255, 255)", c = !!n?.value?.center, l = n?.value?.duration || 500;
510
+ o.style.width = o.style.height = `${i}px`, o.style.backgroundColor = x, o.style.animationDuration = `${l}ms`, o.style.position = "absolute", o.style.borderRadius = "50%", o.style.pointerEvents = "none", o.style.left = c ? `${(r.width - i) / 2}px` : t instanceof MouseEvent ? `${t.clientX - r.left - u}px` : `${r.width / 2 - u}px`, o.style.top = c ? `${(r.height - i) / 2}px` : t instanceof MouseEvent ? `${t.clientY - r.top - u}px` : `${r.height / 2 - u}px`, setTimeout(() => {
511
+ o.parentElement && o.parentElement.removeChild(o);
512
+ }, l);
513
+ }, pe = {
514
+ mounted(e, n) {
515
+ if (n?.value?.disabled) return;
516
+ e.classList.contains("v-ripple-element") || e.classList.add("v-ripple-element"), e.__rippleHandler__ = O(e, n);
517
+ const t = n?.value?.event || "pointerdown";
518
+ e.addEventListener(t, e.__rippleHandler__), t !== "keydown" && e.addEventListener("keydown", e.__rippleHandler__);
519
+ },
520
+ updated(e, n) {
521
+ const t = n?.value?.event || "pointerdown";
522
+ n?.value?.disabled && e.__rippleHandler__ ? (e.removeEventListener(t, e.__rippleHandler__), e.removeEventListener("keydown", e.__rippleHandler__), e.classList.remove("v-ripple-element"), delete e.__rippleHandler__) : !n?.value?.disabled && !e.__rippleHandler__ && (e.__rippleHandler__ = O(e, n), e.addEventListener(t, e.__rippleHandler__), t !== "keydown" && e.addEventListener("keydown", e.__rippleHandler__), e.classList.contains("v-ripple-element") || e.classList.add("v-ripple-element"));
523
+ },
524
+ unmounted(e, n) {
525
+ const t = n.event || "pointerdown";
526
+ e.__rippleHandler__ && (e.removeEventListener(t, e.__rippleHandler__), e.removeEventListener("keydown", e.__rippleHandler__), delete e.__rippleHandler__), e.classList.remove("v-ripple-element");
527
+ }
528
+ }, ue = ["viewBox"], be = {
529
+ name: "VIcon"
530
+ }, w = /* @__PURE__ */ j({
531
+ ...be,
532
+ props: {
533
+ color: {},
534
+ disabled: { type: Boolean },
535
+ preffix: {},
536
+ viewBox: { default: "0 0 24 24" },
537
+ icon: {},
538
+ size: { default: "default" }
539
+ },
540
+ setup(e) {
541
+ const n = E(!1), t = D(), o = e, r = E({ iconClass: "icon", iconPreffix: "icon-" }), i = p(() => typeof o.icon != "string"), u = p(() => i.value ? typeof o.icon == "object" && !Array.isArray(o.icon) ? [o.icon] : o.icon : []), g = (c) => {
542
+ const l = { d: c.d };
543
+ return c.fill && (l.class = `${c.fill}--text`), l;
544
+ }, x = p(() => {
545
+ const c = t.class ? `${t.class}` : "", l = ["v-icon", r.value.iconClass, c], y = o.size || "default";
546
+ return l.push(`v-icon--size-${y}`), i.value || l.push(
547
+ `${(o.preffix || r.value.iconPreffix).trim()}${o.icon.trim()}`
548
+ ), o.color && l.push(`${o.color}--text`), l;
549
+ });
550
+ return K(() => {
551
+ if (typeof window < "u") {
552
+ const c = window.getComputedStyle(document.documentElement);
553
+ r.value.iconClass = c.getPropertyValue("--icon-class") || "icon", r.value.iconPreffix = c.getPropertyValue("--icon-prefix") || "icon-";
554
+ }
555
+ n.value = !0;
556
+ }), (c, l) => n.value ? (b(), h("i", {
557
+ key: 0,
558
+ "aria-hidden": "true",
559
+ class: F(x.value)
560
+ }, [
561
+ L(c.$slots, "default", {}, () => [
562
+ i.value ? (b(), h("svg", {
563
+ key: 0,
564
+ xmlns: "http://www.w3.org/2000/svg",
565
+ viewBox: e.viewBox,
566
+ class: "v-icon__svg"
567
+ }, [
568
+ (b(!0), h(X, null, Y(u.value, (y, S) => (b(), h("path", m({ key: S }, { ref_for: !0 }, g(y)), null, 16))), 128))
569
+ ], 8, ue)) : _("", !0)
570
+ ])
571
+ ], 2)) : _("", !0);
572
+ }
573
+ }), ge = {
574
+ class: "v-btn__loader",
575
+ "aria-live": "polite",
576
+ "aria-atomic": "true"
577
+ }, he = {
578
+ role: "progressbar",
579
+ "aria-valuemin": "0",
580
+ "aria-valuemax": "100",
581
+ class: "e-progress-circular e-progress-circular--visible e-progress-circular--indeterminate",
582
+ style: { height: "23px", width: "23px" }
583
+ }, ve = {
584
+ xmlns: "http://www.w3.org/2000/svg",
585
+ viewBox: "21.904761904761905 21.904761904761905 43.80952380952381 43.80952380952381",
586
+ style: { transform: "rotate(0deg)" }
587
+ }, xe = {
588
+ key: 0,
589
+ class: "v-btn__prepend"
590
+ }, ye = { class: "v-btn__content" }, me = {
591
+ key: 1,
592
+ class: "v-btn__append"
593
+ }, P = /* @__PURE__ */ j({
594
+ __name: "VButton",
595
+ props: {
596
+ disabled: { type: Boolean },
597
+ link: { type: Boolean },
598
+ appendIcon: {},
599
+ prependIcon: {},
600
+ ripple: { type: Boolean, default: !0 },
601
+ loading: { type: Boolean },
602
+ color: {},
603
+ fab: { type: Boolean },
604
+ depressed: { type: Boolean },
605
+ text: { type: Boolean },
606
+ outlined: { type: Boolean },
607
+ block: { type: Boolean },
608
+ size: {},
609
+ type: {},
610
+ rounded: { type: Boolean },
611
+ stacked: { type: Boolean },
612
+ icon: {},
613
+ height: {},
614
+ width: {}
615
+ },
616
+ setup(e) {
617
+ const n = { ...pe }, t = D(), o = q(), r = e, i = p(
618
+ () => r.ripple === !1 ? { disabled: !0 } : void 0
619
+ ), u = p(() => ({
620
+ ...r.size ? { size: r.size } : {}
621
+ })), g = p(() => {
622
+ if (r.link) return "a";
623
+ const { to: a } = t;
624
+ return typeof a == "string" && a.startsWith("http") ? "a" : a ? "router-link" : "button";
625
+ }), x = p(() => {
626
+ const { to: a, target: f } = t;
627
+ return typeof a == "string" && a.startsWith("http") ? {
628
+ href: a,
629
+ target: f,
630
+ rel: f === "_blank" ? "noopener noreferrer" : void 0
631
+ } : {};
632
+ }), c = p(
633
+ () => o.default ? o.default().length > 0 : !1
634
+ ), l = p(
635
+ () => !!(r.icon || r.fab) && !r.prependIcon && !r.appendIcon && !c.value
636
+ ), y = p(() => {
637
+ const a = t["aria-label"];
638
+ if (typeof a == "string" && a.trim().length) return a;
639
+ if (l.value && typeof r.icon == "string") return r.icon;
640
+ });
641
+ G(() => {
642
+ });
643
+ const S = () => {
644
+ const a = ["v-btn"], f = r.size || "default";
645
+ a.push(`v-btn--size-${f}`);
646
+ const T = Object.keys(
647
+ U
648
+ ).filter(($) => !!r[$]).map(($) => U[$]);
649
+ return r.ripple !== !1 && a.push("v-ripple-element"), [...a, ...T];
650
+ }, R = () => {
651
+ const a = {};
652
+ if (r.color) {
653
+ const f = r.color;
654
+ a["--df-btn-bg-color"] = `var(--df-color-${f}, var(--df-color-primary))`, a["--df-btn-text-color"] = `var(--df-color-on-${f}, var(--df-color-on-primary))`, a["--df-btn-border-color"] = `var(--df-color-${f}, var(--df-color-primary))`;
655
+ }
656
+ return r.height && (a["--df-btn-height"] = `${r.height}px`), r.width && (a.width = `${r.width}px`), a;
657
+ };
658
+ return (a, f) => B((b(), I(J(g.value), m(x.value, {
659
+ class: S(),
660
+ type: g.value === "button" ? e.type || "button" : void 0,
661
+ disabled: g.value === "button" ? r.disabled : void 0,
662
+ "aria-disabled": r.disabled ? "true" : void 0,
663
+ "aria-busy": r.loading ? "true" : void 0,
664
+ "aria-label": y.value,
665
+ tabindex: r.disabled && g.value !== "button" ? -1 : void 0,
666
+ style: R()
667
+ }), {
668
+ default: Q(() => [
669
+ B(k("span", ge, [
670
+ L(a.$slots, "loading", {}, () => [
671
+ k("span", he, [
672
+ (b(), h("svg", ve, [...f[0] || (f[0] = [
673
+ k("circle", {
674
+ fill: "transparent",
675
+ cx: "43.80952380952381",
676
+ cy: "43.80952380952381",
677
+ r: "20",
678
+ "stroke-width": "3.8095238095238093",
679
+ "stroke-dasharray": "125.664",
680
+ "stroke-dashoffset": "125.66370614359172px",
681
+ class: "e-progress-circular__overlay"
682
+ }, null, -1)
683
+ ])]))
684
+ ])
685
+ ])
686
+ ], 512), [
687
+ [ee, r.loading]
688
+ ]),
689
+ e.prependIcon ? (b(), h("span", xe, [
690
+ W(w, m(u.value, { icon: e.prependIcon }), null, 16, ["icon"])
691
+ ])) : _("", !0),
692
+ k("span", ye, [
693
+ L(a.$slots, "default", {}, () => [
694
+ e.icon || e.fab ? (b(), I(w, m({ key: 0 }, u.value, { icon: e.icon }), null, 16, ["icon"])) : _("", !0)
695
+ ])
696
+ ]),
697
+ e.appendIcon ? (b(), h("span", me, [
698
+ W(w, m(u.value, { icon: e.appendIcon }), null, 16, ["icon"])
699
+ ])) : _("", !0)
700
+ ]),
701
+ _: 3
702
+ }, 16, ["class", "type", "disabled", "aria-disabled", "aria-busy", "aria-label", "tabindex", "style"])), [
703
+ [n, i.value]
704
+ ]);
705
+ }
706
+ });
707
+ P.install = (e) => {
708
+ e.component("VButton", P);
709
+ };
710
+ w.install = (e) => {
711
+ e.component("VIcon", w);
712
+ };
713
+ function He() {
714
+ return {
715
+ isObject: (n) => typeof n == "object" && !Array.isArray(n) && n !== null
716
+ };
717
+ }
718
+ export {
719
+ U as BUTTON_CLASS_MAP,
720
+ z as DashboardUIKey,
721
+ P as VButton,
722
+ w as VIcon,
723
+ M as applyTheme,
724
+ le as btn,
725
+ A as createColorPalette,
726
+ Le as createDarkTheme,
727
+ ke as createDashboardUI,
728
+ de as createTheme,
729
+ re as darkColors,
730
+ H as darkTheme,
731
+ se as elevation,
732
+ ne as generateCSSVars,
733
+ te as generateUtilityClasses,
734
+ fe as icon,
735
+ Ce as iconFactory,
736
+ oe as lightColors,
737
+ v as lightTheme,
738
+ s as materialTokens,
739
+ C as mergeThemes,
740
+ ce as shape,
741
+ ae as spacing,
742
+ ie as typography,
743
+ Se as useDashboardUI,
744
+ $e as useTheme,
745
+ He as useUtils
746
+ };
@@ -0,0 +1,2 @@
1
+ (function(i,n){typeof exports=="object"&&typeof module<"u"?n(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],n):(i=typeof globalThis<"u"?globalThis:i||self,n(i.DashforgeUI={},i.Vue))})(this,(function(i,n){"use strict";let p=null;function v(e,t){return t?{name:t.name??e.name,colors:{...e.colors,...t.colors||{}},spacing:e.spacing&&t.spacing?{...e.spacing,...t.spacing}:t.spacing||e.spacing,typography:e.typography&&t.typography?{...e.typography,...t.typography}:t.typography||e.typography,shape:e.shape&&t.shape?{...e.shape,...t.shape}:t.shape||e.shape,elevation:e.elevation&&t.elevation?{...e.elevation,...t.elevation}:t.elevation||e.elevation,tokens:{...e.tokens,...t.tokens||{}}}:e}function E(e){const t={};return e.colors&&Object.entries(e.colors).forEach(([o,r])=>{t[`--df-color-${o}`]=r}),e.spacing&&Object.entries(e.spacing).forEach(([o,r])=>{t[`--df-spacing-${o}`]=r}),e.typography&&Object.entries(e.typography).forEach(([o,r])=>{t[`--df-font-size-${o}`]=r.fontSize,t[`--df-font-weight-${o}`]=String(r.fontWeight),t[`--df-line-height-${o}`]=r.lineHeight,t[`--df-letter-spacing-${o}`]=r.letterSpacing}),e.shape&&Object.entries(e.shape).forEach(([o,r])=>{t[`--df-${o}`]=r}),e.elevation&&Object.entries(e.elevation).forEach(([o,r])=>{t[`--df-${o}`]=r}),e.tokens&&Object.entries(e.tokens).forEach(([o,r])=>{t[`--df-${o}`]=r}),t}function H(e,t={}){if(typeof document>"u")return;(!(p&&document.head.contains(p))||t.replace)&&(p&&document.head.contains(p)&&p.remove(),p=document.createElement("style"),p.setAttribute("data-dashforge-utilities","true"),p.setAttribute("type","text/css"),document.head.appendChild(p));const r=[];e.colors&&Object.entries(e.colors).forEach(([a,l])=>{r.push(`.bg-${a}{background-color:var(--df-color-${a},${l})!important}`),r.push(`.text-${a}{color:var(--df-color-${a},${l})!important}`),r.push(`.border-${a}{border-color:var(--df-color-${a},${l})!important}`)}),p&&(p.textContent=r.join(`
2
+ `))}function w(e,t={}){if(typeof document>"u")return;const o=E(e),r=document.documentElement;for(const a in o)r.style.setProperty(a,o[a]);t.generateUtilities&&H(e,{replace:!0})}function S(e){const t=Object.keys(e).filter(o=>!o.startsWith("on-")&&!o.includes("-container"));for(const o of t){const r=`on-${o}`in e,a=`${o}-container`in e,l=`on-${o}-container`in e;r||console.warn(`ColorPalette: Color "${o}" falta "on-${o}"`),a||console.warn(`ColorPalette: Color "${o}" falta "${o}-container"`),l||console.warn(`ColorPalette: Color "${o}" falta "on-${o}-container"`)}return e}const z=S({primary:"#00af67","on-primary":"#ffffff","primary-container":"#b1f5db","on-primary-container":"#00291b",secondary:"#625b71","on-secondary":"#ffffff","secondary-container":"#e8def8","on-secondary-container":"#1d192b",success:"#4caf50","on-success":"#ffffff","success-container":"#c8e6c9","on-success-container":"#1b5e20",warning:"#ffb300","on-warning":"#000000","warning-container":"#ffe082","on-warning-container":"#ff6f00",error:"#b3261e","on-error":"#ffffff","error-container":"#f9dedc","on-error-container":"#410e0b",info:"#2196f3","on-info":"#ffffff","info-container":"#bbdefb","on-info-container":"#0d47a1",input:"#eaddff","on-input":"#000000","input-container":"#fffbfe","on-input-container":"#1c1b1f",grey:"#79747e","on-grey":"#ffffff","grey-container":"#cac7d0","on-grey-container":"#1c1b1f",disabled:"#e0e0e0","on-disabled":"#9e9e9e","disabled-container":"#ded8e1","on-disabled-container":"#1c1b1f",neutral:"#1c1b1f","on-neutral":"#ffffff","neutral-container":"#fffbfe","on-neutral-container":"#1c1b1f","neutral-variant":"#49454e","on-neutral-variant":"#ffffff","neutral-variant-container":"#cac7d0","on-neutral-variant-container":"#1c1b1f",background:"#fffbfe","on-background":"#1c1b1f","background-container":"#fffbfe","on-background-container":"#1c1b1f",surface:"#fffbfe","on-surface":"#1c1b1f","surface-container":"#fffbfe","on-surface-container":"#1c1b1f","surface-dim":"#ded8e1","on-surface-dim":"#1c1b1f","surface-dim-container":"#ded8e1","on-surface-dim-container":"#1c1b1f","surface-bright":"#fffbfe","on-surface-bright":"#1c1b1f","surface-bright-container":"#fffbfe","on-surface-bright-container":"#1c1b1f","on-surface-variant":"#49454e",text:"#1c1b1f","on-text":"#fffbfe","text-container":"#fffbfe","on-text-container":"#1c1b1f","text-secondary":"#49454e","on-text-secondary":"#fffbfe","text-secondary-container":"#fffbfe","on-text-secondary-container":"#1c1b1f","text-tertiary":"#79747e","on-text-tertiary":"#fffbfe","text-tertiary-container":"#fffbfe","on-text-tertiary-container":"#1c1b1f",outline:"#79747e","on-outline":"#1c1b1f","outline-container":"#ded8e1","on-outline-container":"#1c1b1f","outline-variant":"#cac7d0","on-outline-variant":"#1c1b1f","outline-variant-container":"#ded8e1","on-outline-variant-container":"#1c1b1f",white:"#ffffff","on-white":"#000000","white-container":"#fffbfe","on-white-container":"#1c1b1f",black:"#000000","on-black":"#ffffff","black-container":"#1c1b1f","on-black-container":"#ffffff"}),V=S({primary:"#7dffad","on-primary":"#004d32","primary-container":"#007348","on-primary-container":"#b1f5db",secondary:"#ccc7d8","on-secondary":"#312e42","secondary-container":"#4a4458","on-secondary-container":"#e8def8",success:"#81c784","on-success":"#1b5e20","success-container":"#388e3c","on-success-container":"#c8e6c9",warning:"#ffb300","on-warning":"#ff6f00","warning-container":"#ff8f00","on-warning-container":"#ffe082",error:"#f2b8b5","on-error":"#601410","error-container":"#8c1d18","on-error-container":"#f9dedc",info:"#64b5f6","on-info":"#0d47a1","info-container":"#1976d2","on-info-container":"#bbdefb",input:"#523f7f","on-input":"#eaddff","input-container":"#1c1b1f","on-input-container":"#e6e1e5",grey:"#cac7d0","on-grey":"#313033","grey-container":"#49454e","on-grey-container":"#e6e1e5",disabled:"#616161","on-disabled":"#757575","disabled-container":"#0f0d13","on-disabled-container":"#e6e1e5",neutral:"#e6e1e5","on-neutral":"#313033","neutral-container":"#1c1b1f","on-neutral-container":"#e6e1e5","neutral-variant":"#cac7d0","on-neutral-variant":"#49454e","neutral-variant-container":"#49454e","on-neutral-variant-container":"#e6e1e5",background:"#1c1b1f","on-background":"#e6e1e5","background-container":"#1c1b1f","on-background-container":"#e6e1e5",surface:"#1c1b1f","on-surface":"#e6e1e5","surface-container":"#36343b","on-surface-container":"#e6e1e5","surface-dim":"#0f0d13","on-surface-dim":"#e6e1e5","surface-dim-container":"#0f0d13","on-surface-dim-container":"#e6e1e5","surface-bright":"#36343b","on-surface-bright":"#e6e1e5","surface-bright-container":"#36343b","on-surface-bright-container":"#e6e1e5","on-surface-variant":"#cac7d0",text:"#e6e1e5","on-text":"#1c1b1f","text-container":"#1c1b1f","on-text-container":"#e6e1e5","text-secondary":"#cac7d0","on-text-secondary":"#1c1b1f","text-secondary-container":"#1c1b1f","on-text-secondary-container":"#e6e1e5","text-tertiary":"#b0adb8","on-text-tertiary":"#1c1b1f","text-tertiary-container":"#1c1b1f","on-text-tertiary-container":"#e6e1e5",outline:"#938f99","on-outline":"#e6e1e5","outline-container":"#36343b","on-outline-container":"#e6e1e5","outline-variant":"#49454e","on-outline-variant":"#e6e1e5","outline-variant-container":"#36343b","on-outline-variant-container":"#e6e1e5",white:"#ffffff","on-white":"#000000","white-container":"#1c1b1f","on-white-container":"#e6e1e5",black:"#000000","on-black":"#ffffff","black-container":"#1c1b1f","on-black-container":"#ffffff"}),I={xs:"4px",sm:"8px",md:"16px",lg:"24px",xl:"32px","2xl":"48px"},U={"display-large":{fontSize:"57px",fontWeight:400,lineHeight:"64px",letterSpacing:"0px"},"display-medium":{fontSize:"45px",fontWeight:400,lineHeight:"52px",letterSpacing:"0px"},"display-small":{fontSize:"36px",fontWeight:400,lineHeight:"44px",letterSpacing:"0px"},"headline-large":{fontSize:"32px",fontWeight:400,lineHeight:"40px",letterSpacing:"0px"},"headline-medium":{fontSize:"28px",fontWeight:400,lineHeight:"36px",letterSpacing:"0px"},"headline-small":{fontSize:"24px",fontWeight:400,lineHeight:"32px",letterSpacing:"0px"},"title-large":{fontSize:"22px",fontWeight:500,lineHeight:"28px",letterSpacing:"0px"},"title-medium":{fontSize:"16px",fontWeight:500,lineHeight:"24px",letterSpacing:"0.15px"},"title-small":{fontSize:"14px",fontWeight:500,lineHeight:"20px",letterSpacing:"0.1px"},"body-large":{fontSize:"16px",fontWeight:400,lineHeight:"24px",letterSpacing:"0.5px"},"body-medium":{fontSize:"14px",fontWeight:400,lineHeight:"20px",letterSpacing:"0.25px"},"body-small":{fontSize:"12px",fontWeight:400,lineHeight:"16px",letterSpacing:"0.4px"},"label-large":{fontSize:"14px",fontWeight:500,lineHeight:"20px",letterSpacing:"0.1px"},"label-medium":{fontSize:"12px",fontWeight:500,lineHeight:"16px",letterSpacing:"0.5px"},"label-small":{fontSize:"11px",fontWeight:500,lineHeight:"16px",letterSpacing:"0.5px"}},P={"corner-none":"0px","corner-extra-small":"4px","corner-small":"8px","corner-medium":"12px","corner-large":"16px","corner-extra-large":"28px","corner-full":"9999px"},T={"level-0":"none","level-1":"0px 1px 3px rgba(0, 0, 0, 0.12), 0px 1px 2px rgba(0, 0, 0, 0.24)","level-2":"0px 3px 6px rgba(0, 0, 0, 0.16), 0px 3px 6px rgba(0, 0, 0, 0.23)","level-3":"0px 10px 20px rgba(0, 0, 0, 0.19), 0px 6px 6px rgba(0, 0, 0, 0.23)","level-4":"0px 15px 25px rgba(0, 0, 0, 0.15), 0px 10px 10px rgba(0, 0, 0, 0.05)","level-5":"0px 20px 40px rgba(0, 0, 0, 0.2)"},D={states:{focus:.12,hover:.08,active:.12},fontSizes:{"x-small":"0.6875rem",small:"0.75rem",default:"0.875rem",large:"1rem","x-large":"1.125rem"},height:{"x-small":"2rem",small:"2.25rem",default:"2.5rem",large:"3rem","x-large":"3.5rem"},borderRadius:"4px",roundedBorderRadius:"28px",borderStyle:"solid",borderWidth:"1px",fontWeight:500,letterSpacing:"0.1em",textTransform:"uppercase",transitionDuration:"0.28s"},W={class:"df-icon",prefix:"df-icon-",fontSizes:{"x-small":"1rem",small:"1.125rem",default:"1.5rem",large:"2rem","x-large":"3rem"}},f={light:z,dark:V,spacing:I,typography:U,shape:P,elevation:T,btn:D,icon:W,fontFamily:{body:'Roboto, ui-sans-serif, system-ui, -apple-system, "Segoe UI", "Helvetica Neue", Arial, sans-serif'}},b={name:"light",colors:f.light,spacing:f.spacing,typography:f.typography,shape:f.shape,elevation:f.elevation},_={name:"dark",colors:f.dark,spacing:f.spacing,typography:f.typography,shape:f.shape,elevation:f.elevation},k=Symbol("DashboardUI");function N(e={}){const t=typeof e.theme=="string"?e.theme==="dark"?_:b:v(b,e.theme||{}),o=n.reactive({theme:t,generateUtilities:e.generateUtilities??!1});return w(o.theme,{generateUtilities:o.generateUtilities}),{install(r){n.provide(k,o),r.config.globalProperties.$dashboardUI=o}}}function A(){const e=n.inject(k);if(!e)throw new Error("createDashboardUI plugin is not installed");return e}function M(){const e=n.inject(k,null);function t(r){let a;r==="light"?a=b:r==="dark"?a=_:(r.colors,a=v(b,r));const l=e?.generateUtilities??!1;return w(a,{generateUtilities:l}),e&&(e.theme=a),a}return{current:n.computed(()=>e?e.theme:null),setTheme:t}}const $={disabled:"v-btn--disabled",icon:"v-btn--icon",depressed:"v-btn--depressed",text:"v-btn--text",fab:"v-btn--fab",block:"v-btn--block",loading:"v-btn--loading",outlined:"v-btn--outlined",rounded:"v-btn--rounded",stacked:"v-btn--stacked"};function O(e,t=b){return{name:e.name??t.name,colors:{...t.colors,...e.colors||{}},spacing:e.spacing??t.spacing??f.spacing,typography:e.typography??t.typography??f.typography,shape:e.shape??t.shape??f.shape,elevation:e.elevation??t.elevation??f.elevation,tokens:{...t.tokens||{},...e.tokens||{}}}}function R(e){return O(e,_)}const Z={arrowLeft:{d:"M14,7L9,12L14,17V7Z"},arrowRight:{d:"M10,17L15,12L10,7V17Z"},arrowDown:{d:"M7,10L12,15L17,10H7Z"},arrowUp:{d:"M7,15L12,10L17,15H7Z"},chevronDown:{d:"M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z"},clear:{d:"M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"}},j=(e,t)=>o=>{if(t?.value?.disabled||o instanceof KeyboardEvent&&o.key!=="Enter"&&o.key!==" "&&o.key!=="Spacebar")return;e.classList.contains("v-ripple-element")||e.classList.add("v-ripple-element");const r=document.createElement("span");r.classList.add("v-ripple"),e.appendChild(r);const a=e.getBoundingClientRect(),l=Math.max(a.width,a.height),g=l/2,y=t?.value?.color||getComputedStyle(e).color||"rgb(255, 255, 255)",s=!!t?.value?.center,d=t?.value?.duration||500;r.style.width=r.style.height=`${l}px`,r.style.backgroundColor=y,r.style.animationDuration=`${d}ms`,r.style.position="absolute",r.style.borderRadius="50%",r.style.pointerEvents="none",r.style.left=s?`${(a.width-l)/2}px`:o instanceof MouseEvent?`${o.clientX-a.left-g}px`:`${a.width/2-g}px`,r.style.top=s?`${(a.height-l)/2}px`:o instanceof MouseEvent?`${o.clientY-a.top-g}px`:`${a.height/2-g}px`,setTimeout(()=>{r.parentElement&&r.parentElement.removeChild(r)},d)},K={mounted(e,t){if(t?.value?.disabled)return;e.classList.contains("v-ripple-element")||e.classList.add("v-ripple-element"),e.__rippleHandler__=j(e,t);const o=t?.value?.event||"pointerdown";e.addEventListener(o,e.__rippleHandler__),o!=="keydown"&&e.addEventListener("keydown",e.__rippleHandler__)},updated(e,t){const o=t?.value?.event||"pointerdown";t?.value?.disabled&&e.__rippleHandler__?(e.removeEventListener(o,e.__rippleHandler__),e.removeEventListener("keydown",e.__rippleHandler__),e.classList.remove("v-ripple-element"),delete e.__rippleHandler__):!t?.value?.disabled&&!e.__rippleHandler__&&(e.__rippleHandler__=j(e,t),e.addEventListener(o,e.__rippleHandler__),o!=="keydown"&&e.addEventListener("keydown",e.__rippleHandler__),e.classList.contains("v-ripple-element")||e.classList.add("v-ripple-element"))},unmounted(e,t){const o=t.event||"pointerdown";e.__rippleHandler__&&(e.removeEventListener(o,e.__rippleHandler__),e.removeEventListener("keydown",e.__rippleHandler__),delete e.__rippleHandler__),e.classList.remove("v-ripple-element")}},F=["viewBox"],q={name:"VIcon"},m=n.defineComponent({...q,props:{color:{},disabled:{type:Boolean},preffix:{},viewBox:{default:"0 0 24 24"},icon:{},size:{default:"default"}},setup(e){const t=n.ref(!1),o=n.useAttrs(),r=e,a=n.ref({iconClass:"icon",iconPreffix:"icon-"}),l=n.computed(()=>typeof r.icon!="string"),g=n.computed(()=>l.value?typeof r.icon=="object"&&!Array.isArray(r.icon)?[r.icon]:r.icon:[]),h=s=>{const d={d:s.d};return s.fill&&(d.class=`${s.fill}--text`),d},y=n.computed(()=>{const s=o.class?`${o.class}`:"",d=["v-icon",a.value.iconClass,s],x=r.size||"default";return d.push(`v-icon--size-${x}`),l.value||d.push(`${(r.preffix||a.value.iconPreffix).trim()}${r.icon.trim()}`),r.color&&d.push(`${r.color}--text`),d});return n.onMounted(()=>{if(typeof window<"u"){const s=window.getComputedStyle(document.documentElement);a.value.iconClass=s.getPropertyValue("--icon-class")||"icon",a.value.iconPreffix=s.getPropertyValue("--icon-prefix")||"icon-"}t.value=!0}),(s,d)=>t.value?(n.openBlock(),n.createElementBlock("i",{key:0,"aria-hidden":"true",class:n.normalizeClass(y.value)},[n.renderSlot(s.$slots,"default",{},()=>[l.value?(n.openBlock(),n.createElementBlock("svg",{key:0,xmlns:"http://www.w3.org/2000/svg",viewBox:e.viewBox,class:"v-icon__svg"},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(g.value,(x,C)=>(n.openBlock(),n.createElementBlock("path",n.mergeProps({key:C},{ref_for:!0},h(x)),null,16))),128))],8,F)):n.createCommentVNode("",!0)])],2)):n.createCommentVNode("",!0)}}),X={class:"v-btn__loader","aria-live":"polite","aria-atomic":"true"},Y={role:"progressbar","aria-valuemin":"0","aria-valuemax":"100",class:"e-progress-circular e-progress-circular--visible e-progress-circular--indeterminate",style:{height:"23px",width:"23px"}},G={xmlns:"http://www.w3.org/2000/svg",viewBox:"21.904761904761905 21.904761904761905 43.80952380952381 43.80952380952381",style:{transform:"rotate(0deg)"}},J={key:0,class:"v-btn__prepend"},Q={class:"v-btn__content"},ee={key:1,class:"v-btn__append"},L=n.defineComponent({__name:"VButton",props:{disabled:{type:Boolean},link:{type:Boolean},appendIcon:{},prependIcon:{},ripple:{type:Boolean,default:!0},loading:{type:Boolean},color:{},fab:{type:Boolean},depressed:{type:Boolean},text:{type:Boolean},outlined:{type:Boolean},block:{type:Boolean},size:{},type:{},rounded:{type:Boolean},stacked:{type:Boolean},icon:{},height:{},width:{}},setup(e){const t={...K},o=n.useAttrs(),r=n.useSlots(),a=e,l=n.computed(()=>a.ripple===!1?{disabled:!0}:void 0),g=n.computed(()=>({...a.size?{size:a.size}:{}})),h=n.computed(()=>{if(a.link)return"a";const{to:c}=o;return typeof c=="string"&&c.startsWith("http")?"a":c?"router-link":"button"}),y=n.computed(()=>{const{to:c,target:u}=o;return typeof c=="string"&&c.startsWith("http")?{href:c,target:u,rel:u==="_blank"?"noopener noreferrer":void 0}:{}}),s=n.computed(()=>r.default?r.default().length>0:!1),d=n.computed(()=>!!(a.icon||a.fab)&&!a.prependIcon&&!a.appendIcon&&!s.value),x=n.computed(()=>{const c=o["aria-label"];if(typeof c=="string"&&c.trim().length)return c;if(d.value&&typeof a.icon=="string")return a.icon});n.watchEffect(()=>{});const C=()=>{const c=["v-btn"],u=a.size||"default";c.push(`v-btn--size-${u}`);const oe=Object.keys($).filter(B=>!!a[B]).map(B=>$[B]);return a.ripple!==!1&&c.push("v-ripple-element"),[...c,...oe]},te=()=>{const c={};if(a.color){const u=a.color;c["--df-btn-bg-color"]=`var(--df-color-${u}, var(--df-color-primary))`,c["--df-btn-text-color"]=`var(--df-color-on-${u}, var(--df-color-on-primary))`,c["--df-btn-border-color"]=`var(--df-color-${u}, var(--df-color-primary))`}return a.height&&(c["--df-btn-height"]=`${a.height}px`),a.width&&(c.width=`${a.width}px`),c};return(c,u)=>n.withDirectives((n.openBlock(),n.createBlock(n.resolveDynamicComponent(h.value),n.mergeProps(y.value,{class:C(),type:h.value==="button"?e.type||"button":void 0,disabled:h.value==="button"?a.disabled:void 0,"aria-disabled":a.disabled?"true":void 0,"aria-busy":a.loading?"true":void 0,"aria-label":x.value,tabindex:a.disabled&&h.value!=="button"?-1:void 0,style:te()}),{default:n.withCtx(()=>[n.withDirectives(n.createElementVNode("span",X,[n.renderSlot(c.$slots,"loading",{},()=>[n.createElementVNode("span",Y,[(n.openBlock(),n.createElementBlock("svg",G,[...u[0]||(u[0]=[n.createElementVNode("circle",{fill:"transparent",cx:"43.80952380952381",cy:"43.80952380952381",r:"20","stroke-width":"3.8095238095238093","stroke-dasharray":"125.664","stroke-dashoffset":"125.66370614359172px",class:"e-progress-circular__overlay"},null,-1)])]))])])],512),[[n.vShow,a.loading]]),e.prependIcon?(n.openBlock(),n.createElementBlock("span",J,[n.createVNode(m,n.mergeProps(g.value,{icon:e.prependIcon}),null,16,["icon"])])):n.createCommentVNode("",!0),n.createElementVNode("span",Q,[n.renderSlot(c.$slots,"default",{},()=>[e.icon||e.fab?(n.openBlock(),n.createBlock(m,n.mergeProps({key:0},g.value,{icon:e.icon}),null,16,["icon"])):n.createCommentVNode("",!0)])]),e.appendIcon?(n.openBlock(),n.createElementBlock("span",ee,[n.createVNode(m,n.mergeProps(g.value,{icon:e.appendIcon}),null,16,["icon"])])):n.createCommentVNode("",!0)]),_:3},16,["class","type","disabled","aria-disabled","aria-busy","aria-label","tabindex","style"])),[[t,l.value]])}});L.install=e=>{e.component("VButton",L)},m.install=e=>{e.component("VIcon",m)};function ne(){return{isObject:t=>typeof t=="object"&&!Array.isArray(t)&&t!==null}}i.BUTTON_CLASS_MAP=$,i.DashboardUIKey=k,i.VButton=L,i.VIcon=m,i.applyTheme=w,i.btn=D,i.createColorPalette=S,i.createDarkTheme=R,i.createDashboardUI=N,i.createTheme=O,i.darkColors=V,i.darkTheme=_,i.elevation=T,i.generateCSSVars=E,i.generateUtilityClasses=H,i.icon=W,i.iconFactory=Z,i.lightColors=z,i.lightTheme=b,i.materialTokens=f,i.mergeThemes=v,i.shape=P,i.spacing=I,i.typography=U,i.useDashboardUI=A,i.useTheme=M,i.useUtils=ne,Object.defineProperty(i,Symbol.toStringTag,{value:"Module"})}));
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "dashforge-ui",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "description": "Dashboard-focused Vue 3 UI framework skeleton (TypeScript, Vite, SCSS, theming)",
6
+ "main": "dist/index.umd.js",
7
+ "module": "dist/index.es.js",
8
+ "types": "dist/index.d.ts",
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "dev": "vite",
14
+ "build:lib": "vite build",
15
+ "play": "vite --config playground/vite.config.ts",
16
+ "typecheck": "vue-tsc --noEmit",
17
+ "test": "vitest",
18
+ "test:run": "vitest --run",
19
+ "gen:docs": "node scripts/generate-docs.mjs",
20
+ "gen:utils": "node scripts/generate-utility-classes.mjs"
21
+ },
22
+ "keywords": [
23
+ "vue",
24
+ "ui",
25
+ "dashboard",
26
+ "theme",
27
+ "vite",
28
+ "typescript"
29
+ ],
30
+ "author": "",
31
+ "license": "MIT",
32
+ "devDependencies": {
33
+ "@types/node": "^20.0.0",
34
+ "@vitejs/plugin-vue": "^6.0.4",
35
+ "@vue/test-utils": "^2.4.6",
36
+ "jsdom": "^28.1.0",
37
+ "sass": "^1.97.3",
38
+ "typescript": "^5.5.4",
39
+ "vite": "^7.3.1",
40
+ "vitest": "^1.3.0",
41
+ "vue": "^3.4.0",
42
+ "vue-tsc": "^2.1.10"
43
+ },
44
+ "peerDependencies": {
45
+ "vue": "^3.2.0"
46
+ },
47
+ "type": "module"
48
+ }