webcoreui 1.1.0-beta.1 → 1.1.0-beta.3

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
@@ -60,15 +60,15 @@ Webcore can be used as a standalone project, or it can be integrated into your e
60
60
 
61
61
  Webcore components use Sass for styling. To use the component library, you must have the following packages installed:
62
62
 
63
- - [Sass](https://www.npmjs.com/package/sass) - `v1.86`
63
+ - [Sass](https://www.npmjs.com/package/sass) - `v1.9`
64
64
  - [TypeScript](https://www.npmjs.com/package/typescript) - `v5.8`
65
65
 
66
66
  Depending on your project setup, you'll also need the following packages:
67
67
 
68
68
  - **For Astro projects**
69
- - [Astro](https://www.npmjs.com/package/astro) - `v5.5`
69
+ - [Astro](https://www.npmjs.com/package/astro) - `v5.13`
70
70
  - **For Svelte projects**
71
- - [Svelte](https://www.npmjs.com/package/svelte) - `v5.25`
71
+ - [Svelte](https://www.npmjs.com/package/svelte) - `v5.38`
72
72
  - **For React projects**
73
73
  - [React](https://www.npmjs.com/package/react) - `v19.0`
74
74
  - [React DOM](https://www.npmjs.com/package/react-dom) -`v19.0`
@@ -244,6 +244,7 @@ import { Accordion } from 'webcoreui/react'
244
244
  - [Checkbox](https://github.com/Frontendland/webcoreui/tree/main/src/components/Checkbox)
245
245
  - [Collapsible](https://github.com/Frontendland/webcoreui/tree/main/src/components/Collapsible)
246
246
  - [ConditionalWrapper](https://github.com/Frontendland/webcoreui/tree/main/src/components/ConditionalWrapper)
247
+ - [ContextMenu](https://github.com/Frontendland/webcoreui/tree/main/src/components/ContextMenu)
247
248
  - [Copy](https://github.com/Frontendland/webcoreui/tree/main/src/components/Copy)
248
249
  - [DataTable](https://github.com/Frontendland/webcoreui/tree/main/src/components/DataTable)
249
250
  - [Flex](https://github.com/Frontendland/webcoreui/tree/main/src/components/Flex)
package/astro.d.ts CHANGED
@@ -12,6 +12,7 @@ import type { CarouselProps as WCarouselProps } from './components/Carousel/caro
12
12
  import type { CheckboxProps as WCheckboxProps } from './components/Checkbox/checkbox'
13
13
  import type { CollapsibleProps as WCollapsibleProps } from './components/Collapsible/collapsible'
14
14
  import type { ConditionalWrapperProps as WConditionalWrapperProps } from './components/ConditionalWrapper/conditionalwrapper'
15
+ import type { ContextMenuProps as WContextMenuProps } from './components/ContextMenu/contextmenu'
15
16
  import type { CopyProps as WCopyProps } from './components/Copy/copy'
16
17
  import type { DataTableProps as WDataTableProps } from './components/DataTable/datatable'
17
18
  import type { FlexProps as WFlexProps } from './components/Flex/flex'
@@ -70,6 +71,7 @@ declare module 'webcoreui/astro' {
70
71
  export function Checkbox(_props: WCheckboxProps): any
71
72
  export function Collapsible(_props: WCollapsibleProps): any
72
73
  export function ConditionalWrapper(_props: WConditionalWrapperProps): any
74
+ export function ContextMenu(_props: WContextMenuProps): any
73
75
  export function Copy(_props: WCopyProps): any
74
76
  export function DataTable(_props: WDataTableProps): any
75
77
  export function Flex(_props: WFlexProps): any
@@ -122,6 +124,7 @@ declare module 'webcoreui/astro' {
122
124
  export type CheckboxProps = WCheckboxProps
123
125
  export type CollapsibleProps = WCollapsibleProps
124
126
  export type ConditionalWrapperProps = WConditionalWrapperProps
127
+ export type ContextMenuProps = WContextMenuProps
125
128
  export type CopyProps = WCopyProps
126
129
  export type DataTableProps = WDataTableProps
127
130
  export type FlexProps = WFlexProps
package/astro.js CHANGED
@@ -12,6 +12,7 @@ import CarouselComponent from './components/Carousel/Carousel.astro'
12
12
  import CheckboxComponent from './components/Checkbox/Checkbox.astro'
13
13
  import CollapsibleComponent from './components/Collapsible/Collapsible.astro'
14
14
  import ConditionalWrapperComponent from './components/ConditionalWrapper/ConditionalWrapper.astro'
15
+ import ContextMenuComponent from './components/ContextMenu/ContextMenu.astro'
15
16
  import CopyComponent from './components/Copy/Copy.astro'
16
17
  import DataTableComponent from './components/DataTable/DataTable.astro'
17
18
  import FlexComponent from './components/Flex/Flex.astro'
@@ -64,6 +65,7 @@ export const Carousel = CarouselComponent
64
65
  export const Checkbox = CheckboxComponent
65
66
  export const Collapsible = CollapsibleComponent
66
67
  export const ConditionalWrapper = ConditionalWrapperComponent
68
+ export const ContextMenu = ContextMenuComponent
67
69
  export const Copy = CopyComponent
68
70
  export const DataTable = DataTableComponent
69
71
  export const Flex = FlexComponent
@@ -1,3 +1,4 @@
1
+ import type { JSX } from 'react'
1
2
  import type { Snippet } from 'svelte'
2
3
 
3
4
  export type AlertProps = {
@@ -1,3 +1,4 @@
1
+ import type { JSX } from 'react'
1
2
  import type { Snippet } from 'svelte'
2
3
 
3
4
  export type CardProps = {
@@ -132,7 +132,7 @@ const Carousel = ({
132
132
  const usedInAstro = carousel.current?.children[0].nodeName === 'ASTRO-SLOT'
133
133
 
134
134
  carouselItems.current = usedInAstro
135
- ? carousel.current.querySelectorAll('li')
135
+ ? carousel.current?.querySelectorAll('li')
136
136
  : carousel.current?.children
137
137
 
138
138
  carouselContainer.current?.addEventListener('scroll', scroll)
@@ -0,0 +1,90 @@
1
+ ---
2
+ import type { ContextMenuProps } from './contextmenu'
3
+
4
+ import { classNames } from '../../utils/classNames'
5
+
6
+ import styles from './contextmenu.module.scss'
7
+
8
+ interface Props extends ContextMenuProps {}
9
+
10
+ const {
11
+ element = 'div',
12
+ className,
13
+ ...rest
14
+ } = Astro.props
15
+
16
+ const Component = element
17
+
18
+ const classes = classNames([
19
+ styles.ctx,
20
+ className
21
+ ])
22
+
23
+ const props = {
24
+ class: classes
25
+ }
26
+
27
+ if (!Astro.slots.has('context')) {
28
+ // eslint-disable-next-line no-console, max-len
29
+ console.error('Missing "context" slot. Attach slot="context" to one of the children of your <ContextMenu> component.')
30
+ }
31
+ ---
32
+
33
+ <Component {...rest} {...props} data-id="w-ctx">
34
+ <slot />
35
+ <div class={styles.content} data-id="w-ctx-content">
36
+ <slot name="context" />
37
+ </div>
38
+ </Component>
39
+
40
+ <script>
41
+ import { get, on } from '../../utils/DOMUtils'
42
+
43
+ const addEventListeners = () => {
44
+ const ctxs = get('[data-id="w-ctx"]', true) as NodeListOf<HTMLElement>
45
+ const contents: HTMLDivElement[] = []
46
+
47
+ const hideContent = (content: HTMLDivElement, event: MouseEvent) => {
48
+ if (content.contains(event.target as Node)) {
49
+ return
50
+ }
51
+
52
+ content.dataset.show = 'false'
53
+
54
+ setTimeout(() => {
55
+ content.style.top = ''
56
+ content.style.left = ''
57
+ }, 200)
58
+ }
59
+
60
+ [...ctxs].forEach((ctx, i) => {
61
+ on(ctx, 'contextmenu', (event: MouseEvent) => {
62
+ event.preventDefault()
63
+
64
+ if (!contents[i]) {
65
+ const target = event.currentTarget as HTMLElement
66
+ contents[i] = target.lastElementChild as HTMLDivElement
67
+ }
68
+
69
+ if (contents.length > 1) {
70
+ contents.forEach((content, y) => {
71
+ if (i !== y) {
72
+ hideContent(content, event)
73
+ }
74
+ })
75
+ }
76
+
77
+ contents[i].style.top = `${event.offsetY}px`
78
+ contents[i].style.left = `${event.offsetX}px`
79
+ contents[i].dataset.show = 'true'
80
+ })
81
+ })
82
+
83
+ on(document, 'click', (event: MouseEvent) => {
84
+ contents.forEach(content => hideContent(content, event))
85
+ })
86
+ }
87
+
88
+ on(document, 'astro:after-swap', addEventListeners)
89
+ addEventListeners()
90
+ </script>
@@ -0,0 +1,76 @@
1
+ <script lang="ts">
2
+ import { onMount } from 'svelte'
3
+ import type { SvelteContextMenuProps } from './contextmenu'
4
+
5
+ import { classNames } from '../../utils/classNames'
6
+ import { on } from '../../utils/DOMUtils'
7
+
8
+ import styles from './contextmenu.module.scss'
9
+
10
+ const {
11
+ element = 'div',
12
+ className,
13
+ children,
14
+ context,
15
+ ...rest
16
+ }: SvelteContextMenuProps = $props()
17
+
18
+ const classes = classNames([
19
+ styles.ctx,
20
+ className
21
+ ])
22
+
23
+ const showContext = (event: MouseEvent) => {
24
+ event.preventDefault()
25
+
26
+ if (content) {
27
+ content.style.top = `${event.offsetY}px`
28
+ content.style.left = `${event.offsetX}px`
29
+ content.dataset.show = 'true'
30
+ }
31
+ }
32
+
33
+ const hideContext = (event: MouseEvent) => {
34
+ if (content) {
35
+ if (content.contains(event.target as Node)) {
36
+ return
37
+ }
38
+
39
+ content.dataset.show = 'false'
40
+
41
+ setTimeout(() => {
42
+ if (content) {
43
+ content.style.top = ''
44
+ content.style.left = ''
45
+ }
46
+ }, 200)
47
+ }
48
+ }
49
+
50
+ let ctx: HTMLElement
51
+ let content: HTMLDivElement
52
+
53
+ onMount(() => {
54
+ if (ctx && content) {
55
+ on(ctx, 'contextmenu', showContext)
56
+ on(document, 'click', hideContext)
57
+ }
58
+
59
+ return () => {
60
+ ctx?.removeEventListener('contextmenu', showContext)
61
+ document.removeEventListener('click', hideContext)
62
+ }
63
+ })
64
+
65
+ if (!context) {
66
+ // eslint-disable-next-line no-console, max-len
67
+ console.error('Missing "context" slot. Attach slot="context" to one of the children of your <ContextMenu> component.')
68
+ }
69
+ </script>
70
+
71
+ <svelte:element {...rest} this={element} class={classes} bind:this={ctx}>
72
+ {@render children?.()}
73
+ <div class={styles.content} bind:this={content}>
74
+ {@render context?.()}
75
+ </div>
76
+ </svelte:element>
@@ -0,0 +1,78 @@
1
+ import React, { useEffect, useRef } from 'react'
2
+ import type { ReactContextMenuProps } from './contextmenu'
3
+
4
+ import { classNames } from '../../utils/classNames'
5
+ import { on } from '../../utils/DOMUtils'
6
+
7
+ import styles from './contextmenu.module.scss'
8
+
9
+ const ContextMenu = ({
10
+ Element = 'div',
11
+ className,
12
+ children,
13
+ context,
14
+ ...rest
15
+ }: ReactContextMenuProps) => {
16
+ const ctx = useRef<HTMLElement>(null)
17
+ const content = useRef<HTMLDivElement>(null)
18
+ const classes = classNames([
19
+ styles.ctx,
20
+ className
21
+ ])
22
+
23
+ const showContext = (event: MouseEvent) => {
24
+ event.preventDefault()
25
+
26
+ if (content.current) {
27
+ content.current.style.top = `${event.offsetY}px`
28
+ content.current.style.left = `${event.offsetX}px`
29
+ content.current.dataset.show = 'true'
30
+ }
31
+ }
32
+
33
+ const hideContext = (event: MouseEvent) => {
34
+ if (content.current) {
35
+ if (content.current.contains(event.target as Node)) {
36
+ return
37
+ }
38
+
39
+ content.current.dataset.show = 'false'
40
+
41
+ setTimeout(() => {
42
+ if (content.current) {
43
+ content.current.style.top = ''
44
+ content.current.style.left = ''
45
+ }
46
+ }, 200)
47
+ }
48
+ }
49
+
50
+ useEffect(() => {
51
+ if (ctx.current) {
52
+ on(ctx.current, 'contextmenu', showContext)
53
+ on(document, 'click', hideContext)
54
+ }
55
+
56
+ return () => {
57
+ ctx.current?.removeEventListener('contextmenu', showContext)
58
+ document.removeEventListener('click', hideContext)
59
+ }
60
+ }, [])
61
+
62
+ if (!context) {
63
+ // eslint-disable-next-line no-console
64
+ console.error('Missing `context` prop. Add `context={...}` to your <ContextMenu> component.')
65
+ }
66
+
67
+ return (
68
+ <Element {...rest} className={classes} ref={ctx}>
69
+ {children}
70
+ <div className={styles.content} ref={content} onClick={event => event.stopPropagation()}>
71
+ {context}
72
+ </div>
73
+ </Element>
74
+
75
+ )
76
+ }
77
+
78
+ export default ContextMenu
@@ -0,0 +1,24 @@
1
+ @use '../../scss/config.scss' as *;
2
+
3
+ .ctx {
4
+ @include position(relative);
5
+ }
6
+
7
+ .content {
8
+ @include position(absolute);
9
+ @include background(primary-70);
10
+ @include size(wmax-content);
11
+ @include layer(modal);
12
+ @include transition(.2s);
13
+ @include visibility(0);
14
+
15
+ transform: scale(.95);
16
+ pointer-events: none;
17
+
18
+ &[data-show="true"] {
19
+ @include visibility(1);
20
+
21
+ transform: scale(1);
22
+ pointer-events: all;
23
+ }
24
+ }
@@ -0,0 +1,19 @@
1
+ import type React from 'react'
2
+ import type { Snippet } from 'svelte'
3
+
4
+ export type ContextMenuProps = {
5
+ element?: string
6
+ className?: string
7
+ [key: string]: any
8
+ }
9
+
10
+ export type SvelteContextMenuProps = {
11
+ children: Snippet
12
+ context: Snippet
13
+ } & ContextMenuProps
14
+
15
+ export type ReactContextMenuProps = {
16
+ Element?: React.ElementType
17
+ children: React.ReactNode
18
+ context: React.ReactNode
19
+ } & Omit<ContextMenuProps, 'element'>
@@ -1,3 +1,4 @@
1
+ import type { JSX } from 'react'
1
2
  import type { Snippet } from 'svelte'
2
3
 
3
4
  import type {
@@ -1,3 +1,4 @@
1
+ import type { JSX } from 'react'
1
2
  import type { Snippet } from 'svelte'
2
3
 
3
4
  import type {
@@ -1,4 +1,4 @@
1
- import React from 'react'
1
+ import React, { type JSX } from 'react'
2
2
  import type { ReactMasonryProps } from './masonry'
3
3
 
4
4
  import { classNames } from '../../utils/classNames'
@@ -1,3 +1,4 @@
1
+ import type { JSX } from 'react'
1
2
  import type { Snippet } from 'svelte'
2
3
 
3
4
  import type { IconProps } from '../Icon/icon'
package/index.d.ts CHANGED
@@ -126,6 +126,7 @@ export type Toast = {
126
126
  declare module 'webcoreui' {
127
127
  export const bodyFreeze: (freeze: boolean) => void
128
128
  export const classNames: (classes: any[]) => string
129
+ export const closeContext: (ctx: string | HTMLElement) => void
129
130
 
130
131
  export const setCookie: (name: string, value: string, days: number) => void
131
132
  export const getCookie: (name: string) => string | null
package/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from './utils/bodyFreeze.ts'
2
2
  export * from './utils/classNames.ts'
3
+ export * from './utils/context.ts'
3
4
  export * from './utils/cookies.ts'
4
5
  export * from './utils/debounce.ts'
5
6
  export * from './utils/DOMUtils.ts'
@@ -0,0 +1,8 @@
1
+
2
+ import type { AstroIntegration } from 'astro'
3
+ import { Plugin } from 'vite'
4
+
5
+ declare module 'webcoreui/integration' {
6
+ export const webcore: () => AstroIntegration
7
+ export const webcoreVite: () => Plugin
8
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "webcoreui",
3
3
  "type": "module",
4
- "version": "1.1.0-beta.1",
4
+ "version": "1.1.0-beta.3",
5
5
  "scripts": {
6
6
  "prepare": "husky",
7
7
  "pre-commit": "lint-staged",
@@ -18,13 +18,12 @@
18
18
  },
19
19
  "devDependencies": {
20
20
  "@astrojs/check": "0.9.4",
21
- "@astrojs/node": "9.1.3",
22
- "@astrojs/react": "4.2.1",
23
- "@astrojs/svelte": "7.0.7",
21
+ "@astrojs/node": "9.4.1",
22
+ "@astrojs/react": "4.3.0",
23
+ "@astrojs/svelte": "7.1.0",
24
24
  "@eslint/js": "9.23.0",
25
- "@types/node": "24.2.1",
26
- "@typescript-eslint/parser": "8.27.0",
27
- "astro": "5.5.4",
25
+ "@typescript-eslint/parser": "8.39.1",
26
+ "astro": "5.13.0",
28
27
  "astro-eslint-parser": "1.2.2",
29
28
  "eslint": "9.23.0",
30
29
  "eslint-plugin-astro": "1.3.1",
@@ -36,12 +35,12 @@
36
35
  "lint-staged": "15.5.0",
37
36
  "react": "19.0.0",
38
37
  "react-dom": "19.0.0",
39
- "sass": "1.86.0",
38
+ "sass": "1.90.0",
40
39
  "sass-true": "8.1.0",
41
- "svelte": "5.25.3",
40
+ "svelte": "5.38.1",
42
41
  "svelte-eslint-parser": "1.1.0",
43
- "typescript": "5.8.2",
44
- "typescript-eslint": "8.27.0",
42
+ "typescript": "5.9.2",
43
+ "typescript-eslint": "8.39.1",
45
44
  "vite-tsconfig-paths": "5.1.4",
46
45
  "vitest": "3.0.4"
47
46
  },
@@ -71,6 +70,7 @@
71
70
  "index.js",
72
71
  "index.d.ts",
73
72
  "integration.js",
73
+ "integration.d.ts",
74
74
  "README.md",
75
75
  "LICENSE"
76
76
  ],
package/react.d.ts CHANGED
@@ -13,6 +13,7 @@ import type { ReactCarouselProps as WReactCarouselProps } from './components/Car
13
13
  import type { ReactCheckboxProps as WReactCheckboxProps } from './components/Checkbox/checkbox'
14
14
  import type { ReactCollapsibleProps as WReactCollapsibleProps } from './components/Collapsible/collapsible'
15
15
  import type { ReactConditionalWrapperProps as WReactConditionalWrapperProps } from './components/ConditionalWrapper/conditionalwrapper'
16
+ import type { ReactContextMenuProps as WReactContextMenuProps } from './components/ContextMenu/contextmenu'
16
17
  import type { ReactCopyProps as WReactCopyProps } from './components/Copy/copy'
17
18
  import type { ReactDataTableProps as WReactDataTableProps } from './components/DataTable/datatable'
18
19
  import type { ReactFlexProps as WReactFlexProps } from './components/Flex/flex'
@@ -71,6 +72,7 @@ declare module 'webcoreui/react' {
71
72
  export const Checkbox: FC<WReactCheckboxProps>
72
73
  export const Collapsible: FC<WReactCollapsibleProps>
73
74
  export const ConditionalWrapper: FC<WReactConditionalWrapperProps>
75
+ export const ContextMenu: FC<WReactContextMenuProps>
74
76
  export const Copy: FC<WReactCopyProps>
75
77
  export const DataTable: FC<WReactDataTableProps>
76
78
  export const Flex: FC<WReactFlexProps>
@@ -123,6 +125,7 @@ declare module 'webcoreui/react' {
123
125
  export type CheckboxProps = WReactCheckboxProps
124
126
  export type CollapsibleProps = WReactCollapsibleProps
125
127
  export type ConditionalWrapperProps = WReactConditionalWrapperProps
128
+ export type ContextMenuProps = WReactContextMenuProps
126
129
  export type CopyProps = WReactCopyProps
127
130
  export type DataTableProps = WReactDataTableProps
128
131
  export type FlexProps = WReactFlexProps
package/react.js CHANGED
@@ -12,6 +12,7 @@ import CarouselComponent from './components/Carousel/Carousel.tsx'
12
12
  import CheckboxComponent from './components/Checkbox/Checkbox.tsx'
13
13
  import CollapsibleComponent from './components/Collapsible/Collapsible.tsx'
14
14
  import ConditionalWrapperComponent from './components/ConditionalWrapper/ConditionalWrapper.tsx'
15
+ import ContextMenuComponent from './components/ContextMenu/ContextMenu.tsx'
15
16
  import CopyComponent from './components/Copy/Copy.tsx'
16
17
  import DataTableComponent from './components/DataTable/DataTable.tsx'
17
18
  import FlexComponent from './components/Flex/Flex.tsx'
@@ -64,6 +65,7 @@ export const Carousel = CarouselComponent
64
65
  export const Checkbox = CheckboxComponent
65
66
  export const Collapsible = CollapsibleComponent
66
67
  export const ConditionalWrapper = ConditionalWrapperComponent
68
+ export const ContextMenu = ContextMenuComponent
67
69
  export const Copy = CopyComponent
68
70
  export const DataTable = DataTableComponent
69
71
  export const Flex = FlexComponent
package/svelte.d.ts CHANGED
@@ -13,6 +13,7 @@ import type { SvelteCarouselProps as WSvelteCarouselProps } from './components/C
13
13
  import type { SvelteCheckboxProps as WSvelteCheckboxProps } from './components/Checkbox/checkbox'
14
14
  import type { SvelteCollapsibleProps as WSvelteCollapsibleProps } from './components/Collapsible/collapsible'
15
15
  import type { SvelteConditionalWrapperProps as WSvelteConditionalWrapperProps } from './components/ConditionalWrapper/conditionalwrapper'
16
+ import type { SvelteContextMenuProps as WSvelteContextMenuProps } from './components/ContextMenu/contextmenu'
16
17
  import type { SvelteCopyProps as WSvelteCopyProps } from './components/Copy/copy'
17
18
  import type { SvelteDataTableProps as WSvelteDataTableProps } from './components/DataTable/datatable'
18
19
  import type { SvelteFlexProps as WSvelteFlexProps } from './components/Flex/flex'
@@ -71,6 +72,7 @@ declare module 'webcoreui/svelte' {
71
72
  export const Checkbox: Component<WSvelteCheckboxProps>
72
73
  export const Collapsible: Component<WSvelteCollapsibleProps>
73
74
  export const ConditionalWrapper: Component<WSvelteConditionalWrapperProps>
75
+ export const ContextMenu: Component<WSvelteContextMenuProps>
74
76
  export const Copy: Component<WSvelteCopyProps>
75
77
  export const DataTable: Component<WSvelteDataTableProps>
76
78
  export const Flex: Component<WSvelteFlexProps>
@@ -123,6 +125,7 @@ declare module 'webcoreui/svelte' {
123
125
  export type CheckboxProps = WSvelteCheckboxProps
124
126
  export type CollapsibleProps = WSvelteCollapsibleProps
125
127
  export type ConditionalWrapperProps = WSvelteConditionalWrapperProps
128
+ export type ContextMenuProps = WSvelteContextMenuProps
126
129
  export type CopyProps = WSvelteCopyProps
127
130
  export type DataTableProps = WSvelteDataTableProps
128
131
  export type FlexProps = WSvelteFlexProps
package/svelte.js CHANGED
@@ -12,6 +12,7 @@ import CarouselComponent from './components/Carousel/Carousel.svelte'
12
12
  import CheckboxComponent from './components/Checkbox/Checkbox.svelte'
13
13
  import CollapsibleComponent from './components/Collapsible/Collapsible.svelte'
14
14
  import ConditionalWrapperComponent from './components/ConditionalWrapper/ConditionalWrapper.svelte'
15
+ import ContextMenuComponent from './components/ContextMenu/ContextMenu.svelte'
15
16
  import CopyComponent from './components/Copy/Copy.svelte'
16
17
  import DataTableComponent from './components/DataTable/DataTable.svelte'
17
18
  import FlexComponent from './components/Flex/Flex.svelte'
@@ -64,6 +65,7 @@ export const Carousel = CarouselComponent
64
65
  export const Checkbox = CheckboxComponent
65
66
  export const Collapsible = CollapsibleComponent
66
67
  export const ConditionalWrapper = ConditionalWrapperComponent
68
+ export const ContextMenu = ContextMenuComponent
67
69
  export const Copy = CopyComponent
68
70
  export const DataTable = DataTableComponent
69
71
  export const Flex = FlexComponent
@@ -0,0 +1,20 @@
1
+ export const closeContext = (ctx: string | HTMLElement) => {
2
+ const element = typeof ctx === 'string'
3
+ ? document.querySelector(ctx) as HTMLElement
4
+ : ctx
5
+
6
+ const parent = element?.parentElement as HTMLElement
7
+
8
+ if (!parent) {
9
+ // eslint-disable-next-line no-console
10
+ console.error('Could not found context for:', ctx)
11
+ return
12
+ }
13
+
14
+ parent.dataset.show = 'false'
15
+
16
+ setTimeout(() => {
17
+ parent.style.top = ''
18
+ parent.style.left = ''
19
+ }, 200)
20
+ }