flowbite-svelte 0.29.9 → 0.29.11

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/CHANGELOG.md CHANGED
@@ -2,6 +2,35 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [0.29.11](https://github.com/themesberg/flowbite-svelte/compare/v0.29.10...v0.29.11) (2023-01-16)
6
+
7
+
8
+ ### Features
9
+
10
+ * indicator comp ([#532](https://github.com/themesberg/flowbite-svelte/issues/532)) ([57ce4fc](https://github.com/themesberg/flowbite-svelte/commit/57ce4fcdce3965921c0f6edf71f6ae42c2d42b40))
11
+ * make <TableHead> slot more flexible ([#527](https://github.com/themesberg/flowbite-svelte/issues/527)) ([33803f2](https://github.com/themesberg/flowbite-svelte/commit/33803f23ce90f9425417f6417c70bc6928337bbe))
12
+
13
+
14
+ ### Bug Fixes
15
+
16
+ * update badge component's style and doc ([#531](https://github.com/themesberg/flowbite-svelte/issues/531)) ([ce9af8c](https://github.com/themesberg/flowbite-svelte/commit/ce9af8cff8f6979f625b00fd165aa2ffadc41604))
17
+
18
+ ### [0.29.10](https://github.com/themesberg/flowbite-svelte/compare/v0.29.9...v0.29.10) (2023-01-13)
19
+
20
+
21
+ ### Features
22
+
23
+ * add on:input to textarea ([#518](https://github.com/themesberg/flowbite-svelte/issues/518)) ([318ffbf](https://github.com/themesberg/flowbite-svelte/commit/318ffbf676366fcc7bd08c538270800d90ce5189))
24
+ * make Select receive custom options ([#514](https://github.com/themesberg/flowbite-svelte/issues/514)) ([a58b410](https://github.com/themesberg/flowbite-svelte/commit/a58b410a3ffce29432907457baeae8c20977ef42))
25
+
26
+
27
+ ### Bug Fixes
28
+
29
+ * [#530](https://github.com/themesberg/flowbite-svelte/issues/530) ([16c6650](https://github.com/themesberg/flowbite-svelte/commit/16c66504d42a378705a120fae5a6ca147a776bd4))
30
+ * export slide params ([#516](https://github.com/themesberg/flowbite-svelte/issues/516)) ([c8dd81d](https://github.com/themesberg/flowbite-svelte/commit/c8dd81d5493b908a903648104f0371ac143c1167))
31
+ * modal layout ([#526](https://github.com/themesberg/flowbite-svelte/issues/526)) ([6b25019](https://github.com/themesberg/flowbite-svelte/commit/6b250190f25feefe21191b3d8cab709fe28c6908))
32
+ * npm run check corrections ([#517](https://github.com/themesberg/flowbite-svelte/issues/517)) ([f1f89e3](https://github.com/themesberg/flowbite-svelte/commit/f1f89e30221fd3bb63fed174fe825a46f780d1c7))
33
+
5
34
  ### [0.29.9](https://github.com/themesberg/flowbite-svelte/compare/v0.29.8...v0.29.9) (2023-01-01)
6
35
 
7
36
 
@@ -35,7 +35,7 @@ onMount(() => {
35
35
  // this will trigger unsubscribe on destroy
36
36
  return selected.subscribe((x) => (open = x === self));
37
37
  });
38
- const handleToggle = (e) => selected.set(open ? {} : self);
38
+ const handleToggle = (_) => selected.set(open ? {} : self);
39
39
  let buttonClass;
40
40
  $: buttonClass = classNames(defaultClass, ctx.flush ? 'py-5' : 'p-5', open && (ctx.flush ? 'text-gray-900 dark:text-white' : activeClasses || ctx.activeClasses), !open && (ctx.flush ? 'text-gray-500 dark:text-gray-400' : inactiveClasses || ctx.inactiveClasses), $$props.class);
41
41
  </script>
@@ -1,14 +1,16 @@
1
1
  <script>import classNames from 'classnames';
2
2
  import AvatarPlaceholder from './Placeholder.svelte';
3
- import Dot from './Dot.svelte';
3
+ import Indicator from '../indicators/Indicator.svelte';
4
4
  export let src = '';
5
5
  export let href = undefined;
6
6
  export let rounded = false;
7
7
  export let border = false;
8
8
  export let stacked = false;
9
- export let dot = { top: false, color: 'bg-gray-300 dark:bg-gray-500' };
9
+ export let dot = undefined;
10
10
  export let alt = '';
11
11
  export let size = 'md';
12
+ $: dot = dot && { placement: 'top-right', color: 'gray', size: 'lg', ...dot };
13
+ $: dot && console.log(dot);
12
14
  const sizes = {
13
15
  xs: 'w-6 h-6',
14
16
  sm: 'w-8 h-8',
@@ -20,20 +22,21 @@ let avatarClass;
20
22
  $: avatarClass = classNames(rounded ? 'rounded' : 'rounded-full', border && 'p-1 ring-2 ring-gray-300 dark:ring-gray-500', sizes[size], stacked && 'border-2 -ml-4 border-white dark:border-gray-800', 'bg-gray-100 dark:bg-gray-600 text-gray-600 dark:text-gray-300', $$props.class);
21
23
  </script>
22
24
 
23
- <Dot show={$$props.dot} {rounded} {...dot} {size} class={sizes[size]}>
24
- {#if src}
25
- <img {alt} {src} {...$$restProps} class={avatarClass} />
26
- {:else if $$slots.default}
27
- <svelte:element
28
- this={href ? 'a' : 'div'}
29
- {href}
30
- {...$$restProps}
31
- class="flex justify-center items-center text-xs font-medium {avatarClass}">
32
- <slot />
33
- </svelte:element>
34
- {:else}
35
- <svelte:element this={href ? 'a' : 'div'} {href} {...$$restProps} class={avatarClass}>
36
- <AvatarPlaceholder {rounded} />
37
- </svelte:element>
38
- {/if}
39
- </Dot>
25
+ {#if !src || !!href || $$slots.default || dot}
26
+ <svelte:element
27
+ this={href ? 'a' : 'div'}
28
+ {href}
29
+ {...$$restProps}
30
+ class="relative flex justify-center items-center {avatarClass}">
31
+ {#if src}
32
+ <img {alt} {src} class={rounded ? 'rounded' : 'rounded-full'} />
33
+ {:else}
34
+ <slot><AvatarPlaceholder {rounded} /></slot>
35
+ {/if}
36
+ {#if dot}
37
+ <Indicator border offset={rounded} {...dot} />
38
+ {/if}
39
+ </svelte:element>
40
+ {:else}
41
+ <img {alt} {src} {...$$restProps} class={avatarClass} />
42
+ {/if}
@@ -1,5 +1,4 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
- import type { DotType } from '../types';
3
2
  declare const __propDef: {
4
3
  props: {
5
4
  [x: string]: any;
@@ -8,7 +7,7 @@ declare const __propDef: {
8
7
  rounded?: boolean | undefined;
9
8
  border?: boolean | undefined;
10
9
  stacked?: boolean | undefined;
11
- dot?: DotType | undefined;
10
+ dot?: object | undefined;
12
11
  alt?: string | undefined;
13
12
  size?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
14
13
  };
@@ -1,22 +1,22 @@
1
- <script>import classNames from 'classnames';
1
+ <script>import { createEventDispatcher } from 'svelte';
2
+ import classNames from 'classnames';
2
3
  import CloseButton from '../utils/CloseButton.svelte';
3
4
  export let color = 'blue';
4
5
  export let large = false;
6
+ export let border = false;
5
7
  export let href = undefined;
6
8
  export let rounded = false;
7
9
  export let index = false;
8
10
  export let dismissable = false;
9
- export let baseClass = 'inline-flex items-center justify-center -mb-0.5';
10
- let hidden = false;
11
11
  const colors = {
12
- blue: 'bg-blue-100 text-blue-800 dark:bg-blue-200 dark:text-blue-800',
12
+ blue: 'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-300',
13
13
  dark: 'bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-300',
14
- red: 'bg-red-100 text-red-800 dark:bg-red-200 dark:text-red-900',
15
- green: 'bg-green-100 text-green-800 dark:bg-green-200 dark:text-green-900',
16
- yellow: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-200 dark:text-yellow-900',
17
- indigo: 'bg-indigo-100 text-indigo-800 dark:bg-indigo-200 dark:text-indigo-900',
18
- purple: 'bg-purple-100 text-purple-800 dark:bg-purple-200 dark:text-purple-900',
19
- pink: 'bg-pink-100 text-pink-800 dark:bg-pink-200 dark:text-pink-900',
14
+ red: 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-300',
15
+ green: 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-300',
16
+ yellow: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300',
17
+ indigo: 'bg-indigo-100 text-indigo-800 dark:bg-indigo-900 dark:text-indigo-300',
18
+ purple: 'bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-300',
19
+ pink: 'bg-pink-100 text-pink-800 dark:bg-pink-900 dark:text-pink-300',
20
20
  ['!blue']: 'bg-blue-500 text-blue-100',
21
21
  ['!dark']: 'bg-gray-500 text-gray-100',
22
22
  ['!red']: 'bg-red-500 text-white',
@@ -26,26 +26,74 @@ const colors = {
26
26
  ['!purple']: 'bg-purple-500 text-purple-100',
27
27
  ['!pink']: 'bg-pink-500 text-pink-100'
28
28
  };
29
- const hovers = {
30
- blue: 'hover:bg-blue-200 dark:hover:bg-blue-300',
31
- dark: 'hover:bg-gray-200 dark:hover:bg-gray-300',
32
- red: 'hover:bg-red-200 dark:hover:bg-red-300',
33
- green: 'hover:bg-green-200 dark:hover:bg-green-300',
34
- yellow: 'hover:bg-yellow-200 dark:hover:bg-yellow-300',
35
- indigo: 'hover:bg-indigo-200 dark:hover:bg-indigo-300',
36
- purple: 'hover:bg-purple-200 dark:hover:bg-purple-300',
37
- pink: 'hover:bg-pink-200 dark:hover:bg-pink-300'
29
+ const borderedColors = {
30
+ blue: 'bg-blue-100 text-blue-800 dark:bg-gray-700 dark:text-blue-400 border-blue-400',
31
+ dark: 'bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-400 border-gray-500',
32
+ red: 'bg-red-100 text-red-800 dark:bg-gray-700 dark:text-red-400 border-red-400',
33
+ green: 'bg-green-100 text-green-800 dark:bg-gray-700 dark:text-green-400 border-green-400',
34
+ yellow: 'bg-yellow-100 text-yellow-800 dark:bg-gray-700 dark:text-yellow-300 border-yellow-300',
35
+ indigo: 'bg-indigo-100 text-indigo-800 dark:bg-gray-700 dark:text-indigo-400 border-indigo-400',
36
+ purple: 'bg-purple-100 text-purple-800 dark:bg-gray-700 dark:text-purple-400 border-purple-400',
37
+ pink: 'bg-pink-100 text-pink-800 dark:bg-gray-700 dark:text-pink-400 border-pink-400'
38
+ };
39
+ const hoverColors = {
40
+ blue: 'hover:bg-blue-200',
41
+ dark: 'hover:bg-gray-200',
42
+ red: 'hover:bg-red-200',
43
+ green: 'hover:bg-green-200',
44
+ yellow: 'hover:bg-yellow-200',
45
+ indigo: 'hover:bg-indigo-200',
46
+ purple: 'hover:bg-purple-200',
47
+ pink: 'hover:bg-pink-200'
38
48
  };
49
+ const baseClass = 'font-medium inline-flex items-center justify-center px-2.5 py-0.5';
50
+ let transition = false;
39
51
  let badgeClass;
40
- $: badgeClass = classNames(baseClass, large ? 'text-sm font-medium' : 'text-xs font-semibold', colors[color], href && (hovers[color] ?? hovers.blue), rounded ? 'rounded-full p-1' : 'rounded px-2.5 py-0.5', index && 'absolute font-bold border-2 border-white dark:border-gray-900', index && (large ? 'w-7 h-7 -top-3 -right-3' : 'w-6 h-6 -top-2 -right-2'), $$props.class);
52
+ $: badgeClass = classNames(baseClass, large ? 'text-sm' : 'text-xs', border ? `border ${borderedColors[color]}` : colors[color], href && hoverColors[color], rounded ? 'rounded-full' : 'rounded', index && 'absolute font-bold border-2 border-white dark:border-gray-900', index && (large ? 'w-7 h-7 -top-3 -right-3' : 'w-6 h-6 -top-2 -right-2'), transition && 'transition-opacity duration-300 ease-out opacity-0', $$props.class);
53
+ const closeBtnBaseClass = 'inline-flex items-center !p-0.5 !m-0 !ml-2 text-sm bg-transparent rounded-sm focus:!ring-0';
54
+ // uncomment the following lines to completely overwrite <CloseButton>'s color palette
55
+ // in case <CloseButton>'s color palette is changed in the future
56
+ // const closeBtnColors = {
57
+ // blue: '!text-blue-400 hover:!bg-blue-200 hover:!text-blue-900 dark:hover:!bg-blue-800 dark:hover:!text-blue-300',
58
+ // dark: '!text-gray-400 hover:!bg-gray-200 hover:!text-gray-900 dark:hover:!bg-gray-600 dark:hover:!text-gray-300',
59
+ // red: '!text-red-400 hover:!bg-red-200 hover:!text-red-900 dark:hover:!bg-red-800 dark:hover:!text-red-300',
60
+ // green: '!text-green-400 hover:!bg-green-200 hover:!text-green-900 dark:hover:!bg-green-800 dark:hover:!text-green-300',
61
+ // yellow: '!text-yellow-400 hover:!bg-yellow-200 hover:!text-yellow-900 dark:hover:!bg-yellow-800 dark:hover:!text-yellow-300',
62
+ // indigo: '!text-indigo-400 hover:!bg-indigo-200 hover:!text-indigo-900 dark:hover:!bg-indigo-800 dark:hover:!text-indigo-300',
63
+ // purple: '!text-purple-400 hover:!bg-purple-200 hover:!text-purple-900 dark:hover:!bg-purple-800 dark:hover:!text-purple-300',
64
+ // pink: '!text-pink-400 hover:!bg-pink-200 hover:!text-pink-900 dark:hover:!bg-pink-800 dark:hover:!text-pink-300'
65
+ // };
66
+ // only overwrite necessary colors (<CloseButton> v0.29.10)
67
+ const closeBtnColors = {
68
+ blue: 'text-blue-400 hover:text-blue-900 dark:hover:!bg-blue-800 dark:hover:text-blue-300',
69
+ dark: 'text-gray-400 hover:!text-gray-400 hover:!bg-gray-200 dark:hover:!text-gray-300',
70
+ red: 'text-red-400 hover:text-red-900 dark:hover:!bg-red-800 dark:hover:text-red-300',
71
+ green: 'text-green-400 hover:text-green-900 dark:hover:!bg-green-800 dark:hover:text-green-300',
72
+ yellow: 'text-yellow-400 hover:text-yellow-900 dark:hover:!bg-yellow-800 dark:hover:text-yellow-300',
73
+ indigo: 'text-indigo-400 hover:text-indigo-900 dark:hover:!bg-indigo-800 dark:hover:text-indigo-300',
74
+ purple: 'text-purple-400 hover:text-purple-900 dark:hover:!bg-purple-800 dark:hover:text-purple-300',
75
+ pink: 'text-pink-400 hover:text-pink-900 dark:hover:!bg-pink-800 dark:hover:text-pink-300'
76
+ };
77
+ let closeBtnClass;
78
+ $: closeBtnClass = classNames(closeBtnBaseClass, closeBtnColors[color]);
79
+ let hidden = false;
80
+ const dispatch = createEventDispatcher();
41
81
  const handleHide = () => {
42
- hidden = !hidden;
82
+ transition = true;
83
+ setTimeout(() => {
84
+ hidden = true;
85
+ }, 300);
86
+ dispatch('dismiss', {
87
+ message: 'The badge will be dismissed.'
88
+ });
43
89
  };
44
90
  </script>
45
91
 
46
92
  <svelte:element this={href ? 'a' : 'span'} {href} {...$$restProps} class={badgeClass} class:hidden>
47
93
  <slot />
48
94
  {#if dismissable}
49
- <CloseButton {color} on:click={handleHide} size={large ? 'sm' : 'xs'} class="ml-1.5 -mr-1.5" />
95
+ <slot name="closeBtn" {handleHide}>
96
+ <CloseButton {color} on:click={handleHide} size={large ? 'sm' : 'xs'} name="Remove badge" class={closeBtnClass} />
97
+ </slot>
50
98
  {/if}
51
99
  </svelte:element>
@@ -4,17 +4,22 @@ declare const __propDef: {
4
4
  [x: string]: any;
5
5
  color?: "red" | "yellow" | "green" | "indigo" | "purple" | "pink" | "blue" | "dark" | undefined;
6
6
  large?: boolean | undefined;
7
+ border?: boolean | undefined;
7
8
  href?: string | undefined;
8
9
  rounded?: boolean | undefined;
9
10
  index?: boolean | undefined;
10
11
  dismissable?: boolean | undefined;
11
- baseClass?: string | undefined;
12
12
  };
13
13
  events: {
14
+ dismiss: CustomEvent<any>;
15
+ } & {
14
16
  [evt: string]: CustomEvent<any>;
15
17
  };
16
18
  slots: {
17
19
  default: {};
20
+ closeBtn: {
21
+ handleHide: () => void;
22
+ };
18
23
  };
19
24
  };
20
25
  export type BadgeProps = typeof __propDef.props;
@@ -14,7 +14,7 @@ declare const __propDef: {
14
14
  backdrop?: boolean | undefined;
15
15
  bgColor?: string | undefined;
16
16
  bgOpacity?: string | undefined;
17
- placement?: "top" | "bottom" | "left" | "right" | undefined;
17
+ placement?: "bottom" | "left" | "right" | "top" | undefined;
18
18
  id?: string | undefined;
19
19
  divClass?: string | undefined;
20
20
  transitionParams?: drawerTransitionParamTypes | undefined;
@@ -5,6 +5,7 @@ export let year = new Date().getFullYear();
5
5
  export let href = '';
6
6
  export let by = '';
7
7
  export let target = undefined;
8
+ export let copyrightMessage = 'All Rights Reserved.';
8
9
  </script>
9
10
 
10
11
  <span class={classNames(spanClass, $$props.class)}>
@@ -16,5 +17,5 @@ export let target = undefined;
16
17
  {:else}
17
18
  <span class="ml-1">{by}</span>
18
19
  {/if}
19
- . All Rights Reserved.
20
+ . {copyrightMessage}
20
21
  </span>
@@ -8,6 +8,7 @@ declare const __propDef: {
8
8
  href?: string | undefined;
9
9
  by?: string | undefined;
10
10
  target?: string | undefined;
11
+ copyrightMessage?: string | undefined;
11
12
  };
12
13
  events: {
13
14
  [evt: string]: CustomEvent<any>;
@@ -1,5 +1,4 @@
1
- <script>import A from '../typography/A.svelte';
2
- import classNames from 'classnames';
1
+ <script>import classNames from 'classnames';
3
2
  export let liClass = 'mr-4 last:mr-0 md:mr-6';
4
3
  export let aClass = 'hover:underline';
5
4
  export let href = '';
@@ -17,9 +17,13 @@ $: selectClass = classNames(common, underline ? underlineClass : defaultClass, s
17
17
  </script>
18
18
 
19
19
  <select {...$$restProps} bind:value class={selectClass} on:change on:contextmenu on:input>
20
- <option disabled selected value="">{placeholder}</option>
20
+ {#if placeholder}
21
+ <option disabled selected value="">{placeholder}</option>
22
+ {/if}
21
23
 
22
24
  {#each items as { value, name }}
23
25
  <option {value}>{name}</option>
26
+ {:else}
27
+ <slot />
24
28
  {/each}
25
29
  </select>
@@ -18,7 +18,9 @@ declare const __propDef: {
18
18
  } & {
19
19
  [evt: string]: CustomEvent<any>;
20
20
  };
21
- slots: {};
21
+ slots: {
22
+ default: {};
23
+ };
22
24
  };
23
25
  export type SelectProps = typeof __propDef.props;
24
26
  export type SelectEvents = typeof __propDef.events;
@@ -30,6 +30,7 @@ $: innerWrapperClass = classNames('py-2 px-4 bg-white dark:bg-gray-800', $$slots
30
30
  on:click
31
31
  on:contextmenu
32
32
  on:focus
33
+ on:input
33
34
  on:keydown
34
35
  on:keypress
35
36
  on:keyup
@@ -10,6 +10,7 @@ declare const __propDef: {
10
10
  click: MouseEvent;
11
11
  contextmenu: MouseEvent;
12
12
  focus: FocusEvent;
13
+ input: Event;
13
14
  keydown: KeyboardEvent;
14
15
  keypress: KeyboardEvent;
15
16
  keyup: KeyboardEvent;
package/index.d.ts CHANGED
@@ -41,6 +41,7 @@ export { default as SimpleSearch } from './forms/SimpleSearch.svelte';
41
41
  export { default as Textarea } from './forms/Textarea.svelte';
42
42
  export { default as Toggle } from './forms/Toggle.svelte';
43
43
  export { default as VoiceSearch } from './forms/VoiceSearch.svelte';
44
+ export { default as Indicator } from './indicators/Indicator.svelte';
44
45
  export { default as Kbd } from './kbd/Kbd.svelte';
45
46
  export { default as ArrowKeyDown } from './kbd/ArrowKeyDown.svelte';
46
47
  export { default as ArrowKeyLeft } from './kbd/ArrowKeyLeft.svelte';
package/index.js CHANGED
@@ -56,6 +56,8 @@ export { default as SimpleSearch } from './forms/SimpleSearch.svelte';
56
56
  export { default as Textarea } from './forms/Textarea.svelte';
57
57
  export { default as Toggle } from './forms/Toggle.svelte';
58
58
  export { default as VoiceSearch } from './forms/VoiceSearch.svelte';
59
+ // Indicator
60
+ export { default as Indicator } from './indicators/Indicator.svelte';
59
61
  // Kbd
60
62
  export { default as Kbd } from './kbd/Kbd.svelte';
61
63
  export { default as ArrowKeyDown } from './kbd/ArrowKeyDown.svelte';
@@ -0,0 +1,61 @@
1
+ <script>import classNames from 'classnames';
2
+ export let color = 'gray';
3
+ export let rounded = false;
4
+ export let size = 'md';
5
+ export let border = false;
6
+ export let placement = undefined;
7
+ export let offset = true;
8
+ const colors = {
9
+ gray: 'bg-gray-200',
10
+ dark: 'bg-gray-900 dark:bg-gray-700',
11
+ blue: 'bg-blue-600',
12
+ green: 'bg-green-500',
13
+ red: 'bg-red-500',
14
+ purple: 'bg-purple-500',
15
+ indigo: 'bg-indigo-500',
16
+ yellow: 'bg-yellow-300',
17
+ teal: 'bg-teal-500',
18
+ none: ''
19
+ };
20
+ const sizes = {
21
+ xs: 'w-2 h-2',
22
+ sm: 'w-2.5 h-2.5',
23
+ md: 'w-3 h-3',
24
+ lg: 'w-3.5 h-3.5',
25
+ xl: 'w-6 h-6'
26
+ };
27
+ const placements = {
28
+ // top
29
+ 'top-left': 'top-0 left-0',
30
+ 'top-center': 'top-0 left-1/2 -translate-x-1/2',
31
+ 'top-right': 'top-0 right-0',
32
+ // center
33
+ 'center-left': 'top-1/2 -translate-y-1/2 left-0',
34
+ center: 'top-1/2 -translate-y-1/2 left-1/2 -translate-x-1/2',
35
+ 'center-right': 'top-1/2 -translate-y-1/2 right-0',
36
+ // bottom
37
+ 'bottom-left': 'bottom-0 left-0',
38
+ 'bottom-center': 'bottom-0 left-1/2 -translate-x-1/2',
39
+ 'bottom-right': 'bottom-0 right-0'
40
+ };
41
+ const offsets = {
42
+ // top
43
+ 'top-left': '-translate-x-1/3 -translate-y-1/3',
44
+ 'top-center': '-translate-y-1/3',
45
+ 'top-right': 'translate-x-1/3 -translate-y-1/3',
46
+ // center
47
+ 'center-left': '-translate-x-1/3',
48
+ center: '',
49
+ 'center-right': 'translate-x-1/3',
50
+ // bottom
51
+ 'bottom-left': '-translate-x-1/3 translate-y-1/3',
52
+ 'bottom-center': 'translate-y-1/3',
53
+ 'bottom-right': 'translate-x-1/3 translate-y-1/3'
54
+ };
55
+ let dotClass;
56
+ $: dotClass = classNames('flex-shrink-0', rounded ? 'rounded' : 'rounded-full', border && 'border-2 border-white dark:border-gray-800', sizes[size], colors[color], $$slots.default && 'inline-flex items-center justify-center', placement && 'absolute ' + placements[placement], placement && offset && offsets[placement], $$props.class);
57
+ let divClass;
58
+ $: divClass = classNames('relative flex-shrink-0');
59
+ </script>
60
+
61
+ <div class={dotClass}><slot /></div>
@@ -0,0 +1,24 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ [x: string]: any;
5
+ color?: "gray" | "red" | "yellow" | "green" | "indigo" | "purple" | "blue" | "dark" | "none" | "teal" | undefined;
6
+ rounded?: boolean | undefined;
7
+ size?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
8
+ border?: boolean | undefined;
9
+ placement?: 'top-left' | 'top-center' | 'top-right' | 'center-left' | 'center' | 'center-right' | 'bottom-left' | 'bottom-center' | 'bottom-right' | undefined;
10
+ offset?: boolean | undefined;
11
+ };
12
+ events: {
13
+ [evt: string]: CustomEvent<any>;
14
+ };
15
+ slots: {
16
+ default: {};
17
+ };
18
+ };
19
+ export type IndicatorProps = typeof __propDef.props;
20
+ export type IndicatorEvents = typeof __propDef.events;
21
+ export type IndicatorSlots = typeof __propDef.slots;
22
+ export default class Indicator extends SvelteComponentTyped<IndicatorProps, IndicatorEvents, IndicatorSlots> {
23
+ }
24
+ export {};
@@ -62,15 +62,14 @@ const sizes = {
62
62
  const onAutoClose = (e) => {
63
63
  const target = e.target;
64
64
  if (autoclose && target?.tagName === 'BUTTON')
65
- open = false;
65
+ hide(e);
66
66
  };
67
- const hide = () => {
67
+ const hide = (e) => {
68
+ e.preventDefault();
68
69
  open = false;
69
70
  };
70
- let mainClass;
71
- $: mainClass = classNames('flex overflow-hidden fixed top-0 right-0 left-0 z-50 w-full md:inset-0 h-modal md:h-full', backdropClasses, ...getPlacementClasses());
72
71
  let frameClass;
73
- $: frameClass = classNames('relative flex flex-col w-full h-full md:h-auto', $$props.class);
72
+ $: frameClass = classNames('relative flex flex-col mx-auto', $$props.class);
74
73
  const isScrollable = (e) => [
75
74
  e.scrollWidth > e.clientWidth && ['scroll', 'auto'].indexOf(getComputedStyle(e).overflowX) >= 0,
76
75
  e.scrollHeight > e.clientHeight && ['scroll', 'auto'].indexOf(getComputedStyle(e).overflowY) >= 0
@@ -82,22 +81,28 @@ function preventWheelDefault(e) {
82
81
  }
83
82
  function handleKeys(e) {
84
83
  if (e.key === 'Escape' && !permanent)
85
- return hide();
84
+ return hide(e);
86
85
  }
87
86
  </script>
88
87
 
89
88
  {#if open}
89
+ <!-- backdrop -->
90
+ <div class={classNames('fixed inset-0 z-40', backdropClasses)} />
91
+ <!-- dialog -->
90
92
  <div
91
- tabindex="-1"
92
- class={mainClass}
93
- aria-modal="true"
94
- role="dialog"
95
- on:keydown|preventDefault={handleKeys}
93
+ on:keydown={handleKeys}
96
94
  on:wheel|preventDefault
97
95
  use:prepareFocus
98
96
  use:focusTrap
99
- on:click={autoclose ? onAutoClose : null}>
100
- <div class="flex p-4 w-full {sizes[size]} h-full md:h-auto max-h-screen">
97
+ on:click={autoclose ? onAutoClose : null}
98
+ class={classNames(
99
+ 'fixed top-0 left-0 right-0 h-modal md:inset-0 md:h-full z-50 w-full p-4 flex',
100
+ ...getPlacementClasses()
101
+ )}
102
+ tabindex="-1"
103
+ aria-modal="true"
104
+ role="dialog">
105
+ <div class="flex relative {sizes[size]} w-full max-h-full">
101
106
  <!-- Modal content -->
102
107
  <Frame rounded shadow {...$$restProps} class={frameClass}>
103
108
  <!-- Modal header -->
@@ -5,6 +5,7 @@ import Frame from '../utils/Frame.svelte';
5
5
  export let divClass = 'w-full md:block md:w-auto';
6
6
  export let ulClass = 'flex flex-col p-4 mt-4 md:flex-row md:space-x-8 md:mt-0 md:text-sm md:font-medium';
7
7
  export let hidden = true;
8
+ export let slideParams = { delay: 250, duration: 500, easing: quintOut };
8
9
  let _divClass;
9
10
  $: _divClass = classNames(divClass, $$props.class);
10
11
  let _ulClass;
@@ -14,7 +15,7 @@ $$props.class);
14
15
  </script>
15
16
 
16
17
  {#if !hidden}
17
- <div {...$$restProps} class={_divClass} transition:slide={{ delay: 250, duration: 500, easing: quintOut }}>
18
+ <div {...$$restProps} class={_divClass} transition:slide={slideParams}>
18
19
  <Frame tag="ul" border rounded color="navbarUl" class={_ulClass}>
19
20
  <slot />
20
21
  </Frame>
@@ -1,10 +1,12 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
+ import { type SlideParams } from 'svelte/transition';
2
3
  declare const __propDef: {
3
4
  props: {
4
5
  [x: string]: any;
5
6
  divClass?: string | undefined;
6
7
  ulClass?: string | undefined;
7
8
  hidden?: boolean | undefined;
9
+ slideParams?: SlideParams | undefined;
8
10
  };
9
11
  events: {
10
12
  [evt: string]: CustomEvent<any>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flowbite-svelte",
3
- "version": "0.29.9",
3
+ "version": "0.29.11",
4
4
  "description": "Flowbite components for Svelte",
5
5
  "main": "index.js",
6
6
  "author": {
@@ -108,7 +108,6 @@
108
108
  "./accordions/AccordionItem.svelte": "./accordions/AccordionItem.svelte",
109
109
  "./alerts/Alert.svelte": "./alerts/Alert.svelte",
110
110
  "./avatar/Avatar.svelte": "./avatar/Avatar.svelte",
111
- "./avatar/Dot.svelte": "./avatar/Dot.svelte",
112
111
  "./avatar/Placeholder.svelte": "./avatar/Placeholder.svelte",
113
112
  "./badges/Badge.svelte": "./badges/Badge.svelte",
114
113
  "./breadcrumbs/Breadcrumb.svelte": "./breadcrumbs/Breadcrumb.svelte",
@@ -155,6 +154,7 @@
155
154
  "./forms/Toggle.svelte": "./forms/Toggle.svelte",
156
155
  "./forms/VoiceSearch.svelte": "./forms/VoiceSearch.svelte",
157
156
  ".": "./index.js",
157
+ "./indicators/Indicator.svelte": "./indicators/Indicator.svelte",
158
158
  "./kbd/ArrowKeyDown.svelte": "./kbd/ArrowKeyDown.svelte",
159
159
  "./kbd/ArrowKeyLeft.svelte": "./kbd/ArrowKeyLeft.svelte",
160
160
  "./kbd/ArrowKeyRight.svelte": "./kbd/ArrowKeyRight.svelte",
@@ -1,5 +1,5 @@
1
1
  <script>import classNames from 'classnames';
2
- import { getContext, onMount } from 'svelte';
2
+ import { getContext } from 'svelte';
3
3
  export let href = undefined;
4
4
  export let active = false;
5
5
  export let activeClass = '';
@@ -17,12 +17,12 @@ let grayStars = total - roundedRating;
17
17
  <p class="ml-2 text-sm font-bold text-gray-900 dark:text-white">{rating}</p>
18
18
  <slot />
19
19
  {:else}
20
- {#each Array(roundedRating) as _, star}
20
+ {#each Array(roundedRating) as _}
21
21
  <slot name="ratingUp">
22
22
  <Star variation="solid" {size} class="text-yellow-300 dark:text-yellow-200" />
23
23
  </slot>
24
24
  {/each}
25
- {#each Array(grayStars) as _, star}
25
+ {#each Array(grayStars) as _}
26
26
  <slot name="ratingDown">
27
27
  <Star {size} class="text-gray-300 dark:text-gray-500" />
28
28
  </slot>
@@ -10,55 +10,55 @@ let grayStars = comment.total - roundedRating;
10
10
  </script>
11
11
 
12
12
  <article>
13
- <div class="flex items-center mb-4 space-x-4">
14
- <img class="w-10 h-10 rounded-full" src={comment.user.img.src} alt={comment.user.img.alt} />
15
- <div class="space-y-1 font-medium dark:text-white">
16
- <p>
17
- {comment.user.name}
18
- <time datetime="2014-08-16 19:00" class="block text-sm text-gray-500 dark:text-gray-400"
19
- >{comment.user.joined}</time>
20
- </p>
21
- </div>
22
- </div>
23
- <div class="flex items-center mb-1">
24
- {#each Array(roundedRating) as _, star}
25
- <slot name="ratingUp">
26
- <Star variation="solid" size="24" class="text-yellow-300 dark:text-yellow-200" />
27
- </slot>
28
- {/each}
29
- {#each Array(grayStars) as _, star}
30
- <slot name="ratingDown">
31
- <Star size="24" class="px-0.5 text-gray-300 dark:text-gray-500" />
32
- </slot>
33
- {/each}
34
- {#if comment.heading}
35
- <h3 class="ml-2 text-sm font-semibold text-gray-900 dark:text-white">
36
- {comment.heading}
37
- </h3>
38
- {/if}
39
- </div>
40
- {#if comment.address || comment.datetime}
41
- <footer class="mb-5 text-sm text-gray-500 dark:text-gray-400">
42
- <p>Reviewed in {comment.address} on {comment.datetime}</p>
43
- </footer>
44
- {/if}
45
- <slot />
46
- <aside>
47
- <p class="mt-1 text-xs text-gray-500 dark:text-gray-400">
48
- <slot name="evaluation" />
49
- </p>
50
- {#if helpfullink || abuselink}
51
- <div class="flex items-center mt-3 space-x-3 divide-x divide-gray-200 dark:divide-gray-600">
52
- {#if helpfullink}
53
- <Button size="xs" href="/" color="dark">Helpful</Button>
54
- {/if}
55
- {#if abuselink}
56
- <a
57
- href={abuselink}
58
- class="pl-4 text-sm font-medium text-blue-600 hover:underline dark:text-blue-500"
59
- >Report abuse</a>
60
- {/if}
61
- </div>
62
- {/if}
63
- </aside>
13
+ <div class="flex items-center mb-4 space-x-4">
14
+ <img class="w-10 h-10 rounded-full" src={comment.user.img.src} alt={comment.user.img.alt} />
15
+ <div class="space-y-1 font-medium dark:text-white">
16
+ <p>
17
+ {comment.user.name}
18
+ <time datetime="2014-08-16 19:00" class="block text-sm text-gray-500 dark:text-gray-400"
19
+ >{comment.user.joined}</time>
20
+ </p>
21
+ </div>
22
+ </div>
23
+ <div class="flex items-center mb-1">
24
+ {#each Array(roundedRating) as _}
25
+ <slot name="ratingUp">
26
+ <Star variation="solid" size="24" class="text-yellow-300 dark:text-yellow-200" />
27
+ </slot>
28
+ {/each}
29
+ {#each Array(grayStars) as _}
30
+ <slot name="ratingDown">
31
+ <Star size="24" class="px-0.5 text-gray-300 dark:text-gray-500" />
32
+ </slot>
33
+ {/each}
34
+ {#if comment.heading}
35
+ <h3 class="ml-2 text-sm font-semibold text-gray-900 dark:text-white">
36
+ {comment.heading}
37
+ </h3>
38
+ {/if}
39
+ </div>
40
+ {#if comment.address || comment.datetime}
41
+ <footer class="mb-5 text-sm text-gray-500 dark:text-gray-400">
42
+ <p>Reviewed in {comment.address} on {comment.datetime}</p>
43
+ </footer>
44
+ {/if}
45
+ <slot />
46
+ <aside>
47
+ <p class="mt-1 text-xs text-gray-500 dark:text-gray-400">
48
+ <slot name="evaluation" />
49
+ </p>
50
+ {#if helpfullink || abuselink}
51
+ <div class="flex items-center mt-3 space-x-3 divide-x divide-gray-200 dark:divide-gray-600">
52
+ {#if helpfullink}
53
+ <Button size="xs" href="/" color="dark">Helpful</Button>
54
+ {/if}
55
+ {#if abuselink}
56
+ <a
57
+ href={abuselink}
58
+ class="pl-4 text-sm font-medium text-blue-600 hover:underline dark:text-blue-500"
59
+ >Report abuse</a>
60
+ {/if}
61
+ </div>
62
+ {/if}
63
+ </aside>
64
64
  </article>
@@ -1,6 +1,7 @@
1
1
  <script>import classNames from 'classnames';
2
2
  import { getContext } from 'svelte';
3
3
  export let theadClass = 'text-xs uppercase';
4
+ export let defaultRow = true;
4
5
  let color;
5
6
  color = getContext('color');
6
7
  let noborder = getContext('noborder');
@@ -31,7 +32,11 @@ $: theadClassfinal = classNames(theadClass, textColor, striped && borderColors,
31
32
  </script>
32
33
 
33
34
  <thead {...$$restProps} class={theadClassfinal}>
34
- <tr>
35
+ {#if defaultRow}
36
+ <tr>
37
+ <slot />
38
+ </tr>
39
+ {:else}
35
40
  <slot />
36
- </tr>
41
+ {/if}
37
42
  </thead>
@@ -3,6 +3,7 @@ declare const __propDef: {
3
3
  props: {
4
4
  [x: string]: any;
5
5
  theadClass?: string | undefined;
6
+ defaultRow?: boolean | undefined;
6
7
  };
7
8
  events: {
8
9
  [evt: string]: CustomEvent<any>;
package/types.d.ts CHANGED
@@ -93,7 +93,7 @@ export interface ListGroupItemType {
93
93
  [propName: string]: any;
94
94
  }
95
95
  export interface LinkType {
96
- name: number;
96
+ name: string;
97
97
  href?: string;
98
98
  rel?: string;
99
99
  active?: boolean;
@@ -8,7 +8,7 @@ declare const __propDef: {
8
8
  bgClass?: string | undefined;
9
9
  bg?: boolean | undefined;
10
10
  baseClass?: string | undefined;
11
- alignment?: "left" | "right" | "center" | undefined;
11
+ alignment?: "center" | "left" | "right" | undefined;
12
12
  size?: "xs" | "sm" | "lg" | "xl" | "base" | "2xl" | "3xl" | "4xl" | "5xl" | "6xl" | "7xl" | "8xl" | "9xl" | undefined;
13
13
  };
14
14
  events: {
@@ -4,7 +4,7 @@ declare const __propDef: {
4
4
  [x: string]: any;
5
5
  color?: string | undefined;
6
6
  height?: "normal" | "relaxed" | "loose" | undefined;
7
- align?: "left" | "right" | "center" | undefined;
7
+ align?: "center" | "left" | "right" | undefined;
8
8
  justify?: boolean | undefined;
9
9
  italic?: boolean | undefined;
10
10
  firstupper?: boolean | undefined;
@@ -1,6 +1,6 @@
1
1
  export declare let open: boolean;
2
2
  export declare let placement: string;
3
- export declare const init: (node: any, _open: any) => {
4
- update(_open: any): void;
3
+ export declare const init: (node: HTMLElement, _open: boolean) => {
4
+ update(_open: boolean): void;
5
5
  destroy(): void;
6
6
  };
package/utils/backdrop.js CHANGED
@@ -15,7 +15,6 @@ export let placement;
15
15
  export const init = (node, _open) => {
16
16
  getPlacementClasses().map((c) => node.classList.add(c));
17
17
  _open && createBackdrop(node);
18
- console.log('init clicked');
19
18
  return {
20
19
  update(_open) {
21
20
  allPlacementClasses.map((c) => node.classList.remove(c));
@@ -58,7 +57,7 @@ const createBackdrop = (node) => {
58
57
  if (!backdropEl) {
59
58
  backdropEl = document.createElement('div');
60
59
  backdropEl.classList.add(...backdropClasses.split(' '));
61
- const body = document.querySelector('body');
60
+ const body = document.body;
62
61
  body.append(backdropEl);
63
62
  body.style.overflow = 'hidden';
64
63
  document.addEventListener('keydown', handleEscape, true);
@@ -66,7 +65,7 @@ const createBackdrop = (node) => {
66
65
  dispatch('show', node);
67
66
  };
68
67
  const destroyBackdrop = (node) => {
69
- const body = document.querySelector('body');
68
+ const body = document.body;
70
69
  body.style.overflow = 'auto';
71
70
  if (backdropEl)
72
71
  backdropEl.remove();
package/avatar/Dot.svelte DELETED
@@ -1,34 +0,0 @@
1
- <script>import classNames from 'classnames';
2
- export let show = false;
3
- export let top = false;
4
- export let color = 'bg-gray-300 dark:bg-gray-500';
5
- export let rounded = false;
6
- export let size = 'md';
7
- const sizes = {
8
- xs: 'w-2.5 h-2.5',
9
- sm: 'w-3 h-3',
10
- md: 'w-3.5 h-3.5',
11
- lg: 'w-6 h-6',
12
- xl: 'w-10 h-10'
13
- };
14
- const offsets = {
15
- xs: ['left-4', 'left-5'],
16
- sm: ['left-6', 'left-6'],
17
- md: ['left-7', 'left-8'],
18
- lg: ['left-14', 'left-16'],
19
- xl: ['left-24', 'left-32']
20
- };
21
- let dotClass;
22
- $: dotClass = classNames('absolute rounded-full border-white dark:border-gray-800 border-2', sizes[size], offsets[size][+rounded], top ? 'top-0' : 'bottom-0', rounded && top && 'transform -translate-y-1/2', rounded && !top && 'transform translate-y-1/4', color);
23
- let divClass;
24
- $: divClass = classNames('relative flex-shrink-0', $$props.class);
25
- </script>
26
-
27
- {#if show}
28
- <div class={divClass}>
29
- <slot />
30
- <span class={dotClass} />
31
- </div>
32
- {:else}
33
- <slot />
34
- {/if}
@@ -1,23 +0,0 @@
1
- import { SvelteComponentTyped } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- [x: string]: any;
5
- show?: boolean | undefined;
6
- top?: boolean | undefined;
7
- color?: string | undefined;
8
- rounded?: boolean | undefined;
9
- size?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
10
- };
11
- events: {
12
- [evt: string]: CustomEvent<any>;
13
- };
14
- slots: {
15
- default: {};
16
- };
17
- };
18
- export type DotProps = typeof __propDef.props;
19
- export type DotEvents = typeof __propDef.events;
20
- export type DotSlots = typeof __propDef.slots;
21
- export default class Dot extends SvelteComponentTyped<DotProps, DotEvents, DotSlots> {
22
- }
23
- export {};