@mlightcad/cad-viewer 1.1.11 → 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 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":"AAyCA;AAkdA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAatC,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;CACpB;;;;;;;;;;;;YAPU,UAAU;SAEb,MAAM;gBAIC,MAAM;eAFP,IAAI;;AAqYlB,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"}
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,3 @@
1
+ export { default as MlNotificationCenter } from './MlNotificationCenter.vue';
2
+ export { default as MlNotificationItem } from './MlNotificationItem.vue';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
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":"AAmCA;;AAwSA,wBAKG"}
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}