base-ui-vue 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/README.md +41 -1
  2. package/dist/button/Button.cjs +53 -12
  3. package/dist/button/Button.cjs.map +1 -1
  4. package/dist/button/Button.js +26 -15
  5. package/dist/button/Button.js.map +1 -1
  6. package/dist/button/ToolbarButton.cjs +367 -0
  7. package/dist/button/ToolbarButton.cjs.map +1 -0
  8. package/dist/button/ToolbarButton.js +320 -0
  9. package/dist/button/ToolbarButton.js.map +1 -0
  10. package/dist/button/ToolbarButtonDataAttributes.cjs +27 -0
  11. package/dist/button/ToolbarButtonDataAttributes.cjs.map +1 -0
  12. package/dist/button/ToolbarButtonDataAttributes.js +21 -0
  13. package/dist/button/ToolbarButtonDataAttributes.js.map +1 -0
  14. package/dist/checkbox/index.cjs +1173 -0
  15. package/dist/checkbox/index.cjs.map +1 -0
  16. package/dist/checkbox/index.js +1048 -0
  17. package/dist/checkbox/index.js.map +1 -0
  18. package/dist/checkbox-group/CheckboxGroup.cjs +629 -0
  19. package/dist/checkbox-group/CheckboxGroup.cjs.map +1 -0
  20. package/dist/checkbox-group/CheckboxGroup.js +540 -0
  21. package/dist/checkbox-group/CheckboxGroup.js.map +1 -0
  22. package/dist/checkbox-group/CheckboxGroupDataAttributes.cjs +18 -0
  23. package/dist/checkbox-group/CheckboxGroupDataAttributes.cjs.map +1 -0
  24. package/dist/checkbox-group/CheckboxGroupDataAttributes.js +12 -0
  25. package/dist/checkbox-group/CheckboxGroupDataAttributes.js.map +1 -0
  26. package/dist/composite/composite.cjs +167 -0
  27. package/dist/composite/composite.cjs.map +1 -1
  28. package/dist/composite/composite.js +96 -1
  29. package/dist/composite/composite.js.map +1 -1
  30. package/dist/composite/constants.cjs +12 -0
  31. package/dist/composite/constants.cjs.map +1 -0
  32. package/dist/composite/constants.js +6 -0
  33. package/dist/composite/constants.js.map +1 -0
  34. package/dist/control/FieldControl.cjs +18 -343
  35. package/dist/control/FieldControl.cjs.map +1 -1
  36. package/dist/control/FieldControl.js +14 -285
  37. package/dist/control/FieldControl.js.map +1 -1
  38. package/dist/control/SliderControl.cjs +636 -0
  39. package/dist/control/SliderControl.cjs.map +1 -0
  40. package/dist/control/SliderControl.js +553 -0
  41. package/dist/control/SliderControl.js.map +1 -0
  42. package/dist/control/SliderControlDataAttributes.cjs +47 -0
  43. package/dist/control/SliderControlDataAttributes.cjs.map +1 -0
  44. package/dist/control/SliderControlDataAttributes.js +41 -0
  45. package/dist/control/SliderControlDataAttributes.js.map +1 -0
  46. package/dist/csp-provider/CSPContext.cjs +32 -0
  47. package/dist/csp-provider/CSPContext.cjs.map +1 -0
  48. package/dist/csp-provider/CSPContext.js +21 -0
  49. package/dist/csp-provider/CSPContext.js.map +1 -0
  50. package/dist/csp-provider/CSPProvider.cjs +46 -0
  51. package/dist/csp-provider/CSPProvider.cjs.map +1 -0
  52. package/dist/csp-provider/CSPProvider.js +41 -0
  53. package/dist/csp-provider/CSPProvider.js.map +1 -0
  54. package/dist/description/FieldDescription.cjs +5 -5
  55. package/dist/description/FieldDescription.cjs.map +1 -1
  56. package/dist/description/FieldDescription.js +1 -1
  57. package/dist/direction-provider/DirectionProvider.cjs +2 -2
  58. package/dist/direction-provider/DirectionProvider.cjs.map +1 -1
  59. package/dist/direction-provider/DirectionProvider.js +1 -1
  60. package/dist/error/FieldError.cjs +10 -288
  61. package/dist/error/FieldError.cjs.map +1 -1
  62. package/dist/error/FieldError.js +4 -246
  63. package/dist/error/FieldError.js.map +1 -1
  64. package/dist/form/Form.cjs +5 -4
  65. package/dist/form/Form.cjs.map +1 -1
  66. package/dist/form/Form.js +5 -4
  67. package/dist/form/Form.js.map +1 -1
  68. package/dist/group/ToolbarGroup.cjs +92 -0
  69. package/dist/group/ToolbarGroup.cjs.map +1 -0
  70. package/dist/group/ToolbarGroup.js +87 -0
  71. package/dist/group/ToolbarGroup.js.map +1 -0
  72. package/dist/group/ToolbarGroupDataAttributes.cjs +23 -0
  73. package/dist/group/ToolbarGroupDataAttributes.cjs.map +1 -0
  74. package/dist/group/ToolbarGroupDataAttributes.js +17 -0
  75. package/dist/group/ToolbarGroupDataAttributes.js.map +1 -0
  76. package/dist/header/AccordionHeader.cjs +2 -2
  77. package/dist/header/AccordionHeader.js +1 -1
  78. package/dist/image/AvatarImage.cjs +4 -4
  79. package/dist/image/AvatarImage.cjs.map +1 -1
  80. package/dist/image/AvatarImage.js +1 -1
  81. package/dist/index.cjs +80 -10
  82. package/dist/index.d.cts +2751 -612
  83. package/dist/index.d.cts.map +1 -1
  84. package/dist/index.d.ts +2751 -612
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +15 -5
  87. package/dist/index2.cjs +3651 -370
  88. package/dist/index2.cjs.map +1 -1
  89. package/dist/index2.js +3365 -270
  90. package/dist/index2.js.map +1 -1
  91. package/package.json +8 -4
  92. package/src/accordion/root/AccordionRoot.vue +2 -1
  93. package/src/checkbox/index.ts +23 -0
  94. package/src/checkbox/indicator/CheckboxIndicator.vue +102 -0
  95. package/src/checkbox/indicator/CheckboxIndicatorDataAttributes.ts +61 -0
  96. package/src/checkbox/root/CheckboxRoot.vue +632 -0
  97. package/src/checkbox/root/CheckboxRootContext.ts +22 -0
  98. package/src/checkbox/root/CheckboxRootDataAttributes.ts +54 -0
  99. package/src/checkbox/utils/useStateAttributesMapping.ts +30 -0
  100. package/src/checkbox-group/CheckboxGroup.vue +241 -0
  101. package/src/checkbox-group/CheckboxGroupContext.ts +39 -0
  102. package/src/checkbox-group/CheckboxGroupDataAttributes.ts +6 -0
  103. package/src/checkbox-group/index.ts +11 -0
  104. package/src/checkbox-group/useCheckboxGroupParent.ts +173 -0
  105. package/src/collapsible/panel/useCollapsiblePanel.ts +2 -1
  106. package/src/collapsible/root/useCollapsibleRoot.ts +3 -1
  107. package/src/composite/composite.ts +2 -0
  108. package/src/composite/item/CompositeItem.vue +7 -8
  109. package/src/composite/root/CompositeRoot.vue +12 -1
  110. package/src/csp-provider/CSPContext.ts +26 -0
  111. package/src/csp-provider/CSPProvider.vue +40 -0
  112. package/src/csp-provider/index.ts +5 -0
  113. package/src/field/item/FieldItem.vue +6 -1
  114. package/src/field/label/FieldLabel.vue +10 -51
  115. package/src/field/root/FieldRoot.vue +16 -3
  116. package/src/floating-ui-vue/types.ts +1 -4
  117. package/src/floating-ui-vue/utils/element.ts +12 -0
  118. package/src/floating-ui-vue/utils/shadowDom.ts +44 -0
  119. package/src/floating-ui-vue/utils.ts +3 -0
  120. package/src/form/Form.vue +5 -3
  121. package/src/index.ts +9 -0
  122. package/src/labelable-provider/LabelableContext.ts +2 -2
  123. package/src/labelable-provider/LabelableProvider.vue +21 -4
  124. package/src/labelable-provider/index.ts +2 -0
  125. package/src/labelable-provider/useAriaLabelledBy.ts +9 -9
  126. package/src/labelable-provider/useLabel.ts +115 -0
  127. package/src/labelable-provider/useLabelableId.ts +12 -10
  128. package/src/separator/Separator.vue +65 -0
  129. package/src/separator/SeparatorDataAttributes.ts +7 -0
  130. package/src/separator/index.ts +3 -0
  131. package/src/slider/control/SliderControl.vue +497 -0
  132. package/src/slider/control/SliderControlDataAttributes.ts +35 -0
  133. package/src/slider/index.ts +35 -0
  134. package/src/slider/indicator/SliderIndicator.vue +144 -0
  135. package/src/slider/indicator/SliderIndicatorDataAttributes.ts +35 -0
  136. package/src/slider/label/SliderLabel.vue +75 -0
  137. package/src/slider/root/SliderRoot.vue +557 -0
  138. package/src/slider/root/SliderRootContext.ts +126 -0
  139. package/src/slider/root/SliderRootDataAttributes.ts +35 -0
  140. package/src/slider/root/stateAttributesMapping.ts +13 -0
  141. package/src/slider/thumb/SliderThumb.vue +601 -0
  142. package/src/slider/thumb/SliderThumbDataAttributes.ts +39 -0
  143. package/src/slider/thumb/prehydrationScript.min.ts +5 -0
  144. package/src/slider/thumb/prehydrationScript.template.js +69 -0
  145. package/src/slider/track/SliderTrack.vue +48 -0
  146. package/src/slider/track/SliderTrackDataAttributes.ts +10 -0
  147. package/src/slider/utils/asc.ts +3 -0
  148. package/src/slider/utils/getMidpoint.ts +9 -0
  149. package/src/slider/utils/getPushedThumbValues.ts +68 -0
  150. package/src/slider/utils/getSliderValue.ts +25 -0
  151. package/src/slider/utils/replaceArrayItemAtIndex.ts +15 -0
  152. package/src/slider/utils/resolveThumbCollision.ts +177 -0
  153. package/src/slider/utils/roundValueToStep.ts +19 -0
  154. package/src/slider/utils/test-utils.ts +25 -0
  155. package/src/slider/utils/validateMinimumDistance.ts +20 -0
  156. package/src/slider/utils/valueArrayToPercentages.ts +10 -0
  157. package/src/slider/value/SliderValue.vue +90 -0
  158. package/src/slider/value/SliderValueDataAttributes.ts +35 -0
  159. package/src/switch/index.ts +14 -0
  160. package/src/switch/root/SwitchRoot.vue +448 -0
  161. package/src/switch/root/SwitchRootContext.ts +22 -0
  162. package/src/switch/root/SwitchRootDataAttributes.ts +46 -0
  163. package/src/switch/stateAttributesMapping.ts +23 -0
  164. package/src/switch/thumb/SwitchThumb.vue +59 -0
  165. package/src/switch/thumb/SwitchThumbDataAttributes.ts +46 -0
  166. package/src/toggle/Toggle.vue +211 -0
  167. package/src/toggle/ToggleDataAttributes.ts +6 -0
  168. package/src/toggle/index.ts +3 -0
  169. package/src/toggle-group/ToggleGroup.vue +224 -0
  170. package/src/toggle-group/ToggleGroupContext.ts +45 -0
  171. package/src/toggle-group/ToggleGroupDataAttributes.ts +15 -0
  172. package/src/toggle-group/index.ts +5 -0
  173. package/src/toolbar/button/ToolbarButton.vue +99 -0
  174. package/src/toolbar/button/ToolbarButtonDataAttributes.ts +15 -0
  175. package/src/toolbar/group/ToolbarGroup.vue +70 -0
  176. package/src/toolbar/group/ToolbarGroupContext.ts +23 -0
  177. package/src/toolbar/group/ToolbarGroupDataAttributes.ts +11 -0
  178. package/src/toolbar/index.ts +27 -0
  179. package/src/toolbar/input/ToolbarInput.vue +114 -0
  180. package/src/toolbar/input/ToolbarInputDataAttributes.ts +15 -0
  181. package/src/toolbar/link/ToolbarLink.vue +54 -0
  182. package/src/toolbar/link/ToolbarLinkDataAttributes.ts +7 -0
  183. package/src/toolbar/root/ToolbarRoot.vue +144 -0
  184. package/src/toolbar/root/ToolbarRootContext.ts +29 -0
  185. package/src/toolbar/root/ToolbarRootDataAttributes.ts +11 -0
  186. package/src/toolbar/separator/ToolbarSeparator.vue +41 -0
  187. package/src/toolbar/separator/ToolbarSeparatorDataAttributes.ts +7 -0
  188. package/src/use-button/useButton.ts +2 -1
  189. package/src/utils/areArraysEqual.ts +12 -0
  190. package/src/utils/clamp.ts +7 -0
  191. package/src/utils/createBaseUIEventDetails.ts +9 -0
  192. package/src/utils/formatNumber.ts +7 -0
  193. package/src/utils/owner.ts +5 -0
  194. package/src/utils/resolveAriaLabelledBy.ts +10 -0
  195. package/src/utils/useControllableState.ts +78 -14
  196. package/src/utils/useFocusableWhenDisabled.ts +6 -1
  197. package/src/utils/useMergedRefs.ts +26 -2
  198. package/src/utils/useRegisteredLabelId.ts +21 -0
  199. package/src/utils/valueToPercent.ts +7 -0
  200. package/src/utils/visuallyHidden.ts +24 -0
  201. package/dist/direction-provider/DirectionContext.cjs +0 -26
  202. package/dist/direction-provider/DirectionContext.cjs.map +0 -1
  203. package/dist/direction-provider/DirectionContext.js +0 -15
  204. package/dist/direction-provider/DirectionContext.js.map +0 -1
