@mlightcad/cad-viewer 1.1.10 → 1.1.12
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 +50 -0
- package/dist/component/MlCadViewer.vue.d.ts +5 -0
- package/dist/component/MlCadViewer.vue.d.ts.map +1 -1
- package/dist/component/index.d.ts +1 -0
- package/dist/component/index.d.ts.map +1 -1
- package/dist/component/notification/MlNotificationCenter.vue.d.ts +20 -0
- package/dist/component/notification/MlNotificationCenter.vue.d.ts.map +1 -0
- package/dist/component/notification/MlNotificationItem.vue.d.ts +22 -0
- package/dist/component/notification/MlNotificationItem.vue.d.ts.map +1 -0
- package/dist/component/notification/index.d.ts +3 -0
- package/dist/component/notification/index.d.ts.map +1 -0
- package/dist/component/statusBar/MlNotificationButton.vue.d.ts +7 -0
- package/dist/component/statusBar/MlNotificationButton.vue.d.ts.map +1 -0
- package/dist/component/statusBar/MlStatusBar.vue.d.ts +5 -1
- package/dist/component/statusBar/MlStatusBar.vue.d.ts.map +1 -1
- package/dist/composable/index.d.ts +1 -0
- package/dist/composable/index.d.ts.map +1 -1
- package/dist/composable/useNotificationCenter.d.ts +88 -0
- package/dist/composable/useNotificationCenter.d.ts.map +1 -0
- package/dist/index.css +1 -1
- package/dist/index.js +1729 -1235
- package/dist/locale/en/main.d.ts +24 -1
- package/dist/locale/en/main.d.ts.map +1 -1
- package/dist/locale/i18n.d.ts +48 -2
- package/dist/locale/i18n.d.ts.map +1 -1
- package/dist/locale/zh/main.d.ts +24 -1
- package/dist/locale/zh/main.d.ts.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -11,6 +11,7 @@ CAD Viewer is a **high-performance** Vue 3 component for viewing and editing CAD
|
|
|
11
11
|
- **Remote file support** - Load CAD files from URLs automatically
|
|
12
12
|
- **Easy integration** - No server setup or backend infrastructure needed for third-party integration
|
|
13
13
|
- **Customizable UI** - Control visibility of toolbars, command line, coordinates, and performance stats
|
|
14
|
+
- **Customizable Resources** - Set custom base URLs for fonts, templates, and example files
|
|
14
15
|
- Modern UI optimized for large CAD file handling
|
|
15
16
|
- State management for layers, entities, and settings
|
|
16
17
|
- Integration with optimized SVG and THREE.js renderers
|
|
@@ -140,6 +141,12 @@ Then create one vue component as follows.
|
|
|
140
141
|
:background="0x808080"
|
|
141
142
|
:local-file="selectedFile"
|
|
142
143
|
/> -->
|
|
144
|
+
|
|
145
|
+
<!-- With custom base URL for fonts and templates -->
|
|
146
|
+
<!-- <MlCADViewer
|
|
147
|
+
:background="0x808080"
|
|
148
|
+
:base-url="'https://my-cdn.com/cad-data/'"
|
|
149
|
+
/> -->
|
|
143
150
|
</div>
|
|
144
151
|
</template>
|
|
145
152
|
|
|
@@ -180,6 +187,7 @@ The `MlCadViewer` component accepts the following props:
|
|
|
180
187
|
| `url` | `string` | `undefined` | Optional URL to automatically load a CAD file when the component mounts. The file will be fetched and opened automatically. **Note**: If not provided, users can still load local files using the main menu "Open" option. |
|
|
181
188
|
| `localFile` | `File` | `undefined` | Optional local File object to automatically load a CAD file when the component mounts. The file will be read and opened automatically. **Note**: This takes precedence over the `url` prop if both are provided. |
|
|
182
189
|
| `background` | `number` | `undefined` | Background color as 24-bit hexadecimal RGB (e.g., `0x000000` for black, `0x808080` for gray). |
|
|
190
|
+
| `baseUrl` | `string` | `undefined` | Base URL for loading fonts, templates, and example files. This URL is used by the CAD viewer to load resources like fonts and drawing templates. **Note**: If not provided, uses the default URL. |
|
|
183
191
|
|
|
184
192
|
### UI Settings
|
|
185
193
|
|
|
@@ -209,6 +217,12 @@ The `MlCadViewer` reads its UI visibility from the global `AcApSettingManager` (
|
|
|
209
217
|
locale="en"
|
|
210
218
|
:local-file="selectedFile"
|
|
211
219
|
/> -->
|
|
220
|
+
|
|
221
|
+
<!-- Custom baseUrl for fonts and templates -->
|
|
222
|
+
<!-- <MlCadViewer
|
|
223
|
+
locale="en"
|
|
224
|
+
:base-url="'https://my-cdn.com/cad-data/'"
|
|
225
|
+
/> -->
|
|
212
226
|
</template>
|
|
213
227
|
|
|
214
228
|
<script setup lang="ts">
|
|
@@ -229,6 +243,42 @@ AcApSettingManager.instance.isShowCommandLine = false
|
|
|
229
243
|
- Settings are global and immediately reflected by `MlCadViewer`.
|
|
230
244
|
- You can change them at runtime using the same `AcApSettingManager.instance` reference.
|
|
231
245
|
|
|
246
|
+
### Base URL Configuration
|
|
247
|
+
|
|
248
|
+
The `baseUrl` property allows you to customize where the CAD viewer loads fonts, templates, and example files from. This is particularly useful for:
|
|
249
|
+
|
|
250
|
+
- **Self-hosted resources**: Host your own fonts and templates on your CDN or server
|
|
251
|
+
- **Corporate environments**: Use internal servers for CAD resources
|
|
252
|
+
- **Offline deployments**: Serve resources from local file systems
|
|
253
|
+
- **Custom branding**: Use your own templates and fonts
|
|
254
|
+
|
|
255
|
+
#### Default Behavior
|
|
256
|
+
If no `baseUrl` is provided, the viewer uses the default URL: `https://mlightcad.gitlab.io/cad-data/`
|
|
257
|
+
|
|
258
|
+
#### Resource Structure
|
|
259
|
+
When using a custom `baseUrl`, ensure your server has the following structure:
|
|
260
|
+
```
|
|
261
|
+
your-base-url/
|
|
262
|
+
├── fonts/ # Font files for text rendering
|
|
263
|
+
├── templates/ # Drawing templates (e.g., acadiso.dxf)
|
|
264
|
+
└── examples/ # Example CAD files
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
#### Example: Custom Base URL
|
|
268
|
+
```vue
|
|
269
|
+
<template>
|
|
270
|
+
<MlCadViewer
|
|
271
|
+
:base-url="'https://my-company.com/cad-resources/'"
|
|
272
|
+
:url="'https://my-company.com/drawings/project.dwg'"
|
|
273
|
+
/>
|
|
274
|
+
</template>
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
This configuration will:
|
|
278
|
+
- Load fonts from `https://my-company.com/cad-resources/fonts/`
|
|
279
|
+
- Load templates from `https://my-company.com/cad-resources/templates/`
|
|
280
|
+
- Use the custom base URL for any "Quick New" operations
|
|
281
|
+
|
|
232
282
|
### Component Features
|
|
233
283
|
|
|
234
284
|
The `MlCadViewer` component includes:
|
|
@@ -8,22 +8,27 @@ interface Props {
|
|
|
8
8
|
localFile?: File;
|
|
9
9
|
/** Background color as 24-bit hexadecimal RGB number (e.g., 0x000000) */
|
|
10
10
|
background?: number;
|
|
11
|
+
/** Base URL for loading fonts, templates, and example files (e.g., 'https://example.com/cad-data/') */
|
|
12
|
+
baseUrl?: string;
|
|
11
13
|
}
|
|
12
14
|
declare const _default: import('vue').DefineComponent<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<Props>, {
|
|
13
15
|
locale: string;
|
|
14
16
|
url: undefined;
|
|
15
17
|
localFile: undefined;
|
|
16
18
|
background: undefined;
|
|
19
|
+
baseUrl: undefined;
|
|
17
20
|
}>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<Props>, {
|
|
18
21
|
locale: string;
|
|
19
22
|
url: undefined;
|
|
20
23
|
localFile: undefined;
|
|
21
24
|
background: undefined;
|
|
25
|
+
baseUrl: undefined;
|
|
22
26
|
}>>> & Readonly<{}>, {
|
|
23
27
|
locale: LocaleProp;
|
|
24
28
|
url: string;
|
|
25
29
|
background: number;
|
|
26
30
|
localFile: File;
|
|
31
|
+
baseUrl: string;
|
|
27
32
|
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
28
33
|
export default _default;
|
|
29
34
|
type __VLS_WithDefaults<P, D> = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MlCadViewer.vue.d.ts","sourceRoot":"","sources":["../../src/component/MlCadViewer.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MlCadViewer.vue.d.ts","sourceRoot":"","sources":["../../src/component/MlCadViewer.vue"],"names":[],"mappings":"AA0CA;AA6hBA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AActC,UAAU,KAAK;IACb,0EAA0E;IAC1E,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,uEAAuE;IACvE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,qFAAqF;IACrF,SAAS,CAAC,EAAE,IAAI,CAAA;IAChB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,uGAAuG;IACvG,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;;;;;;;;;;;;;;YATU,UAAU;SAEb,MAAM;gBAIC,MAAM;eAFP,IAAI;aAIN,MAAM;;AAsdlB,wBAMG;AAEH,KAAK,kBAAkB,CAAC,CAAC,EAAE,CAAC,IAAI;KAC9B,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,GAC7C,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;KAAC,CAAC,GAC5C,CAAC,CAAC,CAAC,CAAC;CACP,CAAC;AACF,KAAK,sBAAsB,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;AACjE,KAAK,uBAAuB,CAAC,CAAC,IAAI;KAChC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GACpC;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;KAAE,GAC9D;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAA;KAAE;CACzD,CAAC;AACF,KAAK,mBAAmB,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAG,GAAG,EAAE,CAAC"}
|
|
@@ -2,6 +2,7 @@ export * from './common';
|
|
|
2
2
|
export * from './dialog';
|
|
3
3
|
export * from './layerManager';
|
|
4
4
|
export * from './layout';
|
|
5
|
+
export * from './notification';
|
|
5
6
|
export * from './statusBar';
|
|
6
7
|
export { default as MlCadViewer } from './MlCadViewer.vue';
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/component/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/component/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
/** Optional custom title for the notification center header */
|
|
3
|
+
title?: string;
|
|
4
|
+
}
|
|
5
|
+
declare const _default: import('vue').DefineComponent<import('vue').ExtractPropTypes<__VLS_TypePropsToOption<Props>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
6
|
+
close: () => void;
|
|
7
|
+
}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToOption<Props>>> & Readonly<{
|
|
8
|
+
onClose?: (() => any) | undefined;
|
|
9
|
+
}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
10
|
+
export default _default;
|
|
11
|
+
type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
|
|
12
|
+
type __VLS_TypePropsToOption<T> = {
|
|
13
|
+
[K in keyof T]-?: {} extends Pick<T, K> ? {
|
|
14
|
+
type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
|
|
15
|
+
} : {
|
|
16
|
+
type: import('vue').PropType<T[K]>;
|
|
17
|
+
required: true;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=MlNotificationCenter.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MlNotificationCenter.vue.d.ts","sourceRoot":"","sources":["../../../src/component/notification/MlNotificationCenter.vue"],"names":[],"mappings":"AA4DA;AAuNA,UAAU,KAAK;IACb,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;;;;;;AAmRD,wBAOG;AAEH,KAAK,sBAAsB,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;AACjE,KAAK,uBAAuB,CAAC,CAAC,IAAI;KAChC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GACpC;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;KAAE,GAC9D;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAA;KAAE;CACzD,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Notification, NotificationAction } from '../../composable/useNotificationCenter';
|
|
2
|
+
interface Props {
|
|
3
|
+
notification: Notification;
|
|
4
|
+
}
|
|
5
|
+
declare const _default: import('vue').DefineComponent<import('vue').ExtractPropTypes<__VLS_TypePropsToOption<Props>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
6
|
+
close: () => void;
|
|
7
|
+
action: (action: NotificationAction) => void;
|
|
8
|
+
}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToOption<Props>>> & Readonly<{
|
|
9
|
+
onClose?: (() => any) | undefined;
|
|
10
|
+
onAction?: ((action: NotificationAction) => any) | undefined;
|
|
11
|
+
}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
12
|
+
export default _default;
|
|
13
|
+
type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
|
|
14
|
+
type __VLS_TypePropsToOption<T> = {
|
|
15
|
+
[K in keyof T]-?: {} extends Pick<T, K> ? {
|
|
16
|
+
type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
|
|
17
|
+
} : {
|
|
18
|
+
type: import('vue').PropType<T[K]>;
|
|
19
|
+
required: true;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=MlNotificationItem.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MlNotificationItem.vue.d.ts","sourceRoot":"","sources":["../../../src/component/notification/MlNotificationItem.vue"],"names":[],"mappings":"AAgDA;AAkOA,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EACnB,MAAM,wCAAwC,CAAA;AAE/C,UAAU,KAAK;IACb,YAAY,EAAE,YAAY,CAAA;CAC3B;;;;;;;;AA+ND,wBAOG;AAEH,KAAK,sBAAsB,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;AACjE,KAAK,uBAAuB,CAAC,CAAC,IAAI;KAChC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GACpC;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;KAAE,GAC9D;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAA;KAAE;CACzD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/component/notification/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AAC5E,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,0BAA0B,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
2
|
+
click: () => void;
|
|
3
|
+
}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{
|
|
4
|
+
onClick?: (() => any) | undefined;
|
|
5
|
+
}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
6
|
+
export default _default;
|
|
7
|
+
//# sourceMappingURL=MlNotificationButton.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MlNotificationButton.vue.d.ts","sourceRoot":"","sources":["../../../src/component/statusBar/MlNotificationButton.vue"],"names":[],"mappings":"AAmBA;;;;;;AA4KA,wBAMG"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
-
declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
1
|
+
declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
2
|
+
toggleNotificationCenter: () => void;
|
|
3
|
+
}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{
|
|
4
|
+
onToggleNotificationCenter?: (() => any) | undefined;
|
|
5
|
+
}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
2
6
|
export default _default;
|
|
3
7
|
//# sourceMappingURL=MlStatusBar.vue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MlStatusBar.vue.d.ts","sourceRoot":"","sources":["../../../src/component/statusBar/MlStatusBar.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MlStatusBar.vue.d.ts","sourceRoot":"","sources":["../../../src/component/statusBar/MlStatusBar.vue"],"names":[],"mappings":"AAoCA;;;;;;AA8UA,wBAMG"}
|
|
@@ -7,6 +7,7 @@ export * from './useLayers';
|
|
|
7
7
|
export * from './useLayouts';
|
|
8
8
|
export * from './useLocale';
|
|
9
9
|
export * from './useMissedData';
|
|
10
|
+
export * from './useNotificationCenter';
|
|
10
11
|
export * from './useSettings';
|
|
11
12
|
export * from './useSystemVars';
|
|
12
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/composable/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,WAAW,CAAA;AACzB,cAAc,oBAAoB,CAAA;AAClC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/composable/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,WAAW,CAAA;AACzB,cAAc,oBAAoB,CAAA;AAClC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,yBAAyB,CAAA;AACvC,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notification Center Composable
|
|
3
|
+
*
|
|
4
|
+
* Provides a centralized notification system similar to Visual Studio Code.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { useNotificationCenter } from '@mlightcad/cad-viewer'
|
|
9
|
+
*
|
|
10
|
+
* const { info, warning, error, success, notifications, unreadCount } = useNotificationCenter()
|
|
11
|
+
*
|
|
12
|
+
* // Add different types of notifications
|
|
13
|
+
* info('Information', 'This is an info message')
|
|
14
|
+
* warning('Warning', 'This is a warning message')
|
|
15
|
+
* error('Error', 'This is an error message')
|
|
16
|
+
* success('Success', 'This is a success message')
|
|
17
|
+
*
|
|
18
|
+
* // Add notification with actions
|
|
19
|
+
* error('File Error', 'Failed to load file', {
|
|
20
|
+
* actions: [
|
|
21
|
+
* { label: 'Retry', action: () => retryLoad(), primary: true },
|
|
22
|
+
* { label: 'Cancel', action: () => cancel() }
|
|
23
|
+
* ],
|
|
24
|
+
* persistent: true
|
|
25
|
+
* })
|
|
26
|
+
*
|
|
27
|
+
* // Check notification count
|
|
28
|
+
* console.log(`You have ${unreadCount.value} notifications`)
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export interface Notification {
|
|
32
|
+
id: string;
|
|
33
|
+
type: 'info' | 'warning' | 'error' | 'success';
|
|
34
|
+
title: string;
|
|
35
|
+
message?: string;
|
|
36
|
+
timestamp: Date;
|
|
37
|
+
actions?: NotificationAction[];
|
|
38
|
+
persistent?: boolean;
|
|
39
|
+
timeout?: number;
|
|
40
|
+
}
|
|
41
|
+
export interface NotificationAction {
|
|
42
|
+
label: string;
|
|
43
|
+
action: () => void;
|
|
44
|
+
primary?: boolean;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Hook to access the notification center functionality
|
|
48
|
+
*
|
|
49
|
+
* @returns Object containing notification management functions and reactive state
|
|
50
|
+
*/
|
|
51
|
+
export declare function useNotificationCenter(): {
|
|
52
|
+
/** Reactive list of all notifications */
|
|
53
|
+
notifications: import('vue').ComputedRef<{
|
|
54
|
+
id: string;
|
|
55
|
+
type: "info" | "warning" | "error" | "success";
|
|
56
|
+
title: string;
|
|
57
|
+
message?: string | undefined;
|
|
58
|
+
timestamp: Date;
|
|
59
|
+
actions?: {
|
|
60
|
+
label: string;
|
|
61
|
+
action: () => void;
|
|
62
|
+
primary?: boolean | undefined;
|
|
63
|
+
}[] | undefined;
|
|
64
|
+
persistent?: boolean | undefined;
|
|
65
|
+
timeout?: number | undefined;
|
|
66
|
+
}[]>;
|
|
67
|
+
/** Reactive count of unread notifications */
|
|
68
|
+
unreadCount: import('vue').ComputedRef<number>;
|
|
69
|
+
/** Reactive boolean indicating if there are any notifications */
|
|
70
|
+
hasNotifications: import('vue').ComputedRef<boolean>;
|
|
71
|
+
/** Add a custom notification */
|
|
72
|
+
add: (notification: Omit<Notification, "id" | "timestamp">) => string;
|
|
73
|
+
/** Remove a notification by ID */
|
|
74
|
+
remove: (id: string) => void;
|
|
75
|
+
/** Clear all notifications */
|
|
76
|
+
clear: () => void;
|
|
77
|
+
/** Clear all notifications (alias for clear) */
|
|
78
|
+
clearAll: () => void;
|
|
79
|
+
/** Add an info notification */
|
|
80
|
+
info: (title: string, message?: string, options?: Partial<Notification>) => string;
|
|
81
|
+
/** Add a warning notification */
|
|
82
|
+
warning: (title: string, message?: string, options?: Partial<Notification>) => string;
|
|
83
|
+
/** Add an error notification */
|
|
84
|
+
error: (title: string, message?: string, options?: Partial<Notification>) => string;
|
|
85
|
+
/** Add a success notification */
|
|
86
|
+
success: (title: string, message?: string, options?: Partial<Notification>) => string;
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=useNotificationCenter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useNotificationCenter.d.ts","sourceRoot":"","sources":["../../src/composable/useNotificationCenter.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAA;IAC9C,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,IAAI,CAAA;IACf,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAA;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAuFD;;;;GAIG;AACH,wBAAgB,qBAAqB;IAEjC,yCAAyC;;YA5GvC,MAAM;cACJ,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS;eACvC,MAAM;kBACH,MAAM;mBACL,IAAI;;mBAOR,MAAM;oBACL,MAAM,IAAI;sBACR,OAAO;;qBAPJ,OAAO;kBACV,MAAM;;IAuGd,6CAA6C;;IAE7C,iEAAiE;;IAEjE,gCAAgC;wBAlFhB,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,WAAW,CAAC;IAoFtD,kCAAkC;iBAxEzB,MAAM;IA0Ef,8BAA8B;;IAE9B,gDAAgD;;IAEhD,+BAA+B;kBA9DrB,MAAM,YAAY,MAAM,YAAY,OAAO,CAAC,YAAY,CAAC;IAgEnE,iCAAiC;qBAvDpB,MAAM,YAAY,MAAM,YAAY,OAAO,CAAC,YAAY,CAAC;IAyDtE,gCAAgC;mBAhDrB,MAAM,YAAY,MAAM,YAAY,OAAO,CAAC,YAAY,CAAC;IAkDpE,iCAAiC;qBAxCpB,MAAM,YAAY,MAAM,YAAY,OAAO,CAAC,YAAY,CAAC;EA2CzE"}
|
package/dist/index.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
@charset "UTF-8";body{margin:0;display:flex}body,html{height:100%}.el-dialog{padding-bottom:8px;padding-top:8px}.el-dialog__headerbtn{height:36px;width:36px}html.dark{color-scheme:dark;--el-color-primary: #409eff;--el-color-primary-light-3: rgb(51, 117, 185);--el-color-primary-light-5: rgb(42, 89, 138);--el-color-primary-light-7: rgb(33, 61, 91);--el-color-primary-light-8: rgb(29, 48, 67);--el-color-primary-light-9: rgb(24, 34, 43);--el-color-primary-dark-2: rgb(102, 177, 255);--el-color-success: #67c23a;--el-color-success-light-3: rgb(78, 142, 47);--el-color-success-light-5: rgb(62, 107, 39);--el-color-success-light-7: rgb(45, 72, 31);--el-color-success-light-8: rgb(37, 55, 28);--el-color-success-light-9: rgb(28, 37, 24);--el-color-success-dark-2: rgb(133, 206, 97);--el-color-warning: #e6a23c;--el-color-warning-light-3: rgb(167, 119, 48);--el-color-warning-light-5: rgb(125, 91, 40);--el-color-warning-light-7: rgb(83, 63, 32);--el-color-warning-light-8: rgb(62, 48, 28);--el-color-warning-light-9: rgb(41, 34, 24);--el-color-warning-dark-2: rgb(235, 181, 99);--el-color-danger: #f56c6c;--el-color-danger-light-3: rgb(178, 82, 82);--el-color-danger-light-5: rgb(133, 64, 64);--el-color-danger-light-7: rgb(88, 46, 46);--el-color-danger-light-8: rgb(65, 38, 38);--el-color-danger-light-9: rgb(42, 29, 29);--el-color-danger-dark-2: rgb(247, 137, 137);--el-color-error: #f56c6c;--el-color-error-light-3: rgb(178, 82, 82);--el-color-error-light-5: rgb(133, 64, 64);--el-color-error-light-7: rgb(88, 46, 46);--el-color-error-light-8: rgb(65, 38, 38);--el-color-error-light-9: rgb(42, 29, 29);--el-color-error-dark-2: rgb(247, 137, 137);--el-color-info: #909399;--el-color-info-light-3: rgb(107, 109, 113);--el-color-info-light-5: rgb(82, 84, 87);--el-color-info-light-7: rgb(57, 58, 60);--el-color-info-light-8: rgb(45, 45, 47);--el-color-info-light-9: rgb(32, 33, 33);--el-color-info-dark-2: rgb(166, 169, 173);--el-box-shadow: 0px 12px 32px 4px rgba(0, 0, 0, .36), 0px 8px 20px rgba(0, 0, 0, .72);--el-box-shadow-light: 0px 0px 12px rgba(0, 0, 0, .72);--el-box-shadow-lighter: 0px 0px 6px rgba(0, 0, 0, .72);--el-box-shadow-dark: 0px 16px 48px 16px rgba(0, 0, 0, .72), 0px 12px 32px #000000, 0px 8px 16px -8px #000000;--el-bg-color-page: #0a0a0a;--el-bg-color: #141414;--el-bg-color-overlay: #1d1e1f;--el-text-color-primary: #E5EAF3;--el-text-color-regular: #CFD3DC;--el-text-color-secondary: #A3A6AD;--el-text-color-placeholder: #8D9095;--el-text-color-disabled: #6C6E72;--el-border-color-darker: #636466;--el-border-color-dark: #58585B;--el-border-color: #4C4D4F;--el-border-color-light: #414243;--el-border-color-lighter: #363637;--el-border-color-extra-light: #2B2B2C;--el-fill-color-darker: #424243;--el-fill-color-dark: #39393A;--el-fill-color: #303030;--el-fill-color-light: #262727;--el-fill-color-lighter: #1D1D1D;--el-fill-color-extra-light: #191919;--el-fill-color-blank: transparent;--el-mask-color: rgba(0, 0, 0, .8);--el-mask-color-extra-light: rgba(0, 0, 0, .3)}html.dark .el-button{--el-button-disabled-text-color: rgba(255, 255, 255, .5)}html.dark .el-card{--el-card-bg-color: var(--el-bg-color-overlay)}html.dark .el-empty{--el-empty-fill-color-0: var(--el-color-black);--el-empty-fill-color-1: #4b4b52;--el-empty-fill-color-2: #36383d;--el-empty-fill-color-3: #1e1e20;--el-empty-fill-color-4: #262629;--el-empty-fill-color-5: #202124;--el-empty-fill-color-6: #212224;--el-empty-fill-color-7: #1b1c1f;--el-empty-fill-color-8: #1c1d1f;--el-empty-fill-color-9: #18181a}:root{--ml-status-bar-height: 30px}body{font-family:Inter,system-ui,Avenir,Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,微软雅黑,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0}a{color:var(--el-color-primary)}code{border-radius:2px;padding:2px 4px;background-color:var(--el-color-primary-light-9);color:var(--elcolor-primary)}.ml-dialog-header-bottom-line[data-v-8df470d5]{margin-left:-16px;margin-top:6px;margin-bottom:6px;width:calc(100% + 64px)}.ml-dialog-footer-top-line[data-v-8df470d5]{margin-left:-16px;margin-top:6px;margin-bottom:6px;width:calc(100% + 32px)}.ml-toggle-button[data-v-48d6b055]{border:none;padding:0;cursor:pointer;width:var(--a97b120a);height:var(--a97b120a)}.ml-layer-list{width:100%;font-size:small;min-width:100%}.ml-layer-list .el-table__header,.ml-layer-list .el-table__body{border-bottom:1px solid var(--el-border-color)}.ml-layer-list-cell{display:flex;align-items:center;justify-content:center}.ml-layer-list-color{width:20px;height:20px}.ml-layer-manager[data-v-d49ba2cb]{left:2px;top:55px;width:400px;height:500px}.ml-layer-list-wrapper[data-v-d49ba2cb]{overflow:auto;width:100%;display:flex;align-items:flex-start;justify-content:flex-start}.autocomplete-container[data-v-082845cb]{position:fixed;left:50%;bottom:40px;transform:translate(-50%);width:80%;max-width:600px;z-index:1000}.autocomplete-input[data-v-082845cb]{width:100%}.ml-entity-info[data-v-6a67bbe7]{position:fixed;width:180px;left:var(--2d5cc4ca);top:var(--11fa7d7e);margin:0}.ml-entity-info-title[data-v-6a67bbe7]{font-weight:700}.ml-entity-info-text[data-v-6a67bbe7]{margin-bottom:6px;margin-top:6px}.ml-language-selector[data-v-1b9f7bc0]{position:fixed;right:40px;top:20px;z-index:1000}.ml-main-menu-container[data-v-8c0c738e]{position:fixed;left:40px;top:20px;z-index:1000}.ml-main-menu-icon[data-v-8c0c738e],.ml-main-menu-icon[data-v-8c0c738e]:hover{outline:none;border:none}.ml-vertical-toolbar-container{position:fixed;right:30px;top:50%;transform:translateY(-50%)}.ml-point-style-button[data-v-29692d7d]{border:none;padding:0;cursor:pointer;width:30px}.ml-progress[data-v-fe8fa18d]{width:100px}.ml-setting-button[data-v-666f03a3],.ml-warning-button[data-v-3411a3ec]{border:none;padding:0;cursor:pointer;width:30px}.ml-status-bar[data-v-ee6f13c4]{box-sizing:border-box}.ml-status-bar-left-button-group[data-v-ee6f13c4]{border:none;box-sizing:border-box;height:var(--ml-status-bar-height)}.ml-status-bar-layout-button[data-v-ee6f13c4]{box-sizing:border-box}.ml-status-bar-right-button-group[data-v-ee6f13c4]{border:none;padding:0;height:var(--ml-status-bar-height)}.ml-status-bar-current-pos[data-v-ee6f13c4]{border:none;height:100%}.ml-cad-canvas{position:absolute;top:0;left:0;height:calc(100vh - var(--ml-status-bar-height));width:100%;display:block;outline:none;z-index:1;pointer-events:auto}.ml-cad-viewer-container{position:relative;width:100vw;z-index:2;pointer-events:auto}.ml-file-name{position:absolute;top:0;left:50%;transform:translate(-50%);text-align:center;width:100%;margin-top:20px;pointer-events:none;z-index:1}
|
|
1
|
+
@charset "UTF-8";body{margin:0;display:flex}body,html{height:100%}.el-dialog{padding-bottom:8px;padding-top:8px}.el-dialog__headerbtn{height:36px;width:36px}html.dark{color-scheme:dark;--el-color-primary: #409eff;--el-color-primary-light-3: rgb(51, 117, 185);--el-color-primary-light-5: rgb(42, 89, 138);--el-color-primary-light-7: rgb(33, 61, 91);--el-color-primary-light-8: rgb(29, 48, 67);--el-color-primary-light-9: rgb(24, 34, 43);--el-color-primary-dark-2: rgb(102, 177, 255);--el-color-success: #67c23a;--el-color-success-light-3: rgb(78, 142, 47);--el-color-success-light-5: rgb(62, 107, 39);--el-color-success-light-7: rgb(45, 72, 31);--el-color-success-light-8: rgb(37, 55, 28);--el-color-success-light-9: rgb(28, 37, 24);--el-color-success-dark-2: rgb(133, 206, 97);--el-color-warning: #e6a23c;--el-color-warning-light-3: rgb(167, 119, 48);--el-color-warning-light-5: rgb(125, 91, 40);--el-color-warning-light-7: rgb(83, 63, 32);--el-color-warning-light-8: rgb(62, 48, 28);--el-color-warning-light-9: rgb(41, 34, 24);--el-color-warning-dark-2: rgb(235, 181, 99);--el-color-danger: #f56c6c;--el-color-danger-light-3: rgb(178, 82, 82);--el-color-danger-light-5: rgb(133, 64, 64);--el-color-danger-light-7: rgb(88, 46, 46);--el-color-danger-light-8: rgb(65, 38, 38);--el-color-danger-light-9: rgb(42, 29, 29);--el-color-danger-dark-2: rgb(247, 137, 137);--el-color-error: #f56c6c;--el-color-error-light-3: rgb(178, 82, 82);--el-color-error-light-5: rgb(133, 64, 64);--el-color-error-light-7: rgb(88, 46, 46);--el-color-error-light-8: rgb(65, 38, 38);--el-color-error-light-9: rgb(42, 29, 29);--el-color-error-dark-2: rgb(247, 137, 137);--el-color-info: #909399;--el-color-info-light-3: rgb(107, 109, 113);--el-color-info-light-5: rgb(82, 84, 87);--el-color-info-light-7: rgb(57, 58, 60);--el-color-info-light-8: rgb(45, 45, 47);--el-color-info-light-9: rgb(32, 33, 33);--el-color-info-dark-2: rgb(166, 169, 173);--el-box-shadow: 0px 12px 32px 4px rgba(0, 0, 0, .36), 0px 8px 20px rgba(0, 0, 0, .72);--el-box-shadow-light: 0px 0px 12px rgba(0, 0, 0, .72);--el-box-shadow-lighter: 0px 0px 6px rgba(0, 0, 0, .72);--el-box-shadow-dark: 0px 16px 48px 16px rgba(0, 0, 0, .72), 0px 12px 32px #000000, 0px 8px 16px -8px #000000;--el-bg-color-page: #0a0a0a;--el-bg-color: #141414;--el-bg-color-overlay: #1d1e1f;--el-text-color-primary: #E5EAF3;--el-text-color-regular: #CFD3DC;--el-text-color-secondary: #A3A6AD;--el-text-color-placeholder: #8D9095;--el-text-color-disabled: #6C6E72;--el-border-color-darker: #636466;--el-border-color-dark: #58585B;--el-border-color: #4C4D4F;--el-border-color-light: #414243;--el-border-color-lighter: #363637;--el-border-color-extra-light: #2B2B2C;--el-fill-color-darker: #424243;--el-fill-color-dark: #39393A;--el-fill-color: #303030;--el-fill-color-light: #262727;--el-fill-color-lighter: #1D1D1D;--el-fill-color-extra-light: #191919;--el-fill-color-blank: transparent;--el-mask-color: rgba(0, 0, 0, .8);--el-mask-color-extra-light: rgba(0, 0, 0, .3)}html.dark .el-button{--el-button-disabled-text-color: rgba(255, 255, 255, .5)}html.dark .el-card{--el-card-bg-color: var(--el-bg-color-overlay)}html.dark .el-empty{--el-empty-fill-color-0: var(--el-color-black);--el-empty-fill-color-1: #4b4b52;--el-empty-fill-color-2: #36383d;--el-empty-fill-color-3: #1e1e20;--el-empty-fill-color-4: #262629;--el-empty-fill-color-5: #202124;--el-empty-fill-color-6: #212224;--el-empty-fill-color-7: #1b1c1f;--el-empty-fill-color-8: #1c1d1f;--el-empty-fill-color-9: #18181a}:root{--ml-status-bar-height: 30px}body{font-family:Inter,system-ui,Avenir,Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,微软雅黑,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0}a{color:var(--el-color-primary)}code{border-radius:2px;padding:2px 4px;background-color:var(--el-color-primary-light-9);color:var(--elcolor-primary)}.ml-dialog-header-bottom-line[data-v-8df470d5]{margin-left:-16px;margin-top:6px;margin-bottom:6px;width:calc(100% + 64px)}.ml-dialog-footer-top-line[data-v-8df470d5]{margin-left:-16px;margin-top:6px;margin-bottom:6px;width:calc(100% + 32px)}.ml-toggle-button[data-v-48d6b055]{border:none;padding:0;cursor:pointer;width:var(--a97b120a);height:var(--a97b120a)}.ml-layer-list{width:100%;font-size:small;min-width:100%}.ml-layer-list .el-table__header,.ml-layer-list .el-table__body{border-bottom:1px solid var(--el-border-color)}.ml-layer-list-cell{display:flex;align-items:center;justify-content:center}.ml-layer-list-color{width:20px;height:20px}.ml-layer-manager[data-v-d49ba2cb]{left:2px;top:55px;width:400px;height:500px}.ml-layer-list-wrapper[data-v-d49ba2cb]{overflow:auto;width:100%;display:flex;align-items:flex-start;justify-content:flex-start}.autocomplete-container[data-v-082845cb]{position:fixed;left:50%;bottom:40px;transform:translate(-50%);width:80%;max-width:600px;z-index:1000}.autocomplete-input[data-v-082845cb]{width:100%}.ml-entity-info[data-v-6a67bbe7]{position:fixed;width:180px;left:var(--2d5cc4ca);top:var(--11fa7d7e);margin:0}.ml-entity-info-title[data-v-6a67bbe7]{font-weight:700}.ml-entity-info-text[data-v-6a67bbe7]{margin-bottom:6px;margin-top:6px}.ml-language-selector[data-v-1b9f7bc0]{position:fixed;right:40px;top:20px;z-index:1000}.ml-main-menu-container[data-v-8c0c738e]{position:fixed;left:40px;top:20px;z-index:1000}.ml-main-menu-icon[data-v-8c0c738e],.ml-main-menu-icon[data-v-8c0c738e]:hover{outline:none;border:none}.ml-vertical-toolbar-container{position:fixed;right:30px;top:50%;transform:translateY(-50%)}.ml-notification-item[data-v-e1dde915]{display:flex;gap:12px;padding:12px 16px;border-bottom:1px solid var(--el-border-color-lighter);transition:background-color .2s ease}.ml-notification-item[data-v-e1dde915]:hover{background-color:var(--el-fill-color-light)}.ml-notification-item[data-v-e1dde915]:last-child{border-bottom:none}.ml-notification-item-icon[data-v-e1dde915]{flex-shrink:0;width:20px;height:20px;display:flex;align-items:center;justify-content:center;margin-top:2px}.ml-notification-item--info .ml-notification-item-icon[data-v-e1dde915]{color:var(--el-color-info)}.ml-notification-item--warning .ml-notification-item-icon[data-v-e1dde915]{color:var(--el-color-warning)}.ml-notification-item--error .ml-notification-item-icon[data-v-e1dde915]{color:var(--el-color-danger)}.ml-notification-item--success .ml-notification-item-icon[data-v-e1dde915]{color:var(--el-color-success)}.ml-notification-item-content[data-v-e1dde915]{flex:1;min-width:0}.ml-notification-item-header[data-v-e1dde915]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:4px}.ml-notification-item-title[data-v-e1dde915]{margin:0;font-size:14px;font-weight:600;color:var(--el-text-color-primary);line-height:1.4;flex:1}.ml-notification-item-actions[data-v-e1dde915]{display:flex;align-items:center;gap:8px;flex-shrink:0}.ml-notification-item-message[data-v-e1dde915]{margin:0 0 8px;font-size:13px;color:var(--el-text-color-regular);line-height:1.4;word-wrap:break-word}.ml-notification-item-footer[data-v-e1dde915]{display:flex;align-items:center;justify-content:flex-end}.ml-notification-item-time[data-v-e1dde915]{font-size:12px;color:var(--el-text-color-secondary)}.dark .ml-notification-item[data-v-e1dde915]:hover{background-color:var(--el-fill-color-darker)}.ml-notification-center[data-v-2e5353ed]{position:fixed;bottom:calc(var(--ml-status-bar-height) + 20px);right:20px;width:400px;max-height:500px;background:var(--el-bg-color);border:1px solid var(--el-border-color);border-radius:8px;box-shadow:0 4px 12px #00000026;z-index:2000;display:flex;flex-direction:column;overflow:hidden}.ml-notification-center-header[data-v-2e5353ed]{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;height:30px;border-bottom:1px solid var(--el-border-color);background:var(--el-fill-color-light);position:relative}.ml-notification-center-title[data-v-2e5353ed]{display:flex;align-items:center;gap:8px;font-weight:600;font-size:14px;color:var(--el-text-color-primary)}.ml-notification-center-icon[data-v-2e5353ed]{color:var(--el-color-primary)}.ml-notification-center-actions[data-v-2e5353ed]{display:flex;align-items:center;gap:8px;margin-right:36px}.ml-notification-center-close[data-v-2e5353ed]{position:absolute;top:50%;right:8px;transform:translateY(-50%);padding:4px;min-width:auto;width:28px;height:28px;display:flex;align-items:center;justify-content:center}.ml-notification-center-clear[data-v-2e5353ed]{width:28px;height:28px;padding:0;display:flex;align-items:center;justify-content:center}.ml-notification-center-clear[data-v-2e5353ed] .el-icon{font-size:16px}.ml-notification-center-content[data-v-2e5353ed]{flex:1;overflow-y:auto;max-height:400px}.ml-notification-center-empty[data-v-2e5353ed]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;text-align:center;color:var(--el-text-color-secondary)}.ml-notification-center-empty-icon[data-v-2e5353ed]{font-size:48px;margin-bottom:16px;opacity:.5}.ml-notification-center-empty p[data-v-2e5353ed]{margin:0;font-size:14px}.ml-notification-list[data-v-2e5353ed]{padding:8px 0}.dark .ml-notification-center[data-v-2e5353ed]{background:var(--el-bg-color-page);border-color:var(--el-border-color)}.dark .ml-notification-center-header[data-v-2e5353ed]{background:var(--el-fill-color-darker)}.ml-notification-button[data-v-48c740b7]{border:none;padding:0;cursor:pointer;width:30px;position:relative}.ml-notification-badge[data-v-48c740b7]{position:absolute;top:-2px;right:-2px}.ml-notification-badge[data-v-48c740b7] .el-badge__content{font-size:10px;min-width:16px;height:16px;line-height:16px;padding:0 4px}.ml-point-style-button[data-v-29692d7d]{border:none;padding:0;cursor:pointer;width:30px}.ml-progress[data-v-35ad24b9]{width:100px}.ml-setting-button[data-v-666f03a3],.ml-warning-button[data-v-3411a3ec]{border:none;padding:0;cursor:pointer;width:30px}.ml-status-bar[data-v-0d51ad75]{box-sizing:border-box}.ml-status-bar-left-button-group[data-v-0d51ad75]{border:none;box-sizing:border-box;height:var(--ml-status-bar-height)}.ml-status-bar-layout-button[data-v-0d51ad75]{box-sizing:border-box}.ml-status-bar-right-button-group[data-v-0d51ad75]{border:none;padding:0;height:var(--ml-status-bar-height)}.ml-status-bar-current-pos[data-v-0d51ad75]{border:none;height:100%}.ml-cad-canvas{position:absolute;top:0;left:0;height:calc(100vh - var(--ml-status-bar-height));width:100%;display:block;outline:none;z-index:1;pointer-events:auto}.ml-cad-viewer-container{position:relative;width:100vw;z-index:2;pointer-events:auto}.ml-file-name{position:absolute;top:0;left:50%;transform:translate(-50%);text-align:center;width:100%;margin-top:20px;pointer-events:none;z-index:1}
|