winduum 3.0.0-next.1 → 3.0.0-next.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/main.css +1 -1
  2. package/dist/tailwind.css +2 -1
  3. package/package.json +28 -19
  4. package/src/base/defaults.css +3 -0
  5. package/src/base/keyframes.css +32 -0
  6. package/src/common.d.ts +4 -0
  7. package/src/components/carousel/content.css +1 -0
  8. package/src/components/carousel/index.d.ts +14 -35
  9. package/src/components/carousel/index.js +131 -187
  10. package/src/components/check/props/default.css +1 -1
  11. package/src/components/control/props/select-picker.css +4 -4
  12. package/src/components/control/props/select.css +2 -2
  13. package/src/components/control/tel-country-code.css +24 -0
  14. package/src/components/details/index.d.ts +5 -0
  15. package/src/components/details/index.js +13 -0
  16. package/src/components/details/readme.md +2 -5
  17. package/src/components/dialog/content.css +0 -1
  18. package/src/components/dialog/drawer.css +20 -0
  19. package/src/components/dialog/index.css +1 -0
  20. package/src/components/dialog/index.js +4 -0
  21. package/src/components/drawer/content.css +2 -1
  22. package/src/components/drawer/default.css +13 -31
  23. package/src/components/drawer/index.css +3 -0
  24. package/src/components/drawer/index.d.ts +8 -15
  25. package/src/components/drawer/index.js +67 -50
  26. package/src/components/drawer/keyframes/default.css +9 -0
  27. package/src/components/drawer/noscript.css +32 -0
  28. package/src/components/drawer/nosnap.css +32 -0
  29. package/src/components/drawer/props/content.css +2 -2
  30. package/src/components/drawer/props/default.css +6 -0
  31. package/src/components/drawer/scroller.css +32 -0
  32. package/src/components/field/index.d.ts +13 -0
  33. package/src/components/field/index.js +48 -0
  34. package/src/components/form/index.d.ts +3 -21
  35. package/src/components/form/index.js +14 -93
  36. package/src/components/heading/lg.css +1 -1
  37. package/src/components/heading/props/default.css +1 -1
  38. package/src/components/heading/sm.css +1 -1
  39. package/src/components/label/props/default.css +3 -2
  40. package/src/components/popover/content.css +2 -0
  41. package/src/components/popover/default.css +1 -1
  42. package/src/components/popover/index.css +1 -0
  43. package/src/components/popover/tooltip.css +11 -0
  44. package/src/components/tabs/index.d.ts +2 -2
  45. package/src/components/text/content.css +241 -0
  46. package/src/components/text/default.css +0 -238
  47. package/src/components/text/index.css +2 -0
  48. package/src/components/text/props/content.css +9 -0
  49. package/src/components/text/props/default.css +1 -7
  50. package/src/components/toast/default.css +6 -0
  51. package/src/components/toast/index.js +2 -1
  52. package/src/components/toaster/index.d.ts +1 -0
  53. package/src/components/toaster/index.js +18 -0
  54. package/src/polyfill.js +13 -0
  55. package/src/polyfills/timelineTrigger.js +54 -0
  56. package/src/supports.js +24 -0
  57. package/src/utilities/container/props/default.css +3 -3
  58. package/tailwindcss/theme/config/radius.css +9 -1
  59. package/tailwindcss/utilities/animation-timeline.css +51 -0
  60. package/tailwindcss/utilities/animation-trigger-fallback.css +18 -0
  61. package/tailwindcss/utilities/animation-trigger.css +33 -0
  62. package/tailwindcss/utilities/animation.css +88 -0
  63. package/tailwindcss/utilities/grid-area.css +7 -0
  64. package/tailwindcss/utilities/index.css +3 -0
  65. package/tailwindcss/utilities/position.css +24 -0
  66. package/tailwindcss/variants/index.css +2 -1
  67. package/tailwindcss/variants/scroll-state.css +245 -0
  68. package/types/index.d.ts +62 -64
  69. package/types/index.d.ts.map +27 -22
