@ibis-design/svelte 0.2.0 → 0.6.0
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 +12 -2
- package/dist/components/buttons/Button.svelte +106 -0
- package/dist/components/buttons/Button.svelte.d.ts +69 -0
- package/dist/components/buttons/DropdownButton.svelte +91 -0
- package/dist/components/buttons/DropdownButton.svelte.d.ts +33 -0
- package/dist/components/buttons/PillTab.svelte +84 -0
- package/dist/components/buttons/PillTab.svelte.d.ts +55 -0
- package/dist/components/buttons/button.css +193 -0
- package/dist/components/buttons/dropdownButton.css +82 -0
- package/dist/components/buttons/pillTab.css +59 -0
- package/dist/components/containers/Banner.svelte +73 -0
- package/dist/components/containers/Banner.svelte.d.ts +16 -0
- package/dist/components/containers/Card.svelte +34 -0
- package/dist/components/containers/Card.svelte.d.ts +14 -0
- package/dist/components/containers/PillTabs.svelte +22 -0
- package/dist/components/containers/PillTabs.svelte.d.ts +6 -0
- package/dist/components/containers/TipIndicator.svelte +78 -0
- package/dist/components/containers/TipIndicator.svelte.d.ts +28 -0
- package/dist/components/containers/Toaster.svelte +75 -0
- package/dist/components/containers/Toaster.svelte.d.ts +16 -0
- package/dist/components/containers/Tooltip.svelte.d.ts +26 -0
- package/dist/components/containers/banner.css +155 -0
- package/dist/components/containers/tipIndicator.css +79 -0
- package/dist/components/containers/toaster.css +137 -0
- package/dist/components/containers/tooltip.css +0 -0
- package/dist/components/inputs/.gitkeep +0 -0
- package/dist/components/inputs/Checkbox.svelte +95 -0
- package/dist/components/inputs/Checkbox.svelte.d.ts +33 -0
- package/dist/components/inputs/Chips.svelte +104 -0
- package/dist/components/inputs/Chips.svelte.d.ts +48 -0
- package/dist/components/inputs/Dropdown.svelte +83 -0
- package/dist/components/inputs/Dropdown.svelte.d.ts +15 -0
- package/dist/components/inputs/Radio.svelte +109 -0
- package/dist/components/inputs/Radio.svelte.d.ts +49 -0
- package/dist/components/inputs/Switch.svelte +45 -0
- package/dist/components/inputs/Switch.svelte.d.ts +21 -0
- package/dist/components/inputs/TextArea.svelte +65 -0
- package/dist/components/inputs/TextArea.svelte.d.ts +14 -0
- package/dist/components/inputs/TextInput.svelte +273 -0
- package/dist/components/inputs/TextInput.svelte.d.ts +140 -0
- package/dist/components/inputs/TextLink.svelte +102 -0
- package/dist/components/inputs/TextLink.svelte.d.ts +21 -0
- package/dist/components/inputs/checkbox.css +103 -0
- package/dist/components/inputs/chips.css +76 -0
- package/dist/components/inputs/dropdown.css +106 -0
- package/dist/components/inputs/radio.css +108 -0
- package/dist/components/inputs/switch.css +68 -0
- package/dist/components/inputs/textInput.css +152 -0
- package/dist/components/inputs/textarea.css +91 -0
- package/dist/components/inputs/textlink.css +163 -0
- package/dist/index.d.ts +21 -8
- package/dist/index.js +36 -2000
- package/dist/layouts/AppLayout.svelte +83 -0
- package/dist/layouts/AppLayout.svelte.d.ts +20 -0
- package/dist/layouts/AuthLayout.svelte +63 -0
- package/dist/layouts/AuthLayout.svelte.d.ts +18 -0
- package/dist/layouts/DashboardLayout.svelte +88 -0
- package/dist/layouts/DashboardLayout.svelte.d.ts +20 -0
- package/dist/types/button.js +5 -0
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.js +5 -0
- package/dist/types/layout.d.ts +1 -1
- package/dist/types/layout.js +1 -0
- package/package.json +49 -44
- package/dist/index.css +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/components/buttons/Button.svelte.d.ts +0 -1
- package/dist/lib/components/buttons/DropdownButton.svelte.d.ts +0 -1
- package/dist/lib/components/containers/Card.svelte.d.ts +0 -1
- package/dist/lib/layouts/AppLayout.svelte.d.ts +0 -1
- package/dist/lib/layouts/AuthLayout.svelte.d.ts +0 -1
- package/dist/lib/layouts/DashboardLayout.svelte.d.ts +0 -1
- /package/dist/{types/input.d.ts → components/containers/Tooltip.svelte} +0 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
.dropdown-button {
|
|
2
|
+
position: relative;
|
|
3
|
+
display: inline-block;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
.caret {
|
|
7
|
+
margin-left: 0.25em;
|
|
8
|
+
width: 1em;
|
|
9
|
+
height: 1em;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.dropdown-menu {
|
|
13
|
+
position: absolute;
|
|
14
|
+
top: 100%;
|
|
15
|
+
left: 0;
|
|
16
|
+
margin-top: 4px;
|
|
17
|
+
min-width: 160px;
|
|
18
|
+
background: white;
|
|
19
|
+
border: 1px solid var(--color-neutral-300);
|
|
20
|
+
border-radius: var(--component-button-size-md);
|
|
21
|
+
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
|
|
22
|
+
z-index: 1000;
|
|
23
|
+
padding: 4px;
|
|
24
|
+
display: flex;
|
|
25
|
+
flex-direction: column;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* .dropdown-menu :global(button) {
|
|
29
|
+
all: unset;
|
|
30
|
+
padding: 8px;
|
|
31
|
+
cursor: pointer;
|
|
32
|
+
border-radius: 4px;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.dropdown-menu :global(button:hover) {
|
|
36
|
+
background-color: var(--color-neutral-100);
|
|
37
|
+
} */
|
|
38
|
+
|
|
39
|
+
.dropdown-menu :global(.dropdown-menu__item) {
|
|
40
|
+
all: unset;
|
|
41
|
+
display: flex;
|
|
42
|
+
align-items: center;
|
|
43
|
+
justify-content: center;
|
|
44
|
+
width: 100%;
|
|
45
|
+
box-sizing: border-box;
|
|
46
|
+
padding: var(--spacing-3) var(--spacing-4);
|
|
47
|
+
cursor: pointer;
|
|
48
|
+
font-family: var(--font-family-sans);
|
|
49
|
+
font-size: var(--font-size-normal-text-default);
|
|
50
|
+
font-weight: var(--font-weight-medium);
|
|
51
|
+
color: var(--color-neutral-900);
|
|
52
|
+
text-align: center;
|
|
53
|
+
transition: background-color var(--transition-duration-fast) var(--transition-timing-default);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.dropdown-menu :global(.dropdown-menu__item:hover) {
|
|
57
|
+
background-color: var(--color-primary-400);
|
|
58
|
+
color: var(--color-white);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.dropdown-menu :global(.dropdown-menu__item--selected) {
|
|
62
|
+
background-color: var(--color-primary-500);
|
|
63
|
+
color: var(--color-white);
|
|
64
|
+
font-weight: var(--font-weight-bold);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.dropdown-menu :global(.dropdown-menu__item--selected:hover) {
|
|
68
|
+
background-color: var(--color-primary-700);
|
|
69
|
+
color: var(--color-white);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.caret {
|
|
73
|
+
margin-left: 0.25em;
|
|
74
|
+
width: 1em;
|
|
75
|
+
height: 1em;
|
|
76
|
+
transition: transform var(--transition-duration-fast) var(--transition-timing-default);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/* ↓ ADDED — rotates caret when open */
|
|
80
|
+
.caret--open {
|
|
81
|
+
transform: rotate(180deg);
|
|
82
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
.ibis-pill-tab {
|
|
2
|
+
display: inline-flex;
|
|
3
|
+
align-items: center;
|
|
4
|
+
justify-content: center;
|
|
5
|
+
flex: 1;
|
|
6
|
+
padding: var(--spacing-1) var(--spacing-3);
|
|
7
|
+
height: 100%;
|
|
8
|
+
align-self: stretch;
|
|
9
|
+
border-radius: var(--border-radius-full);
|
|
10
|
+
/* background: var(--color-neutral-100); */
|
|
11
|
+
color: var(--color-neutral-700);
|
|
12
|
+
cursor: pointer;
|
|
13
|
+
user-select: none;
|
|
14
|
+
|
|
15
|
+
transition:
|
|
16
|
+
background var(--transition-duration-normal),
|
|
17
|
+
color var(--transition-duration-normal),
|
|
18
|
+
box-shadow var(--transition-duration-normal);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.ibis-pill-tab__input {
|
|
22
|
+
display: none;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.ibis-pill-tab__content {
|
|
26
|
+
font-size: var(--font-size-sm);
|
|
27
|
+
line-height: 1;
|
|
28
|
+
text-align: center; /*New*/
|
|
29
|
+
width: 100%; /*New*/
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/* Active */
|
|
33
|
+
.ibis-pill-tab--active {
|
|
34
|
+
background: var(--color-primary-700);
|
|
35
|
+
color: var(--color-white);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* Hover */
|
|
39
|
+
.ibis-pill-tab:hover:not(.ibis-pill-tab--disabled):not(.ibis-pill-tab--active) {
|
|
40
|
+
background: var(--color-primary-100);
|
|
41
|
+
color: var(--color-primary-800);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.ibis-pill-tab--active:hover {
|
|
45
|
+
background: var(--color-primary-800);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* Focus (important for accessibility) */
|
|
49
|
+
.ibis-pill-tab__input:focus-visible + .ibis-pill-tab__content {
|
|
50
|
+
outline: 2px solid var(--color-primary-500);
|
|
51
|
+
outline-offset: 2px;
|
|
52
|
+
border-radius: 999px;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* Disabled */
|
|
56
|
+
.ibis-pill-tab--disabled {
|
|
57
|
+
opacity: var(--opacity-7);
|
|
58
|
+
cursor: not-allowed;
|
|
59
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import "./banner.css";
|
|
3
|
+
import type { Snippet } from "svelte";
|
|
4
|
+
|
|
5
|
+
type BannerType = "success" | "error" | "default";
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
type?: BannerType;
|
|
9
|
+
title?: string;
|
|
10
|
+
message?: string;
|
|
11
|
+
children?: Snippet;
|
|
12
|
+
icon?: Snippet;
|
|
13
|
+
iconText?: string;
|
|
14
|
+
closable?: boolean;
|
|
15
|
+
loading?: boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let {
|
|
19
|
+
type = "default",
|
|
20
|
+
title,
|
|
21
|
+
message,
|
|
22
|
+
children,
|
|
23
|
+
icon,
|
|
24
|
+
iconText,
|
|
25
|
+
closable,
|
|
26
|
+
loading,
|
|
27
|
+
}: Props = $props();
|
|
28
|
+
|
|
29
|
+
let visible = $state(true);
|
|
30
|
+
|
|
31
|
+
const close = () => {
|
|
32
|
+
visible = false;
|
|
33
|
+
};
|
|
34
|
+
</script>
|
|
35
|
+
|
|
36
|
+
{#if visible}
|
|
37
|
+
<div
|
|
38
|
+
class="ibis-banner"
|
|
39
|
+
role="status"
|
|
40
|
+
class:ibis-banner--success={type === "success"}
|
|
41
|
+
class:ibis-banner--error={type === "error"}
|
|
42
|
+
class:ibis-banner--default={type === "default"}>
|
|
43
|
+
{#if loading || icon || iconText}
|
|
44
|
+
<div class="ibis-banner__icon">
|
|
45
|
+
{#if loading}
|
|
46
|
+
<span class="ibis-banner__loader" aria-hidden="true"></span>
|
|
47
|
+
{:else if icon}
|
|
48
|
+
{@render icon?.()}
|
|
49
|
+
{:else}
|
|
50
|
+
{iconText}
|
|
51
|
+
{/if}
|
|
52
|
+
</div>
|
|
53
|
+
{/if}
|
|
54
|
+
|
|
55
|
+
<div class="ibis-banner__content">
|
|
56
|
+
{#if title}
|
|
57
|
+
<div class="ibis-banner__title">{title}</div>
|
|
58
|
+
{/if}
|
|
59
|
+
|
|
60
|
+
<div class="ibis-banner__message">
|
|
61
|
+
{#if children}
|
|
62
|
+
{@render children?.()}
|
|
63
|
+
{:else if message}
|
|
64
|
+
{message}
|
|
65
|
+
{/if}
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
|
|
69
|
+
{#if closable}
|
|
70
|
+
<button class="ibis-banner__close" onclick={close} aria-label="Close"> x </button>
|
|
71
|
+
{/if}
|
|
72
|
+
</div>
|
|
73
|
+
{/if}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import "./banner.css";
|
|
2
|
+
import type { Snippet } from "svelte";
|
|
3
|
+
type BannerType = "success" | "error" | "default";
|
|
4
|
+
interface Props {
|
|
5
|
+
type?: BannerType;
|
|
6
|
+
title?: string;
|
|
7
|
+
message?: string;
|
|
8
|
+
children?: Snippet;
|
|
9
|
+
icon?: Snippet;
|
|
10
|
+
iconText?: string;
|
|
11
|
+
closable?: boolean;
|
|
12
|
+
loading?: boolean;
|
|
13
|
+
}
|
|
14
|
+
declare const Banner: import("svelte").Component<Props, {}, "">;
|
|
15
|
+
type Banner = ReturnType<typeof Banner>;
|
|
16
|
+
export default Banner;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Card – Container with token-based padding, radius, and shadow.
|
|
3
|
+
@component
|
|
4
|
+
@param {Snippet} [children] - Snippet content for the card body.
|
|
5
|
+
@example
|
|
6
|
+
<Card>Card content</Card>
|
|
7
|
+
-->
|
|
8
|
+
<script lang="ts">
|
|
9
|
+
import type { Snippet } from "svelte";
|
|
10
|
+
|
|
11
|
+
interface Props {
|
|
12
|
+
children?: Snippet;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let { children }: Props = $props();
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<div class="ibis-card">
|
|
19
|
+
{#if children}
|
|
20
|
+
{@render children()}
|
|
21
|
+
{/if}
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
<style>
|
|
25
|
+
.ibis-card {
|
|
26
|
+
background-color: var(--color-backgrounds-classic-bg-light);
|
|
27
|
+
border-radius: var(--border-radius-md);
|
|
28
|
+
box-shadow: var(--shadow-default);
|
|
29
|
+
padding: var(--spacing-4);
|
|
30
|
+
font-family: var(--font-family-sans);
|
|
31
|
+
font-size: var(--font-size-normal-text-default);
|
|
32
|
+
line-height: var(--line-height-normal);
|
|
33
|
+
}
|
|
34
|
+
</style>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Snippet } from "svelte";
|
|
2
|
+
interface Props {
|
|
3
|
+
children?: Snippet;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Card – Container with token-based padding, radius, and shadow.
|
|
7
|
+
*
|
|
8
|
+
* @param {Snippet} [children] - Snippet content for the card body.
|
|
9
|
+
* @example
|
|
10
|
+
* <Card>Card content</Card>
|
|
11
|
+
*/
|
|
12
|
+
declare const Card: import("svelte").Component<Props, {}, "">;
|
|
13
|
+
type Card = ReturnType<typeof Card>;
|
|
14
|
+
export default Card;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
interface Props {
|
|
3
|
+
children?: () => any;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
let { children }: Props = $props();
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<div class="ibis-pill-tabs">
|
|
10
|
+
{@render children?.()}
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<style>
|
|
14
|
+
.ibis-pill-tabs {
|
|
15
|
+
display: inline-flex;
|
|
16
|
+
align-items: stretch;
|
|
17
|
+
border-radius: var(--border-radius-full);
|
|
18
|
+
background: var(--color-white);
|
|
19
|
+
padding: 4px;
|
|
20
|
+
gap: 4px;
|
|
21
|
+
}
|
|
22
|
+
</style>
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import './tipIndicator.css';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
/**
|
|
6
|
+
* Controls the position of the tooltip relative to the indicator.
|
|
7
|
+
*
|
|
8
|
+
* @default "top"
|
|
9
|
+
*/
|
|
10
|
+
position?: 'top' | 'bottom' | 'left' | 'right';
|
|
11
|
+
/**
|
|
12
|
+
* The plain text content displayed inside the tooltip.
|
|
13
|
+
*/
|
|
14
|
+
text: string;
|
|
15
|
+
/**
|
|
16
|
+
* Disables the tooltip from appearing on hover.
|
|
17
|
+
*
|
|
18
|
+
* @default false
|
|
19
|
+
*/
|
|
20
|
+
disabled?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Controls the width of the tooltip.
|
|
23
|
+
*
|
|
24
|
+
* @default "auto"
|
|
25
|
+
*/
|
|
26
|
+
width?: 'auto' | '240' | '360';
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
let { position = 'top', text, disabled = false, width = 'auto' }: Props = $props();
|
|
30
|
+
|
|
31
|
+
let visible = $state(false);
|
|
32
|
+
|
|
33
|
+
const show = () => {
|
|
34
|
+
if (!disabled) visible = true;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const hide = () => {
|
|
38
|
+
visible = false;
|
|
39
|
+
};
|
|
40
|
+
</script>
|
|
41
|
+
|
|
42
|
+
<span
|
|
43
|
+
class="ibis-tip-indicator"
|
|
44
|
+
onmouseenter={show}
|
|
45
|
+
onmouseleave={hide}
|
|
46
|
+
onfocus={show}
|
|
47
|
+
onblur={hide}
|
|
48
|
+
tabindex="0"
|
|
49
|
+
role="button"
|
|
50
|
+
aria-describedby="ibis-tip"
|
|
51
|
+
>
|
|
52
|
+
<svg
|
|
53
|
+
class="ibis-tip-indicator__icon"
|
|
54
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
55
|
+
viewBox="0 0 24 24"
|
|
56
|
+
fill="none"
|
|
57
|
+
aria-hidden="true"
|
|
58
|
+
>
|
|
59
|
+
<circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="2" />
|
|
60
|
+
<line
|
|
61
|
+
x1="12"
|
|
62
|
+
y1="11"
|
|
63
|
+
x2="12"
|
|
64
|
+
y2="17"
|
|
65
|
+
stroke="currentColor"
|
|
66
|
+
stroke-width="2"
|
|
67
|
+
stroke-linecap="round"
|
|
68
|
+
/>
|
|
69
|
+
<circle cx="12" cy="7.5" r="1.2" fill="currentColor" />
|
|
70
|
+
</svg>
|
|
71
|
+
|
|
72
|
+
{#if visible}
|
|
73
|
+
<div id="ibis-tip" class="ibis-tip ibis-tip--{position} ibis-tip--width-{width}" role="tooltip">
|
|
74
|
+
<span class="ibis-tip__text">{text}</span>
|
|
75
|
+
<span class="ibis-tip__arrow"></span>
|
|
76
|
+
</div>
|
|
77
|
+
{/if}
|
|
78
|
+
</span>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import './tipIndicator.css';
|
|
2
|
+
interface Props {
|
|
3
|
+
/**
|
|
4
|
+
* Controls the position of the tooltip relative to the indicator.
|
|
5
|
+
*
|
|
6
|
+
* @default "top"
|
|
7
|
+
*/
|
|
8
|
+
position?: 'top' | 'bottom' | 'left' | 'right';
|
|
9
|
+
/**
|
|
10
|
+
* The plain text content displayed inside the tooltip.
|
|
11
|
+
*/
|
|
12
|
+
text: string;
|
|
13
|
+
/**
|
|
14
|
+
* Disables the tooltip from appearing on hover.
|
|
15
|
+
*
|
|
16
|
+
* @default false
|
|
17
|
+
*/
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Controls the width of the tooltip.
|
|
21
|
+
*
|
|
22
|
+
* @default "auto"
|
|
23
|
+
*/
|
|
24
|
+
width?: 'auto' | '240' | '360';
|
|
25
|
+
}
|
|
26
|
+
declare const TipIndicator: import("svelte").Component<Props, {}, "">;
|
|
27
|
+
type TipIndicator = ReturnType<typeof TipIndicator>;
|
|
28
|
+
export default TipIndicator;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import './toaster.css';
|
|
3
|
+
import type { Snippet } from 'svelte';
|
|
4
|
+
|
|
5
|
+
type ToastType = 'success' | 'error' | 'accent' | 'default';
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
type?: ToastType;
|
|
9
|
+
title?: string;
|
|
10
|
+
message?: string;
|
|
11
|
+
children?: Snippet;
|
|
12
|
+
icon?: Snippet;
|
|
13
|
+
iconText?: string;
|
|
14
|
+
closable?: boolean;
|
|
15
|
+
loading?: boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let {
|
|
19
|
+
type = 'default',
|
|
20
|
+
title,
|
|
21
|
+
message,
|
|
22
|
+
children,
|
|
23
|
+
icon,
|
|
24
|
+
iconText,
|
|
25
|
+
closable,
|
|
26
|
+
loading
|
|
27
|
+
}: Props = $props();
|
|
28
|
+
|
|
29
|
+
let visible = $state(true);
|
|
30
|
+
|
|
31
|
+
const close = () => {
|
|
32
|
+
visible = false;
|
|
33
|
+
};
|
|
34
|
+
</script>
|
|
35
|
+
|
|
36
|
+
{#if visible}
|
|
37
|
+
<div
|
|
38
|
+
class="ibis-toaster"
|
|
39
|
+
role="status"
|
|
40
|
+
class:ibis-toaster--success={type === 'success'}
|
|
41
|
+
class:ibis-toaster--error={type === 'error'}
|
|
42
|
+
class:ibis-toaster--accent={type === 'accent'}
|
|
43
|
+
class:ibis-toaster--default={type === 'default'}
|
|
44
|
+
>
|
|
45
|
+
{#if loading || icon || iconText}
|
|
46
|
+
<div class="ibis-toaster__icon">
|
|
47
|
+
{#if loading}
|
|
48
|
+
<span class="ibis-toaster__loader" aria-hidden="true"></span>
|
|
49
|
+
{:else if icon}
|
|
50
|
+
{@render icon?.()}
|
|
51
|
+
{:else}
|
|
52
|
+
{iconText}
|
|
53
|
+
{/if}
|
|
54
|
+
</div>
|
|
55
|
+
{/if}
|
|
56
|
+
|
|
57
|
+
<div class="ibis-toaster__content">
|
|
58
|
+
{#if title}
|
|
59
|
+
<div class="ibis-toaster__title">{title}</div>
|
|
60
|
+
{/if}
|
|
61
|
+
|
|
62
|
+
<div class="ibis-toaster__message">
|
|
63
|
+
{#if children}
|
|
64
|
+
{@render children?.()}
|
|
65
|
+
{:else if message}
|
|
66
|
+
{message}
|
|
67
|
+
{/if}
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
|
|
71
|
+
{#if closable}
|
|
72
|
+
<button class="ibis-toaster__close" onclick={close} aria-label="Close"> x </button>
|
|
73
|
+
{/if}
|
|
74
|
+
</div>
|
|
75
|
+
{/if}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import './toaster.css';
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
type ToastType = 'success' | 'error' | 'accent' | 'default';
|
|
4
|
+
interface Props {
|
|
5
|
+
type?: ToastType;
|
|
6
|
+
title?: string;
|
|
7
|
+
message?: string;
|
|
8
|
+
children?: Snippet;
|
|
9
|
+
icon?: Snippet;
|
|
10
|
+
iconText?: string;
|
|
11
|
+
closable?: boolean;
|
|
12
|
+
loading?: boolean;
|
|
13
|
+
}
|
|
14
|
+
declare const Toaster: import("svelte").Component<Props, {}, "">;
|
|
15
|
+
type Toaster = ReturnType<typeof Toaster>;
|
|
16
|
+
export default Toaster;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export default Tooltip;
|
|
2
|
+
type Tooltip = SvelteComponent<{
|
|
3
|
+
[x: string]: never;
|
|
4
|
+
}, {
|
|
5
|
+
[evt: string]: CustomEvent<any>;
|
|
6
|
+
}, {}> & {
|
|
7
|
+
$$bindings?: string | undefined;
|
|
8
|
+
};
|
|
9
|
+
declare const Tooltip: $$__sveltets_2_IsomorphicComponent<{
|
|
10
|
+
[x: string]: never;
|
|
11
|
+
}, {
|
|
12
|
+
[evt: string]: CustomEvent<any>;
|
|
13
|
+
}, {}, {}, string>;
|
|
14
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
15
|
+
new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
|
|
16
|
+
$$bindings?: Bindings;
|
|
17
|
+
} & Exports;
|
|
18
|
+
(internal: unknown, props: {
|
|
19
|
+
$$events?: Events;
|
|
20
|
+
$$slots?: Slots;
|
|
21
|
+
}): Exports & {
|
|
22
|
+
$set?: any;
|
|
23
|
+
$on?: any;
|
|
24
|
+
};
|
|
25
|
+
z_$$bindings?: Bindings;
|
|
26
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
.ibis-banner {
|
|
2
|
+
font-family: var(--font-family-sans);
|
|
3
|
+
display: flex;
|
|
4
|
+
align-items: flex-start;
|
|
5
|
+
gap: 8px; /*hardcoded*/
|
|
6
|
+
padding: 8px 16px;
|
|
7
|
+
border-radius: 16px; /*hardcoded*/
|
|
8
|
+
border: var(--border-width-default) solid var(--color-neutral-200);
|
|
9
|
+
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.08); /*hardcoded - tokenize later*/
|
|
10
|
+
|
|
11
|
+
max-width: 300px;
|
|
12
|
+
position: relative;
|
|
13
|
+
margin-bottom: 2px;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/* ICON */
|
|
17
|
+
.ibis-banner__icon {
|
|
18
|
+
display: flex;
|
|
19
|
+
align-items: center;
|
|
20
|
+
justify-content: center;
|
|
21
|
+
|
|
22
|
+
width: 20px;
|
|
23
|
+
height: 20px;
|
|
24
|
+
top: 2px;
|
|
25
|
+
left: 2px;
|
|
26
|
+
|
|
27
|
+
flex-shrink: 0;
|
|
28
|
+
|
|
29
|
+
margin-top: 2px;
|
|
30
|
+
color: var(--color-white);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.ibis-banner__icon :global(svg) {
|
|
34
|
+
width: 100%;
|
|
35
|
+
height: 100%;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.ibis-banner__content {
|
|
39
|
+
flex: 1;
|
|
40
|
+
display: flex;
|
|
41
|
+
flex-direction: column;
|
|
42
|
+
gap: var(--spacing-1);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.ibis-banner__title {
|
|
46
|
+
font-weight: var(--font-weight-medium);
|
|
47
|
+
font-size: var(--font-size-normal-text-sm);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.ibis-banner__message {
|
|
51
|
+
font-size: var(--font-size-normal-text-sm);
|
|
52
|
+
color: var(--color-white);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.ibis-banner--default .ibis-banner__message {
|
|
56
|
+
font-size: var(--font-size-normal-text-sm);
|
|
57
|
+
color: var(--color-primary-900);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.ibis-banner--success .ibis-banner__message {
|
|
61
|
+
font-size: var(--font-size-normal-text-sm);
|
|
62
|
+
color: var(--color-status-success);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.ibis-banner--error .ibis-banner__message {
|
|
66
|
+
font-size: var(--font-size-normal-text-sm);
|
|
67
|
+
color: var(--color-status-error);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.ibis-banner__close {
|
|
71
|
+
background: transparent;
|
|
72
|
+
border: none;
|
|
73
|
+
cursor: pointer;
|
|
74
|
+
font-size: 18px; /*hardcoded*/
|
|
75
|
+
line-height: 1;
|
|
76
|
+
color: var(--color-white);
|
|
77
|
+
flex-shrink: 0;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* SUCCESS */
|
|
81
|
+
.ibis-banner--success {
|
|
82
|
+
border-color: rgba(0, 154, 8, 0.1);
|
|
83
|
+
background-color: rgba(0, 154, 8, 0.1);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.ibis-banner--success .ibis-banner__title {
|
|
87
|
+
color: var(--color-status-success);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.ibis-banner--success .ibis-banner__icon {
|
|
91
|
+
color: var(--color-status-success);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.ibis-banner--success .ibis-banner__close {
|
|
95
|
+
color: var(--color-status-success);
|
|
96
|
+
border-color: var(--color-status-success);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* ERROR */
|
|
100
|
+
.ibis-banner--error {
|
|
101
|
+
border-color: rgba(183, 12, 0, 0.1);
|
|
102
|
+
background-color: rgba(183, 12, 0, 0.1);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.ibis-banner--error .ibis-banner__title {
|
|
106
|
+
color: var(--color-status-error);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.ibis-banner--error .ibis-banner__icon {
|
|
110
|
+
color: var(--color-status-error);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.ibis-banner--error .ibis-banner__close {
|
|
114
|
+
color: var(--color-status-error);
|
|
115
|
+
border-color: var(--color-status-error);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* DEFAULT */
|
|
119
|
+
.ibis-banner--default {
|
|
120
|
+
border-color: rgba(113, 59, 193, 0.1);
|
|
121
|
+
background-color: rgba(113, 59, 193, 0.1);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.ibis-banner--default .ibis-banner__title {
|
|
125
|
+
color: var(--color-primary-900);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.ibis-banner--default .ibis-banner__icon {
|
|
129
|
+
color: var(--color-primary-900);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.ibis-banner--default .ibis-banner__close {
|
|
133
|
+
color: var(--color-primary-900);
|
|
134
|
+
border-color: var(--color-primary-900);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.ibis-banner__loader {
|
|
138
|
+
width: 1em;
|
|
139
|
+
height: 1em;
|
|
140
|
+
|
|
141
|
+
border: var(--border-width-default) solid var(--color-primary-300);
|
|
142
|
+
border-top-color: var(--color-primary-900);
|
|
143
|
+
border-radius: 50%;
|
|
144
|
+
|
|
145
|
+
animation: ibis-spin 0.8s linear infinite;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
@keyframes ibis-spin {
|
|
149
|
+
from {
|
|
150
|
+
transform: rotate(0deg);
|
|
151
|
+
}
|
|
152
|
+
to {
|
|
153
|
+
transform: rotate(360deg);
|
|
154
|
+
}
|
|
155
|
+
}
|