windmill-components 1.82.0 → 1.82.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/components/Multiselect.svelte.d.ts +2 -2
  2. package/components/apps/components/buttons/AppButton.svelte +2 -16
  3. package/components/apps/components/buttons/AppForm.svelte +2 -9
  4. package/components/apps/components/buttons/AppFormButton.svelte +59 -82
  5. package/components/apps/components/display/PlotlyHtml.svelte +1 -1
  6. package/components/apps/components/display/table/AppTable.svelte +15 -8
  7. package/components/apps/components/helpers/RunnableComponent.svelte +9 -6
  8. package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +1 -0
  9. package/components/apps/components/helpers/RunnableWrapper.svelte +2 -0
  10. package/components/apps/components/helpers/RunnableWrapper.svelte.d.ts +1 -0
  11. package/components/apps/editor/AppEditor.svelte +14 -12
  12. package/components/apps/editor/AppPreview.svelte +1 -2
  13. package/components/apps/editor/component/Component.svelte +1 -1
  14. package/components/apps/editor/component/ComponentNavigation.svelte +2 -1
  15. package/components/apps/editor/component/README.md +4 -0
  16. package/components/apps/editor/componentsPanel/CssProperty.svelte +87 -47
  17. package/components/apps/editor/componentsPanel/CssProperty.svelte.d.ts +5 -2
  18. package/components/apps/editor/componentsPanel/QuickStyleMenu.svelte +167 -0
  19. package/components/apps/editor/componentsPanel/QuickStyleMenu.svelte.d.ts +18 -0
  20. package/components/apps/editor/componentsPanel/QuickStyleProperty.svelte +130 -0
  21. package/components/apps/editor/componentsPanel/QuickStyleProperty.svelte.d.ts +21 -0
  22. package/components/apps/editor/componentsPanel/quickStyleProperties.d.ts +535 -0
  23. package/components/apps/editor/componentsPanel/quickStyleProperties.js +595 -0
  24. package/components/apps/editor/settingsPanel/ComponentPanel.svelte +24 -14
  25. package/components/apps/editor/settingsPanel/StylePanel.svelte +23 -0
  26. package/components/apps/editor/settingsPanel/StylePanel.svelte.d.ts +17 -0
  27. package/components/apps/editor/settingsPanel/inputEditor/ColorInput.svelte +12 -12
  28. package/components/apps/editor/settingsPanel/inputEditor/ColorInput.svelte.d.ts +3 -2
  29. package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +1 -1
  30. package/components/apps/editor/settingsPanel/secondaryMenu/SecondaryMenu.svelte +47 -0
  31. package/components/apps/editor/settingsPanel/secondaryMenu/SecondaryMenu.svelte.d.ts +14 -0
  32. package/components/apps/editor/settingsPanel/secondaryMenu/index.d.ts +2 -0
  33. package/components/apps/editor/settingsPanel/secondaryMenu/index.js +2 -0
  34. package/components/apps/editor/settingsPanel/secondaryMenu/menuStore.d.ts +12 -0
  35. package/components/apps/editor/settingsPanel/secondaryMenu/menuStore.js +10 -0
  36. package/components/apps/types.d.ts +2 -1
  37. package/components/common/button/ButtonPopup.svelte +5 -2
  38. package/components/common/button/ButtonPopup.svelte.d.ts +5 -1
  39. package/components/common/button/ButtonPopupItem.svelte +2 -1
  40. package/components/common/button/ButtonPopupItem.svelte.d.ts +1 -0
  41. package/components/common/clearableInput/ClearableInput.svelte +56 -0
  42. package/components/common/clearableInput/ClearableInput.svelte.d.ts +28 -0
  43. package/components/common/index.d.ts +1 -0
  44. package/components/common/index.js +1 -0
  45. package/components/common/kbd/Kbd.svelte +4 -1
  46. package/components/common/kbd/Kbd.svelte.d.ts +6 -14
  47. package/components/common/menu/Menu.svelte +8 -2
  48. package/components/common/menu/Menu.svelte.d.ts +4 -1
  49. package/components/common/modal/AlwaysMountedModal.svelte +109 -0
  50. package/components/common/modal/AlwaysMountedModal.svelte.d.ts +22 -0
  51. package/package.json +672 -662
  52. package/utils.d.ts +1 -0
  53. package/utils.js +3 -0