@@ -1,16 +1,9 @@
1
- export interface ScrollDrawerOptions {
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 showDrawer(element: HTMLElement | Element, distance?: number, direction?: 'left' | 'top'): void
12
- export function closeDrawer(element: HTMLElement | Element, distance?: number, direction?: 'left' | 'top'): void
13
- export function scrollInitDrawer(element: HTMLElement | Element, distance?: number, direction?: 'left' | 'top'): void
14
- export function toggleDrawerAttributes(element: HTMLDialogElement | Element, state?: 'open' | 'close', snapClass?: string): void
15
- export function scrollDrawerState(scrollState: number, scrollDirection: number): boolean
16
- export function scrollDrawer(element: HTMLDialogElement | Element, options?: ScrollDrawerOptions): void
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]
@@ -1,85 +1,102 @@
1
+ import { supportsScrollInitialTarget } from '../../supports.js'
1
2
  import { nextRepaint } from '../../common.js'
2
3
 
3
4
  /**
4
- * @param {HTMLElement | Element} element
5
- * @param {number} distance
6
- * @param {'top' | 'left'} direction
7
- * @returns void
5
+ * @param {'left' | 'right' | 'top' | 'bottom'} placement
6
+ * @returns boolean
8
7
  */
9
- export const showDrawer = async (element, distance = 0, direction = 'left') => {
10
- element.scroll({ [direction]: distance })
8
+ export const isVerticalDrawer = (placement) => {
9
+ return ['top', 'bottom'].includes(placement)
11
10
  }
12
11
 
13
12
  /**
14
13
  * @param {HTMLElement | Element} element
15
- * @param {number} distance
16
- * @param {'top' | 'left'} direction
14
+ * @param {'left' | 'right' | 'top' | 'bottom'} placement
15
+ * @param {boolean} reverse
16
+ * @param {'auto' | 'instant'} behavior
17
17
  * @returns void
18
18
  */
19
- export const closeDrawer = (element, distance = element.scrollWidth, direction = 'left') => {
20
- element.scroll({ [direction]: distance })
19
+ export const scrollDrawer = (element, placement, reverse = false, behavior = 'auto') => {
20
+ const [direction, distance, closedDistance] = drawerProperties(element, placement)
21
+
22
+ element.scroll({ [direction]: reverse ? closedDistance : distance, behavior })
21
23
  }
22
24
 
23
25
  /**
24
26
  * @param {HTMLElement | Element} element
25
- * @param {number} distance
26
- * @param {'top' | 'left'} direction
27
+ * @param {'left' | 'right' | 'top' | 'bottom'} placement
27
28
  * @returns void
28
29
  */
29
- export const scrollInitDrawer = async (element, distance = element.scrollWidth, direction = 'left') => {
30
- element.scroll({ [direction]: distance, behavior: 'instant' })
31
- await nextRepaint()
30
+ export const showDrawer = async (element, placement) => {
31
+ if (!supportsScrollInitialTarget) {
32
+ scrollDrawer(element, placement, true, 'instant')
33
+ await nextRepaint()
34
+ }
35
+
36
+ scrollDrawer(element, placement)
32
37
  }
33
38
 
34
39
  /**
35
40
  * @param {HTMLElement | Element} element
36
- * @param {'open' | 'close'} state
37
- * @param {string} snapClass
41
+ * @param {'left' | 'right' | 'top' | 'bottom'} placement
38
42
  * @returns void
39
43
  */
40
- export const toggleDrawerAttributes = (element, state = 'open', snapClass) => {
41
- element.classList[state === 'open' ? 'add' : 'remove'](...snapClass.split(/\s/))
42
- element.inert = state === 'close'
43
- element.dispatchEvent(new CustomEvent(`x-drawer:${state}`))
44
+ export const closeDrawer = (element, placement) => {
45
+ scrollDrawer(element, placement, true)
44
46
  }
45
47
 
46
48
  /**
47
- * @param {number} scrollState
48
- * @param {number} scrollDirection
49
- * @returns boolean
49
+ * @param {HTMLElement | Element} element
50
+ * @param {HTMLElement | Element} contentElement
51
+ * @param {AbortSignal} signal
52
+ * @param {'left' | 'right' | 'top' | 'bottom'} placement
53
+ * @returns void
50
54
  */
51
- export const scrollDrawerState = (scrollState, scrollDirection) => {
52
- return scrollState ? Math.ceil(scrollDirection) >= scrollState : Math.floor(scrollDirection) <= scrollState
55
+ export const drawerEvents = (element, contentElement, placement, signal) => {
56
+ element.addEventListener('cancel', (event) => {
57
+ const scroller = element.firstElementChild
58
+
59
+ if (scroller.scrollHeight > 0 || scroller.scrollWidth > 0) event.preventDefault()
60
+
61
+ closeDrawer(scroller, placement)
62
+ }, { signal })
63
+
64
+ element.addEventListener('click', ({ target }) => {
65
+ if (!contentElement.contains(target) && !contentElement.isEqualNode(target))
66
+ closeDrawer(element.firstElementChild, placement)
67
+ }, { signal })
53
68
  }
54
69
 
55
70
  /**
56
71
  * @param {HTMLDialogElement | Element} element
57
- * @param {import("./").ScrollDrawerOptions} options
58
- * @returns void
72
+ * @param {'left' | 'right' | 'top' | 'bottom'} placement
73
+ * @returns IntersectionObserver
59
74
  */
60
- export const scrollDrawer = (element, options = {}) => {
61
- options = {
62
- snapClass: 'snap-x snap-mandatory',
63
- opacityProperty: '--background-color-opacity',
64
- opacityRatio: 1,
65
- scrollOpen: 0,
66
- scrollClose: element.scrollWidth - element.clientWidth,
67
- scrollSize: element.scrollWidth - element.clientWidth,
68
- scrollDirection: element.scrollLeft,
69
- ...options,
70
- }
71
-
72
- element.style.setProperty(
73
- options.opacityProperty,
74
- `${Math.min(Math.abs((options.scrollDirection / options.scrollSize) - options.opacityRatio), 1)}`,
75
+ export const drawerObserver = (element, placement) => {
76
+ const visibleThreshold = 1 / (
77
+ isVerticalDrawer(placement) ? window.innerHeight : window.innerWidth
75
78
  )
76
79
 
77
- if (scrollDrawerState(options.scrollOpen, options.scrollDirection)) {
78
- toggleDrawerAttributes(element, 'open', options.snapClass)
79
- }
80
+ return new IntersectionObserver((entries) => {
81
+ if (entries.at(-1).intersectionRatio < visibleThreshold) element.close()
82
+ }, {
83
+ root: element,
84
+ threshold: [visibleThreshold, 1],
85
+ })
86
+ }
80
87
 
81
- if (scrollDrawerState(options.scrollClose, options.scrollDirection) && !element.inert) {
82
- toggleDrawerAttributes(element, 'close', options.snapClass)
83
- element.close && element.close()
84
- }
88
+ /**
89
+ * @param {HTMLElement | Element} element
90
+ * @param {'left' | 'right' | 'top' | 'bottom'} placement
91
+ * @returns {['top' | 'left', number, number]}
92
+ */
93
+ export const drawerProperties = (element, placement) => {
94
+ const [openedDistance, closedDistance] = {
95
+ left: [0, element.offsetWidth],
96
+ right: [element.offsetWidth, 0],
97
+ top: [0, element.offsetHeight],
98
+ bottom: [element.offsetHeight, 0],
99
+ }[placement]
100
+
101
+ return [isVerticalDrawer(placement) ? 'top' : 'left', openedDistance, closedDistance]
85
102
  }
@@ -0,0 +1,9 @@
1
+ @keyframes x-drawer-backdrop-opacity {
2
+ 0% {
3
+ --x-drawer-backdrop-opacity: 1;
4
+ }
5
+
6
+ 100% {
7
+ --x-drawer-backdrop-opacity: 0;
8
+ }
9
+ }
@@ -0,0 +1,32 @@
1
+ .x-drawer {
2
+ @media (scripting: none) {
3
+ --x-drawer-backdrop-opacity: 1;
4
+
5
+ width: fit-content;
6
+ height: fit-content;
7
+ transition-property: var(--default-transition-property);
8
+ transition-timing-function: var(--ease-in-out);
9
+ transition-duration: var(--default-transition-duration);
10
+ transition-behavior: allow-discrete;
11
+
12
+ &::backdrop {
13
+ transition: inherit;
14
+ }
15
+
16
+ &:not([open]) {
17
+ &::backdrop {
18
+ opacity: 0%;
19
+ }
20
+ }
21
+
22
+ @starting-style {
23
+ &[open] {
24
+ opacity: 0%;
25
+
26
+ &::backdrop {
27
+ opacity: 0%;
28
+ }
29
+ }
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,32 @@
1
+ .x-drawer {
2
+ &:where(.no-snap) {
3
+ --x-drawer-backdrop-opacity: 1;
4
+
5
+ width: fit-content;
6
+ height: fit-content;
7
+ transition-property: var(--default-transition-property);
8
+ transition-timing-function: var(--ease-in-out);
9
+ transition-duration: var(--default-transition-duration);
10
+ transition-behavior: allow-discrete;
11
+
12
+ &::backdrop {
13
+ transition: inherit;
14
+ }
15
+
16
+ &:not([open]) {
17
+ &::backdrop {
18
+ opacity: 0%;
19
+ }
20
+ }
21
+
22
+ @starting-style {
23
+ &[open] {
24
+ opacity: 0%;
25
+
26
+ &::backdrop {
27
+ opacity: 0%;
28
+ }
29
+ }
30
+ }
31
+ }
32
+ }
@@ -3,6 +3,6 @@
3
3
  --x-drawer-content-background-color: var(--color-body-primary);
4
4
  --x-drawer-content-padding-block: 2rem;
5
5
  --x-drawer-content-padding-inline: 1.5rem;
6
- --x-drawer-content-inline-size: 100%;
7
- --x-drawer-content-block-size: 100%;
6
+ --x-drawer-content-inline-size: 50dvw;
7
+ --x-drawer-content-block-size: 100dvh;
8
8
  }
@@ -2,3 +2,9 @@
2
2
  :host {
3
3
  --x-drawer-background-color-opacity: 75%;
4
4
  }
5
+
6
+ @property --x-drawer-backdrop-opacity {
7
+ syntax: "<number>";
8
+ inherits: true;
9
+ initial-value: 0;
10
+ }
@@ -0,0 +1,32 @@
1
+ .x-drawer-scroller {
2
+ display: flex;
3
+ width: inherit;
4
+ height: inherit;
5
+ overflow: auto clip;
6
+ scrollbar-width: none;
7
+ scroll-behavior: smooth;
8
+ -webkit-overflow-scrolling: touch;
9
+ overscroll-behavior: none;
10
+ scroll-snap-type: x mandatory;
11
+ scroll-timeline: --x-drawer-backdrop x;
12
+
13
+ &::-webkit-scrollbar {
14
+ display: none;
15
+ }
16
+
17
+ &::after {
18
+ content: "";
19
+ min-inline-size: 100dvw;
20
+ scroll-snap-align: end;
21
+ scroll-initial-target: nearest;
22
+ }
23
+
24
+ &:where(.snap-y) {
25
+ overflow: clip auto;
26
+ scroll-timeline: --x-drawer-backdrop y;
27
+
28
+ &::after {
29
+ min-block-size: 100dvh;
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,13 @@
1
+ export interface ValidateFieldOptions {
2
+ validationMessage?: string
3
+ selector?: string
4
+ validitySelector?: string
5
+ infoContent?: string
6
+ iconParentSelector?: string
7
+ iconSelector?: string
8
+ iconContent?: string
9
+ validIcon?: string | null
10
+ invalidIcon?: string
11
+ }
12
+
13
+ export function validateField(element: HTMLElement, options?: ValidateFieldOptions): void
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @param {HTMLElement} element
3
+ * @param {import("./").ValidateFieldOptions} options
4
+ * @returns void
5
+ */
6
+ export const validateField = (element, options = {}) => {
7
+ options = {
8
+ selector: ':is(input:not([type="hidden"]), textarea, select):not([readonly], [data-novalidate])',
9
+ validitySelector: '[data-validity]',
10
+ infoContent: '<div class="x-info text-error" data-validity></div>',
11
+ iconParentSelector: '.x-control',
12
+ iconSelector: '.ms-auto',
13
+ iconContent: '<div class="ms-auto"></div>',
14
+ validIcon: null,
15
+ invalidIcon: '<svg class="text-error" data-validity aria-hidden="true"><use href="#heroicons-outline/exclamation-circle"></use></svg>',
16
+ ...options,
17
+ }
18
+
19
+ const validationElements = [...element.querySelectorAll(options.selector)]
20
+
21
+ if (!validationElements.length) return
22
+
23
+ element.querySelectorAll(options.validitySelector).forEach(el => el.remove())
24
+
25
+ const invalidElements = validationElements.filter(validationElement => !validationElement.checkValidity())
26
+
27
+ validationElements.forEach((validationElement) => {
28
+ const icon = invalidElements.includes(validationElement) ? options.invalidIcon : options.validIcon
29
+ const iconParentElement = validationElement.closest(options.iconParentSelector)
30
+
31
+ if (!iconParentElement || !icon) return
32
+
33
+ if (!iconParentElement.querySelector(options.iconSelector)) {
34
+ iconParentElement.insertAdjacentHTML('beforeend', options.iconContent)
35
+ }
36
+
37
+ iconParentElement.querySelector(options.iconSelector).insertAdjacentHTML('afterbegin', icon)
38
+ })
39
+
40
+ if (!invalidElements.length) return
41
+
42
+ element.insertAdjacentHTML('beforeend', options.infoContent)
43
+ element.lastElementChild.textContent = options.validationMessage ?? invalidElements[0].dataset.validationMessage ?? invalidElements[0].validationMessage
44
+ }
45
+
46
+ export default {
47
+ validateField,
48
+ }
@@ -1,29 +1,11 @@
1
+ import { validateField, type ValidateFieldOptions } from "../field";
2
+
1
3
  export interface ValidateFormOptions {
2
- validateSelectors?: string
4
+ validateSelector?: string
3
5
  validateOptions?: ValidateFieldOptions
4
6
  validateField?: typeof validateField
5
7
  scrollOptions?: ScrollIntoViewOptions
6
8
  submitterLoadingAttribute?: string
7
9
  }
8
10
 
9
- export interface ValidateFieldOptions {
10
- validate?: boolean
11
- validationMessage?: string
12
- selector?: string
13
- ignoreMatch?: RegExp
14
- validitySelector?: string
15
- infoParentSelector?: string
16
- infoSelector?: string
17
- infoContent?: string
18
- endParentSelector?: string
19
- endSelector?: string
20
- endContent?: string
21
- validAttribute?: string
22
- validIcon?: string | null
23
- invalidAttribute?: string
24
- invalidIcon?: string
25
- activeAttribute?: string
26
- }
27
-
28
11
  export function validateForm(event: Event | SubmitEvent, options?: ValidateFormOptions): void
29
- export function validateField(element: HTMLElement | SubmitEvent, options?: ValidateFieldOptions): void
@@ -1,115 +1,36 @@
1
+ import { validateField } from '../field/index.js'
2
+
1
3
  /**
2
- * @param {Event | SubmitEvent} event
4
+ * @param {SubmitEvent & { target: HTMLFormElement }} event
3
5
  * @param {import("./").ValidateFormOptions} options
4
6
  * @returns void
5
7
  */
6
8
  export const validateForm = (event, options = {}) => {
7
9
  options = {
8
- validateSelectors: '.x-control, .x-check, .x-switch, .x-rating, .x-color',
9
- validateOptions: {
10
- validate: true,
11
- },
10
+ validateSelector: '.x-field',
11
+ validateOptions: {},
12
12
  validateField,
13
13
  submitterLoadingAttribute: 'data-loading',
14
14
  scrollOptions: { behavior: 'smooth', block: 'center' },
15
15
  ...options,
16
16
  }
17
17
 
18
- if (options.validateOptions.validate) {
19
- if (!event.target.checkValidity()) {
20
- event.preventDefault()
21
- event.stopImmediatePropagation()
18
+ if (!event.target.checkValidity()) {
19
+ event.preventDefault()
20
+ event.stopImmediatePropagation()
22
21
 
23
- event.target.querySelector(':invalid').scrollIntoView(options.scrollOptions)
24
- event.target.querySelector(':invalid').focus()
25
- }
26
- else {
27
- event?.submitter?.setAttribute(options.submitterLoadingAttribute, '')
28
- }
22
+ event.target.querySelector(':invalid').scrollIntoView(options.scrollOptions)
23
+ event.target.querySelector(':invalid').focus()
24
+ }
25
+ else if (options.submitterLoadingAttribute) {
26
+ event?.submitter?.setAttribute(options.submitterLoadingAttribute, '')
29
27
  }
30
28
 
31
- event.target.querySelectorAll(options.validateSelectors).forEach((element) => {
29
+ event.target.querySelectorAll(options.validateSelector).forEach((element) => {
32
30
  options.validateField(element, options.validateOptions)
33
31
  })
34
32
  }
35
33
 
36
- /**
37
- * @param {HTMLElement} element
38
- * @param {import("./").ValidateFieldOptions} options
39
- * @returns void
40
- */
41
- export const validateField = (element, options = {}) => {
42
- options = {
43
- validate: true,
44
- selector: 'input:not([type="hidden"]), textarea, select',
45
- ignoreMatch: /(data-novalidate|readonly)/,
46
- validitySelector: '.validity',
47
- infoParentSelector: '.x-field',
48
- infoSelector: '.x-info',
49
- infoContent: '<div class="x-info text-error validity"></div>',
50
- endParentSelector: '.x-control',
51
- endSelector: '.ms-auto',
52
- endContent: '<div class="ms-auto"></div>',
53
- validAttribute: 'data-valid',
54
- validIcon: null,
55
- invalidAttribute: 'data-invalid',
56
- invalidIcon: '<svg class="text-error validity" aria-hidden="true"><use href="#icon-exclamation-circle"></use></svg>',
57
- activeAttribute: 'data-active',
58
- ...options,
59
- }
60
-
61
- if (!element.querySelector(options.selector)) return
62
-
63
- const validationElement = element.querySelector(options.selector)
64
- const validationMessage = options.validationMessage ?? validationElement.dataset.validationMessage ?? validationElement.validationMessage
65
- const infoParentElement = validationElement?.closest(options.infoParentSelector)
66
- const endParentElement = validationElement.closest(options.endParentSelector)
67
- const infoSelector = options.infoSelector + options.validitySelector
68
- const endSelector = `${options.endSelector} ${options.validitySelector}`
69
-
70
- const insertIcon = (icon) => {
71
- if (!endParentElement || !icon) return
72
-
73
- if (!element?.querySelector(options.endSelector)) {
74
- element?.insertAdjacentHTML('beforeend', options.endContent)
75
- }
76
-
77
- element.querySelector(options.endSelector).insertAdjacentHTML('afterbegin', icon)
78
- }
79
-
80
- if (validationElement.value !== '') {
81
- element.setAttribute(options.activeAttribute, '')
82
- }
83
- else {
84
- element.removeAttribute(options.activeAttribute)
85
- }
86
-
87
- if (!validationElement.outerHTML.match(options.ignoreMatch) && options.validate) {
88
- element?.removeAttribute(options.validAttribute)
89
- element?.removeAttribute(options.invalidAttribute)
90
-
91
- infoParentElement?.querySelector(infoSelector)?.remove()
92
- endParentElement?.querySelector(endSelector)?.remove()
93
-
94
- if (validationElement.checkValidity()) {
95
- element.setAttribute(options.validAttribute, '')
96
-
97
- insertIcon(options.validIcon)
98
- }
99
- else {
100
- element.setAttribute(options.invalidAttribute, '')
101
-
102
- insertIcon(options.invalidIcon)
103
-
104
- if (infoParentElement) {
105
- infoParentElement.insertAdjacentHTML('beforeend', options.infoContent)
106
- infoParentElement.querySelector(infoSelector).textContent = validationMessage
107
- }
108
- }
109
- }
110
- }
111
-
112
34
  export default {
113
35
  validateForm,
114
- validateField,
115
36
  }
@@ -1,3 +1,3 @@
1
1
  .x-heading:is(.lg) {
2
- --x-heading-font-size: var(--text-3xl);
2
+ --x-heading-font-size: var(--text-5xl);
3
3
  }
@@ -2,6 +2,6 @@
2
2
  :host {
3
3
  --x-heading-font-family: var(--font-primary);
4
4
  --x-heading-font-weight: var(--font-weight-semibold);
5
- --x-heading-font-size: var(--text-xl);
5
+ --x-heading-font-size: var(--text-4xl);
6
6
  --x-heading-line-height: calc(1em + 0.375rem);
7
7
  }
@@ -1,3 +1,3 @@
1
1
  .x-heading:is(.sm) {
2
- --x-heading-font-size: var(--text-lg);
2
+ --x-heading-font-size: var(--text-3xl);
3
3
  }
@@ -1,5 +1,6 @@
1
1
  :root,
2
2
  :host {
3
- --x-label-font-size: var(--text-sm);
4
- --x-label-line-height: calc(1em + 0.25rem);
3
+ --x-label-font-size: var(--text-2xs);
4
+ --x-label-line-height: calc(1em + 0.125rem);
5
+ --x-label-font-weight: var(--font-weight-medium);
5
6
  }
@@ -2,6 +2,8 @@
2
2
  background-color: var(--x-popover-content-background-color);
3
3
  border-radius: var(--x-popover-content-border-radius);
4
4
  padding: var(--x-popover-content-padding-block) var(--x-popover-content-padding-inline);
5
+ color: var(--x-popover-content-color);
6
+ font-size: var(--x-popover-font-size);
5
7
  transition: inherit;
6
8
  will-change: transform;
7
9
 
@@ -14,4 +14,4 @@
14
14
  &:not(:popover-open) {
15
15
  opacity: var(--x-popover-starting-opacity);
16
16
  }
17
- }
17
+ }
@@ -2,3 +2,4 @@
2
2
  @import "./props/content.css";
3
3
  @import "./default.css";
4
4
  @import "./content.css";
5
+ @import "./tooltip.css";
@@ -0,0 +1,11 @@
1
+ .x-popover {
2
+ &:is(.tooltip) {
3
+ --x-popover-content-background-color: var(--color-main);
4
+ --x-popover-content-color: var(--color-main-foreground);
5
+ --x-popover-content-border-radius: var(--radius-md);
6
+ --x-popover-content-padding-block: calc(var(--spacing) * 1);
7
+ --x-popover-content-padding-inline: calc(var(--spacing) * 2);
8
+ --x-popover-font-size: var(--text-sm);
9
+ --x-popover-content-starting-scale: 0.75;
10
+ }
11
+ }
@@ -1,6 +1,6 @@
1
1
  interface ToggleTabOptions {
2
- tabElements?: NodeListOf<Element>
3
- tabPanelElements?: NodeListOf<Element>
2
+ tabElements?: NodeListOf<Element> | Element[]
3
+ tabPanelElements?: NodeListOf<Element> | Element[]
4
4
  }
5
5
 
6
6
  export function toggleTab(element: HTMLElement | Element, options?: ToggleTabOptions): void