@invopop/popui 0.1.96 → 0.1.98
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/dist/CounterWidget.svelte +65 -30
- package/dist/GlobalSearch.svelte +1 -1
- package/dist/MenuItem.svelte +106 -29
- package/dist/ProgressBarCircle.svelte +9 -6
- package/dist/index.d.ts +36 -1
- package/dist/index.js +74 -0
- package/dist/separator/index.d.ts +2 -0
- package/dist/separator/index.js +4 -0
- package/dist/separator/separator.svelte +21 -0
- package/dist/separator/separator.svelte.d.ts +4 -0
- package/dist/sheet/index.d.ts +11 -0
- package/dist/sheet/index.js +13 -0
- package/dist/sheet/sheet-close.svelte +7 -0
- package/dist/sheet/sheet-close.svelte.d.ts +4 -0
- package/dist/sheet/sheet-content.svelte +65 -0
- package/dist/sheet/sheet-content.svelte.d.ts +15 -0
- package/dist/sheet/sheet-description.svelte +17 -0
- package/dist/sheet/sheet-description.svelte.d.ts +4 -0
- package/dist/sheet/sheet-footer.svelte +20 -0
- package/dist/sheet/sheet-footer.svelte.d.ts +5 -0
- package/dist/sheet/sheet-header.svelte +20 -0
- package/dist/sheet/sheet-header.svelte.d.ts +5 -0
- package/dist/sheet/sheet-overlay.svelte +20 -0
- package/dist/sheet/sheet-overlay.svelte.d.ts +4 -0
- package/dist/sheet/sheet-portal.svelte +7 -0
- package/dist/sheet/sheet-portal.svelte.d.ts +3 -0
- package/dist/sheet/sheet-title.svelte +17 -0
- package/dist/sheet/sheet-title.svelte.d.ts +4 -0
- package/dist/sheet/sheet-trigger.svelte +7 -0
- package/dist/sheet/sheet-trigger.svelte.d.ts +4 -0
- package/dist/sheet/sheet.svelte +7 -0
- package/dist/sheet/sheet.svelte.d.ts +3 -0
- package/dist/sidebar/constants.d.ts +10 -0
- package/dist/sidebar/constants.js +10 -0
- package/dist/sidebar/context.svelte.d.ts +23 -0
- package/dist/sidebar/context.svelte.js +58 -0
- package/dist/sidebar/index.d.ts +25 -0
- package/dist/sidebar/index.js +27 -0
- package/dist/sidebar/is-mobile.svelte.d.ts +4 -0
- package/dist/sidebar/is-mobile.svelte.js +7 -0
- package/dist/sidebar/sidebar-content.svelte +25 -0
- package/dist/sidebar/sidebar-content.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-footer.svelte +21 -0
- package/dist/sidebar/sidebar-footer.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-group-action.svelte +33 -0
- package/dist/sidebar/sidebar-group-action.svelte.d.ts +11 -0
- package/dist/sidebar/sidebar-group-content.svelte +21 -0
- package/dist/sidebar/sidebar-group-content.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-group-label.svelte +33 -0
- package/dist/sidebar/sidebar-group-label.svelte.d.ts +11 -0
- package/dist/sidebar/sidebar-group.svelte +21 -0
- package/dist/sidebar/sidebar-group.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-header.svelte +21 -0
- package/dist/sidebar/sidebar-header.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-input.svelte +23 -0
- package/dist/sidebar/sidebar-input.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-inset.svelte +23 -0
- package/dist/sidebar/sidebar-inset.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-menu-action.svelte +37 -0
- package/dist/sidebar/sidebar-menu-action.svelte.d.ts +12 -0
- package/dist/sidebar/sidebar-menu-badge.svelte +24 -0
- package/dist/sidebar/sidebar-menu-badge.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-menu-button.svelte +102 -0
- package/dist/sidebar/sidebar-menu-button.svelte.d.ts +51 -0
- package/dist/sidebar/sidebar-menu-item.svelte +21 -0
- package/dist/sidebar/sidebar-menu-item.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-menu-skeleton.svelte +35 -0
- package/dist/sidebar/sidebar-menu-skeleton.svelte.d.ts +8 -0
- package/dist/sidebar/sidebar-menu-sub-button.svelte +39 -0
- package/dist/sidebar/sidebar-menu-sub-button.svelte.d.ts +13 -0
- package/dist/sidebar/sidebar-menu-sub-item.svelte +21 -0
- package/dist/sidebar/sidebar-menu-sub-item.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-menu-sub.svelte +24 -0
- package/dist/sidebar/sidebar-menu-sub.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-menu.svelte +21 -0
- package/dist/sidebar/sidebar-menu.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-provider.svelte +47 -0
- package/dist/sidebar/sidebar-provider.svelte.d.ts +9 -0
- package/dist/sidebar/sidebar-rail.svelte +165 -0
- package/dist/sidebar/sidebar-rail.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar-separator.svelte +19 -0
- package/dist/sidebar/sidebar-separator.svelte.d.ts +13 -0
- package/dist/sidebar/sidebar-trigger.svelte +35 -0
- package/dist/sidebar/sidebar-trigger.svelte.d.ts +5 -0
- package/dist/sidebar/sidebar.svelte +106 -0
- package/dist/sidebar/sidebar.svelte.d.ts +10 -0
- package/dist/tailwind.theme.css +20 -0
- package/dist/types.d.ts +3 -1
- package/package.json +2 -1
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
import type { CounterWidgetProps } from './types'
|
|
3
3
|
import { Icon } from '@steeze-ui/svelte-icon'
|
|
4
4
|
import { Warning, Failure } from '@invopop/ui-icons'
|
|
5
|
+
import { untrack } from 'svelte'
|
|
5
6
|
import ProgressBar from './ProgressBar.svelte'
|
|
7
|
+
import ProgressBarCircle from './ProgressBarCircle.svelte'
|
|
6
8
|
|
|
7
9
|
let {
|
|
8
10
|
label,
|
|
@@ -10,43 +12,76 @@
|
|
|
10
12
|
total,
|
|
11
13
|
resetDate = '',
|
|
12
14
|
icon,
|
|
13
|
-
allowOverage = true
|
|
15
|
+
allowOverage = true,
|
|
16
|
+
collapsed = false
|
|
14
17
|
}: CounterWidgetProps = $props()
|
|
15
18
|
|
|
16
|
-
let
|
|
19
|
+
let progress = $derived(total > 0 ? current / total : 0)
|
|
20
|
+
let percentage = $derived(progress * 100)
|
|
17
21
|
let isOverage = $derived(current > total && allowOverage)
|
|
18
22
|
let isCritical = $derived(percentage >= 100 || (current > total && !allowOverage))
|
|
19
23
|
let isWarning = $derived(percentage >= 80 && percentage < 100)
|
|
24
|
+
let circleVariant = $derived.by<'dark' | 'warning' | 'critical'>(() => {
|
|
25
|
+
if (isCritical) return 'critical'
|
|
26
|
+
if (isWarning) return 'warning'
|
|
27
|
+
return 'dark'
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
const EXPAND_DELAY_MS = 200
|
|
31
|
+
let showCollapsed = $state(untrack(() => collapsed))
|
|
32
|
+
let expandTimer: ReturnType<typeof setTimeout> | null = null
|
|
33
|
+
|
|
34
|
+
$effect(() => {
|
|
35
|
+
if (expandTimer) clearTimeout(expandTimer)
|
|
36
|
+
if (collapsed) {
|
|
37
|
+
showCollapsed = true
|
|
38
|
+
} else {
|
|
39
|
+
expandTimer = setTimeout(() => (showCollapsed = false), EXPAND_DELAY_MS)
|
|
40
|
+
}
|
|
41
|
+
return () => {
|
|
42
|
+
if (expandTimer) clearTimeout(expandTimer)
|
|
43
|
+
}
|
|
44
|
+
})
|
|
20
45
|
</script>
|
|
21
46
|
|
|
22
|
-
|
|
23
|
-
<div
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
47
|
+
{#if showCollapsed}
|
|
48
|
+
<div
|
|
49
|
+
class="size-8 p-1.75 flex items-center justify-center rounded-lg border border-transparent hover:bg-background-selected-inverse"
|
|
50
|
+
title="{label}: {current}/{total}"
|
|
51
|
+
data-counter-widget-collapsed
|
|
52
|
+
>
|
|
53
|
+
<ProgressBarCircle {progress} size={16} variant={circleVariant} />
|
|
54
|
+
</div>
|
|
55
|
+
{:else}
|
|
56
|
+
<div class="border border-border-inverse rounded-xl w-full py-[5px] pl-2 pr-1.5 flex flex-col">
|
|
57
|
+
<div class="flex items-center justify-between text-base font-medium">
|
|
58
|
+
<div class="flex items-center gap-1.5">
|
|
59
|
+
{#if icon}
|
|
60
|
+
<Icon src={icon} class="size-3 text-icon-inverse rounded-xs" />
|
|
61
|
+
{/if}
|
|
62
|
+
<span class="font-medium text-foreground-inverse">
|
|
63
|
+
{label}
|
|
64
|
+
</span>
|
|
65
|
+
</div>
|
|
66
|
+
<div class="flex items-center gap-1.5">
|
|
67
|
+
{#if isCritical && !isOverage}
|
|
68
|
+
<Icon src={Failure} class="size-4 text-icon-critical-inverse" />
|
|
69
|
+
{:else if isWarning && !isOverage}
|
|
70
|
+
<Icon src={Warning} class="size-4 text-icon-warning-inverse" />
|
|
71
|
+
{/if}
|
|
72
|
+
<span class="font-mono text-foreground-inverse">
|
|
73
|
+
{current}<span class="text-white/70">/{total}</span>
|
|
74
|
+
</span>
|
|
75
|
+
</div>
|
|
31
76
|
</div>
|
|
32
|
-
<div class="
|
|
33
|
-
{
|
|
34
|
-
<Icon src={Failure} class="size-4 text-icon-critical-inverse" />
|
|
35
|
-
{:else if isWarning && !isOverage}
|
|
36
|
-
<Icon src={Warning} class="size-4 text-icon-warning-inverse" />
|
|
37
|
-
{/if}
|
|
38
|
-
<span class="font-mono text-foreground-inverse">
|
|
39
|
-
{current}<span class="text-white/70">/{total}</span>
|
|
40
|
-
</span>
|
|
77
|
+
<div class="py-2">
|
|
78
|
+
<ProgressBar {percentage} {current} {total} {allowOverage} />
|
|
41
79
|
</div>
|
|
42
|
-
</div>
|
|
43
|
-
<div class="py-2">
|
|
44
|
-
<ProgressBar {percentage} {current} {total} {allowOverage} />
|
|
45
|
-
</div>
|
|
46
80
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
</div>
|
|
81
|
+
{#if resetDate}
|
|
82
|
+
<span class="text-sm font-normal text-foreground-inverse-secondary">
|
|
83
|
+
{label} reset {resetDate}
|
|
84
|
+
</span>
|
|
85
|
+
{/if}
|
|
86
|
+
</div>
|
|
87
|
+
{/if}
|
package/dist/GlobalSearch.svelte
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
'cursor-pointer flex items-center border border-border-inverse-default rounded-lg box-border',
|
|
16
16
|
{
|
|
17
17
|
'gap-1 px-2 py-1.5 w-full hover:bg-background-selected-inverse h-8': !collapsed,
|
|
18
|
-
'p-2 size-8': collapsed
|
|
18
|
+
'p-2 size-8 mx-auto': collapsed
|
|
19
19
|
}
|
|
20
20
|
)
|
|
21
21
|
)
|
package/dist/MenuItem.svelte
CHANGED
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import MenuItem from './MenuItem.svelte'
|
|
3
|
+
import { flip, shift, offset } from 'svelte-floating-ui/dom'
|
|
4
|
+
import { createFloatingActions } from 'svelte-floating-ui'
|
|
3
5
|
import clsx from 'clsx'
|
|
4
6
|
import { cn } from './utils.js'
|
|
5
|
-
import type { MenuItemProps } from './types.ts'
|
|
7
|
+
import type { MenuItemProps, DrawerOption, AnyProp } from './types.ts'
|
|
6
8
|
import { Icon, type IconSource } from '@steeze-ui/svelte-icon'
|
|
7
|
-
import { ChevronDown, ChevronRight } from '@invopop/ui-icons'
|
|
9
|
+
import { ChevronDown, ChevronRight, FolderL } from '@invopop/ui-icons'
|
|
8
10
|
import { resolveIcon } from './helpers.js'
|
|
11
|
+
import DrawerContext from './DrawerContext.svelte'
|
|
9
12
|
import TagBeta from './TagBeta.svelte'
|
|
10
13
|
|
|
14
|
+
const [floatingRef, floatingContent] = createFloatingActions({
|
|
15
|
+
strategy: 'absolute',
|
|
16
|
+
placement: 'bottom-start',
|
|
17
|
+
middleware: [offset(-4), flip(), shift()]
|
|
18
|
+
})
|
|
19
|
+
|
|
11
20
|
let {
|
|
12
21
|
label = '',
|
|
13
22
|
url = '',
|
|
@@ -15,6 +24,7 @@
|
|
|
15
24
|
collapsable = false,
|
|
16
25
|
open = $bindable(false),
|
|
17
26
|
active = false,
|
|
27
|
+
collapsedSidebar = false,
|
|
18
28
|
iconTheme = 'default',
|
|
19
29
|
icon = undefined,
|
|
20
30
|
imageUrl = undefined,
|
|
@@ -27,28 +37,46 @@
|
|
|
27
37
|
}: MenuItemProps = $props()
|
|
28
38
|
|
|
29
39
|
let resolvedIcon: IconSource | undefined = $state()
|
|
40
|
+
let hovered = $state(false)
|
|
41
|
+
let highlight = $state(false)
|
|
42
|
+
let leaveHoverTimeout: ReturnType<typeof setTimeout> | null = null
|
|
30
43
|
let rowStyles = $derived(
|
|
31
|
-
clsx('flex items-center rounded-lg border border-transparent
|
|
32
|
-
'
|
|
44
|
+
clsx('flex items-center rounded-lg border border-transparent', {
|
|
45
|
+
'py-1 pr-1': !collapsedSidebar,
|
|
46
|
+
'pl-2': !collapsedSidebar && !imageUrl,
|
|
47
|
+
'pl-[10px]': !collapsedSidebar && imageUrl,
|
|
48
|
+
'gap-1.5': !collapsedSidebar && (action || collapsable),
|
|
49
|
+
'size-8 p-[7px] justify-center mx-auto': collapsedSidebar,
|
|
33
50
|
'bg-background-selected-inverse': active,
|
|
34
51
|
'hover:bg-background-selected-inverse': !active
|
|
35
52
|
})
|
|
36
53
|
)
|
|
37
54
|
let buttonStyles = $derived(
|
|
38
|
-
clsx(
|
|
39
|
-
'flex-1 min-w-0 h-6
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
55
|
+
clsx('cursor-pointer text-base flex items-center hover:text-white focus:text-white', {
|
|
56
|
+
'flex-1 min-w-0 h-6': !collapsedSidebar,
|
|
57
|
+
'group': collapsedSidebar,
|
|
58
|
+
'text-foreground-inverse font-medium': !isFolderItem,
|
|
59
|
+
'text-foreground-inverse-secondary': isFolderItem && !active,
|
|
60
|
+
'text-white': active
|
|
61
|
+
})
|
|
62
|
+
)
|
|
63
|
+
let iconStyles = $derived(
|
|
64
|
+
clsx({ 'group-hover:text-white text-icon-inverse-bold!': collapsedSidebar })
|
|
46
65
|
)
|
|
47
66
|
let wrapperStyles = $derived(
|
|
48
67
|
clsx({
|
|
49
68
|
'group/menu-item ml-4 border-l border-white-10 pl-2 pt-0.5 relative': isFolderItem
|
|
50
69
|
})
|
|
51
70
|
)
|
|
71
|
+
let items = $derived([
|
|
72
|
+
{ label, value: url, selected: active, icon: resolvedIcon },
|
|
73
|
+
...(children || []).map((c) => ({
|
|
74
|
+
label: c.label || '',
|
|
75
|
+
value: c.url || '',
|
|
76
|
+
selected: c.active,
|
|
77
|
+
icon: FolderL
|
|
78
|
+
}))
|
|
79
|
+
] as DrawerOption[])
|
|
52
80
|
|
|
53
81
|
$effect(() => {
|
|
54
82
|
resolveIcon(icon).then((res) => (resolvedIcon = res))
|
|
@@ -61,25 +89,58 @@
|
|
|
61
89
|
|
|
62
90
|
onclick?.(url)
|
|
63
91
|
}
|
|
92
|
+
|
|
93
|
+
function handleClickChild(value: AnyProp) {
|
|
94
|
+
hovered = false
|
|
95
|
+
onclick?.(value as string)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function handleHover() {
|
|
99
|
+
highlight = true
|
|
100
|
+
if (leaveHoverTimeout) {
|
|
101
|
+
clearTimeout(leaveHoverTimeout)
|
|
102
|
+
}
|
|
103
|
+
hovered = true
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function handleBlur() {
|
|
107
|
+
highlight = false
|
|
108
|
+
leaveHoverTimeout = setTimeout(() => {
|
|
109
|
+
hovered = false
|
|
110
|
+
}, 200)
|
|
111
|
+
}
|
|
64
112
|
</script>
|
|
65
113
|
|
|
66
114
|
<div bind:this={ref} class={cn(wrapperStyles, className)} data-menu-item-root>
|
|
67
115
|
{#if isFolderItem}
|
|
68
116
|
<div
|
|
69
117
|
class={clsx('border-l border-white h-3 w-px absolute top-3.5 left-0 -m-px', {
|
|
70
|
-
'opacity-0 group-hover/menu-item:opacity-100': !active
|
|
118
|
+
'opacity-0 group-hover/menu-item:opacity-100': !active && !collapsedSidebar,
|
|
119
|
+
'opacity-0': collapsedSidebar && !highlight && !active
|
|
71
120
|
})}
|
|
72
121
|
data-menu-item-tree-indicator
|
|
73
122
|
></div>
|
|
74
123
|
{/if}
|
|
75
|
-
<div
|
|
124
|
+
<div
|
|
125
|
+
class={rowStyles}
|
|
126
|
+
data-menu-item-row
|
|
127
|
+
use:floatingRef
|
|
128
|
+
onmouseenter={collapsedSidebar ? handleHover : undefined}
|
|
129
|
+
onmouseleave={collapsedSidebar ? handleBlur : undefined}
|
|
130
|
+
role={collapsedSidebar ? 'presentation' : undefined}
|
|
131
|
+
>
|
|
76
132
|
<button
|
|
77
133
|
onclick={handleClick}
|
|
78
134
|
title={label}
|
|
79
135
|
data-menu-item-button
|
|
80
136
|
class={buttonStyles}
|
|
81
137
|
>
|
|
82
|
-
<span
|
|
138
|
+
<span
|
|
139
|
+
class={clsx('flex items-center', {
|
|
140
|
+
'space-x-1.5 min-w-0 flex-1': !collapsedSidebar
|
|
141
|
+
})}
|
|
142
|
+
data-menu-item-content
|
|
143
|
+
>
|
|
83
144
|
{#if imageUrl}
|
|
84
145
|
<img
|
|
85
146
|
src={imageUrl}
|
|
@@ -91,22 +152,24 @@
|
|
|
91
152
|
<Icon
|
|
92
153
|
src={resolvedIcon}
|
|
93
154
|
theme={iconTheme}
|
|
94
|
-
class="h-4 w-4 text-icon-inverse"
|
|
155
|
+
class="{iconStyles} h-4 w-4 text-icon-inverse"
|
|
95
156
|
data-menu-item-icon
|
|
96
157
|
/>
|
|
97
158
|
{/if}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
159
|
+
{#if !collapsedSidebar}
|
|
160
|
+
<span class="truncate tracking-normal" data-menu-item-label>{label}</span>
|
|
161
|
+
{#if beta}
|
|
162
|
+
<TagBeta />
|
|
163
|
+
{/if}
|
|
101
164
|
{/if}
|
|
102
165
|
</span>
|
|
103
166
|
</button>
|
|
104
|
-
{#if action}
|
|
167
|
+
{#if !collapsedSidebar && action}
|
|
105
168
|
<span class="shrink-0" data-menu-item-action>
|
|
106
169
|
{@render action()}
|
|
107
170
|
</span>
|
|
108
171
|
{/if}
|
|
109
|
-
{#if collapsable}
|
|
172
|
+
{#if !collapsedSidebar && collapsable}
|
|
110
173
|
<button
|
|
111
174
|
class="shrink-0 cursor-pointer"
|
|
112
175
|
data-menu-item-chevron
|
|
@@ -116,13 +179,27 @@
|
|
|
116
179
|
</button>
|
|
117
180
|
{/if}
|
|
118
181
|
</div>
|
|
119
|
-
{#if children?.length
|
|
120
|
-
|
|
121
|
-
{#
|
|
122
|
-
<
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
182
|
+
{#if children?.length}
|
|
183
|
+
{#if collapsedSidebar}
|
|
184
|
+
{#if hovered}
|
|
185
|
+
<div
|
|
186
|
+
use:floatingContent
|
|
187
|
+
role="contentinfo"
|
|
188
|
+
onmouseenter={handleHover}
|
|
189
|
+
onmouseleave={handleBlur}
|
|
190
|
+
class="pt-4 z-30"
|
|
191
|
+
>
|
|
192
|
+
<DrawerContext autofocus onclick={handleClickChild} {items} />
|
|
193
|
+
</div>
|
|
194
|
+
{/if}
|
|
195
|
+
{:else if open || !collapsable}
|
|
196
|
+
<ul data-menu-item-children>
|
|
197
|
+
{#each children as child}
|
|
198
|
+
<li>
|
|
199
|
+
<MenuItem {...child} isFolderItem {onclick} />
|
|
200
|
+
</li>
|
|
201
|
+
{/each}
|
|
202
|
+
</ul>
|
|
203
|
+
{/if}
|
|
127
204
|
{/if}
|
|
128
205
|
</div>
|
|
@@ -4,13 +4,16 @@
|
|
|
4
4
|
let { progress, size, variant = 'default' }: ProgressBarCircleProps = $props()
|
|
5
5
|
|
|
6
6
|
let angle = $derived(360 * progress)
|
|
7
|
-
let filledColor = $derived(
|
|
8
|
-
variant === '
|
|
9
|
-
|
|
7
|
+
let filledColor = $derived.by(() => {
|
|
8
|
+
if (variant === 'critical') return 'var(--color-background-critical-inverse)'
|
|
9
|
+
if (variant === 'warning') return 'var(--color-background-warning-inverse)'
|
|
10
|
+
if (variant === 'dark') return 'var(--color-icon-inverse-bold)'
|
|
11
|
+
return 'var(--color-icon-selected-default)'
|
|
12
|
+
})
|
|
10
13
|
let restColor = $derived(
|
|
11
|
-
variant === '
|
|
12
|
-
? 'var(--color-background-
|
|
13
|
-
: 'var(--color-background-
|
|
14
|
+
variant === 'default'
|
|
15
|
+
? 'var(--color-background-default-tertiary)'
|
|
16
|
+
: 'var(--color-background-selected-inverse-hover)'
|
|
14
17
|
)
|
|
15
18
|
let background = $derived(
|
|
16
19
|
`conic-gradient(${filledColor} 0deg ${angle}deg, ${restColor} ${angle}deg 360deg)`
|
package/dist/index.d.ts
CHANGED
|
@@ -77,6 +77,41 @@ import { TooltipContent } from './tooltip';
|
|
|
77
77
|
import { TooltipTrigger } from './tooltip';
|
|
78
78
|
import { TooltipProvider } from './tooltip';
|
|
79
79
|
import { TooltipAutoHide } from './tooltip';
|
|
80
|
+
import { Separator } from './separator';
|
|
81
|
+
import { Sheet } from './sheet';
|
|
82
|
+
import { SheetClose } from './sheet';
|
|
83
|
+
import { SheetContent } from './sheet';
|
|
84
|
+
import { SheetDescription } from './sheet';
|
|
85
|
+
import { SheetFooter } from './sheet';
|
|
86
|
+
import { SheetHeader } from './sheet';
|
|
87
|
+
import { SheetOverlay } from './sheet';
|
|
88
|
+
import { SheetPortal } from './sheet';
|
|
89
|
+
import { SheetTitle } from './sheet';
|
|
90
|
+
import { SheetTrigger } from './sheet';
|
|
91
|
+
import { Sidebar } from './sidebar';
|
|
92
|
+
import { SidebarContent } from './sidebar';
|
|
93
|
+
import { SidebarFooter } from './sidebar';
|
|
94
|
+
import { SidebarGroup } from './sidebar';
|
|
95
|
+
import { SidebarGroupAction } from './sidebar';
|
|
96
|
+
import { SidebarGroupContent } from './sidebar';
|
|
97
|
+
import { SidebarGroupLabel } from './sidebar';
|
|
98
|
+
import { SidebarHeader } from './sidebar';
|
|
99
|
+
import { SidebarInput } from './sidebar';
|
|
100
|
+
import { SidebarInset } from './sidebar';
|
|
101
|
+
import { SidebarMenu } from './sidebar';
|
|
102
|
+
import { SidebarMenuAction } from './sidebar';
|
|
103
|
+
import { SidebarMenuBadge } from './sidebar';
|
|
104
|
+
import { SidebarMenuButton } from './sidebar';
|
|
105
|
+
import { SidebarMenuItem } from './sidebar';
|
|
106
|
+
import { SidebarMenuSkeleton } from './sidebar';
|
|
107
|
+
import { SidebarMenuSub } from './sidebar';
|
|
108
|
+
import { SidebarMenuSubButton } from './sidebar';
|
|
109
|
+
import { SidebarMenuSubItem } from './sidebar';
|
|
110
|
+
import { SidebarProvider } from './sidebar';
|
|
111
|
+
import { SidebarRail } from './sidebar';
|
|
112
|
+
import { SidebarSeparator } from './sidebar';
|
|
113
|
+
import { SidebarTrigger } from './sidebar';
|
|
114
|
+
import { useSidebar } from './sidebar';
|
|
80
115
|
import { resolveIcon } from './helpers.js';
|
|
81
116
|
import { getCountryName } from './helpers.js';
|
|
82
117
|
import { getStatusType } from './helpers.js';
|
|
@@ -88,4 +123,4 @@ import { FlexRender } from './data-table';
|
|
|
88
123
|
import { createSvelteTable } from './data-table';
|
|
89
124
|
import { renderComponent } from './data-table';
|
|
90
125
|
import { renderSnippet } from './data-table';
|
|
91
|
-
export { Accordion, AlertDialog, BaseButton, BaseCard, BaseCounter, BaseDropdown, BaseFlag, BaseTableActions, Breadcrumbs, ButtonFile, ButtonSearch, ButtonUuidCopy, CardCheckbox, CardRelation, CompanySelector, CounterWidget, DataListItem, DatePicker, DrawerContext, DrawerContextItem, DrawerContextSeparator, DropdownSelect, DropdownSelectGroup, EmptyState, FeedEvents, FeedIconEvent, FeedIconStatus, FeedItem, FeedItemDetail, FeedViewer, GlobalSearch, InputCheckbox, InputError, InputLabel, InputRadio, InputSearch, InputSelect, InputText, InputTextarea, InputToggle, MenuItem, MenuItemCollapsible, Notification, ProfileAvatar, ProgressBar, ProgressBarCircle, SeparatorHorizontal, ShortcutWrapper, Skeleton, SkeletonAvatar, SkeletonCard, SkeletonList, StatusLabel, AvatarIcon, AvatarStack, Table, TableBody, TableCaption, TableFooter, TableHeader, TableRow, TableHead, TableCell, Tabs, TabsContent, TabsList, TabsTrigger, TagBeta, TagProgress, TagSearch, TagStatus, TitleMain, TitleSection, Toaster, Tooltip, TooltipContent, TooltipTrigger, TooltipProvider, TooltipAutoHide, resolveIcon, getCountryName, getStatusType, buttonVariants, DataTable, DataTableToolbar, DataTableViewOptions, FlexRender, createSvelteTable, renderComponent, renderSnippet };
|
|
126
|
+
export { Accordion, AlertDialog, BaseButton, BaseCard, BaseCounter, BaseDropdown, BaseFlag, BaseTableActions, Breadcrumbs, ButtonFile, ButtonSearch, ButtonUuidCopy, CardCheckbox, CardRelation, CompanySelector, CounterWidget, DataListItem, DatePicker, DrawerContext, DrawerContextItem, DrawerContextSeparator, DropdownSelect, DropdownSelectGroup, EmptyState, FeedEvents, FeedIconEvent, FeedIconStatus, FeedItem, FeedItemDetail, FeedViewer, GlobalSearch, InputCheckbox, InputError, InputLabel, InputRadio, InputSearch, InputSelect, InputText, InputTextarea, InputToggle, MenuItem, MenuItemCollapsible, Notification, ProfileAvatar, ProgressBar, ProgressBarCircle, SeparatorHorizontal, ShortcutWrapper, Skeleton, SkeletonAvatar, SkeletonCard, SkeletonList, StatusLabel, AvatarIcon, AvatarStack, Table, TableBody, TableCaption, TableFooter, TableHeader, TableRow, TableHead, TableCell, Tabs, TabsContent, TabsList, TabsTrigger, TagBeta, TagProgress, TagSearch, TagStatus, TitleMain, TitleSection, Toaster, Tooltip, TooltipContent, TooltipTrigger, TooltipProvider, TooltipAutoHide, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, useSidebar, resolveIcon, getCountryName, getStatusType, buttonVariants, DataTable, DataTableToolbar, DataTableViewOptions, FlexRender, createSvelteTable, renderComponent, renderSnippet };
|
package/dist/index.js
CHANGED
|
@@ -69,6 +69,45 @@ import TitleMain from './TitleMain.svelte'
|
|
|
69
69
|
import TitleSection from './TitleSection.svelte'
|
|
70
70
|
import { Toaster } from './sonner'
|
|
71
71
|
import { Tooltip, TooltipContent, TooltipTrigger, TooltipProvider, TooltipAutoHide } from './tooltip'
|
|
72
|
+
import { Separator } from './separator'
|
|
73
|
+
import {
|
|
74
|
+
Sheet,
|
|
75
|
+
SheetClose,
|
|
76
|
+
SheetContent,
|
|
77
|
+
SheetDescription,
|
|
78
|
+
SheetFooter,
|
|
79
|
+
SheetHeader,
|
|
80
|
+
SheetOverlay,
|
|
81
|
+
SheetPortal,
|
|
82
|
+
SheetTitle,
|
|
83
|
+
SheetTrigger
|
|
84
|
+
} from './sheet'
|
|
85
|
+
import {
|
|
86
|
+
Sidebar,
|
|
87
|
+
SidebarContent,
|
|
88
|
+
SidebarFooter,
|
|
89
|
+
SidebarGroup,
|
|
90
|
+
SidebarGroupAction,
|
|
91
|
+
SidebarGroupContent,
|
|
92
|
+
SidebarGroupLabel,
|
|
93
|
+
SidebarHeader,
|
|
94
|
+
SidebarInput,
|
|
95
|
+
SidebarInset,
|
|
96
|
+
SidebarMenu,
|
|
97
|
+
SidebarMenuAction,
|
|
98
|
+
SidebarMenuBadge,
|
|
99
|
+
SidebarMenuButton,
|
|
100
|
+
SidebarMenuItem,
|
|
101
|
+
SidebarMenuSkeleton,
|
|
102
|
+
SidebarMenuSub,
|
|
103
|
+
SidebarMenuSubButton,
|
|
104
|
+
SidebarMenuSubItem,
|
|
105
|
+
SidebarProvider,
|
|
106
|
+
SidebarRail,
|
|
107
|
+
SidebarSeparator,
|
|
108
|
+
SidebarTrigger,
|
|
109
|
+
useSidebar
|
|
110
|
+
} from './sidebar'
|
|
72
111
|
import { resolveIcon, getCountryName, getStatusType } from './helpers.js'
|
|
73
112
|
import { buttonVariants } from './button/button.svelte' // Ensure button styles are included
|
|
74
113
|
import {
|
|
@@ -161,6 +200,41 @@ export {
|
|
|
161
200
|
TooltipTrigger,
|
|
162
201
|
TooltipProvider,
|
|
163
202
|
TooltipAutoHide,
|
|
203
|
+
Separator,
|
|
204
|
+
Sheet,
|
|
205
|
+
SheetClose,
|
|
206
|
+
SheetContent,
|
|
207
|
+
SheetDescription,
|
|
208
|
+
SheetFooter,
|
|
209
|
+
SheetHeader,
|
|
210
|
+
SheetOverlay,
|
|
211
|
+
SheetPortal,
|
|
212
|
+
SheetTitle,
|
|
213
|
+
SheetTrigger,
|
|
214
|
+
Sidebar,
|
|
215
|
+
SidebarContent,
|
|
216
|
+
SidebarFooter,
|
|
217
|
+
SidebarGroup,
|
|
218
|
+
SidebarGroupAction,
|
|
219
|
+
SidebarGroupContent,
|
|
220
|
+
SidebarGroupLabel,
|
|
221
|
+
SidebarHeader,
|
|
222
|
+
SidebarInput,
|
|
223
|
+
SidebarInset,
|
|
224
|
+
SidebarMenu,
|
|
225
|
+
SidebarMenuAction,
|
|
226
|
+
SidebarMenuBadge,
|
|
227
|
+
SidebarMenuButton,
|
|
228
|
+
SidebarMenuItem,
|
|
229
|
+
SidebarMenuSkeleton,
|
|
230
|
+
SidebarMenuSub,
|
|
231
|
+
SidebarMenuSubButton,
|
|
232
|
+
SidebarMenuSubItem,
|
|
233
|
+
SidebarProvider,
|
|
234
|
+
SidebarRail,
|
|
235
|
+
SidebarSeparator,
|
|
236
|
+
SidebarTrigger,
|
|
237
|
+
useSidebar,
|
|
164
238
|
resolveIcon,
|
|
165
239
|
getCountryName,
|
|
166
240
|
getStatusType,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Separator as SeparatorPrimitive } from 'bits-ui'
|
|
3
|
+
import { cn } from '../utils.js'
|
|
4
|
+
|
|
5
|
+
let {
|
|
6
|
+
ref = $bindable(null),
|
|
7
|
+
class: className,
|
|
8
|
+
'data-slot': dataSlot = 'separator',
|
|
9
|
+
...restProps
|
|
10
|
+
}: SeparatorPrimitive.RootProps = $props()
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<SeparatorPrimitive.Root
|
|
14
|
+
bind:ref
|
|
15
|
+
data-slot={dataSlot}
|
|
16
|
+
class={cn(
|
|
17
|
+
'bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:h-full',
|
|
18
|
+
className
|
|
19
|
+
)}
|
|
20
|
+
{...restProps}
|
|
21
|
+
/>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import Root from './sheet.svelte';
|
|
2
|
+
import Portal from './sheet-portal.svelte';
|
|
3
|
+
import Trigger from './sheet-trigger.svelte';
|
|
4
|
+
import Close from './sheet-close.svelte';
|
|
5
|
+
import Overlay from './sheet-overlay.svelte';
|
|
6
|
+
import Content from './sheet-content.svelte';
|
|
7
|
+
import Header from './sheet-header.svelte';
|
|
8
|
+
import Footer from './sheet-footer.svelte';
|
|
9
|
+
import Title from './sheet-title.svelte';
|
|
10
|
+
import Description from './sheet-description.svelte';
|
|
11
|
+
export { Root, Close, Trigger, Portal, Overlay, Content, Header, Footer, Title, Description, Root as Sheet, Close as SheetClose, Trigger as SheetTrigger, Portal as SheetPortal, Overlay as SheetOverlay, Content as SheetContent, Header as SheetHeader, Footer as SheetFooter, Title as SheetTitle, Description as SheetDescription };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import Root from './sheet.svelte';
|
|
2
|
+
import Portal from './sheet-portal.svelte';
|
|
3
|
+
import Trigger from './sheet-trigger.svelte';
|
|
4
|
+
import Close from './sheet-close.svelte';
|
|
5
|
+
import Overlay from './sheet-overlay.svelte';
|
|
6
|
+
import Content from './sheet-content.svelte';
|
|
7
|
+
import Header from './sheet-header.svelte';
|
|
8
|
+
import Footer from './sheet-footer.svelte';
|
|
9
|
+
import Title from './sheet-title.svelte';
|
|
10
|
+
import Description from './sheet-description.svelte';
|
|
11
|
+
export { Root, Close, Trigger, Portal, Overlay, Content, Header, Footer, Title, Description,
|
|
12
|
+
//
|
|
13
|
+
Root as Sheet, Close as SheetClose, Trigger as SheetTrigger, Portal as SheetPortal, Overlay as SheetOverlay, Content as SheetContent, Header as SheetHeader, Footer as SheetFooter, Title as SheetTitle, Description as SheetDescription };
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
export type Side = 'top' | 'right' | 'bottom' | 'left'
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<script lang="ts">
|
|
6
|
+
import { Dialog as SheetPrimitive } from 'bits-ui'
|
|
7
|
+
import { Close } from '@invopop/ui-icons'
|
|
8
|
+
import { Icon } from '@steeze-ui/svelte-icon'
|
|
9
|
+
import type { Snippet } from 'svelte'
|
|
10
|
+
import SheetPortal from './sheet-portal.svelte'
|
|
11
|
+
import SheetOverlay from './sheet-overlay.svelte'
|
|
12
|
+
import { cn, type WithoutChildrenOrChild } from '../utils.js'
|
|
13
|
+
import type { ComponentProps } from 'svelte'
|
|
14
|
+
|
|
15
|
+
let {
|
|
16
|
+
ref = $bindable(null),
|
|
17
|
+
class: className,
|
|
18
|
+
side = 'right',
|
|
19
|
+
showCloseButton = true,
|
|
20
|
+
portalProps,
|
|
21
|
+
children,
|
|
22
|
+
...restProps
|
|
23
|
+
}: WithoutChildrenOrChild<SheetPrimitive.ContentProps> & {
|
|
24
|
+
portalProps?: WithoutChildrenOrChild<ComponentProps<typeof SheetPortal>>
|
|
25
|
+
side?: Side
|
|
26
|
+
showCloseButton?: boolean
|
|
27
|
+
children: Snippet
|
|
28
|
+
} = $props()
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<SheetPortal {...portalProps}>
|
|
32
|
+
<SheetOverlay />
|
|
33
|
+
<SheetPrimitive.Content
|
|
34
|
+
bind:ref
|
|
35
|
+
data-slot="sheet-content"
|
|
36
|
+
data-side={side}
|
|
37
|
+
class={cn(
|
|
38
|
+
'bg-background text-foreground fixed z-50 flex flex-col gap-4 bg-clip-padding text-sm shadow-lg transition duration-200 ease-in-out',
|
|
39
|
+
'data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t',
|
|
40
|
+
'data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r',
|
|
41
|
+
'data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l',
|
|
42
|
+
'data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b',
|
|
43
|
+
'data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm',
|
|
44
|
+
'data-[state=open]:animate-in data-[state=open]:fade-in-0',
|
|
45
|
+
'data-[state=closed]:animate-out data-[state=closed]:fade-out-0',
|
|
46
|
+
'data-[side=bottom]:data-[state=open]:slide-in-from-bottom data-[side=bottom]:data-[state=closed]:slide-out-to-bottom',
|
|
47
|
+
'data-[side=left]:data-[state=open]:slide-in-from-left data-[side=left]:data-[state=closed]:slide-out-to-left',
|
|
48
|
+
'data-[side=right]:data-[state=open]:slide-in-from-right data-[side=right]:data-[state=closed]:slide-out-to-right',
|
|
49
|
+
'data-[side=top]:data-[state=open]:slide-in-from-top data-[side=top]:data-[state=closed]:slide-out-to-top',
|
|
50
|
+
className
|
|
51
|
+
)}
|
|
52
|
+
{...restProps}
|
|
53
|
+
>
|
|
54
|
+
{@render children?.()}
|
|
55
|
+
{#if showCloseButton}
|
|
56
|
+
<SheetPrimitive.Close
|
|
57
|
+
data-slot="sheet-close"
|
|
58
|
+
class="absolute top-4 right-4 rounded-md p-1 opacity-70 transition-opacity hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
59
|
+
>
|
|
60
|
+
<Icon src={Close} class="size-4" />
|
|
61
|
+
<span class="sr-only">Close</span>
|
|
62
|
+
</SheetPrimitive.Close>
|
|
63
|
+
{/if}
|
|
64
|
+
</SheetPrimitive.Content>
|
|
65
|
+
</SheetPortal>
|