winduum 3.0.0-next.1 → 3.0.0-next.10
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/main.css +1 -1
- package/dist/tailwind.css +2 -1
- package/package.json +28 -19
- package/src/base/defaults.css +3 -0
- package/src/base/keyframes.css +32 -0
- package/src/common.d.ts +4 -0
- package/src/components/carousel/content.css +1 -0
- package/src/components/carousel/index.d.ts +14 -35
- package/src/components/carousel/index.js +75 -194
- package/src/components/check/props/default.css +1 -1
- package/src/components/control/props/select-picker.css +4 -4
- package/src/components/control/props/select.css +2 -2
- package/src/components/control/tel-country-code.css +24 -0
- package/src/components/details/index.d.ts +5 -0
- package/src/components/details/index.js +13 -0
- package/src/components/details/readme.md +2 -5
- package/src/components/dialog/content.css +0 -1
- package/src/components/dialog/drawer.css +20 -0
- package/src/components/dialog/index.css +1 -0
- package/src/components/dialog/index.js +4 -0
- package/src/components/drawer/content.css +2 -1
- package/src/components/drawer/default.css +13 -31
- package/src/components/drawer/index.css +3 -0
- package/src/components/drawer/index.d.ts +8 -15
- package/src/components/drawer/index.js +67 -50
- package/src/components/drawer/keyframes/default.css +9 -0
- package/src/components/drawer/noscript.css +32 -0
- package/src/components/drawer/nosnap.css +32 -0
- package/src/components/drawer/props/content.css +2 -2
- package/src/components/drawer/props/default.css +6 -0
- package/src/components/drawer/scroller.css +32 -0
- package/src/components/form/index.d.ts +5 -12
- package/src/components/form/index.js +35 -70
- package/src/components/heading/lg.css +1 -1
- package/src/components/heading/props/default.css +1 -1
- package/src/components/heading/sm.css +1 -1
- package/src/components/label/props/default.css +3 -2
- package/src/components/popover/content.css +2 -0
- package/src/components/popover/default.css +1 -1
- package/src/components/popover/index.css +1 -0
- package/src/components/popover/tooltip.css +11 -0
- package/src/components/tabs/index.d.ts +2 -2
- package/src/components/text/content.css +241 -0
- package/src/components/text/default.css +0 -238
- package/src/components/text/index.css +2 -0
- package/src/components/text/props/content.css +9 -0
- package/src/components/text/props/default.css +1 -7
- package/src/components/toast/default.css +6 -0
- package/src/components/toast/index.js +2 -1
- package/src/components/toaster/index.d.ts +1 -0
- package/src/components/toaster/index.js +18 -0
- package/src/polyfill.js +13 -0
- package/src/polyfills/timelineTrigger.js +54 -0
- package/src/supports.js +24 -0
- package/src/utilities/container/props/default.css +3 -3
- package/tailwindcss/theme/config/radius.css +9 -1
- package/tailwindcss/utilities/animation-timeline.css +51 -0
- package/tailwindcss/utilities/animation-trigger-fallback.css +18 -0
- package/tailwindcss/utilities/animation-trigger.css +33 -0
- package/tailwindcss/utilities/animation.css +88 -0
- package/tailwindcss/utilities/grid-area.css +7 -0
- package/tailwindcss/utilities/index.css +3 -0
- package/tailwindcss/utilities/position.css +24 -0
- package/tailwindcss/variants/index.css +2 -1
- package/tailwindcss/variants/scroll-state.css +245 -0
- package/types/index.d.ts +13 -12
- package/types/index.d.ts.map +21 -3
|
@@ -1,40 +1,19 @@
|
|
|
1
|
-
export
|
|
2
|
-
visibleAttribute?: string
|
|
3
|
-
observerOptions?: {
|
|
4
|
-
rootMargin?: string
|
|
5
|
-
threshold?: number | number[]
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export interface PaginationCarouselOptions {
|
|
10
|
-
element?: HTMLElement | Element
|
|
11
|
-
itemContent?: string
|
|
12
|
-
activeAttribute?: string
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export interface ScrollCarouselOptions {
|
|
16
|
-
observe?: ObserveCarouselOptions
|
|
17
|
-
pagination?: PaginationCarouselOptions
|
|
18
|
-
progressElement?: HTMLProgressElement | Element
|
|
19
|
-
counterMinElement?: HTMLElement | Element
|
|
20
|
-
counterMaxElement?: HTMLElement | Element
|
|
21
|
-
}
|
|
1
|
+
export type CarouselPlacement = 'left' | 'right' | 'top' | 'bottom'
|
|
22
2
|
|
|
23
|
-
export interface
|
|
24
|
-
|
|
25
|
-
|
|
3
|
+
export interface ScrollByOptions {
|
|
4
|
+
direction?: number
|
|
5
|
+
vertical?: boolean
|
|
6
|
+
ratio?: number
|
|
26
7
|
}
|
|
27
8
|
|
|
28
|
-
export interface
|
|
29
|
-
|
|
9
|
+
export interface ToggleScrollStateOptions {
|
|
10
|
+
prevElement?: HTMLButtonElement | null
|
|
11
|
+
nextElement?: HTMLButtonElement | null
|
|
12
|
+
vertical?: boolean
|
|
30
13
|
}
|
|
31
14
|
|
|
32
|
-
export function
|
|
33
|
-
export function
|
|
34
|
-
export function
|
|
35
|
-
export function
|
|
36
|
-
export function
|
|
37
|
-
export function scrollCarousel(element: HTMLElement | Element, options?: ScrollCarouselOptions): void
|
|
38
|
-
export function paginationCarousel(element: HTMLElement | Element, options?: PaginationCarouselOptions): void
|
|
39
|
-
export function autoplayCarousel(element: HTMLElement | Element, options?: AutoplayCarouselOptions): void
|
|
40
|
-
export function dragCarousel(element: HTMLElement | Element, options?: DragCarouselOptions): void
|
|
15
|
+
export function scrollBy(element: HTMLElement, options?: ScrollByOptions): void
|
|
16
|
+
export function toggleScrollState(element: HTMLElement, options?: ToggleScrollStateOptions): void
|
|
17
|
+
export function setCurrentAttribute(element: HTMLElement, index: number, attributeName?: string): void
|
|
18
|
+
export function setSnappedAttribute(element: HTMLElement, target: HTMLElement, markerGroupElement?: HTMLElement | null): void
|
|
19
|
+
export function scrollToMarker(element: HTMLElement, target: HTMLElement, markerGroupElement: HTMLElement, scrollIntoViewOptions?: ScrollIntoViewOptions): void
|
|
@@ -1,227 +1,108 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @param {HTMLElement
|
|
3
|
-
* @param {
|
|
4
|
-
* @
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const scrollPaddingLeft = parseInt(getComputedStyle(element).scrollPaddingLeft)
|
|
8
|
-
|
|
9
|
-
element.scroll({ left: element?.children[index]?.offsetLeft - (isNaN(scrollPaddingLeft) ? 0 : scrollPaddingLeft) })
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* @param {HTMLElement | Element & { _activeIndex: number }} element
|
|
14
|
-
* @returns void
|
|
15
|
-
*/
|
|
16
|
-
export const scrollPrev = (element) => {
|
|
17
|
-
scrollTo(element, element._activeIndex - 1)
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* @param {HTMLElement | Element & { _activeIndex: number }} element
|
|
2
|
+
* @param {HTMLElement} element
|
|
3
|
+
* @param {object} options
|
|
4
|
+
* @param {number} [options.direction=1]
|
|
5
|
+
* @param {boolean} [options.vertical=false]
|
|
6
|
+
* @param {number} [options.ratio=0.85]
|
|
22
7
|
* @returns void
|
|
23
8
|
*/
|
|
24
|
-
export const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
*
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
return [...element.children].reduce((count, children) => {
|
|
39
|
-
if (mathRound(scrollWidth / (children.offsetWidth + (isNaN(gap) ? 0 : gap)), mathFloor) > count) {
|
|
40
|
-
return count + 1
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
return count
|
|
44
|
-
}
|
|
45
|
-
}, 0) + 1
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* @param {HTMLElement | Element} element
|
|
50
|
-
* @param {import("./").ObserveCarouselOptions} options
|
|
51
|
-
* @returns IntersectionObserver
|
|
52
|
-
*/
|
|
53
|
-
export const observeCarousel = (element, options = {}) => {
|
|
54
|
-
options = {
|
|
55
|
-
visibleAttribute: 'data-visible',
|
|
56
|
-
observerOptions: {},
|
|
57
|
-
...options,
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
element._observer = new IntersectionObserver((entries) => {
|
|
61
|
-
entries.forEach((entry) => {
|
|
62
|
-
entry.target.toggleAttribute(options.visibleAttribute, entry.isIntersecting)
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
const activeElement = [...element.children].find(children => children.hasAttribute(options.visibleAttribute))
|
|
66
|
-
|
|
67
|
-
if (activeElement) {
|
|
68
|
-
element._activeIndex = [...element.children].indexOf(activeElement)
|
|
69
|
-
}
|
|
70
|
-
}, {
|
|
71
|
-
root: element,
|
|
72
|
-
threshold: 0.75,
|
|
73
|
-
...options.observerOptions,
|
|
9
|
+
export const scrollBy = (element, { direction = 1, vertical = false, ratio = 0.85 }) => {
|
|
10
|
+
const { distance, position } = vertical
|
|
11
|
+
? {
|
|
12
|
+
distance: element.clientHeight * ratio,
|
|
13
|
+
position: 'top',
|
|
14
|
+
}
|
|
15
|
+
: {
|
|
16
|
+
distance: element.clientWidth * ratio,
|
|
17
|
+
position: 'left',
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
element.scrollBy({
|
|
21
|
+
[position]: (distance ?? element.clientWidth * ratio) * direction,
|
|
74
22
|
})
|
|
75
|
-
|
|
76
|
-
;[...element.children].forEach(children => element._observer.observe(children))
|
|
77
|
-
|
|
78
|
-
return element._observer
|
|
79
23
|
}
|
|
80
24
|
|
|
81
25
|
/**
|
|
82
|
-
* @param {HTMLElement
|
|
83
|
-
* @param {
|
|
26
|
+
* @param {HTMLElement} element
|
|
27
|
+
* @param {object} options
|
|
28
|
+
* @param {HTMLButtonElement | null} [options.prevElement]
|
|
29
|
+
* @param {HTMLButtonElement | null} [options.nextElement]
|
|
30
|
+
* @param {boolean} vertical
|
|
84
31
|
* @returns void
|
|
85
32
|
*/
|
|
86
|
-
export const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
if (options.counterMinElement) {
|
|
106
|
-
options.counterMinElement.innerHTML = `${activeItem}`
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
if (options.counterMaxElement) {
|
|
110
|
-
options.counterMaxElement.innerHTML = `${activeItemMax}`
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
element._lastScrollLeft = element.scrollLeft <= 0 ? 0 : element.scrollLeft
|
|
33
|
+
export const toggleScrollState = (element, { prevElement, nextElement, vertical = false }) => {
|
|
34
|
+
const { scrollStart, scrollEnd, scrollNone } = vertical
|
|
35
|
+
? {
|
|
36
|
+
scrollStart: element.scrollTop <= 0,
|
|
37
|
+
scrollEnd: element.scrollTop >= element.scrollHeight - element.clientHeight,
|
|
38
|
+
scrollNone: !(element.scrollHeight - element.clientHeight),
|
|
39
|
+
}
|
|
40
|
+
: {
|
|
41
|
+
scrollStart: element.scrollLeft <= 0,
|
|
42
|
+
scrollEnd: element.scrollLeft >= element.scrollWidth - element.clientWidth,
|
|
43
|
+
scrollNone: !(element.scrollWidth - element.clientWidth),
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (prevElement) prevElement.disabled = scrollStart
|
|
47
|
+
if (nextElement) nextElement.disabled = scrollEnd
|
|
48
|
+
|
|
49
|
+
element.toggleAttribute('data-scroll-start', scrollStart)
|
|
50
|
+
element.toggleAttribute('data-scroll-end', scrollEnd)
|
|
51
|
+
element.toggleAttribute('data-scroll-none', scrollNone)
|
|
114
52
|
}
|
|
115
53
|
|
|
116
54
|
/**
|
|
117
|
-
* @param {HTMLElement
|
|
118
|
-
* @param {
|
|
55
|
+
* @param {HTMLElement} element
|
|
56
|
+
* @param {number} index
|
|
57
|
+
* @param {string} [attributeName='data-current']
|
|
119
58
|
* @returns void
|
|
120
59
|
*/
|
|
121
|
-
export const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
activeAttribute: 'data-active',
|
|
125
|
-
...options,
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
if (!options.element) return
|
|
129
|
-
|
|
130
|
-
options.element.insertAdjacentHTML('beforeend', [...Array(getItemCount(element))].map(
|
|
131
|
-
() => options.itemContent,
|
|
132
|
-
).join(''))
|
|
133
|
-
|
|
134
|
-
;[...options.element.children].forEach((children, i) => {
|
|
135
|
-
(i === 0) && children.setAttribute(options.activeAttribute, '')
|
|
136
|
-
children.addEventListener('click', ({ currentTarget }) => {
|
|
137
|
-
scrollTo(element, [...options.element.children].indexOf(currentTarget))
|
|
138
|
-
})
|
|
139
|
-
})
|
|
60
|
+
export const setCurrentAttribute = (element, index, attributeName = 'aria-current') => {
|
|
61
|
+
element.querySelector(`[${attributeName}]`)?.removeAttribute(attributeName)
|
|
62
|
+
element.children[index].setAttribute(attributeName, 'true')
|
|
140
63
|
}
|
|
141
64
|
|
|
142
65
|
/**
|
|
143
|
-
* @param {HTMLElement |
|
|
144
|
-
* @param {
|
|
66
|
+
* @param {HTMLElement & { _markerIndex?: number | null }} element
|
|
67
|
+
* @param {HTMLElement} target
|
|
68
|
+
* @param {HTMLElement | null} markerGroupElement
|
|
145
69
|
* @returns void
|
|
146
70
|
*/
|
|
147
|
-
export const
|
|
148
|
-
|
|
149
|
-
delay: 4000,
|
|
150
|
-
pauseElements: [],
|
|
151
|
-
...options,
|
|
152
|
-
}
|
|
71
|
+
export const setSnappedAttribute = (element, target, markerGroupElement) => {
|
|
72
|
+
const snappedIndex = [...element.children].indexOf(target)
|
|
153
73
|
|
|
154
|
-
|
|
74
|
+
setCurrentAttribute(element, snappedIndex, 'data-snapped')
|
|
155
75
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
element
|
|
159
|
-
})
|
|
76
|
+
if (markerGroupElement) {
|
|
77
|
+
const markerTarget = markerGroupElement.querySelector(`[href="#${target.id}"]`)
|
|
78
|
+
const index = element._markerIndex ?? (markerTarget && [...markerGroupElement.children].indexOf(markerTarget)) ?? snappedIndex
|
|
160
79
|
|
|
161
|
-
|
|
162
|
-
if (paused) return
|
|
80
|
+
setCurrentAttribute(markerGroupElement, index)
|
|
163
81
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
scrollTo(element, 0)
|
|
169
|
-
}
|
|
170
|
-
}, options.delay)
|
|
82
|
+
element._markerIndex = null
|
|
83
|
+
}
|
|
171
84
|
}
|
|
172
85
|
|
|
173
86
|
/**
|
|
174
|
-
* @param {HTMLElement
|
|
175
|
-
* @param {
|
|
87
|
+
* @param {HTMLElement & { _markerIndex?: number | null }} element
|
|
88
|
+
* @param {HTMLElement | HTMLLinkElement} target
|
|
89
|
+
* @param {HTMLElement} markerGroupElement
|
|
90
|
+
* @param {ScrollIntoViewOptions} scrollIntoViewOptions
|
|
176
91
|
* @returns void
|
|
177
92
|
*/
|
|
178
|
-
export const
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
if (!matchMedia('(hover: hover) and (pointer: fine)').matches) {
|
|
185
|
-
return
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
let isDown
|
|
189
|
-
let startX
|
|
190
|
-
let scrollLeft
|
|
191
|
-
let timeout
|
|
192
|
-
|
|
193
|
-
const endGrabbing = () => {
|
|
194
|
-
isDown = false
|
|
195
|
-
element.removeAttribute(options.activeAttribute)
|
|
196
|
-
|
|
197
|
-
scrollTo(element, element._activeIndex)
|
|
198
|
-
|
|
199
|
-
clearTimeout(timeout)
|
|
200
|
-
|
|
201
|
-
timeout = setTimeout(() => {
|
|
202
|
-
element.style.scrollSnapType = ''
|
|
203
|
-
}, 300)
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
element.addEventListener('mouseleave', endGrabbing)
|
|
207
|
-
|
|
208
|
-
element.addEventListener('mouseup', endGrabbing)
|
|
209
|
-
|
|
210
|
-
element.addEventListener('mousedown', ({ pageX }) => {
|
|
211
|
-
isDown = true
|
|
212
|
-
startX = pageX - element.offsetLeft
|
|
213
|
-
scrollLeft = element.scrollLeft
|
|
214
|
-
})
|
|
93
|
+
export const scrollToMarker = (element, target, markerGroupElement, scrollIntoViewOptions = {}) => {
|
|
94
|
+
const snappedTarget = document.getElementById(target.getAttribute('href').slice(1))
|
|
95
|
+
const markerTargetIndex = [...markerGroupElement.children].indexOf(target)
|
|
96
|
+
const index = snappedTarget ? [...element.children].indexOf(snappedTarget) : markerTargetIndex
|
|
215
97
|
|
|
216
|
-
element.
|
|
217
|
-
if (!isDown) return
|
|
218
|
-
e.preventDefault()
|
|
98
|
+
element._markerIndex = markerTargetIndex
|
|
219
99
|
|
|
220
|
-
|
|
100
|
+
setCurrentAttribute(markerGroupElement, markerTargetIndex)
|
|
221
101
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
102
|
+
element.children[index]?.scrollIntoView({
|
|
103
|
+
inline: 'start',
|
|
104
|
+
block: 'nearest',
|
|
105
|
+
container: 'nearest',
|
|
106
|
+
...scrollIntoViewOptions,
|
|
226
107
|
})
|
|
227
108
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
--x-check-size: 1.25rem;
|
|
4
4
|
--x-check-gap: calc(var(--spacing) * 3);
|
|
5
5
|
--x-check-font-size: var(--text-sm);
|
|
6
|
-
--x-check-line-height:
|
|
6
|
+
--x-check-line-height: 1.25rem;
|
|
7
7
|
--x-check-border-radius: var(--radius-md);
|
|
8
8
|
--x-check-border-width: 1px;
|
|
9
9
|
--x-check-background-color: currentcolor;
|
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
--x-control-select-picker-border-color: currentcolor;
|
|
6
6
|
--x-control-select-picker-background-color: var(--color-body-primary);
|
|
7
7
|
--x-control-select-picker-margin-block: 0.375rem;
|
|
8
|
-
--x-control-select-picker-padding-block:
|
|
9
|
-
--x-control-select-picker-padding-inline:
|
|
8
|
+
--x-control-select-picker-padding-block: calc(var(--spacing) * 1);
|
|
9
|
+
--x-control-select-picker-padding-inline: calc(var(--spacing) * 1);
|
|
10
10
|
--x-control-select-picker-gap: 0.25rem;
|
|
11
11
|
--x-control-select-picker-scrollbar-color: currentcolor var(--color-body-primary);
|
|
12
|
-
--x-control-select-option-padding-block:
|
|
13
|
-
--x-control-select-option-padding-inline:
|
|
12
|
+
--x-control-select-option-padding-block: calc(var(--spacing) * 2.5);
|
|
13
|
+
--x-control-select-option-padding-inline: calc(var(--spacing) * 3);
|
|
14
14
|
--x-control-select-option-border-radius: var(--radius-md);
|
|
15
15
|
--x-control-select-option-hocus-background-color: var(--color-body-secondary);
|
|
16
16
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
:root,
|
|
2
2
|
:host {
|
|
3
|
-
--x-control-select-icon-size:
|
|
4
|
-
--x-control-select-icon-mask: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" fill="
|
|
3
|
+
--x-control-select-icon-size: 1rem;
|
|
4
|
+
--x-control-select-icon-mask: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.75" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="m19.5 8.25-7.5 7.5-7.5-7.5" /></svg>');
|
|
5
5
|
--x-control-select-icon-margin-inline-end: -0.25rem;
|
|
6
6
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
.x-control {
|
|
2
|
+
&:has([autocomplete="tel-country-code"]) {
|
|
3
|
+
:where(select) {
|
|
4
|
+
@media not (scripting: none) {
|
|
5
|
+
font-size: 0;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
+ :where(span) {
|
|
9
|
+
pointer-events: none;
|
|
10
|
+
|
|
11
|
+
@media (scripting: none) {
|
|
12
|
+
display: none;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
:where(option) {
|
|
17
|
+
&::before {
|
|
18
|
+
content: attr(data-icon);
|
|
19
|
+
margin-inline-end: 0.5ch;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {HTMLInputElement} element
|
|
3
|
+
* @param {import("./").ToggleDetailsOptions} options
|
|
4
|
+
* @returns void
|
|
5
|
+
*/
|
|
6
|
+
export const toggleDetails = (element, options = {}) => {
|
|
7
|
+
const { selector } = {
|
|
8
|
+
selector: 'details',
|
|
9
|
+
...options,
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
element?.closest(selector)?.toggleAttribute('open', element.checked)
|
|
13
|
+
}
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
# [Details](https://winduum.dev/docs/components/details.html)
|
|
2
2
|
|
|
3
|
-
## Dependencies
|
|
4
|
-
* [slide-element](https://www.npmjs.com/package/slide-element)
|
|
5
|
-
|
|
6
3
|
## Installation
|
|
7
4
|
```shell
|
|
8
5
|
npm i winduum
|
|
@@ -10,7 +7,7 @@ npm i winduum
|
|
|
10
7
|
Learn more how to set up Winduum [here](https://winduum.dev/docs/).
|
|
11
8
|
|
|
12
9
|
```js
|
|
13
|
-
import {
|
|
10
|
+
import { toggleDetails } from 'winduum/src/components/details/index.js'
|
|
14
11
|
```
|
|
15
12
|
|
|
16
13
|
### Local imports
|
|
@@ -18,7 +15,7 @@ By default, imports are directly from `npm` so you can leverage updates.
|
|
|
18
15
|
You can also copy and paste the code from this directory to your project and remap the imports to local.
|
|
19
16
|
|
|
20
17
|
```js
|
|
21
|
-
import {
|
|
18
|
+
import { toggleDetails } from '@/components/details/assets/index.js'
|
|
22
19
|
```
|
|
23
20
|
|
|
24
21
|
### Docs
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
.x-dialog {
|
|
2
|
+
&:is(.drawer) {
|
|
3
|
+
timeline-scope: --x-drawer-backdrop;
|
|
4
|
+
animation: x-drawer-backdrop-opacity linear both;
|
|
5
|
+
animation-timeline: --x-drawer-backdrop;
|
|
6
|
+
|
|
7
|
+
&::backdrop {
|
|
8
|
+
background-color:
|
|
9
|
+
color-mix(
|
|
10
|
+
in var(--x-drawer-background-color-space, srgb),
|
|
11
|
+
var(--color-dark) calc(var(--x-drawer-backdrop-opacity, 0) * var(--x-drawer-background-color-opacity)),
|
|
12
|
+
var(--x-drawer-background-color-mix, transparent)
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
@supports not (animation-timeline: --x) {
|
|
16
|
+
--x-drawer-backdrop-opacity: 1;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -5,3 +5,7 @@ document.documentElement.addEventListener('click', ({ target }) => {
|
|
|
5
5
|
target?.close()
|
|
6
6
|
}
|
|
7
7
|
})
|
|
8
|
+
|
|
9
|
+
new ResizeObserver(() => {
|
|
10
|
+
document.documentElement.style.setProperty('--default-scrollbar-width', `${Math.max(0, window.innerWidth - document.body.clientWidth)}px`)
|
|
11
|
+
}).observe(document.body)
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
.x-drawer-content {
|
|
2
|
+
background-color: var(--x-drawer-content-background-color);
|
|
3
|
+
padding: var(--x-drawer-content-padding-block) var(--x-drawer-content-padding-inline);
|
|
2
4
|
inline-size: var(--x-drawer-content-inline-size);
|
|
3
5
|
block-size: var(--x-drawer-content-block-size);
|
|
4
|
-
background-color: var(--x-drawer-content-background-color);
|
|
5
6
|
flex-shrink: 0;
|
|
6
7
|
scroll-snap-align: end;
|
|
7
8
|
}
|
|
@@ -1,40 +1,22 @@
|
|
|
1
1
|
.x-drawer {
|
|
2
|
-
z-index: var(--x-drawer-z-index, var(--z-index-30));
|
|
3
|
-
background-color:
|
|
4
|
-
color-mix(
|
|
5
|
-
in var(--x-drawer-background-color-space, srgb),
|
|
6
|
-
var(--color-dark) calc(var(--background-color-opacity, 0) * var(--x-drawer-background-color-opacity)),
|
|
7
|
-
var(--x-drawer-background-color-mix, transparent)
|
|
8
|
-
);
|
|
9
2
|
position: fixed;
|
|
10
3
|
inset: 0;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
-
|
|
16
|
-
overscroll-behavior: contain;
|
|
4
|
+
width: 100dvw;
|
|
5
|
+
height: 100dvh;
|
|
6
|
+
timeline-scope: --x-drawer-backdrop;
|
|
7
|
+
animation: x-drawer-backdrop-opacity linear both;
|
|
8
|
+
animation-timeline: --x-drawer-backdrop;
|
|
17
9
|
|
|
18
|
-
&:not([open]),
|
|
19
10
|
&::backdrop {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
&::after {
|
|
28
|
-
content: "";
|
|
29
|
-
min-inline-size: 100vw;
|
|
30
|
-
scroll-snap-align: end;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
&.flex-col {
|
|
34
|
-
overflow: hidden auto;
|
|
11
|
+
background-color:
|
|
12
|
+
color-mix(
|
|
13
|
+
in var(--x-drawer-background-color-space, srgb),
|
|
14
|
+
var(--color-dark) calc(var(--x-drawer-backdrop-opacity, 0) * var(--x-drawer-background-color-opacity)),
|
|
15
|
+
var(--x-drawer-background-color-mix, transparent)
|
|
16
|
+
);
|
|
35
17
|
|
|
36
|
-
|
|
37
|
-
|
|
18
|
+
@supports not (animation-timeline: --x) {
|
|
19
|
+
--x-drawer-backdrop-opacity: 1;
|
|
38
20
|
}
|
|
39
21
|
}
|
|
40
22
|
}
|
|
@@ -1,16 +1,9 @@
|
|
|
1
|
-
export
|
|
2
|
-
snapClass?: string
|
|
3
|
-
opacityProperty?: string
|
|
4
|
-
opacityRatio?: number
|
|
5
|
-
scrollOpen?: number
|
|
6
|
-
scrollClose?: number
|
|
7
|
-
scrollSize?: number
|
|
8
|
-
scrollDirection?:number
|
|
9
|
-
}
|
|
1
|
+
export type DrawerPlacement = 'left' | 'right' | 'top' | 'bottom'
|
|
10
2
|
|
|
11
|
-
export function
|
|
12
|
-
export function
|
|
13
|
-
export function
|
|
14
|
-
export function
|
|
15
|
-
export function
|
|
16
|
-
export function
|
|
3
|
+
export function isVerticalDrawer(placement: DrawerPlacement): boolean
|
|
4
|
+
export function scrollDrawer(element: HTMLElement | Element, placement: DrawerPlacement, reverse?: boolean, behavior?: 'auto' | 'instant'): void
|
|
5
|
+
export function showDrawer(element: HTMLElement | Element, placement: DrawerPlacement): Promise<void>
|
|
6
|
+
export function closeDrawer(element: HTMLElement | Element, placement: DrawerPlacement): void
|
|
7
|
+
export function drawerEvents(element: HTMLDialogElement | Element, contentElement: HTMLElement | Element, placement: DrawerPlacement, signal?: AbortSignal): void
|
|
8
|
+
export function drawerObserver(element: HTMLDialogElement | Element, placement: DrawerPlacement): IntersectionObserver
|
|
9
|
+
export function drawerProperties(element: HTMLElement | Element, placement: DrawerPlacement): ['top' | 'left', number, number]
|