ropav 0.1.5 → 0.1.7

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 (235) hide show
  1. package/README.md +10 -0
  2. package/dist/accordion.css +17 -17
  3. package/dist/accordion.js +125 -154
  4. package/dist/alert.css +18 -18
  5. package/dist/alert.js +20 -20
  6. package/dist/aria.js +14 -0
  7. package/dist/aspect-ratio.js +1 -1
  8. package/dist/attributes.js +9 -0
  9. package/dist/attributes2.js +29 -0
  10. package/dist/avatar.css +19 -19
  11. package/dist/avatar.js +10 -18
  12. package/dist/badge.css +16 -16
  13. package/dist/badge.js +6 -6
  14. package/dist/base.css +18 -13
  15. package/dist/button-group.js +1 -1
  16. package/dist/button-link.js +13 -14
  17. package/dist/button.css +32 -27
  18. package/dist/button.js +13 -14
  19. package/dist/{useButtonColor.js → button.scss_vue_type_style_index_0_src_true_lang.js} +3 -2
  20. package/dist/card.js +1 -1
  21. package/dist/checkbox.css +32 -32
  22. package/dist/checkbox.js +23 -29
  23. package/dist/collapse.css +6 -6
  24. package/dist/collapse.js +8 -7
  25. package/dist/collectionNavigation.js +2 -99
  26. package/dist/color-input.css +19 -19
  27. package/dist/color-input.js +15 -14
  28. package/dist/color-picker.css +40 -40
  29. package/dist/color-picker.js +222 -202
  30. package/dist/color-picker2.js +1 -9
  31. package/dist/color-swatch.css +4 -4
  32. package/dist/color-swatch.js +7 -9
  33. package/dist/color.js +5 -10
  34. package/dist/componentColors.js +165 -84
  35. package/dist/componentRef.js +26 -0
  36. package/dist/components/accordion/accordionContext.d.ts +3 -0
  37. package/dist/components/accordion/accordionModel.d.ts +14 -0
  38. package/dist/components/accordion/index.d.ts +2 -1
  39. package/dist/components/accordion/index.js +1 -1
  40. package/dist/components/accordion/types.d.ts +1 -2
  41. package/dist/components/accordion/useAccordion.d.ts +2 -2
  42. package/dist/components/accordion/useAccordionItem.d.ts +2 -0
  43. package/dist/components/checkbox/useCheckbox.d.ts +2 -3
  44. package/dist/components/color-input/color-input.d.ts +2 -2
  45. package/dist/components/color-input/useColorInput.d.ts +1 -1
  46. package/dist/components/color-picker/index.js +2 -2
  47. package/dist/components/color-picker/types.d.ts +2 -2
  48. package/dist/components/color-picker/useColorPickerSaturation.d.ts +22 -0
  49. package/dist/components/color-picker/useColorPickerSlider.d.ts +20 -0
  50. package/dist/components/color-picker/useColorPickerValue.d.ts +1 -1
  51. package/dist/components/dialog/{dialog-core.d.ts → dialogContext.d.ts} +2 -6
  52. package/dist/components/dialog/useDialogContentInteractions.d.ts +18 -0
  53. package/dist/components/dialog/useDialogRootState.d.ts +19 -0
  54. package/dist/components/dropdown-menu/dropdown-menu-content.d.ts +2 -2
  55. package/dist/components/dropdown-menu/dropdown-menu-item-row.d.ts +1 -1
  56. package/dist/components/dropdown-menu/dropdown-menu-items.d.ts +1 -1
  57. package/dist/components/dropdown-menu/dropdown-menu-model.d.ts +8 -0
  58. package/dist/components/dropdown-menu/dropdown-menu-root.d.ts +2 -2
  59. package/dist/components/dropdown-menu/dropdown-menu-sub-content.d.ts +2 -2
  60. package/dist/components/dropdown-menu/dropdown-menu-sub-trigger.d.ts +1 -1
  61. package/dist/components/dropdown-menu/dropdown-menu-sub.d.ts +1 -1
  62. package/dist/components/dropdown-menu/dropdown-menu.d.ts +3 -3
  63. package/dist/components/dropdown-menu/{dropdown-menu-primitive-core.d.ts → dropdownMenuContext.d.ts} +17 -19
  64. package/dist/components/dropdown-menu/dropdownMenuDataModel.d.ts +20 -0
  65. package/dist/components/dropdown-menu/dropdownMenuInteraction.d.ts +3 -0
  66. package/dist/components/dropdown-menu/dropdownMenuInteractionNavigation.d.ts +24 -0
  67. package/dist/components/dropdown-menu/dropdownMenuInteractionRegistry.d.ts +42 -0
  68. package/dist/components/dropdown-menu/dropdownMenuInteractionTypes.d.ts +85 -0
  69. package/dist/components/dropdown-menu/useDropdownMenu.d.ts +11 -11
  70. package/dist/components/dropdown-menu/useDropdownMenuContextTrigger.d.ts +9 -0
  71. package/dist/components/dropdown-menu/useDropdownMenuDataController.d.ts +34 -0
  72. package/dist/components/dropdown-menu/useDropdownMenuDataRegistration.d.ts +22 -0
  73. package/dist/components/dropdown-menu/useDropdownMenuHoverIntent.d.ts +6 -5
  74. package/dist/components/dropdown-menu/useDropdownMenuInteractionDismissal.d.ts +17 -0
  75. package/dist/components/dropdown-menu/useDropdownMenuInteractionKeyboard.d.ts +19 -0
  76. package/dist/components/dropdown-menu/useDropdownMenuPortalPosition.d.ts +0 -1
  77. package/dist/components/dropdown-menu/useDropdownMenuPresentation.d.ts +29 -0
  78. package/dist/components/dropdown-menu/useDropdownMenuPrimitiveContent.d.ts +2 -2
  79. package/dist/components/dropdown-menu/useDropdownMenuRenderItems.d.ts +1 -1
  80. package/dist/components/dropdown-menu/useDropdownMenuTargetBindings.d.ts +19 -0
  81. package/dist/components/floating/hoverDisclosureInteractionModel.d.ts +42 -0
  82. package/dist/components/floating/index.js +1 -1
  83. package/dist/components/floating/useFloatingPosition.d.ts +0 -1
  84. package/dist/components/floating/useHoverDisclosureInteractions.d.ts +32 -0
  85. package/dist/components/floating/useHoverDisclosureOpenState.d.ts +25 -0
  86. package/dist/components/floating/useHoverDisclosureTargetBinding.d.ts +27 -0
  87. package/dist/components/input/useInput.d.ts +1 -1
  88. package/dist/components/number-input/numberInputModel.d.ts +15 -0
  89. package/dist/components/number-input/useNumberInput.d.ts +4 -18
  90. package/dist/components/pagination/index.d.ts +1 -1
  91. package/dist/components/pagination/index.js +1 -1
  92. package/dist/components/pagination/paginationModel.d.ts +4 -0
  93. package/dist/components/pagination/types.d.ts +15 -0
  94. package/dist/components/pagination/usePagination.d.ts +3 -19
  95. package/dist/components/popover/usePopoverBindings.d.ts +16 -0
  96. package/dist/components/progress/progressModel.d.ts +8 -0
  97. package/dist/components/progress/useProgress.d.ts +1 -7
  98. package/dist/components/radio/useRadio.d.ts +3 -4
  99. package/dist/components/scroll-area/scroll-area.d.ts +1 -1
  100. package/dist/components/scroll-area/scrollAreaModel.d.ts +64 -0
  101. package/dist/components/scroll-area/types.d.ts +4 -0
  102. package/dist/components/scroll-area/useScrollArea.d.ts +70 -52
  103. package/dist/components/scroll-area/{useScrollAreaPresentation.d.ts → useScrollAreaAttributes.d.ts} +37 -14
  104. package/dist/components/scroll-area/useScrollAreaDerivedState.d.ts +8 -0
  105. package/dist/components/scroll-area/useScrollAreaMeasurement.d.ts +35 -0
  106. package/dist/components/scroll-area/useScrollAreaPointer.d.ts +10 -8
  107. package/dist/components/scroll-area/useScrollAreaVisibility.d.ts +15 -20
  108. package/dist/components/select/useSelect.d.ts +2 -1
  109. package/dist/components/select/useSelectNativeValue.d.ts +1 -7
  110. package/dist/components/slider/rangeSliderModel.d.ts +41 -0
  111. package/dist/components/slider/{sliderCore.d.ts → sliderModel.d.ts} +2 -2
  112. package/dist/components/slider/useRangeSlider.d.ts +9 -17
  113. package/dist/components/slider/useRangeSliderValueState.d.ts +40 -0
  114. package/dist/components/slider/useSlider.d.ts +8 -14
  115. package/dist/components/slider/useSliderPointerPreview.d.ts +22 -0
  116. package/dist/components/slider/useSliderTooltipState.d.ts +40 -0
  117. package/dist/components/slider/useSliderValueState.d.ts +33 -0
  118. package/dist/components/switch/useSwitch.d.ts +1 -1
  119. package/dist/components/teleport-provider/index.js +1 -1
  120. package/dist/components/teleport-provider/useTeleportTarget.d.ts +1 -2
  121. package/dist/components/textarea/useTextarea.d.ts +1 -1
  122. package/dist/components/toast/useToastLifecycle.d.ts +19 -0
  123. package/dist/components/tooltip/useTooltip.d.ts +1 -2
  124. package/dist/composables/index.d.ts +2 -0
  125. package/dist/composables/index.js +2 -0
  126. package/dist/composables/useControllableValue.d.ts +14 -0
  127. package/dist/css.js +12 -0
  128. package/dist/dialog.js +227 -216
  129. package/dist/dropdown-menu.js +1493 -1118
  130. package/dist/events.js +59 -0
  131. package/dist/field.css +8 -8
  132. package/dist/field.js +13 -25
  133. package/dist/floating.js +553 -312
  134. package/dist/floatingOffset.js +11 -0
  135. package/dist/focus-trap.js +7 -5
  136. package/dist/focusNavigation.js +37 -0
  137. package/dist/icon-button.css +12 -173
  138. package/dist/icon-button.js +8 -7
  139. package/dist/index.d.ts +5 -4
  140. package/dist/index.js +13 -11
  141. package/dist/input.css +24 -24
  142. package/dist/input.js +20 -32
  143. package/dist/interactive.js +18 -0
  144. package/dist/modal.js +11 -7
  145. package/dist/number-input.css +18 -18
  146. package/dist/number-input.js +15 -13
  147. package/dist/number.js +22 -0
  148. package/dist/overlay.js +3 -2
  149. package/dist/pagination.css +28 -28
  150. package/dist/pagination.js +67 -65
  151. package/dist/pointer.js +9 -0
  152. package/dist/popover.css +34 -34
  153. package/dist/popover.js +93 -91
  154. package/dist/progress.css +29 -21
  155. package/dist/progress.js +25 -21
  156. package/dist/query.js +40 -0
  157. package/dist/radio.css +18 -18
  158. package/dist/radio.js +31 -37
  159. package/dist/rafScheduler.js +34 -0
  160. package/dist/scroll-area.css +35 -26
  161. package/dist/scroll-area.js +553 -500
  162. package/dist/select.css +45 -45
  163. package/dist/select.js +70 -56
  164. package/dist/slider.css +191 -191
  165. package/dist/slider.js +695 -628
  166. package/dist/styles-api.d.ts +0 -1
  167. package/dist/styles-api.js +1 -4
  168. package/dist/switch.css +17 -17
  169. package/dist/switch.js +15 -16
  170. package/dist/tabs.css +46 -46
  171. package/dist/tabs.js +51 -68
  172. package/dist/text.js +17 -0
  173. package/dist/textarea.css +26 -26
  174. package/dist/textarea.js +22 -33
  175. package/dist/toast.css +26 -26
  176. package/dist/toast.js +157 -129
  177. package/dist/tooltip.css +12 -12
  178. package/dist/tooltip.js +46 -47
  179. package/dist/useCollapse.js +19 -17
  180. package/dist/useControlState.js +4 -7
  181. package/dist/useControllableValue.js +8 -2
  182. package/dist/useFloatingPosition.js +122 -1128
  183. package/dist/useFormControl.js +3 -2
  184. package/dist/useOverlayZIndex.js +2 -6
  185. package/dist/useRequiredInject.js +1 -1
  186. package/dist/useTeleportTarget.js +3 -14
  187. package/dist/useTypeahead.js +94 -0
  188. package/dist/utils/aria.d.ts +3 -0
  189. package/dist/utils/attributes.d.ts +2 -0
  190. package/dist/utils/bem.d.ts +3 -0
  191. package/dist/utils/collectionNavigation.d.ts +2 -0
  192. package/dist/utils/color.d.ts +7 -0
  193. package/dist/{components/color-picker/color-picker-utils.d.ts → utils/colorPicker.d.ts} +5 -4
  194. package/dist/utils/componentColors.d.ts +7 -0
  195. package/dist/utils/css.d.ts +3 -0
  196. package/dist/utils/dom/ancestry.d.ts +7 -0
  197. package/dist/utils/dom/attributes.d.ts +16 -0
  198. package/dist/utils/dom/componentRef.d.ts +4 -0
  199. package/dist/utils/dom/events.d.ts +5 -0
  200. package/dist/utils/dom/focusNavigation.d.ts +7 -0
  201. package/dist/utils/dom/interactive.d.ts +2 -0
  202. package/dist/utils/dom/pointer.d.ts +2 -0
  203. package/dist/utils/dom/query.d.ts +4 -0
  204. package/dist/utils/dom/scroll.d.ts +23 -0
  205. package/dist/utils/floatingOffset.d.ts +10 -0
  206. package/dist/utils/geometry.d.ts +14 -0
  207. package/dist/utils/indexPath.d.ts +6 -0
  208. package/dist/utils/number.d.ts +4 -0
  209. package/dist/utils/rafScheduler.d.ts +4 -0
  210. package/dist/utils/text.d.ts +2 -0
  211. package/docs/code-architecture.md +118 -0
  212. package/docs/public-composables-api.md +52 -0
  213. package/docs/public-floating-api.md +6 -5
  214. package/package.json +54 -46
  215. package/src/styles/_mixins.scss +4 -0
  216. package/src/styles/_tokens.scss +12 -12
  217. package/src/styles/_variables.scss +1 -1
  218. package/dist/button-link.css +0 -167
  219. package/dist/components/dropdown-menu/dropdown-menu-outside.d.ts +0 -3
  220. package/dist/components/dropdown-menu/dropdown-menu-utils.d.ts +0 -21
  221. package/dist/components/dropdown-menu/useDropdownMenuDisclosure.d.ts +0 -37
  222. package/dist/components/dropdown-menu/useDropdownMenuDom.d.ts +0 -29
  223. package/dist/components/dropdown-menu/useDropdownMenuInteractions.d.ts +0 -52
  224. package/dist/components/dropdown-menu/useDropdownMenuNavigation.d.ts +0 -17
  225. package/dist/components/dropdown-menu/useDropdownSubmenus.d.ts +0 -18
  226. package/dist/components/scroll-area/scrollAreaCore.d.ts +0 -25
  227. package/dist/components/scroll-area/useScrollAreaControls.d.ts +0 -25
  228. package/dist/components/scroll-area/useScrollAreaMetrics.d.ts +0 -35
  229. /package/dist/components/alert/{useAlertColor.d.ts → alertColor.d.ts} +0 -0
  230. /package/dist/components/avatar/{useAvatarColor.d.ts → avatarColor.d.ts} +0 -0
  231. /package/dist/components/badge/{useBadgeColor.d.ts → badgeColor.d.ts} +0 -0
  232. /package/dist/components/button/{useButtonColor.d.ts → buttonColor.d.ts} +0 -0
  233. /package/dist/components/color-swatch/{useColorSwatchColor.d.ts → colorSwatchColor.d.ts} +0 -0
  234. /package/dist/components/toast/{useToastColor.d.ts → toastColor.d.ts} +0 -0
  235. /package/dist/{composables → internal/composables}/useOverlayLayer.d.ts +0 -0