@@ -0,0 +1,144 @@
1
+ <script setup lang="ts">
2
+ import type { CSSProperties } from 'vue'
3
+ import type { BaseUIComponentProps } from '../../utils/types'
4
+ import type { SliderRootState } from '../root/SliderRoot.vue'
5
+ import { computed, onMounted, ref, useAttrs } from 'vue'
6
+ import { mergeProps } from '../../merge-props/mergeProps'
7
+ import { useRenderElement } from '../../utils/useRenderElement'
8
+ import { valueToPercent } from '../../utils/valueToPercent'
9
+ import { useSliderRootContext } from '../root/SliderRootContext'
10
+ import { sliderStateAttributesMapping } from '../root/stateAttributesMapping'
11
+
12
+ export interface SliderIndicatorState extends SliderRootState {}
13
+ export interface SliderIndicatorProps extends BaseUIComponentProps<SliderIndicatorState> {}
14
+
15
+ /**
16
+ * Visualizes the current value of the slider.
17
+ * Renders a `<div>` element.
18
+ *
19
+ * Documentation: [Base UI Vue Slider](https://baseui-vue.com/docs/components/slider)
20
+ */
21
+ defineOptions({
22
+ name: 'SliderIndicator',
23
+ inheritAttrs: false,
24
+ })
25
+
26
+ const props = withDefaults(defineProps<SliderIndicatorProps>(), {
27
+ as: 'div',
28
+ })
29
+
30
+ function getInsetStyles(
31
+ vertical: boolean,
32
+ range: boolean,
33
+ start: number | undefined,
34
+ end: number | undefined,
35
+ renderBeforeHydration: boolean,
36
+ mounted: boolean,
37
+ ): CSSProperties & Record<string, unknown> {
38
+ const visibility
39
+ = start === undefined || (range && end === undefined) ? 'hidden' : undefined
40
+
41
+ const startEdge = vertical ? 'bottom' : 'insetInlineStart'
42
+ const mainSide = vertical ? 'height' : 'width'
43
+ const crossSide = vertical ? 'width' : 'height'
44
+
45
+ const styles: CSSProperties & Record<string, unknown> = {
46
+ visibility: renderBeforeHydration && !mounted ? 'hidden' : visibility,
47
+ position: vertical ? 'absolute' : 'relative',
48
+ [crossSide]: 'inherit',
49
+ }
50
+
51
+ styles['--start-position'] = `${start ?? 0}%`
52
+
53
+ if (!range) {
54
+ styles[startEdge] = 0
55
+ styles[mainSide] = 'var(--start-position)'
56
+ return styles
57
+ }
58
+
59
+ styles['--relative-size'] = `${(end ?? 0) - (start ?? 0)}%`
60
+ styles[startEdge] = 'var(--start-position)'
61
+ styles[mainSide] = 'var(--relative-size)'
62
+ return styles
63
+ }
64
+
65
+ function getCenteredStyles(
66
+ vertical: boolean,
67
+ range: boolean,
68
+ start: number,
69
+ end: number,
70
+ ): CSSProperties {
71
+ const startEdge = vertical ? 'bottom' : 'insetInlineStart'
72
+ const mainSide = vertical ? 'height' : 'width'
73
+ const crossSide = vertical ? 'width' : 'height'
74
+
75
+ const styles: CSSProperties = {
76
+ position: vertical ? 'absolute' : 'relative',
77
+ [crossSide]: 'inherit',
78
+ }
79
+
80
+ if (!range) {
81
+ styles[startEdge] = 0
82
+ styles[mainSide] = `${start}%`
83
+ return styles
84
+ }
85
+
86
+ styles[startEdge] = `${start}%`
87
+ styles[mainSide] = `${end - start}%`
88
+ return styles
89
+ }
90
+
91
+ const attrs = useAttrs()
92
+ const rootContext = useSliderRootContext()
93
+ const isMounted = ref(false)
94
+ onMounted(() => {
95
+ isMounted.value = true
96
+ })
97
+
98
+ const vertical = computed(() => rootContext.orientation.value === 'vertical')
99
+ const range = computed(() => rootContext.values.value.length > 1)
100
+
101
+ const style = computed(() => rootContext.inset.value
102
+ ? getInsetStyles(
103
+ vertical.value,
104
+ range.value,
105
+ rootContext.indicatorPosition.value[0],
106
+ rootContext.indicatorPosition.value[1],
107
+ rootContext.renderBeforeHydration.value,
108
+ isMounted.value,
109
+ )
110
+ : getCenteredStyles(
111
+ vertical.value,
112
+ range.value,
113
+ valueToPercent(rootContext.values.value[0], rootContext.min.value, rootContext.max.value),
114
+ valueToPercent(
115
+ rootContext.values.value[rootContext.values.value.length - 1],
116
+ rootContext.min.value,
117
+ rootContext.max.value,
118
+ ),
119
+ ))
120
+
121
+ const indicatorProps = computed(() => mergeProps(
122
+ attrs as Record<string, unknown>,
123
+ {
124
+ 'data-base-ui-slider-indicator': rootContext.renderBeforeHydration.value ? '' : undefined,
125
+ 'style': style.value,
126
+ 'suppressHydrationWarning': rootContext.renderBeforeHydration.value || undefined,
127
+ },
128
+ ))
129
+
130
+ const { tag, mergedProps, renderless, ref: renderRef } = useRenderElement({
131
+ componentProps: props,
132
+ state: rootContext.state,
133
+ props: indicatorProps,
134
+ defaultTagName: 'div',
135
+ stateAttributesMapping: sliderStateAttributesMapping,
136
+ })
137
+ </script>
138
+
139
+ <template>
140
+ <slot v-if="renderless" :ref="renderRef" :props="mergedProps" :state="rootContext.state" />
141
+ <component :is="tag" v-else :ref="renderRef" v-bind="mergedProps">
142
+ <slot />
143
+ </component>
144
+ </template>
@@ -0,0 +1,35 @@
1
+ export enum SliderIndicatorDataAttributes {
2
+ /**
3
+ * Present while the user is dragging.
4
+ */
5
+ dragging = 'data-dragging',
6
+ /**
7
+ * Indicates the orientation of the slider.
8
+ * @type {'horizontal' | 'vertical'}
9
+ */
10
+ orientation = 'data-orientation',
11
+ /**
12
+ * Present when the slider is disabled.
13
+ */
14
+ disabled = 'data-disabled',
15
+ /**
16
+ * Present when the slider is in valid state (when wrapped in Field.Root).
17
+ */
18
+ valid = 'data-valid',
19
+ /**
20
+ * Present when the slider is in invalid state (when wrapped in Field.Root).
21
+ */
22
+ invalid = 'data-invalid',
23
+ /**
24
+ * Present when the slider has been touched (when wrapped in Field.Root).
25
+ */
26
+ touched = 'data-touched',
27
+ /**
28
+ * Present when the slider's value has changed (when wrapped in Field.Root).
29
+ */
30
+ dirty = 'data-dirty',
31
+ /**
32
+ * Present when the slider is focused (when wrapped in Field.Root).
33
+ */
34
+ focused = 'data-focused',
35
+ }
@@ -0,0 +1,75 @@
1
+ <script setup lang="ts">
2
+ import type { BaseUIComponentProps } from '../../utils/types'
3
+ import type { SliderRootState } from '../root/SliderRoot.vue'
4
+ import { isHTMLElement } from '@floating-ui/utils/dom'
5
+ import { computed, useAttrs } from 'vue'
6
+ import { focusElementWithVisible, useLabel } from '../../labelable-provider/useLabel'
7
+ import { mergeProps } from '../../merge-props/mergeProps'
8
+ import { ownerDocument } from '../../utils/owner'
9
+ import { useRenderElement } from '../../utils/useRenderElement'
10
+ import { useSliderRootContext } from '../root/SliderRootContext'
11
+ import { sliderStateAttributesMapping } from '../root/stateAttributesMapping'
12
+
13
+ export type SliderLabelState = SliderRootState
14
+ export interface SliderLabelProps extends BaseUIComponentProps<SliderLabelState> {}
15
+
16
+ /**
17
+ * An accessible label that is automatically associated with the slider thumbs.
18
+ * Renders a `<div>` element.
19
+ *
20
+ * Documentation: [Base UI Vue Slider](https://baseui-vue.com/docs/components/slider)
21
+ */
22
+ defineOptions({
23
+ name: 'SliderLabel',
24
+ inheritAttrs: false,
25
+ })
26
+
27
+ const props = withDefaults(defineProps<SliderLabelProps>(), {
28
+ as: 'div',
29
+ })
30
+
31
+ const attrs = useAttrs()
32
+ const rootContext = useSliderRootContext()
33
+ const label = useLabel({
34
+ id: computed(() => rootContext.rootLabelId.value),
35
+ fallbackControlId: computed(() => rootContext.controlRef.value?.id),
36
+ setLabelId: rootContext.setLabelId,
37
+ focusControl(_event, controlId) {
38
+ if (controlId) {
39
+ const controlElement = rootContext.controlRef.value
40
+ ? ownerDocument(rootContext.controlRef.value)?.getElementById(controlId)
41
+ : null
42
+ if (isHTMLElement(controlElement)) {
43
+ focusElementWithVisible(controlElement)
44
+ return
45
+ }
46
+ }
47
+
48
+ const fallbackInputs = rootContext.controlRef.value?.querySelectorAll('input[type="range"]')
49
+ const fallbackInput = fallbackInputs?.length === 1 ? fallbackInputs[0] : null
50
+ if (isHTMLElement(fallbackInput)) {
51
+ focusElementWithVisible(fallbackInput)
52
+ }
53
+ },
54
+ })
55
+
56
+ const labelProps = computed(() => mergeProps(
57
+ attrs as Record<string, unknown>,
58
+ label.props.value,
59
+ ))
60
+
61
+ const { tag, mergedProps, renderless, ref: renderRef } = useRenderElement({
62
+ componentProps: props,
63
+ state: rootContext.state,
64
+ props: labelProps,
65
+ defaultTagName: 'div',
66
+ stateAttributesMapping: sliderStateAttributesMapping,
67
+ })
68
+ </script>
69
+
70
+ <template>
71
+ <slot v-if="renderless" :ref="renderRef" :props="mergedProps" :state="rootContext.state" />
72
+ <component :is="tag" v-else :ref="renderRef" v-bind="mergedProps">
73
+ <slot />
74
+ </component>
75
+ </template>