@invopop/popui 0.1.35 → 0.1.41
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/BaseButton.svelte +4 -0
- package/dist/BaseDropdown.svelte +42 -3
- package/dist/BaseDropdown.svelte.d.ts +1 -0
- package/dist/BaseTableHeaderOrderBy.svelte +35 -12
- package/dist/ButtonSearch.svelte +82 -0
- package/dist/ButtonSearch.svelte.d.ts +4 -0
- package/dist/ButtonUuidCopy.svelte +1 -0
- package/dist/DatePicker.svelte +96 -27
- package/dist/DatePicker.svelte.d.ts +5 -1
- package/dist/DrawerContext.svelte +443 -34
- package/dist/DrawerContextItem.svelte +36 -29
- package/dist/DropdownSelect.svelte +68 -18
- package/dist/DropdownSelect.svelte.d.ts +4 -1
- package/dist/DropdownSelectGroup.svelte +15 -0
- package/dist/DropdownSelectGroup.svelte.d.ts +7 -0
- package/dist/EmptyState.svelte +6 -2
- package/dist/InputSearch.svelte +45 -5
- package/dist/InputSelect.svelte +12 -3
- package/dist/InputText.svelte +25 -8
- package/dist/InputToggle.svelte +23 -6
- package/dist/StepIcon.svelte +35 -0
- package/dist/StepIcon.svelte.d.ts +4 -0
- package/dist/StepIconList.svelte +24 -31
- package/dist/TagStatus.svelte +1 -1
- package/dist/button/button.svelte +34 -3
- package/dist/button/button.svelte.d.ts +29 -0
- package/dist/clickOutside.d.ts +5 -2
- package/dist/clickOutside.js +9 -3
- package/dist/data-table/cells/boolean-cell.svelte +29 -0
- package/dist/data-table/cells/boolean-cell.svelte.d.ts +8 -0
- package/dist/data-table/cells/cell-skeleton.svelte +35 -0
- package/dist/data-table/cells/cell-skeleton.svelte.d.ts +4 -0
- package/dist/data-table/cells/currency-cell.svelte +10 -0
- package/dist/data-table/cells/currency-cell.svelte.d.ts +8 -0
- package/dist/data-table/cells/date-cell.svelte +10 -0
- package/dist/data-table/cells/date-cell.svelte.d.ts +8 -0
- package/dist/data-table/cells/tag-cell.svelte +12 -0
- package/dist/data-table/cells/tag-cell.svelte.d.ts +8 -0
- package/dist/data-table/cells/text-cell.svelte +10 -0
- package/dist/data-table/cells/text-cell.svelte.d.ts +8 -0
- package/dist/data-table/cells/uuid-cell.svelte +17 -0
- package/dist/data-table/cells/uuid-cell.svelte.d.ts +8 -0
- package/dist/data-table/column-definitions.d.ts +12 -0
- package/dist/data-table/column-definitions.js +42 -0
- package/dist/data-table/column-sizing-helpers.d.ts +6 -0
- package/dist/data-table/column-sizing-helpers.js +24 -0
- package/dist/data-table/create-columns.d.ts +3 -0
- package/dist/data-table/create-columns.js +67 -0
- package/dist/data-table/data-table-cell.svelte +94 -0
- package/dist/data-table/data-table-cell.svelte.d.ts +25 -0
- package/dist/data-table/data-table-header-cell.svelte +188 -0
- package/dist/data-table/data-table-header-cell.svelte.d.ts +25 -0
- package/dist/data-table/data-table-helpers.d.ts +10 -0
- package/dist/data-table/data-table-helpers.js +124 -0
- package/dist/data-table/data-table-pagination.svelte +221 -0
- package/dist/data-table/data-table-pagination.svelte.d.ts +4 -0
- package/dist/data-table/data-table-row.svelte +57 -0
- package/dist/data-table/data-table-row.svelte.d.ts +25 -0
- package/dist/data-table/data-table-svelte.svelte.d.ts +40 -0
- package/dist/data-table/data-table-svelte.svelte.js +115 -0
- package/dist/data-table/data-table-toolbar.svelte +19 -0
- package/dist/data-table/data-table-toolbar.svelte.d.ts +32 -0
- package/dist/data-table/data-table-types.d.ts +196 -0
- package/dist/data-table/data-table-types.js +1 -0
- package/dist/data-table/data-table-view-options.svelte +126 -0
- package/dist/data-table/data-table-view-options.svelte.d.ts +29 -0
- package/dist/data-table/data-table.svelte +437 -0
- package/dist/data-table/data-table.svelte.d.ts +25 -0
- package/dist/data-table/flex-render.svelte +40 -0
- package/dist/data-table/flex-render.svelte.d.ts +33 -0
- package/dist/data-table/index.d.ts +13 -0
- package/dist/data-table/index.js +13 -0
- package/dist/data-table/render-helpers.d.ts +90 -0
- package/dist/data-table/render-helpers.js +99 -0
- package/dist/data-table/table-setup.d.ts +39 -0
- package/dist/data-table/table-setup.js +151 -0
- package/dist/data-table/table-styles.d.ts +17 -0
- package/dist/data-table/table-styles.js +70 -0
- package/dist/drawer-dnd-helpers.d.ts +30 -0
- package/dist/drawer-dnd-helpers.js +72 -0
- package/dist/helpers.d.ts +1 -0
- package/dist/helpers.js +3 -0
- package/dist/index.d.ts +15 -3
- package/dist/index.js +28 -5
- package/dist/skeleton/index.d.ts +5 -0
- package/dist/skeleton/index.js +7 -0
- package/dist/skeleton/skeleton-avatar.svelte +14 -0
- package/dist/skeleton/skeleton-avatar.svelte.d.ts +7 -0
- package/dist/skeleton/skeleton-card.svelte +22 -0
- package/dist/skeleton/skeleton-card.svelte.d.ts +9 -0
- package/dist/skeleton/skeleton-list.svelte +25 -0
- package/dist/skeleton/skeleton-list.svelte.d.ts +8 -0
- package/dist/skeleton/skeleton.svelte +17 -0
- package/dist/skeleton/skeleton.svelte.d.ts +5 -0
- package/dist/svg/IconDelivery.svelte +1 -1
- package/dist/svg/IconOrder.svelte +1 -1
- package/dist/svg/IconPayment.svelte +1 -1
- package/dist/table/table-cell.svelte +4 -2
- package/dist/table/table-head.svelte +4 -2
- package/dist/table/table-header.svelte +1 -1
- package/dist/table/table-row.svelte +4 -2
- package/dist/table/table.svelte +2 -2
- package/dist/tailwind.theme.css +30 -6
- package/dist/tooltip/index.d.ts +2 -1
- package/dist/tooltip/index.js +3 -2
- package/dist/tooltip/tooltip-auto-hide.svelte +31 -0
- package/dist/tooltip/tooltip-auto-hide.svelte.d.ts +7 -0
- package/dist/types.d.ts +51 -73
- package/package.json +14 -8
- package/dist/BaseTable.svelte +0 -391
- package/dist/BaseTable.svelte.d.ts +0 -4
- package/dist/BaseTableCellContent.svelte +0 -58
- package/dist/BaseTableCellContent.svelte.d.ts +0 -4
- package/dist/BaseTableCheckbox.svelte +0 -33
- package/dist/BaseTableCheckbox.svelte.d.ts +0 -4
- package/dist/BaseTableHeaderContent.svelte +0 -67
- package/dist/BaseTableHeaderContent.svelte.d.ts +0 -4
- package/dist/BaseTableRow.svelte +0 -127
- package/dist/BaseTableRow.svelte.d.ts +0 -4
package/dist/BaseButton.svelte
CHANGED
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
shortcut = false,
|
|
15
15
|
fullwidth = false,
|
|
16
16
|
notification = false,
|
|
17
|
+
stackedLeft = false,
|
|
18
|
+
stackedRight = false,
|
|
17
19
|
children,
|
|
18
20
|
onclick,
|
|
19
21
|
class: className,
|
|
@@ -30,6 +32,8 @@
|
|
|
30
32
|
iconClass,
|
|
31
33
|
type,
|
|
32
34
|
disabled,
|
|
35
|
+
stackedLeft,
|
|
36
|
+
stackedRight,
|
|
33
37
|
onclick,
|
|
34
38
|
class: `${fullWidthClass} ${className || ''}`,
|
|
35
39
|
...rest
|
package/dist/BaseDropdown.svelte
CHANGED
|
@@ -4,18 +4,23 @@
|
|
|
4
4
|
import { clickOutside } from './clickOutside.js'
|
|
5
5
|
import { portal } from 'svelte-portal'
|
|
6
6
|
import type { BaseDropdownProps } from './types.js'
|
|
7
|
+
import type { TransitionConfig } from 'svelte/transition'
|
|
7
8
|
|
|
8
9
|
let {
|
|
9
10
|
isOpen = $bindable(false),
|
|
10
11
|
fullWidth = false,
|
|
11
12
|
placement = 'bottom-start',
|
|
12
13
|
matchParentWidth = false,
|
|
14
|
+
usePortal = true,
|
|
13
15
|
class: className = '',
|
|
14
16
|
trigger,
|
|
15
17
|
children,
|
|
16
18
|
...rest
|
|
17
19
|
}: BaseDropdownProps = $props()
|
|
18
20
|
|
|
21
|
+
// Conditional portal action - noop if disabled
|
|
22
|
+
const conditionalPortal = usePortal ? portal : () => {}
|
|
23
|
+
|
|
19
24
|
const middleware = [offset(6), flip(), shift()]
|
|
20
25
|
|
|
21
26
|
if (matchParentWidth) {
|
|
@@ -31,18 +36,51 @@
|
|
|
31
36
|
)
|
|
32
37
|
}
|
|
33
38
|
|
|
39
|
+
let closedFromClickOutside = $state(false)
|
|
40
|
+
|
|
41
|
+
// Create floating actions with strategy based on usePortal
|
|
42
|
+
const strategy = usePortal ? 'absolute' : 'fixed'
|
|
34
43
|
const [floatingRef, floatingContent] = createFloatingActions({
|
|
35
|
-
strategy
|
|
44
|
+
strategy,
|
|
36
45
|
placement,
|
|
37
46
|
middleware
|
|
38
47
|
})
|
|
39
48
|
|
|
40
|
-
|
|
49
|
+
// Custom transition that mimics shadcn style
|
|
50
|
+
function dropdownTransition(
|
|
51
|
+
node: HTMLElement,
|
|
52
|
+
{ duration = 70 }: { duration?: number } = {}
|
|
53
|
+
): TransitionConfig {
|
|
54
|
+
const side = placement.split('-')[0]
|
|
55
|
+
|
|
56
|
+
// Calculate slide direction
|
|
57
|
+
let slideY = 0
|
|
58
|
+
let slideX = 0
|
|
59
|
+
if (side === 'bottom') slideY = -8
|
|
60
|
+
if (side === 'top') slideY = 8
|
|
61
|
+
if (side === 'left') slideX = 8
|
|
62
|
+
if (side === 'right') slideX = -8
|
|
63
|
+
|
|
64
|
+
return {
|
|
65
|
+
duration,
|
|
66
|
+
css: (t) => {
|
|
67
|
+
const eased = t * (2 - t) // ease-out
|
|
68
|
+
return `
|
|
69
|
+
opacity: ${eased};
|
|
70
|
+
transform: scale(${0.95 + eased * 0.05}) translate(${slideX * (1 - eased)}px, ${slideY * (1 - eased)}px);
|
|
71
|
+
`
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
41
75
|
|
|
42
76
|
export const toggle = () => {
|
|
43
77
|
isOpen = !isOpen
|
|
44
78
|
}
|
|
45
79
|
|
|
80
|
+
export const close = () => {
|
|
81
|
+
isOpen = false
|
|
82
|
+
}
|
|
83
|
+
|
|
46
84
|
function handleClick(event: MouseEvent) {
|
|
47
85
|
event.stopPropagation()
|
|
48
86
|
if (closedFromClickOutside) return
|
|
@@ -62,7 +100,7 @@
|
|
|
62
100
|
{#if isOpen}
|
|
63
101
|
<div
|
|
64
102
|
class="max-h-40 absolute z-1001"
|
|
65
|
-
use:
|
|
103
|
+
use:conditionalPortal
|
|
66
104
|
use:floatingContent
|
|
67
105
|
use:clickOutside
|
|
68
106
|
onclick_outside={() => {
|
|
@@ -72,6 +110,7 @@
|
|
|
72
110
|
}, 100)
|
|
73
111
|
isOpen = false
|
|
74
112
|
}}
|
|
113
|
+
transition:dropdownTransition={{ duration: 70 }}
|
|
75
114
|
>
|
|
76
115
|
{@render children?.()}
|
|
77
116
|
</div>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { BaseDropdownProps } from './types.js';
|
|
2
2
|
declare const BaseDropdown: import("svelte").Component<BaseDropdownProps, {
|
|
3
3
|
toggle: () => void;
|
|
4
|
+
close: () => void;
|
|
4
5
|
}, "isOpen">;
|
|
5
6
|
type BaseDropdown = ReturnType<typeof BaseDropdown>;
|
|
6
7
|
export default BaseDropdown;
|
|
@@ -1,24 +1,47 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { SortAscending, SortDescending } from '@invopop/ui-icons'
|
|
2
|
+
import { SortAscending, SortDescending, Preview, Filter, Lock } from '@invopop/ui-icons'
|
|
3
3
|
import type { TableSortBy, DrawerOption, BaseTableHeaderOrderByProps } from './types.js'
|
|
4
4
|
import DrawerContext from './DrawerContext.svelte'
|
|
5
5
|
|
|
6
|
-
let { isActive = false, sortDirection, onOrderBy }: BaseTableHeaderOrderByProps = $props()
|
|
6
|
+
let { isActive = false, sortDirection, onOrderBy, onHide, onFilter, onFreeze, isFrozen = false, showSortOptions = true, showFilterOption = true }: BaseTableHeaderOrderByProps = $props()
|
|
7
7
|
|
|
8
|
-
let items = $derived(
|
|
9
|
-
[
|
|
10
|
-
{
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
8
|
+
let items = $derived([
|
|
9
|
+
...(showSortOptions ? [
|
|
10
|
+
{
|
|
11
|
+
icon: SortAscending,
|
|
12
|
+
label: 'Sort Ascending',
|
|
13
|
+
value: 'asc',
|
|
14
|
+
selected: isActive && sortDirection === 'asc'
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
icon: SortDescending,
|
|
18
|
+
label: 'Sort Descending',
|
|
19
|
+
value: 'desc',
|
|
20
|
+
selected: isActive && sortDirection === 'desc'
|
|
21
|
+
},
|
|
22
|
+
{ label: '', value: 'sep-1', separator: true }
|
|
23
|
+
] : []),
|
|
24
|
+
...(showFilterOption ? [
|
|
25
|
+
{ icon: Filter, label: 'Filter by column', value: 'filter' },
|
|
26
|
+
{ label: '', value: 'sep-2', separator: true }
|
|
27
|
+
] : []),
|
|
28
|
+
{ icon: Lock, label: isFrozen ? 'Unfreeze column' : 'Freeze column', value: 'freeze' },
|
|
29
|
+
{ label: '', value: 'sep-3', separator: true },
|
|
30
|
+
{ icon: Preview, label: 'Hide column', value: 'hide' }
|
|
31
|
+
] as DrawerOption[])
|
|
17
32
|
</script>
|
|
18
33
|
|
|
19
34
|
<DrawerContext
|
|
20
35
|
{items}
|
|
21
36
|
onclick={(e) => {
|
|
22
|
-
|
|
37
|
+
if (e === 'hide') {
|
|
38
|
+
onHide?.()
|
|
39
|
+
} else if (e === 'filter') {
|
|
40
|
+
onFilter?.()
|
|
41
|
+
} else if (e === 'freeze') {
|
|
42
|
+
onFreeze?.()
|
|
43
|
+
} else {
|
|
44
|
+
onOrderBy?.(e as TableSortBy)
|
|
45
|
+
}
|
|
23
46
|
}}
|
|
24
47
|
/>
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Search, Pulse } from '@invopop/ui-icons'
|
|
3
|
+
import BaseButton from './BaseButton.svelte'
|
|
4
|
+
import InputSearch from './InputSearch.svelte'
|
|
5
|
+
import { clickOutside } from './clickOutside.js'
|
|
6
|
+
import type { ButtonSearchProps } from './types.js'
|
|
7
|
+
|
|
8
|
+
let {
|
|
9
|
+
value = $bindable(''),
|
|
10
|
+
expanded = $bindable(false),
|
|
11
|
+
placeholder = 'Search...',
|
|
12
|
+
size = 'sm',
|
|
13
|
+
loading = false,
|
|
14
|
+
autofocus = false,
|
|
15
|
+
oninput,
|
|
16
|
+
onExpand,
|
|
17
|
+
onCollapse
|
|
18
|
+
}: ButtonSearchProps = $props()
|
|
19
|
+
|
|
20
|
+
let inputSearch: InputSearch | undefined = $state()
|
|
21
|
+
let isLoadingCollapsed = $derived(loading && !expanded)
|
|
22
|
+
|
|
23
|
+
function handleExpand() {
|
|
24
|
+
expanded = true
|
|
25
|
+
onExpand?.()
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function handleClickOutside() {
|
|
29
|
+
if (expanded && value.trim() === '') {
|
|
30
|
+
expanded = false
|
|
31
|
+
onCollapse?.()
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function handleInput(newValue: string) {
|
|
36
|
+
value = newValue
|
|
37
|
+
oninput?.(newValue)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
$effect(() => {
|
|
41
|
+
if (expanded && inputSearch) {
|
|
42
|
+
inputSearch.focus()
|
|
43
|
+
}
|
|
44
|
+
})
|
|
45
|
+
</script>
|
|
46
|
+
|
|
47
|
+
<div
|
|
48
|
+
class="overflow-hidden transition-all duration-150 ease-in-out relative rounded-md"
|
|
49
|
+
class:w-[280px]={expanded}
|
|
50
|
+
class:w-10={!expanded}
|
|
51
|
+
use:clickOutside
|
|
52
|
+
onclick_outside={handleClickOutside}
|
|
53
|
+
>
|
|
54
|
+
<div
|
|
55
|
+
class="w-[280px] transition-opacity duration-100 absolute left-0 top-0"
|
|
56
|
+
class:opacity-0={!expanded}
|
|
57
|
+
class:opacity-100={expanded}
|
|
58
|
+
class:pointer-events-none={!expanded}
|
|
59
|
+
>
|
|
60
|
+
<InputSearch
|
|
61
|
+
bind:this={inputSearch}
|
|
62
|
+
bind:value
|
|
63
|
+
{placeholder}
|
|
64
|
+
{size}
|
|
65
|
+
{loading}
|
|
66
|
+
{autofocus}
|
|
67
|
+
oninput={handleInput}
|
|
68
|
+
/>
|
|
69
|
+
</div>
|
|
70
|
+
<div
|
|
71
|
+
class="transition-opacity duration-100"
|
|
72
|
+
class:opacity-0={expanded}
|
|
73
|
+
class:opacity-100={!expanded}
|
|
74
|
+
class:pointer-events-none={expanded}
|
|
75
|
+
>
|
|
76
|
+
<BaseButton
|
|
77
|
+
icon={isLoadingCollapsed ? Pulse : Search}
|
|
78
|
+
class={isLoadingCollapsed ? 'pulse-icon' : ''}
|
|
79
|
+
onclick={handleExpand}
|
|
80
|
+
/>
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
package/dist/DatePicker.svelte
CHANGED
|
@@ -3,13 +3,17 @@
|
|
|
3
3
|
import RangeCalendar from './range-calendar/range-calendar.svelte'
|
|
4
4
|
import { parseDate, type DateValue } from '@internationalized/date'
|
|
5
5
|
import type { DateRange } from 'bits-ui'
|
|
6
|
-
import { Icon } from '@steeze-ui/svelte-icon'
|
|
7
|
-
import { Calendar } from '@invopop/ui-icons'
|
|
6
|
+
import { Icon, type IconSource } from '@steeze-ui/svelte-icon'
|
|
8
7
|
import Transition from 'svelte-transition'
|
|
9
8
|
import type { DatePickerProps } from './types'
|
|
10
9
|
import { clickOutside } from './clickOutside'
|
|
11
10
|
import BaseButton from './BaseButton.svelte'
|
|
12
|
-
import { datesFromToday, toCalendarDate } from './helpers'
|
|
11
|
+
import { datesFromToday, toCalendarDate, resolveIcon } from './helpers'
|
|
12
|
+
import { buttonVariants } from './button/button.svelte'
|
|
13
|
+
import { offset, flip, shift } from 'svelte-floating-ui/dom'
|
|
14
|
+
import { createFloatingActions } from 'svelte-floating-ui'
|
|
15
|
+
import { portal } from 'svelte-portal'
|
|
16
|
+
import { cn } from './utils'
|
|
13
17
|
|
|
14
18
|
const {
|
|
15
19
|
startOfThisWeek,
|
|
@@ -109,25 +113,50 @@
|
|
|
109
113
|
|
|
110
114
|
let {
|
|
111
115
|
label = 'Date',
|
|
112
|
-
|
|
116
|
+
placement = 'bottom-start',
|
|
113
117
|
from = '',
|
|
114
118
|
to = '',
|
|
115
|
-
onSelect
|
|
119
|
+
onSelect,
|
|
120
|
+
stackLeft = false,
|
|
121
|
+
stackRight = false,
|
|
122
|
+
icon = undefined,
|
|
123
|
+
iconTheme = 'default',
|
|
124
|
+
isOpen = $bindable(false)
|
|
116
125
|
}: DatePickerProps = $props()
|
|
117
126
|
|
|
127
|
+
const [floatingRef, floatingContent] = createFloatingActions({
|
|
128
|
+
strategy: 'absolute',
|
|
129
|
+
placement,
|
|
130
|
+
middleware: [offset(8), flip(), shift()]
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
let resolvedIcon: IconSource | undefined = $state()
|
|
134
|
+
|
|
135
|
+
$effect(() => {
|
|
136
|
+
resolveIcon(icon).then((res) => (resolvedIcon = res))
|
|
137
|
+
})
|
|
138
|
+
|
|
118
139
|
let selectedPeriod = $state('custom')
|
|
119
140
|
let value = $state<DateRange>({
|
|
120
141
|
start: undefined,
|
|
121
142
|
end: undefined
|
|
122
143
|
})
|
|
123
|
-
let
|
|
144
|
+
let selectedLabel = $state(label)
|
|
145
|
+
let isStacked = $derived(stackLeft || stackRight)
|
|
146
|
+
let hasSelectedDates = $derived(value.start !== undefined)
|
|
147
|
+
let hasConfirmedDates = $derived(selectedLabel !== label)
|
|
124
148
|
let styles = $derived(
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
149
|
+
isStacked
|
|
150
|
+
? buttonVariants({
|
|
151
|
+
variant: 'ghost',
|
|
152
|
+
stackedLeft: stackLeft,
|
|
153
|
+
stackedRight: stackRight
|
|
154
|
+
})
|
|
155
|
+
: clsx('border backdrop-blur-sm backdrop-filter', {
|
|
156
|
+
'border-border-selected-bold shadow-active': isOpen,
|
|
157
|
+
'border-border-default-secondary hover:border-border-default-secondary-hover': !isOpen
|
|
158
|
+
})
|
|
129
159
|
)
|
|
130
|
-
let selectedLabel = $state(label)
|
|
131
160
|
|
|
132
161
|
$effect(() => {
|
|
133
162
|
if (!value.end) {
|
|
@@ -137,9 +166,19 @@
|
|
|
137
166
|
|
|
138
167
|
$effect(() => {
|
|
139
168
|
if (from) {
|
|
169
|
+
const startDate = parseDate(from)
|
|
170
|
+
const endDate = to ? parseDate(to) : undefined
|
|
171
|
+
|
|
140
172
|
value = {
|
|
141
|
-
start:
|
|
142
|
-
end:
|
|
173
|
+
start: startDate,
|
|
174
|
+
end: endDate
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Update label directly without calling getLabel() to avoid circular dependency
|
|
178
|
+
if (startDate === endDate) {
|
|
179
|
+
selectedLabel = getDisplayFromValue(startDate)
|
|
180
|
+
} else {
|
|
181
|
+
selectedLabel = `${getDisplayFromValue(startDate)} → ${getDisplayFromValue(endDate)}`
|
|
143
182
|
}
|
|
144
183
|
return
|
|
145
184
|
}
|
|
@@ -180,22 +219,52 @@
|
|
|
180
219
|
|
|
181
220
|
onSelect?.({ from: value.start?.toString() || '', to: value.end?.toString() || '' })
|
|
182
221
|
}
|
|
222
|
+
|
|
223
|
+
// Exposed methods
|
|
224
|
+
export function open() {
|
|
225
|
+
isOpen = true
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export function close() {
|
|
229
|
+
isOpen = false
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
export function toggle() {
|
|
233
|
+
isOpen = !isOpen
|
|
234
|
+
}
|
|
183
235
|
</script>
|
|
184
236
|
|
|
185
237
|
<div>
|
|
186
|
-
<
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
238
|
+
<button
|
|
239
|
+
use:floatingRef
|
|
240
|
+
onclick={() => {
|
|
241
|
+
isOpen = !isOpen
|
|
242
|
+
}}
|
|
243
|
+
class="{styles} {isStacked
|
|
244
|
+
? 'h-7 py-1.5'
|
|
245
|
+
: 'py-1.5'} datepicker-trigger flex items-center w-full {resolvedIcon
|
|
246
|
+
? 'pl-7'
|
|
247
|
+
: 'pl-2'} pr-2 text-left rounded-lg bg-background cursor-pointer relative overflow-hidden"
|
|
248
|
+
>
|
|
249
|
+
{#if resolvedIcon}
|
|
250
|
+
<Icon
|
|
251
|
+
src={resolvedIcon}
|
|
252
|
+
theme={iconTheme}
|
|
253
|
+
class="h-4 w-4 absolute top-1.5 left-2 text-foreground-default-secondary"
|
|
254
|
+
/>
|
|
255
|
+
{/if}
|
|
256
|
+
<span
|
|
257
|
+
class={clsx('flex-1 text-base truncate', {
|
|
258
|
+
'text-foreground': hasConfirmedDates,
|
|
259
|
+
'text-foreground-default-secondary': !hasConfirmedDates,
|
|
260
|
+
'font-normal': isStacked && !hasConfirmedDates
|
|
261
|
+
})}
|
|
192
262
|
>
|
|
193
263
|
{selectedLabel}
|
|
194
|
-
</
|
|
195
|
-
|
|
196
|
-
</div>
|
|
264
|
+
</span>
|
|
265
|
+
</button>
|
|
197
266
|
|
|
198
|
-
|
|
267
|
+
{#if isOpen}
|
|
199
268
|
<Transition
|
|
200
269
|
show={isOpen}
|
|
201
270
|
enter="transition ease-out duration-100"
|
|
@@ -207,9 +276,9 @@
|
|
|
207
276
|
>
|
|
208
277
|
<!-- @ts-ignore -->
|
|
209
278
|
<div
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
class="bg-background inline-flex flex-col shadow-lg rounded-xl absolute
|
|
279
|
+
use:portal
|
|
280
|
+
use:floatingContent
|
|
281
|
+
class="bg-background inline-flex flex-col shadow-lg rounded-xl absolute z-1001 border border-border"
|
|
213
282
|
use:clickOutside
|
|
214
283
|
onclick_outside={() => {
|
|
215
284
|
if (!isOpen) return
|
|
@@ -239,5 +308,5 @@
|
|
|
239
308
|
</div>
|
|
240
309
|
</div>
|
|
241
310
|
</Transition>
|
|
242
|
-
|
|
311
|
+
{/if}
|
|
243
312
|
</div>
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import type { DatePickerProps } from './types';
|
|
2
|
-
declare const DatePicker: import("svelte").Component<DatePickerProps, {
|
|
2
|
+
declare const DatePicker: import("svelte").Component<DatePickerProps, {
|
|
3
|
+
open: () => void;
|
|
4
|
+
close: () => void;
|
|
5
|
+
toggle: () => void;
|
|
6
|
+
}, "isOpen">;
|
|
3
7
|
type DatePicker = ReturnType<typeof DatePicker>;
|
|
4
8
|
export default DatePicker;
|