package/README.md CHANGED
@@ -37,6 +37,10 @@ Import the components you need:
37
37
  import { Button } from 'ropav';
38
38
  ```
39
39
 
40
+ Headless state utilities are available from `ropav/composables`. See the
41
+ [public composables API](./docs/public-composables-api.md) for their controlled and uncontrolled
42
+ state contracts.
43
+
40
44
  ## Custom color contrast
41
45
 
42
46
  `autoContrast` selects foreground colors for preset colors and opaque custom color literals. A
@@ -140,3 +144,9 @@ See the [Public Styles API](./docs/public-styles-api.md) and [public token table
140
144
 
141
145
  For headless Tooltip, HoverCard and custom menu markup, see the
142
146
  [public floating API](./docs/public-floating-api.md).
147
+
148
+ ## Development
149
+
150
+ Contributors should follow the [code architecture guide](./docs/code-architecture.md) for component,
151
+ composable, utility, dependency, and testing conventions. Run `pnpm run verify` before submitting a
152
+ change.
@@ -1,5 +1,5 @@
1
1
  @layer ropav.components {
2
- .rp-accordion[data-v-d15589fa] {
2
+ .rp-accordion[data-v-c48cb87a] {
3
3
  --_rp-accordion-radius: var(--rp-radius-sm);
4
4
  --_rp-accordion-duration: var(--rp-transition-fast);
5
5
  box-sizing: border-box;
@@ -12,29 +12,29 @@
12
12
  border: var(--rp-border-width-thin) solid var(--rp-color-default-border);
13
13
  border-radius: var(--_rp-accordion-radius);
14
14
  }
15
- .rp-accordion--disabled[data-v-d15589fa] {
15
+ .rp-accordion--disabled[data-v-c48cb87a] {
16
16
  opacity: var(--rp-opacity-disabled);
17
17
  cursor: not-allowed;
18
18
  }
19
19
  }@layer ropav.components {
20
- .rp-accordion-item[data-v-5b00ef39] {
20
+ .rp-accordion-item[data-v-ab630265] {
21
21
  --_rp-accordion-duration: var(--rp-transition-fast);
22
22
  box-sizing: border-box;
23
23
  min-width: 0;
24
24
  border-top: var(--rp-border-width-thin) solid var(--rp-color-default-border);
25
25
  }
26
- .rp-accordion-item[data-v-5b00ef39]:first-child {
26
+ .rp-accordion-item[data-v-ab630265]:first-child {
27
27
  border-top: 0;
28
28
  }
29
- .rp-accordion-item--disabled[data-v-5b00ef39] {
29
+ .rp-accordion-item--disabled[data-v-ab630265] {
30
30
  opacity: var(--rp-opacity-disabled);
31
31
  cursor: not-allowed;
32
32
  }
33
- .rp-accordion-item__heading[data-v-5b00ef39] {
33
+ .rp-accordion-item__heading[data-v-ab630265] {
34
34
  margin: 0;
35
35
  font: inherit;
36
36
  }
37
- .rp-accordion-item__trigger[data-v-5b00ef39] {
37
+ .rp-accordion-item__trigger[data-v-ab630265] {
38
38
  display: flex;
39
39
  align-items: center;
40
40
  justify-content: space-between;
@@ -55,30 +55,30 @@
55
55
  border: 0;
56
56
  transition: background-color var(--_rp-accordion-duration), color var(--_rp-accordion-duration);
57
57
  }
58
- .rp-accordion-item__trigger[data-v-5b00ef39]:hover:not(:disabled) {
58
+ .rp-accordion-item__trigger[data-v-ab630265]:hover:not(:disabled) {
59
59
  background-color: var(--rp-color-default-hover);
60
60
  }
61
- .rp-accordion-item__trigger[data-v-5b00ef39]:focus-visible {
61
+ .rp-accordion-item__trigger[data-v-ab630265]:focus-visible {
62
62
  outline: none;
63
63
  border-color: var(--rp-color-control-border-focus);
64
64
  box-shadow: 0 0 0 var(--rp-border-width-medium) var(--rp-color-focus-ring);
65
65
  }
66
- .rp-accordion-item__trigger[data-v-5b00ef39]:disabled {
66
+ .rp-accordion-item__trigger[data-v-ab630265]:disabled {
67
67
  cursor: default;
68
68
  }
69
- .rp-accordion-item__title[data-v-5b00ef39] {
69
+ .rp-accordion-item__title[data-v-ab630265] {
70
70
  min-width: 0;
71
71
  }
72
- .rp-accordion-item__icon[data-v-5b00ef39] {
72
+ .rp-accordion-item__icon[data-v-ab630265] {
73
73
  display: inline-flex;
74
74
  flex: 0 0 auto;
75
75
  color: var(--rp-color-control-icon);
76
76
  transition: transform var(--_rp-accordion-duration);
77
77
  }
78
- .rp-accordion-item--open .rp-accordion-item__icon[data-v-5b00ef39] {
78
+ .rp-accordion-item--open .rp-accordion-item__icon[data-v-ab630265] {
79
79
  transform: rotate(180deg);
80
80
  }
81
- .rp-accordion-item__content[data-v-5b00ef39] {
81
+ .rp-accordion-item__content[data-v-ab630265] {
82
82
  box-sizing: border-box;
83
83
  display: grid;
84
84
  min-width: 0;
@@ -90,13 +90,13 @@
90
90
  grid-template-rows: 1fr;
91
91
  transition: grid-template-rows var(--_rp-accordion-duration), opacity var(--_rp-accordion-duration), padding-top var(--_rp-accordion-duration), padding-bottom var(--_rp-accordion-duration);
92
92
  }
93
- .rp-accordion-item__inner[data-v-5b00ef39] {
93
+ .rp-accordion-item__inner[data-v-ab630265] {
94
94
  min-height: 0;
95
95
  min-width: 0;
96
96
  overflow: hidden;
97
97
  }
98
- .rp-accordion-content-enter-from[data-v-5b00ef39],
99
- .rp-accordion-content-leave-to[data-v-5b00ef39] {
98
+ .rp-accordion-content-enter-from[data-v-ab630265],
99
+ .rp-accordion-content-leave-to[data-v-ab630265] {
100
100
  opacity: 0;
101
101
  grid-template-rows: 0fr;
102
102
  padding-top: 0;
package/dist/accordion.js CHANGED
@@ -1,133 +1,39 @@
1
1
  import './accordion.css';
2
+ import { t as useControllableValue } from "./useControllableValue.js";
3
+ import { t as useStylesApi } from "./styles-api.js";
4
+ import { n as toPresenceAttribute, t as toOptionalAttribute } from "./attributes.js";
2
5
  import { t as bem } from "./bem.js";
3
- import { n as useStylesApi, t as presence } from "./styles-api.js";
4
- import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
6
+ import { t as getFocusNavigationTarget } from "./focusNavigation.js";
5
7
  import { t as useRequiredInject } from "./useRequiredInject.js";
6
8
  import { t as useCollapse } from "./useCollapse.js";
7
- import { VaporTransition, applyVShow, child, computed, createComponent, createIf, createSlot, defineVaporComponent, extend, markRaw, next, provide, ref, renderEffect, setDynamicProps, setInsertionState, setText, template, toDisplayString, unref, useId } from "vue";
8
- //#region src/components/accordion/types.ts
9
- var accordionParts = ["root"];
10
- var accordionItemParts = [
11
- "root",
12
- "trigger",
13
- "title",
14
- "icon",
15
- "content"
16
- ];
9
+ import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
10
+ import { VaporTransition, applyVShow, child, computed, createComponent, createIf, createSlot, defineVaporComponent, extend, markRaw, next, provide, renderEffect, setDynamicProps, setInsertionState, setText, template, toDisplayString, unref, useId } from "vue";
11
+ //#region src/components/accordion/accordionContext.ts
17
12
  var accordionKey = Symbol("accordion");
18
13
  //#endregion
19
- //#region src/components/accordion/useAccordion.ts
20
- var ACCORDION_SELECTOR = ".rp-accordion";
21
- var TRIGGER_SELECTOR = ".rp-accordion-item__trigger";
22
- function normalizeValue(value, multiple) {
14
+ //#region src/components/accordion/accordionModel.ts
15
+ function readAccordionOpenValues(value, multiple) {
23
16
  if (value == null) return [];
24
17
  const values = Array.isArray(value) ? value : [value];
25
18
  return multiple ? values : values.slice(0, 1);
26
19
  }
27
- function toModelValue(values, multiple) {
28
- return multiple ? [...values] : values[0] ?? null;
29
- }
30
20
  function hasValue(values, value) {
31
21
  return values.some((itemValue) => itemValue === value);
32
22
  }
33
- function withoutValue(values, value) {
34
- return values.filter((itemValue) => itemValue !== value);
35
- }
36
- var NAVIGATION_KEYS = {
37
- ArrowDown: 1,
38
- ArrowUp: -1
39
- };
40
- function getAccordionTrigger(event, root) {
41
- const target = event.target;
42
- if (!(target instanceof Element)) return void 0;
43
- const trigger = target.closest(TRIGGER_SELECTOR);
44
- if (!trigger || trigger.closest(ACCORDION_SELECTOR) !== root) return void 0;
45
- return trigger;
46
- }
47
- function getAccordionTriggers(root) {
48
- return Array.from(root.querySelectorAll(TRIGGER_SELECTOR)).filter((trigger) => trigger.closest(ACCORDION_SELECTOR) === root && !trigger.disabled);
49
- }
50
- function getNextTrigger(root, currentTrigger, key) {
51
- const triggers = getAccordionTriggers(root);
52
- const currentIndex = triggers.indexOf(currentTrigger);
53
- if (currentIndex === -1 || triggers.length === 0) return void 0;
54
- if (key === "Home") return triggers[0];
55
- if (key === "End") return triggers[triggers.length - 1];
56
- const direction = NAVIGATION_KEYS[key];
57
- if (!direction) return void 0;
58
- return triggers[(currentIndex + direction + triggers.length) % triggers.length];
59
- }
60
- function useAccordion(props, emitUpdate) {
61
- const isMultiple = computed(() => Boolean(props.multiple));
62
- const isCollapsible = computed(() => props.collapsible !== false);
63
- const isDisabled = computed(() => Boolean(props.disabled));
64
- const isControlled = computed(() => props.modelValue !== void 0);
65
- const uncontrolledValue = ref(props.defaultValue ?? null);
66
- const openValues = computed(() => normalizeValue(isControlled.value ? props.modelValue : uncontrolledValue.value, isMultiple.value));
67
- const rootClass = computed(() => bem("rp-accordion", {
68
- disabled: isDisabled.value,
69
- multiple: isMultiple.value
70
- }));
71
- const rootProps = computed(() => ({
72
- id: props.id,
73
- class: rootClass.value,
74
- "data-disabled": isDisabled.value || void 0,
75
- "aria-label": props.ariaLabel || void 0,
76
- "aria-labelledby": props.labelledby || void 0,
77
- "aria-describedby": props.describedby || void 0,
78
- onKeydown: onRootKeydown
79
- }));
80
- function setValues(nextValues) {
81
- const nextModelValue = toModelValue(nextValues, isMultiple.value);
82
- if (!isControlled.value) uncontrolledValue.value = nextModelValue;
83
- emitUpdate(nextModelValue);
84
- }
85
- function setItemOpen(value, open) {
86
- if (isDisabled.value) return;
87
- const values = openValues.value;
88
- if (hasValue(values, value) === open) return;
89
- if (!open && !isCollapsible.value) return;
90
- if (isMultiple.value) {
91
- setValues(open ? [...values, value] : withoutValue(values, value));
92
- return;
93
- }
94
- setValues(open ? [value] : []);
95
- }
96
- function onRootKeydown(event) {
97
- const root = event.currentTarget;
98
- if (!root) return;
99
- const trigger = getAccordionTrigger(event, root);
100
- if (!trigger) return;
101
- const nextTrigger = getNextTrigger(root, trigger, event.key);
102
- if (!nextTrigger) return;
103
- event.preventDefault();
104
- nextTrigger.focus();
105
- }
106
- provide(accordionKey, {
107
- get multiple() {
108
- return isMultiple.value;
109
- },
110
- get collapsible() {
111
- return isCollapsible.value;
112
- },
113
- get disabled() {
114
- return isDisabled.value;
115
- },
116
- get unmountOnExit() {
117
- return Boolean(props.unmountOnExit);
118
- },
119
- isItemOpen(value) {
120
- return hasValue(openValues.value, value);
121
- },
122
- setItemOpen
123
- });
23
+ function transitionAccordionValue(currentValue, itemValue, open, options) {
24
+ const openValues = readAccordionOpenValues(currentValue, options.multiple);
25
+ if (hasValue(openValues, itemValue) === open || !open && !options.collapsible) return { changed: false };
26
+ if (!options.multiple) return {
27
+ changed: true,
28
+ modelValue: open ? itemValue : null
29
+ };
124
30
  return {
125
- rootClass,
126
- rootProps,
127
- openValues,
128
- setItemOpen
31
+ changed: true,
32
+ modelValue: open ? [...openValues, itemValue] : openValues.filter((value) => value !== itemValue)
129
33
  };
130
34
  }
35
+ //#endregion
36
+ //#region src/components/accordion/useAccordionItem.ts
131
37
  function useAccordionItem(props) {
132
38
  const group = useRequiredInject(accordionKey, "RpAccordionItem");
133
39
  const generatedId = useId();
@@ -137,7 +43,6 @@ function useAccordionItem(props) {
137
43
  const isOpen = computed(() => group.isItemOpen(props.value));
138
44
  const isDisabled = computed(() => Boolean(group.disabled || props.disabled));
139
45
  const shouldUnmountOnExit = computed(() => props.unmountOnExit ?? group.unmountOnExit);
140
- const state = computed(() => isOpen.value ? "open" : "closed");
141
46
  const triggerAriaDisabled = computed(() => isDisabled.value || !group.collapsible && isOpen.value);
142
47
  const collapse = useCollapse({
143
48
  id: contentId,
@@ -149,7 +54,7 @@ function useAccordionItem(props) {
149
54
  ariaDescribedby: () => props.ariaDescribedby,
150
55
  ariaLabelledby: () => props.ariaLabelledby ?? triggerId.value
151
56
  }, (nextOpen) => {
152
- setOpen(nextOpen);
57
+ group.setItemOpen(props.value, nextOpen);
153
58
  });
154
59
  const rootClass = computed(() => bem("rp-accordion-item", {
155
60
  open: isOpen.value,
@@ -159,8 +64,8 @@ function useAccordionItem(props) {
159
64
  const rootProps = computed(() => ({
160
65
  id: id.value,
161
66
  class: rootClass.value,
162
- "data-state": state.value,
163
- "data-disabled": isDisabled.value || void 0
67
+ "data-state": collapse.state.value,
68
+ "data-disabled": toOptionalAttribute(isDisabled.value)
164
69
  }));
165
70
  const triggerProps = computed(() => ({
166
71
  ...collapse.triggerProps.value,
@@ -168,9 +73,8 @@ function useAccordionItem(props) {
168
73
  class: "rp-accordion-item__trigger",
169
74
  "aria-controls": contentId.value,
170
75
  "aria-expanded": isOpen.value,
171
- "aria-disabled": triggerAriaDisabled.value || void 0,
172
- disabled: isDisabled.value || void 0,
173
- onClick: onTriggerClick
76
+ "aria-disabled": toOptionalAttribute(triggerAriaDisabled.value),
77
+ disabled: toOptionalAttribute(isDisabled.value)
174
78
  }));
175
79
  const contentProps = computed(() => ({
176
80
  ...collapse.contentProps.value,
@@ -182,36 +86,20 @@ function useAccordionItem(props) {
182
86
  value: props.value,
183
87
  isOpen: isOpen.value,
184
88
  disabled: isDisabled.value,
185
- open,
186
- close,
187
- toggle
89
+ open: collapse.open,
90
+ close: collapse.close,
91
+ toggle: collapse.toggle
188
92
  }));
189
93
  const triggerSlotProps = computed(() => ({
190
94
  triggerProps: triggerProps.value,
191
95
  ...contentSlotProps.value
192
96
  }));
193
- function open() {
194
- setOpen(true);
195
- }
196
- function close() {
197
- setOpen(false);
198
- }
199
- function toggle() {
200
- setOpen(!isOpen.value);
201
- }
202
- function setOpen(nextOpen) {
203
- if (isDisabled.value) return;
204
- group.setItemOpen(props.value, nextOpen);
205
- }
206
- function onTriggerClick() {
207
- toggle();
208
- }
209
97
  return {
210
98
  group,
211
99
  id,
212
100
  triggerId,
213
101
  contentId,
214
- state,
102
+ state: collapse.state,
215
103
  isOpen,
216
104
  isDisabled,
217
105
  shouldRenderContent: collapse.shouldRenderContent,
@@ -221,14 +109,87 @@ function useAccordionItem(props) {
221
109
  contentProps,
222
110
  triggerSlotProps,
223
111
  contentSlotProps,
224
- open,
225
- close,
226
- toggle
112
+ open: collapse.open,
113
+ close: collapse.close,
114
+ toggle: collapse.toggle
115
+ };
116
+ }
117
+ //#endregion
118
+ //#region src/components/accordion/useAccordion.ts
119
+ var ACCORDION_SELECTOR = ".rp-accordion";
120
+ var TRIGGER_SELECTOR = ".rp-accordion-item__trigger";
121
+ function useAccordion(props, emitUpdate) {
122
+ const isMultiple = computed(() => Boolean(props.multiple));
123
+ const isCollapsible = computed(() => props.collapsible !== false);
124
+ const isDisabled = computed(() => Boolean(props.disabled));
125
+ const controllable = useControllableValue({
126
+ modelValue: () => props.modelValue,
127
+ defaultValue: () => props.defaultValue ?? null,
128
+ onChange: emitUpdate
129
+ });
130
+ const openValues = computed(() => readAccordionOpenValues(controllable.value.value, isMultiple.value));
131
+ const rootClass = computed(() => bem("rp-accordion", {
132
+ disabled: isDisabled.value,
133
+ multiple: isMultiple.value
134
+ }));
135
+ const rootProps = computed(() => ({
136
+ id: props.id,
137
+ class: rootClass.value,
138
+ "data-disabled": toOptionalAttribute(isDisabled.value),
139
+ "aria-label": toOptionalAttribute(props.ariaLabel),
140
+ "aria-labelledby": toOptionalAttribute(props.labelledby),
141
+ "aria-describedby": toOptionalAttribute(props.describedby),
142
+ onKeydown: onRootKeydown
143
+ }));
144
+ function setItemOpen(value, open) {
145
+ if (isDisabled.value) return;
146
+ const transition = transitionAccordionValue(controllable.value.value, value, open, {
147
+ multiple: isMultiple.value,
148
+ collapsible: isCollapsible.value
149
+ });
150
+ if (!transition.changed) return;
151
+ controllable.setValue(transition.modelValue);
152
+ }
153
+ function onRootKeydown(event) {
154
+ const root = event.currentTarget;
155
+ if (!root) return;
156
+ const nextTrigger = getFocusNavigationTarget(event, root, {
157
+ itemSelector: TRIGGER_SELECTOR,
158
+ collectionSelector: ACCORDION_SELECTOR,
159
+ orientation: "vertical"
160
+ });
161
+ if (!nextTrigger) return;
162
+ event.preventDefault();
163
+ nextTrigger.focus();
164
+ }
165
+ provide(accordionKey, {
166
+ get multiple() {
167
+ return isMultiple.value;
168
+ },
169
+ get collapsible() {
170
+ return isCollapsible.value;
171
+ },
172
+ get disabled() {
173
+ return isDisabled.value;
174
+ },
175
+ get unmountOnExit() {
176
+ return Boolean(props.unmountOnExit);
177
+ },
178
+ isItemOpen(value) {
179
+ return openValues.value.some((itemValue) => itemValue === value);
180
+ },
181
+ setItemOpen
182
+ });
183
+ return {
184
+ rootClass,
185
+ rootProps,
186
+ openValues,
187
+ setItemOpen
227
188
  };
228
189
  }
229
190
  //#endregion
230
191
  //#region src/components/accordion/accordion.vue?vue&type=script&setup=true&vapor=true&lang.ts
231
- var t0$2 = template("<div data-v-d15589fa>", 1);
192
+ var t0$2 = template("<div data-v-c48cb87a>", 1);
232
193
  //#endregion
233
194
  //#region src/components/accordion/accordion.vue
234
195
  var accordion_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
@@ -271,7 +232,7 @@ var accordion_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
271
232
  const { getRootAttrs } = useStylesApi(props, "root");
272
233
  const rootAttrs = computed(() => getRootAttrs({
273
234
  ...internalRootProps.value,
274
- "data-disabled": presence(props.disabled)
235
+ "data-disabled": toPresenceAttribute(props.disabled)
275
236
  }));
276
237
  const n1 = t0$2();
277
238
  renderEffect(() => setDynamicProps(n1, [rootAttrs.value]));
@@ -279,7 +240,7 @@ var accordion_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
279
240
  createSlot("default", null, null, 1);
280
241
  return n1;
281
242
  }
282
- }), [["__scopeId", "data-v-d15589fa"]]);
243
+ }), [["__scopeId", "data-v-c48cb87a"]]);
283
244
  //#endregion
284
245
  //#region ~icons/lucide/chevron-down
285
246
  var t0$1 = template("<svg viewBox=\"0 0 24 24\"width=1.2em height=1.2em><path fill=none stroke=currentColor stroke-linecap=round stroke-linejoin=round stroke-width=2 d=\"m6 9l6 6l6-6\">", 3, 1);
@@ -293,9 +254,9 @@ var chevron_down_default = markRaw(defineVaporComponent({
293
254
  //#endregion
294
255
  //#region src/components/accordion/accordion-item.vue?vue&type=script&setup=true&vapor=true&lang.ts
295
256
  var t0 = template(" ");
296
- var t1 = template("<button data-v-5b00ef39><span data-v-5b00ef39></span><span data-v-5b00ef39>");
297
- var t2 = template("<section data-v-5b00ef39><div data-v-5b00ef39 class=rp-accordion-item__inner>");
298
- var t3 = template("<div data-v-5b00ef39><h3 data-v-5b00ef39 class=rp-accordion-item__heading>", 1);
257
+ var t1 = template("<button data-v-ab630265><span data-v-ab630265></span><span data-v-ab630265>");
258
+ var t2 = template("<section data-v-ab630265><div data-v-ab630265 class=rp-accordion-item__inner>");
259
+ var t3 = template("<div data-v-ab630265><h3 data-v-ab630265 class=rp-accordion-item__heading>", 1);
299
260
  //#endregion
300
261
  //#region src/components/accordion/accordion-item.vue
301
262
  var accordion_item_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
@@ -327,13 +288,13 @@ var accordion_item_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/*
327
288
  const { getPartAttrs, getRootAttrs } = useStylesApi(props, "root");
328
289
  const rootAttrs = computed(() => getRootAttrs({
329
290
  ...internalRootProps.value,
330
- "data-disabled": presence(internalRootProps.value["data-disabled"])
291
+ "data-disabled": toPresenceAttribute(internalRootProps.value["data-disabled"])
331
292
  }));
332
293
  const publicTriggerProps = computed(() => ({
333
294
  ...internalTriggerProps.value,
334
295
  ...getPartAttrs("trigger", { class: internalTriggerProps.value.class }),
335
296
  "data-state": internalRootProps.value["data-state"],
336
- "data-disabled": presence(internalRootProps.value["data-disabled"])
297
+ "data-disabled": toPresenceAttribute(internalRootProps.value["data-disabled"])
337
298
  }));
338
299
  const publicTriggerSlotProps = computed(() => ({
339
300
  ...triggerSlotProps.value,
@@ -380,6 +341,16 @@ var accordion_item_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/*
380
341
  }, { _: 8 }));
381
342
  return n16;
382
343
  }
383
- }), [["__scopeId", "data-v-5b00ef39"]]);
344
+ }), [["__scopeId", "data-v-ab630265"]]);
345
+ //#endregion
346
+ //#region src/components/accordion/types.ts
347
+ var accordionParts = ["root"];
348
+ var accordionItemParts = [
349
+ "root",
350
+ "trigger",
351
+ "title",
352
+ "icon",
353
+ "content"
354
+ ];
384
355
  //#endregion
385
- export { accordionItemParts as a, useAccordionItem as i, accordion_default as n, accordionParts as o, useAccordion as r, accordion_item_default as t };
356
+ export { useAccordion as a, accordion_default as i, accordionParts as n, useAccordionItem as o, accordion_item_default as r, accordionItemParts as t };
package/dist/alert.css CHANGED
@@ -1,5 +1,5 @@
1
1
  @layer ropav.components {
2
- .rp-alert[data-v-433c81a2] {
2
+ .rp-alert[data-v-09abef83] {
3
3
  --_rp-alert-bg: var(--rp-color-cyan-light);
4
4
  --_rp-alert-fg: var(--rp-color-text);
5
5
  --_rp-alert-title-fg: var(--rp-color-cyan-light-color);
@@ -22,25 +22,25 @@
22
22
  border-radius: var(--_rp-alert-radius);
23
23
  transition: background-color var(--rp-transition-fast), color var(--rp-transition-fast), border-color var(--rp-transition-fast);
24
24
  }
25
- .rp-alert--radius-none[data-v-433c81a2] {
25
+ .rp-alert--radius-none[data-v-09abef83] {
26
26
  --_rp-alert-radius: var(--rp-radius-none);
27
27
  }
28
- .rp-alert--radius-xs[data-v-433c81a2] {
28
+ .rp-alert--radius-xs[data-v-09abef83] {
29
29
  --_rp-alert-radius: var(--rp-radius-xs);
30
30
  }
31
- .rp-alert--radius-sm[data-v-433c81a2] {
31
+ .rp-alert--radius-sm[data-v-09abef83] {
32
32
  --_rp-alert-radius: var(--rp-radius-sm);
33
33
  }
34
- .rp-alert--radius-md[data-v-433c81a2] {
34
+ .rp-alert--radius-md[data-v-09abef83] {
35
35
  --_rp-alert-radius: var(--rp-radius-md);
36
36
  }
37
- .rp-alert--radius-lg[data-v-433c81a2] {
37
+ .rp-alert--radius-lg[data-v-09abef83] {
38
38
  --_rp-alert-radius: var(--rp-radius-lg);
39
39
  }
40
- .rp-alert--radius-xl[data-v-433c81a2] {
40
+ .rp-alert--radius-xl[data-v-09abef83] {
41
41
  --_rp-alert-radius: var(--rp-radius-xl);
42
42
  }
43
- .rp-alert__icon[data-v-433c81a2] {
43
+ .rp-alert__icon[data-v-09abef83] {
44
44
  display: inline-flex;
45
45
  flex: 0 0 auto;
46
46
  align-items: center;
@@ -49,37 +49,37 @@
49
49
  color: var(--_rp-alert-icon-fg);
50
50
  line-height: 0;
51
51
  }
52
- .rp-alert__icon[data-v-433c81a2] > svg {
52
+ .rp-alert__icon[data-v-09abef83] > svg {
53
53
  display: block;
54
54
  width: 1rem;
55
55
  height: 1rem;
56
56
  }
57
- .rp-alert__content[data-v-433c81a2] {
57
+ .rp-alert__content[data-v-09abef83] {
58
58
  display: grid;
59
59
  flex: 1 1 auto;
60
60
  min-width: 0;
61
61
  gap: var(--rp-spacing-1);
62
62
  }
63
- .rp-alert__title[data-v-433c81a2] {
63
+ .rp-alert__title[data-v-09abef83] {
64
64
  color: var(--_rp-alert-title-fg);
65
65
  font-size: var(--rp-font-size-md);
66
66
  font-weight: var(--rp-font-weight-semibold);
67
67
  line-height: var(--rp-line-height-xs);
68
68
  }
69
- .rp-alert__description[data-v-433c81a2] {
69
+ .rp-alert__description[data-v-09abef83] {
70
70
  margin: 0;
71
71
  }
72
- .rp-alert__body[data-v-433c81a2], .rp-alert__description[data-v-433c81a2] {
72
+ .rp-alert__body[data-v-09abef83], .rp-alert__description[data-v-09abef83] {
73
73
  min-width: 0;
74
74
  color: var(--_rp-alert-fg);
75
75
  }
76
- .rp-alert__action[data-v-433c81a2] {
76
+ .rp-alert__action[data-v-09abef83] {
77
77
  display: inline-flex;
78
78
  flex: 0 0 auto;
79
79
  align-items: center;
80
80
  margin-left: auto;
81
81
  }
82
- .rp-alert__close[data-v-433c81a2] {
82
+ .rp-alert__close[data-v-09abef83] {
83
83
  box-sizing: border-box;
84
84
  display: inline-flex;
85
85
  flex: 0 0 auto;
@@ -96,14 +96,14 @@
96
96
  cursor: pointer;
97
97
  transition: background-color var(--rp-transition-fast), color var(--rp-transition-fast);
98
98
  }
99
- .rp-alert__close[data-v-433c81a2]:hover {
99
+ .rp-alert__close[data-v-09abef83]:hover {
100
100
  background-color: color-mix(in srgb, var(--_rp-alert-icon-fg) 12%, transparent);
101
101
  }
102
- .rp-alert__close[data-v-433c81a2]:focus-visible {
102
+ .rp-alert__close[data-v-09abef83]:focus-visible {
103
103
  outline: var(--rp-border-width-medium) solid var(--rp-color-focus-ring);
104
104
  outline-offset: 2px;
105
105
  }
106
- .rp-alert__close[data-v-433c81a2] > svg {
106
+ .rp-alert__close[data-v-09abef83] > svg {
107
107
  display: block;
108
108
  width: 1rem;
109
109
  height: 1rem;