@@ -0,0 +1,17 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import { type AppComponent } from '../component';
3
+ declare const __propDef: {
4
+ props: {
5
+ component: AppComponent | undefined;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {};
11
+ };
12
+ export type StylePanelProps = typeof __propDef.props;
13
+ export type StylePanelEvents = typeof __propDef.events;
14
+ export type StylePanelSlots = typeof __propDef.slots;
15
+ export default class StylePanel extends SvelteComponentTyped<StylePanelProps, StylePanelEvents, StylePanelSlots> {
16
+ }
17
+ export {};
@@ -1,19 +1,18 @@
1
- <script>import ColorPicker, { ChromeVariant } from 'svelte-awesome-color-picker';
2
- export let componentInput;
1
+ <script>import { createEventDispatcher } from 'svelte';
2
+ import ColorPicker, { ChromeVariant } from 'svelte-awesome-color-picker';
3
+ import { ClearableInput } from '../../../../common';
4
+ export let value = '#fff';
5
+ const dispatch = createEventDispatcher();
3
6
  let isOpen = false;
7
+ $: dispatch('change', value);
4
8
  </script>
5
9
 
6
- <div class="color-picker-input">
7
- <input
8
- type="text"
9
- readonly
10
- value={componentInput.value}
11
- on:focus|preventDefault|stopPropagation={() => (isOpen = true)}
12
- />
10
+ <div class="color-picker-input grow">
11
+ <ClearableInput readonly bind:value on:focus={() => (isOpen = true)} />
13
12
  <ColorPicker
14
13
  bind:isOpen
15
- bind:hex={componentInput.value}
16
- label={componentInput.value}
14
+ bind:hex={value}
15
+ label={value}
17
16
  canChangeMode={false}
18
17
  components={ChromeVariant}
19
18
  toRight
@@ -22,7 +21,7 @@ let isOpen = false;
22
21
  </div>
23
22
 
24
23
  <style global>
25
- :global(.color-picker-input) :global(span) > :global(label.svelte-rogbpz) {
24
+ :global(.color-picker-input) :global(span) > :global(label) {
26
25
  display: none;
27
26
  }
28
27
 
@@ -30,6 +29,7 @@ let isOpen = false;
30
29
  box-shadow: 0 10px 40px -5px rgba(0, 0, 0, 0.25) !important;
31
30
  border-style: none !important;
32
31
  border-radius: 0.375rem !important;
32
+ z-index: 20;
33
33
  }
34
34
 
35
35
  :global(.color-picker-input) :global(.slider-wrapper) {
@@ -1,10 +1,11 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
- import type { StaticInput } from '../../../inputType';
3
2
  declare const __propDef: {
4
3
  props: {
5
- componentInput: StaticInput<string>;
4
+ value?: string | undefined;
6
5
  };
7
6
  events: {
7
+ change: CustomEvent<any>;
8
+ } & {
8
9
  [evt: string]: CustomEvent<any>;
9
10
  };
10
11
  slots: {};
@@ -74,7 +74,7 @@ $: componentInput && onchange?.();
74
74
  Inconsistent labeled resource object
75
75
  {/if}
76
76
  {:else if fieldType === 'color'}
77
- <ColorInput bind:componentInput />
77
+ <ColorInput bind:value={componentInput.value} />
78
78
  {:else if fieldType === 'object'}
79
79
  {#if format?.startsWith('resource-')}
80
80
  <ResourcePicker
@@ -0,0 +1,47 @@
1
+ <script>import { fly } from 'svelte/transition';
2
+ import { faChevronLeft } from '@fortawesome/free-solid-svg-icons';
3
+ import { Badge, Button } from '../../../../common';
4
+ import { secondaryMenu, SECONDARY_MENU_ID } from './';
5
+ import { getContext } from 'svelte';
6
+ const { selectedComponent } = getContext('AppViewerContext');
7
+ let width;
8
+ let lastSelected = $selectedComponent;
9
+ $: if (lastSelected !== $selectedComponent) {
10
+ secondaryMenu.close();
11
+ lastSelected = $selectedComponent;
12
+ }
13
+ </script>
14
+
15
+ <div
16
+ bind:clientWidth={width}
17
+ class="absolute z-50 inset-0 overflow-hidden"
18
+ class:pointer-events-none={!$secondaryMenu.isOpen}
19
+ >
20
+ {#if $secondaryMenu.isOpen && $secondaryMenu.component}
21
+ <div
22
+ transition:fly|local={{ duration: 300, x: width, y: 0, opacity: 1 }}
23
+ id={SECONDARY_MENU_ID}
24
+ class="flex flex-col w-full h-full bg-white"
25
+ >
26
+ <div class="flex justify-between items-center bg-white gap-1 p-3">
27
+ <Button
28
+ color="light"
29
+ size="xs"
30
+ variant="border"
31
+ startIcon={{ icon: faChevronLeft }}
32
+ on:click={secondaryMenu.close}
33
+ >
34
+ Back
35
+ </Button>
36
+ <Badge color="blue">{$selectedComponent}</Badge>
37
+ </div>
38
+ <div class="relative h-full overflow-y-auto px-3 pb-3">
39
+ {#if typeof $secondaryMenu.component === 'string'}
40
+ {@html $secondaryMenu.component}
41
+ {:else}
42
+ <svelte:component this={$secondaryMenu.component} {...$secondaryMenu.props} />
43
+ {/if}
44
+ </div>
45
+ </div>
46
+ {/if}
47
+ </div>
@@ -0,0 +1,14 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: Record<string, never>;
4
+ events: {
5
+ [evt: string]: CustomEvent<any>;
6
+ };
7
+ slots: {};
8
+ };
9
+ export type SecondaryMenuProps = typeof __propDef.props;
10
+ export type SecondaryMenuEvents = typeof __propDef.events;
11
+ export type SecondaryMenuSlots = typeof __propDef.slots;
12
+ export default class SecondaryMenu extends SvelteComponentTyped<SecondaryMenuProps, SecondaryMenuEvents, SecondaryMenuSlots> {
13
+ }
14
+ export {};
@@ -0,0 +1,2 @@
1
+ export { default as SecondaryMenu } from './SecondaryMenu.svelte';
2
+ export * from './menuStore';
@@ -0,0 +1,2 @@
1
+ export { default as SecondaryMenu } from './SecondaryMenu.svelte';
2
+ export * from './menuStore';
@@ -0,0 +1,12 @@
1
+ import type { SvelteComponent } from 'svelte';
2
+ export declare const SECONDARY_MENU_ID: "app-secondary-menu";
3
+ export interface SecondaryMenuStore {
4
+ isOpen: boolean;
5
+ component?: typeof SvelteComponent | string;
6
+ props: Record<string, any>;
7
+ }
8
+ export declare const secondaryMenu: {
9
+ readonly subscribe: (this: void, run: import("svelte/store").Subscriber<SecondaryMenuStore>, invalidate?: ((value?: SecondaryMenuStore | undefined) => void) | undefined) => import("svelte/store").Unsubscriber;
10
+ readonly open: (component: SecondaryMenuStore['component'], props?: SecondaryMenuStore['props']) => void;
11
+ readonly close: () => void;
12
+ };
@@ -0,0 +1,10 @@
1
+ import { writable } from 'svelte/store';
2
+ export const SECONDARY_MENU_ID = 'app-secondary-menu';
3
+ const store = writable({ isOpen: false, component: undefined, props: {} });
4
+ export const secondaryMenu = {
5
+ subscribe: store.subscribe,
6
+ open: (component, props = {}) => {
7
+ store.set({ isOpen: true, component, props });
8
+ },
9
+ close: () => store.set({ isOpen: false, component: undefined, props: {} })
10
+ };
@@ -63,6 +63,7 @@ export type InlineScript = {
63
63
  key: string;
64
64
  }[];
65
65
  };
66
+ export type AppCssItemName = 'viewer' | 'grid' | AppComponent['type'];
66
67
  export type App = {
67
68
  grid: GridItem[];
68
69
  fullscreen: boolean;
@@ -78,7 +79,7 @@ export type App = {
78
79
  autoRefresh?: boolean;
79
80
  doNotRecomputeOnInputChanged?: boolean;
80
81
  }>;
81
- css?: Partial<Record<'viewer' | 'grid' | AppComponent['type'], Record<string, ComponentCssProperty>>>;
82
+ css?: Partial<Record<AppCssItemName, Record<string, ComponentCssProperty>>>;
82
83
  subgrids?: Record<string, GridItem[]>;
83
84
  };
84
85
  export type ConnectingInput = {
@@ -7,6 +7,7 @@ export let color = 'blue';
7
7
  export let variant = 'contained';
8
8
  export let mainClasses = '';
9
9
  export let toggleClasses = '';
10
+ export let listClasses = '';
10
11
  export let disabled = false;
11
12
  export let href = undefined;
12
13
  export let target = '_self';
@@ -59,14 +60,16 @@ $: commonProps = {
59
60
  {#if ref}
60
61
  <Popup
61
62
  {ref}
63
+ let:open
64
+ let:close
62
65
  options={{
63
66
  placement: $$slots.main ? 'bottom-end' : 'bottom',
64
67
  strategy: 'absolute',
65
68
  modifiers: [{ name: 'offset', options: { offset: [0, 0] } }]
66
69
  }}
67
70
  >
68
- <ul class="bg-white rounded-t border pt-1 pb-2 max-h-40 overflow-auto">
69
- <slot />
71
+ <ul class="bg-white rounded-t border pt-1 pb-2 max-h-40 overflow-auto {listClasses}">
72
+ <slot {open} {close} />
70
73
  </ul>
71
74
  </Popup>
72
75
  {/if}
@@ -8,6 +8,7 @@ declare const __propDef: {
8
8
  variant?: ButtonType.Variant | undefined;
9
9
  mainClasses?: string | undefined;
10
10
  toggleClasses?: string | undefined;
11
+ listClasses?: string | undefined;
11
12
  disabled?: boolean | undefined;
12
13
  href?: string | undefined;
13
14
  target?: ButtonType.Target | undefined;
@@ -24,7 +25,10 @@ declare const __propDef: {
24
25
  slots: {
25
26
  main: {};
26
27
  toggle: {};
27
- default: {};
28
+ default: {
29
+ open: () => void;
30
+ close: () => void;
31
+ };
28
32
  };
29
33
  };
30
34
  export type ButtonPopupProps = typeof __propDef.props;
@@ -8,6 +8,7 @@ export let target = '_self';
8
8
  export let iconOnly = false;
9
9
  export let startIcon = undefined;
10
10
  export let endIcon = undefined;
11
+ export let wrapperClasses = '';
11
12
  const props = getContext(ButtonType.ItemContextKey);
12
13
  const iconWidthClass = {
13
14
  xs: '!w-[12px]',
@@ -40,7 +41,7 @@ $: buttonProps = {
40
41
  };
41
42
  </script>
42
43
 
43
- <li class="mt-1">
44
+ <li class="mt-1 {wrapperClasses}">
44
45
  <Button {...buttonProps} on:click>
45
46
  <slot />
46
47
  </Button>
@@ -9,6 +9,7 @@ declare const __propDef: {
9
9
  iconOnly?: boolean | undefined;
10
10
  startIcon?: ButtonType.Icon | undefined;
11
11
  endIcon?: ButtonType.Icon | undefined;
12
+ wrapperClasses?: string | undefined;
12
13
  };
13
14
  events: {
14
15
  click: CustomEvent<any>;
@@ -0,0 +1,56 @@
1
+ <script>import { createEventDispatcher } from 'svelte';
2
+ import { fade } from 'svelte/transition';
3
+ import { X } from 'lucide-svelte';
4
+ export let value = '';
5
+ export let placeholder = '';
6
+ export let type = 'text';
7
+ export let inputClass = '';
8
+ export let wrapperClass = '';
9
+ export let buttonClass = '';
10
+ const dispatch = createEventDispatcher();
11
+ $: isNumeric = ['number', 'range'].includes(type);
12
+ $: dispatch('change', value);
13
+ function handleInput(e) {
14
+ value = isNumeric ? +e.target.value : e.target.value;
15
+ }
16
+ function clear() {
17
+ value = '';
18
+ }
19
+ </script>
20
+
21
+ <div class="relative grow {wrapperClass}">
22
+ {#if type === 'textarea'}
23
+ <textarea
24
+ {value}
25
+ {placeholder}
26
+ rows="1"
27
+ class="resize-y duration-200 {inputClass}"
28
+ {...$$restProps}
29
+ on:input={handleInput}
30
+ on:focus
31
+ on:blur
32
+ />
33
+ {:else}
34
+ <input
35
+ {type}
36
+ {value}
37
+ {placeholder}
38
+ class="duration-200 {(type === 'number' && value ? '!pr-[26px] ' : '') + inputClass}"
39
+ {...$$restProps}
40
+ on:input={handleInput}
41
+ on:focus
42
+ on:blur
43
+ />
44
+ {/if}
45
+ {#if value}
46
+ <button
47
+ transition:fade|local={{ duration: 100 }}
48
+ class="absolute z-10 top-1.5 right-1 rounded-full p-1 bg-white/60 duration-200 hover:bg-gray-200 {buttonClass}"
49
+ aria-label="Clear"
50
+ on:click|preventDefault|stopPropagation={clear}
51
+ >
52
+ <X size={14} />
53
+ </button>
54
+ {/if}
55
+ <slot />
56
+ </div>
@@ -0,0 +1,28 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ [x: string]: any;
5
+ value?: any;
6
+ placeholder?: string | undefined;
7
+ type?: "number" | "text" | "textarea" | undefined;
8
+ inputClass?: string | undefined;
9
+ wrapperClass?: string | undefined;
10
+ buttonClass?: string | undefined;
11
+ };
12
+ events: {
13
+ focus: FocusEvent;
14
+ blur: FocusEvent;
15
+ change: CustomEvent<any>;
16
+ } & {
17
+ [evt: string]: CustomEvent<any>;
18
+ };
19
+ slots: {
20
+ default: {};
21
+ };
22
+ };
23
+ export type ClearableInputProps = typeof __propDef.props;
24
+ export type ClearableInputEvents = typeof __propDef.events;
25
+ export type ClearableInputSlots = typeof __propDef.slots;
26
+ export default class ClearableInput extends SvelteComponentTyped<ClearableInputProps, ClearableInputEvents, ClearableInputSlots> {
27
+ }
28
+ export {};
@@ -5,6 +5,7 @@ export { default as Button } from './button/Button.svelte';
5
5
  export { default as ButtonPopup } from './button/ButtonPopup.svelte';
6
6
  export { default as ButtonPopupItem } from './button/ButtonPopupItem.svelte';
7
7
  export { default as UndoRedo } from './button/UndoRedo.svelte';
8
+ export { default as ClearableInput } from './clearableInput/ClearableInput.svelte';
8
9
  export { default as Drawer } from './drawer/Drawer.svelte';
9
10
  export { default as DrawerContent } from './drawer/DrawerContent.svelte';
10
11
  export { default as Kbd } from './kbd/Kbd.svelte';
@@ -5,6 +5,7 @@ export { default as Button } from './button/Button.svelte';
5
5
  export { default as ButtonPopup } from './button/ButtonPopup.svelte';
6
6
  export { default as ButtonPopupItem } from './button/ButtonPopupItem.svelte';
7
7
  export { default as UndoRedo } from './button/UndoRedo.svelte';
8
+ export { default as ClearableInput } from './clearableInput/ClearableInput.svelte';
8
9
  export { default as Drawer } from './drawer/Drawer.svelte';
9
10
  export { default as DrawerContent } from './drawer/DrawerContent.svelte';
10
11
  export { default as Kbd } from './kbd/Kbd.svelte';
@@ -1,7 +1,10 @@
1
+ <script>export let kbdClass = '';
2
+ </script>
3
+
1
4
  <span
2
5
  class="{$$props.class} rounded border bg-white/70 px-1.5 !text-xs text-gray-600 shadow-sm font-light transition-all group-hover:border-primary-500 group-hover:text-primary-500"
3
6
  >
4
- <kbd>
7
+ <kbd class={kbdClass}>
5
8
  <slot />
6
9
  </kbd>
7
10
  </span>
@@ -1,21 +1,8 @@
1
- /** @typedef {typeof __propDef.props} KbdProps */
2
- /** @typedef {typeof __propDef.events} KbdEvents */
3
- /** @typedef {typeof __propDef.slots} KbdSlots */
4
- export default class Kbd extends SvelteComponentTyped<{
5
- [x: string]: any;
6
- }, {
7
- [evt: string]: CustomEvent<any>;
8
- }, {
9
- default: {};
10
- }> {
11
- }
12
- export type KbdProps = typeof __propDef.props;
13
- export type KbdEvents = typeof __propDef.events;
14
- export type KbdSlots = typeof __propDef.slots;
15
1
  import { SvelteComponentTyped } from "svelte";
16
2
  declare const __propDef: {
17
3
  props: {
18
4
  [x: string]: any;
5
+ kbdClass?: string | undefined;
19
6
  };
20
7
  events: {
21
8
  [evt: string]: CustomEvent<any>;
@@ -24,4 +11,9 @@ declare const __propDef: {
24
11
  default: {};
25
12
  };
26
13
  };
14
+ export type KbdProps = typeof __propDef.props;
15
+ export type KbdEvents = typeof __propDef.events;
16
+ export type KbdSlots = typeof __propDef.slots;
17
+ export default class Kbd extends SvelteComponentTyped<KbdProps, KbdEvents, KbdSlots> {
18
+ }
27
19
  export {};
@@ -4,8 +4,12 @@ let current = undefined;
4
4
 
5
5
  <script>import { classNames } from '../../../utils';
6
6
  import { onMount } from 'svelte';
7
+ import { fade } from 'svelte/transition';
7
8
  export let noMinW = false;
8
9
  export let show = false;
10
+ export let wrapperClasses = '';
11
+ export let popupClasses = '';
12
+ export let transitionDuration = 100;
9
13
  let menu;
10
14
  export let placement = 'bottom-start';
11
15
  function handleOutsideClick(event) {
@@ -40,7 +44,7 @@ const placementsClasses = {
40
44
  };
41
45
  </script>
42
46
 
43
- <div class="relative" bind:this={menu}>
47
+ <div class="relative {wrapperClasses}" bind:this={menu}>
44
48
  <!-- svelte-ignore a11y-click-events-have-key-events -->
45
49
  <div
46
50
  on:click|stopPropagation={() => {
@@ -56,10 +60,12 @@ const placementsClasses = {
56
60
  </div>
57
61
  {#if show}
58
62
  <div
63
+ transition:fade|local={{ duration: transitionDuration }}
59
64
  class={classNames(
60
65
  'z-50 absolute mt-2 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5 focus:outline-none',
61
66
  placementsClasses[placement],
62
- noMinW ? 'min-w-0' : 'w-60'
67
+ noMinW ? 'min-w-0' : 'w-60',
68
+ popupClasses
63
69
  )}
64
70
  role="menu"
65
71
  tabindex="-1"
@@ -3,7 +3,10 @@ declare const __propDef: {
3
3
  props: {
4
4
  noMinW?: boolean | undefined;
5
5
  show?: boolean | undefined;
6
- placement?: "top-start" | "top-end" | "top-center" | "bottom-start" | "bottom-end" | "bottom-center" | undefined;
6
+ wrapperClasses?: string | undefined;
7
+ popupClasses?: string | undefined;
8
+ transitionDuration?: number | undefined;
9
+ placement?: "top-start" | "top-end" | "bottom-start" | "bottom-end" | "top-center" | "bottom-center" | undefined;
7
10
  };
8
11
  events: {
9
12
  [evt: string]: CustomEvent<any>;
@@ -0,0 +1,109 @@
1
+ <script context="module">let onTop;
2
+ const modals = {};
3
+ export function getModal(id = '') {
4
+ return modals[id];
5
+ }
6
+ </script>
7
+
8
+ <script>import { onDestroy } from 'svelte';
9
+ import { twMerge } from 'tailwind-merge';
10
+ import { Badge } from '..';
11
+ import Button from '../button/Button.svelte';
12
+ let topDiv;
13
+ let visible = false;
14
+ let prevOnTop;
15
+ export let title;
16
+ export let style = '';
17
+ export let id = '';
18
+ function onKeyDown(event) {
19
+ if (onTop == topDiv) {
20
+ switch (event.key) {
21
+ case 'Enter':
22
+ event.stopPropagation();
23
+ event.preventDefault();
24
+ break;
25
+ case 'Escape':
26
+ event.stopPropagation();
27
+ event.preventDefault();
28
+ close();
29
+ break;
30
+ }
31
+ }
32
+ }
33
+ function open() {
34
+ if (visible) {
35
+ return;
36
+ }
37
+ prevOnTop = onTop;
38
+ onTop = topDiv;
39
+ window.addEventListener('keydown', onKeyDown);
40
+ document.body.style.overflow = 'hidden';
41
+ visible = true;
42
+ document.body.appendChild(topDiv);
43
+ }
44
+ function close() {
45
+ if (!visible) {
46
+ return;
47
+ }
48
+ window.removeEventListener('keydown', onKeyDown);
49
+ onTop = prevOnTop;
50
+ if (onTop == null) {
51
+ document.body.style.overflow = '';
52
+ }
53
+ visible = false;
54
+ }
55
+ modals[id] = { open, close };
56
+ onDestroy(() => {
57
+ delete modals[id];
58
+ window.removeEventListener('keydown', onKeyDown);
59
+ });
60
+ </script>
61
+
62
+ <!-- svelte-ignore a11y-click-events-have-key-events -->
63
+ <div id="topModal" class:visible bind:this={topDiv} on:click={() => close()}>
64
+ <!-- svelte-ignore a11y-click-events-have-key-events -->
65
+ <div class="relative bg-white p-4 rounded-md" on:click|stopPropagation={() => {}}>
66
+ <div class={twMerge('max-w-screen-lg max-h-screen-80 overflow-auto', $$props.class)} {style}>
67
+ <div class="flex">
68
+ <div class="ml-4 text-left flex-1">
69
+ <h3 class="text-lg font-medium text-gray-900">
70
+ {title}
71
+ </h3>
72
+ <div class="mt-2 text-sm text-gray-500">
73
+ <slot />
74
+ </div>
75
+ </div>
76
+ </div>
77
+ <div class="flex items-center space-x-2 flex-row-reverse space-x-reverse mt-4">
78
+ <Button
79
+ on:click={() => {
80
+ close()
81
+ }}
82
+ color="light"
83
+ size="sm"
84
+ >
85
+ <span class="gap-2">Cancel <Badge color="dark-gray">Escape</Badge></span>
86
+ </Button>
87
+ </div>
88
+ </div>
89
+ </div>
90
+ </div>
91
+
92
+ <style>
93
+ #topModal {
94
+ visibility: hidden;
95
+ z-index: 9999;
96
+ position: fixed;
97
+ top: 0;
98
+ left: 0;
99
+ right: 0;
100
+ bottom: 0;
101
+ background: #4448;
102
+ display: flex;
103
+ align-items: center;
104
+ justify-content: center;
105
+ }
106
+
107
+ .visible {
108
+ visibility: visible !important;
109
+ }</style>
@@ -0,0 +1,22 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ export declare function getModal(id?: string): any;
3
+ declare const __propDef: {
4
+ props: {
5
+ [x: string]: any;
6
+ title: string;
7
+ style?: string | undefined;
8
+ id?: string | undefined;
9
+ };
10
+ events: {
11
+ [evt: string]: CustomEvent<any>;
12
+ };
13
+ slots: {
14
+ default: {};
15
+ };
16
+ };
17
+ export type AlwaysMountedModalProps = typeof __propDef.props;
18
+ export type AlwaysMountedModalEvents = typeof __propDef.events;
19
+ export type AlwaysMountedModalSlots = typeof __propDef.slots;
20
+ export default class AlwaysMountedModal extends SvelteComponentTyped<AlwaysMountedModalProps, AlwaysMountedModalEvents, AlwaysMountedModalSlots> {
21
+ }
22
+ export {};