@dataloop-ai/components 0.13.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 (294) hide show
  1. package/.eslintrc.js +154 -0
  2. package/.prettierrc.json +7 -0
  3. package/Dockerfile +12 -0
  4. package/LICENSE +201 -0
  5. package/README.md +43 -0
  6. package/favicon.ico +0 -0
  7. package/index.html +13 -0
  8. package/index.ts +1 -0
  9. package/jest.config.js +16 -0
  10. package/jest.setup.js +59 -0
  11. package/models.ts +1 -0
  12. package/package.json +109 -0
  13. package/src/App.vue +201 -0
  14. package/src/assets/globals.scss +253 -0
  15. package/src/assets/globalsKeys.ts +28 -0
  16. package/src/components/DlAccordion/AccordionHeader.vue +148 -0
  17. package/src/components/DlAccordion/DlAccordion.vue +108 -0
  18. package/src/components/DlAccordion/index.ts +2 -0
  19. package/src/components/DlAlert.vue +227 -0
  20. package/src/components/DlAvatar.vue +99 -0
  21. package/src/components/DlBadge.vue +127 -0
  22. package/src/components/DlButton/DlButton.vue +370 -0
  23. package/src/components/DlButton/index.ts +4 -0
  24. package/src/components/DlButton/utils.ts +169 -0
  25. package/src/components/DlButtonGroup.vue +122 -0
  26. package/src/components/DlCheckbox.vue +298 -0
  27. package/src/components/DlChip/DlChip.vue +244 -0
  28. package/src/components/DlChip/index.ts +4 -0
  29. package/src/components/DlChip/utils.ts +100 -0
  30. package/src/components/DlColorPicker/DlAlpha.vue +142 -0
  31. package/src/components/DlColorPicker/DlBox.vue +75 -0
  32. package/src/components/DlColorPicker/DlColorPicker.vue +306 -0
  33. package/src/components/DlColorPicker/DlColors.vue +139 -0
  34. package/src/components/DlColorPicker/DlHue.vue +135 -0
  35. package/src/components/DlColorPicker/DlPreview.vue +61 -0
  36. package/src/components/DlColorPicker/DlSaturation.vue +152 -0
  37. package/src/components/DlColorPicker/constants.ts +16 -0
  38. package/src/components/DlColorPicker/index.ts +20 -0
  39. package/src/components/DlColorPicker/types.ts +11 -0
  40. package/src/components/DlColorPicker/utils.ts +128 -0
  41. package/src/components/DlCounters.vue +173 -0
  42. package/src/components/DlDatePicker/DlCalendar.vue +332 -0
  43. package/src/components/DlDatePicker/DlDatePicker.vue +315 -0
  44. package/src/components/DlDatePicker/DlMonthCalendar.vue +282 -0
  45. package/src/components/DlDatePicker/classes/Calendar.ts +110 -0
  46. package/src/components/DlDatePicker/classes/CalendarDate.ts +12 -0
  47. package/src/components/DlDatePicker/classes/CustomDate.ts +218 -0
  48. package/src/components/DlDatePicker/index.ts +3 -0
  49. package/src/components/DlDatePicker/isInRange.ts +44 -0
  50. package/src/components/DlDatePicker/types.ts +4 -0
  51. package/src/components/DlDatePicker/utils.ts +39 -0
  52. package/src/components/DlDateTimeRange/DlCardSidebar.vue +109 -0
  53. package/src/components/DlDateTimeRange/DlDateInput.vue +105 -0
  54. package/src/components/DlDateTimeRange/DlDateTimeRange.vue +468 -0
  55. package/src/components/DlDateTimeRange/index.ts +3 -0
  56. package/src/components/DlDateTimeRange/types.ts +42 -0
  57. package/src/components/DlDialogBox/DlDialogBox.vue +196 -0
  58. package/src/components/DlDialogBox/DlDialogBoxFooter.vue +22 -0
  59. package/src/components/DlDialogBox/DlDialogBoxHeader.vue +75 -0
  60. package/src/components/DlDialogBox/index.ts +5 -0
  61. package/src/components/DlDropdownButton.vue +463 -0
  62. package/src/components/DlIcon.vue +147 -0
  63. package/src/components/DlInfoErrorMessage.vue +91 -0
  64. package/src/components/DlItem/DlItem.vue +35 -0
  65. package/src/components/DlItem/index.ts +2 -0
  66. package/src/components/DlItemSection.vue +88 -0
  67. package/src/components/DlLink/DlLink.vue +76 -0
  68. package/src/components/DlLink/index.ts +4 -0
  69. package/src/components/DlLink/utils.ts +4 -0
  70. package/src/components/DlList.vue +61 -0
  71. package/src/components/DlListItem/DlListItem.vue +205 -0
  72. package/src/components/DlListItem/index.ts +3 -0
  73. package/src/components/DlListItem/utils.ts +14 -0
  74. package/src/components/DlMenu/DlMenu.vue +438 -0
  75. package/src/components/DlMenu/index.ts +3 -0
  76. package/src/components/DlMenu/utils.ts +138 -0
  77. package/src/components/DlOptionGroup/DlOptionGroup.vue +201 -0
  78. package/src/components/DlOptionGroup/MenuItemWrapper.vue +48 -0
  79. package/src/components/DlOptionGroup/OptionGroup.types.ts +36 -0
  80. package/src/components/DlOptionGroup/SimpleWrapper.vue +28 -0
  81. package/src/components/DlOptionGroup/index.ts +4 -0
  82. package/src/components/DlOptionGroup/utils.ts +40 -0
  83. package/src/components/DlPagination/DlPagination.vue +184 -0
  84. package/src/components/DlPagination/PageNavigation.vue +350 -0
  85. package/src/components/DlPagination/PaginationLegend.vue +41 -0
  86. package/src/components/DlPagination/QuickNavigation.vue +146 -0
  87. package/src/components/DlPagination/RowsSelector.vue +74 -0
  88. package/src/components/DlPagination/index.ts +3 -0
  89. package/src/components/DlPanelContainer/DlPanel.vue +213 -0
  90. package/src/components/DlPanelContainer/DlPanelContainer.vue +527 -0
  91. package/src/components/DlPanelContainer/index.ts +4 -0
  92. package/src/components/DlPopup/DlPopup.vue +478 -0
  93. package/src/components/DlPopup/DraggableUpper.vue +64 -0
  94. package/src/components/DlPopup/PopupHeader.vue +129 -0
  95. package/src/components/DlPopup/index.ts +1 -0
  96. package/src/components/DlProgressBar.vue +159 -0
  97. package/src/components/DlProgressChart.vue +299 -0
  98. package/src/components/DlRadio.vue +218 -0
  99. package/src/components/DlRange/DlRange.vue +439 -0
  100. package/src/components/DlRange/utils.ts +209 -0
  101. package/src/components/DlSearch.vue +155 -0
  102. package/src/components/DlSelect/DlSelect.vue +992 -0
  103. package/src/components/DlSelect/SelectOption.vue +261 -0
  104. package/src/components/DlSelect/index.ts +4 -0
  105. package/src/components/DlSelect/utils.ts +43 -0
  106. package/src/components/DlSkeleton.vue +72 -0
  107. package/src/components/DlSlider/DlSlider.vue +243 -0
  108. package/src/components/DlSlider/components/DlSliderBase.vue +380 -0
  109. package/src/components/DlSlider/components/DlSliderInput.vue +123 -0
  110. package/src/components/DlSlider/components/index.ts +4 -0
  111. package/src/components/DlSlider/index.ts +3 -0
  112. package/src/components/DlSlider/sliderStyles.scss +109 -0
  113. package/src/components/DlSlider/useSlider.ts +277 -0
  114. package/src/components/DlSlider/utils.ts +7 -0
  115. package/src/components/DlSmartSearch/DlJsonEditor.vue +309 -0
  116. package/src/components/DlSmartSearch/DlSmartSearch.vue +333 -0
  117. package/src/components/DlSmartSearch/DlSmartSearchInput.vue +741 -0
  118. package/src/components/DlSmartSearch/DlSuggestionsDropdown.vue +73 -0
  119. package/src/components/DlSmartSearch/highlightSyntax.ts +169 -0
  120. package/src/components/DlSmartSearch/index.ts +4 -0
  121. package/src/components/DlSmartSearch/types.ts +36 -0
  122. package/src/components/DlSmartSearch/utils.ts +45 -0
  123. package/src/components/DlStepper/DlStepper.vue +196 -0
  124. package/src/components/DlStepper/DlStepperContainer.vue +55 -0
  125. package/src/components/DlStepper/DlStepperContent.vue +101 -0
  126. package/src/components/DlStepper/DlStepperFooter.vue +133 -0
  127. package/src/components/DlStepper/DlStepperHeader.vue +49 -0
  128. package/src/components/DlStepper/DlStepperSidebar.vue +167 -0
  129. package/src/components/DlStepper/Step.ts +101 -0
  130. package/src/components/DlStepper/Stepper.ts +107 -0
  131. package/src/components/DlStepper/index.ts +7 -0
  132. package/src/components/DlStepper/interfaces.ts +11 -0
  133. package/src/components/DlSwitch.vue +280 -0
  134. package/src/components/DlTabPanels/DlTabPanel.vue +22 -0
  135. package/src/components/DlTabPanels/DlTabPanels.vue +41 -0
  136. package/src/components/DlTabPanels/index.ts +4 -0
  137. package/src/components/DlTabPanels/utils.ts +19 -0
  138. package/src/components/DlTable/DlTable.vue +1264 -0
  139. package/src/components/DlTable/DlTd.vue +109 -0
  140. package/src/components/DlTable/DlTh.vue +126 -0
  141. package/src/components/DlTable/DlTr.vue +44 -0
  142. package/src/components/DlTable/ResizableManager.ts +233 -0
  143. package/src/components/DlTable/dl-table-styles.scss +466 -0
  144. package/src/components/DlTable/hooks/tableActions.ts +64 -0
  145. package/src/components/DlTable/hooks/tableColumnSelection.ts +112 -0
  146. package/src/components/DlTable/hooks/tableFilter.ts +42 -0
  147. package/src/components/DlTable/hooks/tablePagination.ts +197 -0
  148. package/src/components/DlTable/hooks/tableRowExpand.ts +55 -0
  149. package/src/components/DlTable/hooks/tableRowSelection.ts +106 -0
  150. package/src/components/DlTable/hooks/tableSort.ts +125 -0
  151. package/src/components/DlTable/index.ts +6 -0
  152. package/src/components/DlTable/types.ts +96 -0
  153. package/src/components/DlTabs/DlTab.vue +146 -0
  154. package/src/components/DlTabs/DlTabs.vue +192 -0
  155. package/src/components/DlTabs/TabsWrapper.vue +104 -0
  156. package/src/components/DlTabs/index.ts +4 -0
  157. package/src/components/DlTabs/types.ts +8 -0
  158. package/src/components/DlTextArea.vue +151 -0
  159. package/src/components/DlTextHolder.vue +65 -0
  160. package/src/components/DlTextInput.vue +753 -0
  161. package/src/components/DlThemeProvider.vue +41 -0
  162. package/src/components/DlTimePicker/DlTimeCounter.vue +81 -0
  163. package/src/components/DlTimePicker/DlTimePicker.vue +151 -0
  164. package/src/components/DlTimePicker/DlTimePickerInput.vue +311 -0
  165. package/src/components/DlTimePicker/index.ts +3 -0
  166. package/src/components/DlTimePicker/types.ts +4 -0
  167. package/src/components/DlTooltip.vue +456 -0
  168. package/src/components/DlTrend.vue +97 -0
  169. package/src/components/DlTypography.vue +87 -0
  170. package/src/components/DlVirtualScroll/DlVirtualScroll.vue +290 -0
  171. package/src/components/DlVirtualScroll/index.ts +3 -0
  172. package/src/components/DlVirtualScroll/useVirtualScroll.ts +833 -0
  173. package/src/components/DlWidget/DlWidget.vue +50 -0
  174. package/src/components/DlWidget/DlWidgetGrid.vue +360 -0
  175. package/src/components/DlWidget/index.ts +4 -0
  176. package/src/components/DlWidget/types.ts +6 -0
  177. package/src/components/DlWidget/utils.ts +30 -0
  178. package/src/components/index.ts +118 -0
  179. package/src/demo/DlAccordionDemo.vue +60 -0
  180. package/src/demo/DlAlertDemo.vue +54 -0
  181. package/src/demo/DlAvatarDemo.vue +43 -0
  182. package/src/demo/DlBadgeDemo.vue +65 -0
  183. package/src/demo/DlButtonDemo.vue +266 -0
  184. package/src/demo/DlCheckboxDemo.vue +50 -0
  185. package/src/demo/DlChipDemo.vue +181 -0
  186. package/src/demo/DlColorPickerDemo.vue +43 -0
  187. package/src/demo/DlCounterDemo.vue +53 -0
  188. package/src/demo/DlDateTimeRangeDemo.vue +217 -0
  189. package/src/demo/DlDialogBoxDemo.vue +175 -0
  190. package/src/demo/DlDropdownButtonDemo.vue +260 -0
  191. package/src/demo/DlIconDemo.vue +47 -0
  192. package/src/demo/DlLinkDemo.vue +23 -0
  193. package/src/demo/DlListDemo.vue +177 -0
  194. package/src/demo/DlMenuDemo.vue +524 -0
  195. package/src/demo/DlOptionGroupDemo.vue +79 -0
  196. package/src/demo/DlPaginationDemo.vue +44 -0
  197. package/src/demo/DlPanelContainerDemo.vue +221 -0
  198. package/src/demo/DlPopupDemo.vue +58 -0
  199. package/src/demo/DlProgressBarDemo.vue +22 -0
  200. package/src/demo/DlProgressChartDemo.vue +71 -0
  201. package/src/demo/DlRadioDemo.vue +35 -0
  202. package/src/demo/DlRangeDemo.vue +44 -0
  203. package/src/demo/DlSearchDemo.vue +27 -0
  204. package/src/demo/DlSelectDemo.vue +355 -0
  205. package/src/demo/DlSkeletonDemo.vue +20 -0
  206. package/src/demo/DlSliderDemo.vue +47 -0
  207. package/src/demo/DlStepperDemo/CenteredStepperInDialogBox.vue +260 -0
  208. package/src/demo/DlStepperDemo/SimpleStepper.vue +202 -0
  209. package/src/demo/DlStepperDemo/StepperInDialogBox.vue +261 -0
  210. package/src/demo/DlStepperDemo/index.ts +5 -0
  211. package/src/demo/DlStepperDemo/steps/AssignmentsStep.vue +97 -0
  212. package/src/demo/DlStepperDemo/steps/DataStep.vue +158 -0
  213. package/src/demo/DlStepperDemo/steps/GeneralStep.vue +106 -0
  214. package/src/demo/DlStepperDemo/steps/InstructionStep.vue +176 -0
  215. package/src/demo/DlStepperDemo/steps/QualityStep.vue +65 -0
  216. package/src/demo/DlSwitchDemo.vue +49 -0
  217. package/src/demo/DlTableDemo.vue +475 -0
  218. package/src/demo/DlTabsDemo.vue +67 -0
  219. package/src/demo/DlTdDemo.vue +19 -0
  220. package/src/demo/DlTextAreaDemo.vue +37 -0
  221. package/src/demo/DlTextHolderDemo.vue +42 -0
  222. package/src/demo/DlTextInputDemo.vue +89 -0
  223. package/src/demo/DlThDemo.vue +32 -0
  224. package/src/demo/DlTooltipDemo.vue +60 -0
  225. package/src/demo/DlTrDemo.vue +18 -0
  226. package/src/demo/DlTrendDemo.vue +25 -0
  227. package/src/demo/DlTypographyDemo.vue +93 -0
  228. package/src/demo/DlWidgetDemo.vue +157 -0
  229. package/src/demo/SmartSearchDemo/DlSmartSearchDemo.vue +202 -0
  230. package/src/demo/SmartSearchDemo/schema.ts +44 -0
  231. package/src/demo/index.ts +141 -0
  232. package/src/directives/TouchPan.ts +525 -0
  233. package/src/env.d.ts +8 -0
  234. package/src/hooks/use-anchor.ts +223 -0
  235. package/src/hooks/use-model-toggle.ts +181 -0
  236. package/src/hooks/use-portal.ts +104 -0
  237. package/src/hooks/use-scroll-target.ts +53 -0
  238. package/src/hooks/use-size-observer.ts +24 -0
  239. package/src/hooks/use-suggestions.ts +355 -0
  240. package/src/hooks/use-tick.ts +32 -0
  241. package/src/hooks/use-timeout.ts +20 -0
  242. package/src/hooks/use-transition.ts +32 -0
  243. package/src/hooks/use-window-size.ts +25 -0
  244. package/src/hooks/useForm.ts +12 -0
  245. package/src/index.ts +7 -0
  246. package/src/main.ts +4 -0
  247. package/src/models.ts +4 -0
  248. package/src/types.ts +6 -0
  249. package/src/utils/calcs.ts +18 -0
  250. package/src/utils/click-outside.ts +108 -0
  251. package/src/utils/component-name-parser.ts +1 -0
  252. package/src/utils/css-color-names.ts +150 -0
  253. package/src/utils/dom.ts +55 -0
  254. package/src/utils/draggable-table.ts +416 -0
  255. package/src/utils/escape-key.ts +54 -0
  256. package/src/utils/events.ts +67 -0
  257. package/src/utils/focus-manager.ts +33 -0
  258. package/src/utils/focusout.ts +29 -0
  259. package/src/utils/format.ts +3 -0
  260. package/src/utils/getColor.ts +17 -0
  261. package/src/utils/getLighterGradient.ts +36 -0
  262. package/src/utils/getRootStyles.ts +52 -0
  263. package/src/utils/global-config.ts +6 -0
  264. package/src/utils/global-nodes.ts +42 -0
  265. package/src/utils/includes.ts +3 -0
  266. package/src/utils/index.ts +29 -0
  267. package/src/utils/inject-object-prop.ts +21 -0
  268. package/src/utils/input-sizes.ts +7 -0
  269. package/src/utils/is-ellipsis-active.ts +3 -0
  270. package/src/utils/is-in-viewport.ts +13 -0
  271. package/src/utils/is.ts +15 -0
  272. package/src/utils/key-composition.ts +17 -0
  273. package/src/utils/keyCodes.ts +12 -0
  274. package/src/utils/logger/ConsoleLogger.ts +65 -0
  275. package/src/utils/logger/ILogger.ts +8 -0
  276. package/src/utils/logger/index.ts +8 -0
  277. package/src/utils/nav-keys-constants.ts +1 -0
  278. package/src/utils/portal.ts +55 -0
  279. package/src/utils/position-engine.ts +381 -0
  280. package/src/utils/render.ts +36 -0
  281. package/src/utils/ripple.ts +7 -0
  282. package/src/utils/scroll.ts +73 -0
  283. package/src/utils/selection.ts +15 -0
  284. package/src/utils/sort.ts +7 -0
  285. package/src/utils/splitByQuotes.ts +32 -0
  286. package/src/utils/string.ts +6 -0
  287. package/src/utils/teleport.ts +14 -0
  288. package/src/utils/theme.ts +2 -0
  289. package/src/utils/vm.ts +16 -0
  290. package/storybook.js +8 -0
  291. package/tsconfig.json +44 -0
  292. package/tsconfig.node.json +8 -0
  293. package/types.ts +1 -0
  294. package/vite.config.ts +13 -0
@@ -0,0 +1,381 @@
1
+ import { isMobileOrTablet } from '.'
2
+ import { getScrollbarWidth } from './scroll'
3
+
4
+ let vpLeft: number | undefined
5
+ let vpTop: number | undefined
6
+
7
+ export function validatePosition(pos: string) {
8
+ const parts = pos.split(' ')
9
+ if (parts.length !== 2) {
10
+ return false
11
+ }
12
+ if (['top', 'center', 'bottom'].includes(parts[0]) !== true) {
13
+ return false
14
+ }
15
+ if (
16
+ ['left', 'middle', 'right', 'start', 'end'].includes(parts[1]) !== true
17
+ ) {
18
+ return false
19
+ }
20
+ return true
21
+ }
22
+
23
+ export function validateOffset(val: number[]) {
24
+ if (!val) {
25
+ return true
26
+ }
27
+ if (val.length !== 2) {
28
+ return false
29
+ }
30
+ if (typeof val[0] !== 'number' || typeof val[1] !== 'number') {
31
+ return false
32
+ }
33
+ return true
34
+ }
35
+
36
+ const horizontalPos = {
37
+ 'start#ltr': 'left',
38
+ 'end#ltr': 'right'
39
+ }
40
+
41
+ const positions = ['left', 'middle', 'right']
42
+
43
+ positions.forEach((pos) => {
44
+ (horizontalPos as { [key: string]: string })[`${pos}#ltr`] = pos
45
+ })
46
+
47
+ interface AnchorProps {
48
+ top: number
49
+ left: number
50
+ right: number
51
+ bottom: number
52
+ width: number
53
+ height: number
54
+ middle: number
55
+ center: number
56
+ }
57
+
58
+ export type ParsedPosition = {
59
+ vertical: keyof AnchorProps
60
+ horizontal: keyof AnchorProps
61
+ }
62
+
63
+ interface TargetProps {
64
+ top: number
65
+ center: number
66
+ bottom: number
67
+ left: number
68
+ middle: number
69
+ right: number
70
+ }
71
+
72
+ export function parsePosition(pos: string): ParsedPosition {
73
+ const parts = pos.split(' ')
74
+ const vertical = parts[0] as keyof AnchorProps
75
+ const horizontal = (horizontalPos as { [key: string]: keyof AnchorProps })[
76
+ `${parts[1]}#ltr`
77
+ ]
78
+ return {
79
+ vertical,
80
+ horizontal
81
+ }
82
+ }
83
+
84
+ export function getAnchorProps(el: HTMLElement, offset: number[]) {
85
+ let { top, left, right, bottom, width, height } = el.getBoundingClientRect()
86
+
87
+ if (offset !== void 0) {
88
+ top -= offset[1]
89
+ left -= offset[0]
90
+ bottom += offset[1]
91
+ right += offset[0]
92
+
93
+ width += offset[0]
94
+ height += offset[1]
95
+ }
96
+
97
+ return {
98
+ top,
99
+ left,
100
+ right,
101
+ bottom,
102
+ width,
103
+ height,
104
+ middle: left + (right - left) / 2,
105
+ center: top + (bottom - top) / 2
106
+ }
107
+ }
108
+
109
+ export function getTargetProps(el: HTMLElement) {
110
+ return {
111
+ top: 0,
112
+ center: el.offsetHeight / 2,
113
+ bottom: el.offsetHeight,
114
+ left: 0,
115
+ middle: el.offsetWidth / 2,
116
+ right: el.offsetWidth
117
+ }
118
+ }
119
+
120
+ interface PositionConfig {
121
+ el: HTMLElement
122
+ offset: number[]
123
+ anchorEl: HTMLElement
124
+ anchorOrigin: ParsedPosition
125
+ selfOrigin: any
126
+ maxHeight?: string
127
+ maxWidth?: string
128
+ absoluteOffset?: any
129
+ fit?: boolean // fit the size to the content
130
+ cover?: boolean
131
+ }
132
+
133
+ interface ElementStyle {
134
+ maxHeight?: string
135
+ maxWidth?: string
136
+ visibility?: string
137
+ minWidth?: string
138
+ minHeight?: string
139
+ top?: string
140
+ left?: string
141
+ }
142
+
143
+ // cfg: { el, anchorEl, anchorOrigin, selfOrigin, offset, absoluteOffset, cover, fit, maxHeight, maxWidth }
144
+ export function setPosition(cfg: PositionConfig) {
145
+ const isMobile = isMobileOrTablet()
146
+
147
+ if (isMobile && window.visualViewport !== void 0) {
148
+ // uses the dl-position-engine CSS class
149
+
150
+ const el = document.body.style
151
+ const { offsetLeft: left, offsetTop: top } = window.visualViewport
152
+
153
+ if (left !== vpLeft) {
154
+ el.setProperty('--dl-pe-left', left + 'px')
155
+ vpLeft = left
156
+ }
157
+ if (top !== vpTop) {
158
+ el.setProperty('--dl-pe-top', top + 'px')
159
+ vpTop = top
160
+ }
161
+ }
162
+
163
+ let anchorProps: AnchorProps
164
+
165
+ // scroll position might change
166
+ // if max-height/-width changes, so we
167
+ // need to restore it after we calculate
168
+ // the new positioning
169
+ const { scrollLeft, scrollTop } = cfg.el!
170
+
171
+ if (cfg.absoluteOffset === void 0) {
172
+ anchorProps = getAnchorProps(cfg.anchorEl, cfg.offset)
173
+ } else {
174
+ const { top: anchorTop, left: anchorLeft } =
175
+ cfg.anchorEl.getBoundingClientRect()
176
+ const top = anchorTop + cfg.absoluteOffset.top
177
+ const left = anchorLeft + cfg.absoluteOffset.left
178
+
179
+ anchorProps = {
180
+ top,
181
+ left,
182
+ width: 1,
183
+ height: 1,
184
+ right: left + 1,
185
+ center: top,
186
+ middle: left,
187
+ bottom: top + 1
188
+ }
189
+ }
190
+
191
+ let elStyle: ElementStyle = {
192
+ maxHeight: cfg.maxHeight,
193
+ maxWidth: cfg.maxWidth,
194
+ visibility: 'visible'
195
+ }
196
+
197
+ if (cfg.fit === true || cfg.cover === true) {
198
+ elStyle.minWidth = cfg.maxWidth || anchorProps.width + 'px'
199
+ elStyle.maxWidth = cfg.maxWidth || anchorProps.width + 'px'
200
+
201
+ if (cfg.cover === true) {
202
+ elStyle.minHeight = anchorProps.height + 'px'
203
+ }
204
+ }
205
+
206
+ Object.assign(cfg.el!.style, elStyle)
207
+
208
+ const targetProps = getTargetProps(cfg.el as HTMLElement)
209
+ const verticalAnchorOrigin: keyof AnchorProps = cfg.anchorOrigin.vertical
210
+ const verticalSelfOrigin: keyof TargetProps = cfg.selfOrigin.vertical
211
+ const horizontalSelfOrigin: keyof TargetProps = cfg.selfOrigin.horizontal
212
+
213
+ const props: {
214
+ top: number
215
+ left: number
216
+ maxHeight?: number
217
+ maxWidth?: number
218
+ } = {
219
+ top:
220
+ anchorProps[verticalAnchorOrigin] - targetProps[verticalSelfOrigin],
221
+ left:
222
+ anchorProps[cfg.anchorOrigin.horizontal] -
223
+ targetProps[horizontalSelfOrigin]
224
+ }
225
+
226
+ applyBoundaries(
227
+ props,
228
+ anchorProps,
229
+ targetProps,
230
+ cfg.anchorOrigin,
231
+ cfg.selfOrigin
232
+ )
233
+
234
+ elStyle = {
235
+ top: props.top + 'px',
236
+ left: props.left + 'px'
237
+ }
238
+
239
+ if (props.maxHeight !== void 0) {
240
+ elStyle.maxHeight = props.maxHeight + 'px'
241
+
242
+ if (anchorProps.height > props.maxHeight) {
243
+ elStyle.minHeight = elStyle.maxHeight
244
+ }
245
+ }
246
+
247
+ if (props.maxWidth !== void 0) {
248
+ elStyle.maxWidth = props.maxWidth + 'px'
249
+
250
+ if (anchorProps.width > props.maxWidth) {
251
+ elStyle.minWidth = elStyle.maxWidth
252
+ }
253
+ }
254
+
255
+ Object.assign(cfg.el!.style, elStyle)
256
+
257
+ // restore scroll position
258
+ if (cfg.el!.scrollTop !== scrollTop) {
259
+ cfg.el!.scrollTop = scrollTop
260
+ }
261
+ if (cfg.el!.scrollLeft !== scrollLeft) {
262
+ cfg.el!.scrollLeft = scrollLeft
263
+ }
264
+ }
265
+
266
+ interface Position {
267
+ top: number
268
+ left: number
269
+ }
270
+
271
+ export function setForcedPosition(
272
+ cfg: Partial<PositionConfig>,
273
+ position: Position
274
+ ) {
275
+ // scroll position might change
276
+ // if max-height/-width changes, so we
277
+ // need to restore it after we calculate
278
+ // the new positioning
279
+ const { scrollLeft, scrollTop } = cfg.el!
280
+
281
+ const props: {
282
+ top: number
283
+ left: number
284
+ } = position
285
+
286
+ const elStyle: ElementStyle = {
287
+ top: props.top + 'px',
288
+ left: props.left + 'px'
289
+ }
290
+
291
+ Object.assign(cfg.el!.style, elStyle)
292
+
293
+ // restore scroll position
294
+ if (cfg.el!.scrollTop !== scrollTop) {
295
+ cfg.el!.scrollTop = scrollTop
296
+ }
297
+ if (cfg.el!.scrollLeft !== scrollLeft) {
298
+ cfg.el!.scrollLeft = scrollLeft
299
+ }
300
+ }
301
+
302
+ function applyBoundaries(
303
+ props: {
304
+ top: number
305
+ left: number
306
+ maxHeight?: number
307
+ maxWidth?: number
308
+ },
309
+ anchorProps: AnchorProps,
310
+ targetProps: TargetProps,
311
+ anchorOrigin: ParsedPosition,
312
+ selfOrigin: ParsedPosition
313
+ ) {
314
+ const currentHeight = targetProps.bottom
315
+ const currentWidth = targetProps.right
316
+ const margin = getScrollbarWidth()
317
+ const innerHeight = window.innerHeight - margin
318
+ const innerWidth = document.body.clientWidth
319
+
320
+ if (props.top < 0 || props.top + currentHeight > innerHeight) {
321
+ if (selfOrigin.vertical === 'center') {
322
+ props.top =
323
+ anchorProps[anchorOrigin.vertical] > innerHeight / 2
324
+ ? Math.max(0, innerHeight - currentHeight)
325
+ : 0
326
+ props.maxHeight = Math.min(currentHeight, innerHeight)
327
+ } else if (anchorProps[anchorOrigin.vertical] > innerHeight / 2) {
328
+ const anchorY = Math.min(
329
+ innerHeight,
330
+ anchorOrigin.vertical === 'center'
331
+ ? anchorProps.center
332
+ : anchorOrigin.vertical === selfOrigin.vertical
333
+ ? anchorProps.bottom
334
+ : anchorProps.top
335
+ )
336
+ props.maxHeight = Math.min(currentHeight, anchorY)
337
+ props.top = Math.max(0, anchorY - currentHeight)
338
+ } else {
339
+ props.top = Math.max(
340
+ 0,
341
+ anchorOrigin.vertical === 'center'
342
+ ? anchorProps.center
343
+ : anchorOrigin.vertical === selfOrigin.vertical
344
+ ? anchorProps.top
345
+ : anchorProps.bottom
346
+ )
347
+ props.maxHeight = Math.min(currentHeight, innerHeight - props.top)
348
+ }
349
+ }
350
+
351
+ if (props.left < 0 || props.left + currentWidth > innerWidth) {
352
+ props.maxWidth = Math.min(currentWidth, innerWidth)
353
+ if (selfOrigin.horizontal === 'middle') {
354
+ props.left =
355
+ anchorProps[anchorOrigin.horizontal] > innerWidth / 2
356
+ ? Math.max(0, innerWidth - currentWidth)
357
+ : 0
358
+ } else if (anchorProps[anchorOrigin.horizontal] > innerWidth / 2) {
359
+ const anchorX = Math.min(
360
+ innerWidth,
361
+ anchorOrigin.horizontal === 'middle'
362
+ ? anchorProps.middle
363
+ : anchorOrigin.horizontal === selfOrigin.horizontal
364
+ ? anchorProps.right
365
+ : anchorProps.left
366
+ )
367
+ props.maxWidth = Math.min(currentWidth, anchorX)
368
+ props.left = Math.max(0, anchorX - props.maxWidth)
369
+ } else {
370
+ props.left = Math.max(
371
+ 0,
372
+ anchorOrigin.horizontal === 'middle'
373
+ ? anchorProps.middle
374
+ : anchorOrigin.horizontal === selfOrigin.horizontal
375
+ ? anchorProps.left
376
+ : anchorProps.right
377
+ )
378
+ props.maxWidth = Math.min(currentWidth, innerWidth - props.left)
379
+ }
380
+ }
381
+ }
@@ -0,0 +1,36 @@
1
+ import { isVue2, h } from 'vue-demi'
2
+
3
+ export const createElement = (
4
+ renderFn: Function,
5
+ el: any,
6
+ opts: any = {},
7
+ slots: any
8
+ ) => {
9
+ if (isVue2) {
10
+ return renderFn(el, opts, slots)
11
+ }
12
+
13
+ return h(el, opts, slots)
14
+ }
15
+
16
+ export const hSlot = (
17
+ slots: any,
18
+ elements: any = [],
19
+ slotName: string = 'default'
20
+ ) => {
21
+ let renderSlots = isVue2 ? slots[slotName] || [] : slots[slotName]?.() || []
22
+
23
+ if (elements.length > 0) renderSlots = renderSlots.concat(elements)
24
+ if (isVue2) {
25
+ return renderSlots
26
+ }
27
+ return () => renderSlots
28
+ }
29
+
30
+ export const textSlot = (slots: any, slotName: string = 'default') => {
31
+ if (isVue2) {
32
+ return slots[slotName]
33
+ }
34
+
35
+ return slots[slotName]?.()
36
+ }
@@ -0,0 +1,7 @@
1
+ import VWave from 'v-wave'
2
+ import { isVue2 } from 'vue-demi'
3
+
4
+ export const { wave, waveTrigger } = VWave.createLocalWaveDirective(
5
+ {},
6
+ isVue2 ? 'vue2' : 'vue3'
7
+ )
@@ -0,0 +1,73 @@
1
+ import { css, getElement } from './dom'
2
+
3
+ const scrollTargets = [
4
+ null,
5
+ document,
6
+ document.body,
7
+ document.scrollingElement,
8
+ document.documentElement
9
+ ]
10
+
11
+ export function getScrollTarget(
12
+ el: HTMLElement | Element,
13
+ targetEl: string | Element
14
+ ) {
15
+ let target = getElement(targetEl)
16
+
17
+ if (target === void 0) {
18
+ if (el === void 0 || el === null) {
19
+ return window
20
+ }
21
+
22
+ target = el.closest('.scroll,.scroll-y,.overflow-auto')
23
+ }
24
+
25
+ return scrollTargets.includes(target) ? window : target
26
+ }
27
+
28
+ export const getScrollWidth = (el: HTMLElement | Window) => {
29
+ return (
30
+ el === window ? (document.body as HTMLElement) : (el as HTMLElement)
31
+ ).scrollWidth
32
+ }
33
+
34
+ let size: number | undefined
35
+ export const getScrollbarWidth = () => {
36
+ if (size !== undefined) {
37
+ return size
38
+ }
39
+
40
+ const inner = document.createElement('p')
41
+ const outer = document.createElement('div')
42
+
43
+ css(inner, {
44
+ width: '100%',
45
+ height: '200px'
46
+ })
47
+ css(outer, {
48
+ position: 'absolute',
49
+ top: '0px',
50
+ left: '0px',
51
+ visibility: 'hidden',
52
+ width: '200px',
53
+ height: '150px',
54
+ overflow: 'hidden'
55
+ })
56
+
57
+ outer.appendChild(inner)
58
+
59
+ document.body.appendChild(outer)
60
+
61
+ const w1 = inner.offsetWidth
62
+ outer.style.overflow = 'scroll'
63
+ let w2 = inner.offsetWidth
64
+
65
+ if (w1 === w2) {
66
+ w2 = outer.clientWidth
67
+ }
68
+
69
+ outer.remove()
70
+ size = w1 - w2
71
+
72
+ return size
73
+ }
@@ -0,0 +1,15 @@
1
+ export function clearSelection() {
2
+ if (window.getSelection !== void 0) {
3
+ const selection = window.getSelection()
4
+ if (!selection) return
5
+
6
+ if (selection.empty !== void 0) {
7
+ selection.empty()
8
+ } else if (selection.removeAllRanges !== void 0) {
9
+ selection.removeAllRanges()
10
+ if ('ontouchstart' in window) {
11
+ selection.addRange(document.createRange())
12
+ }
13
+ }
14
+ }
15
+ }
@@ -0,0 +1,7 @@
1
+ export function sortDate(a: string, b: string) {
2
+ return new Date(a).getTime() - new Date(b).getTime()
3
+ }
4
+
5
+ export function sortBoolean(a: boolean, b: boolean) {
6
+ return a && !b ? -1 : !a && b ? 1 : 0
7
+ }
@@ -0,0 +1,32 @@
1
+ export function splitByQuotes(input: string, split: string) {
2
+ const pattern = '([\\s\\S]*?)(e)?(?:(o)|(c)|(t)|(sp)|$)'
3
+ .replace('sp', split)
4
+ .replace('o', '[\\(\\{\\[]')
5
+ .replace('c', '[\\)\\}\\]]')
6
+ .replace('t', '[\'"]')
7
+ .replace('e', '[\\\\]')
8
+ const r = new RegExp(pattern, 'gi')
9
+ const stack: string[] = []
10
+ let buffer: string[] = []
11
+ const results: string[] = []
12
+ input.replace(r, ($0, $1, $e, $o, $c, $t, $s, i): any => {
13
+ if ($e) {
14
+ buffer.push($1, $s || $o || $c || $t)
15
+ return
16
+ } else if ($o) stack.push($o)
17
+ else if ($c) stack.pop()
18
+ else if ($t) {
19
+ if (stack[stack.length - 1] !== $t) stack.push($t)
20
+ else stack.pop()
21
+ } else {
22
+ if ($s ? !stack.length : !$1) {
23
+ buffer.push($1)
24
+ results.push(buffer.join(''))
25
+ buffer = []
26
+ return
27
+ }
28
+ }
29
+ buffer.push($0)
30
+ })
31
+ return results
32
+ }
@@ -0,0 +1,6 @@
1
+ export const textTransform = (text: string) =>
2
+ text
3
+ .toLowerCase()
4
+ .replace(/(^\w{1})|(\s+\w{1})/g, (letter: string) =>
5
+ letter.toUpperCase()
6
+ )
@@ -0,0 +1,14 @@
1
+ import * as VueDemi from 'vue-demi'
2
+ // @ts-ignore
3
+ import Teleport2 from 'vue2-teleport'
4
+
5
+ let DlTeleport: any
6
+
7
+ if (VueDemi.isVue2) {
8
+ DlTeleport = Teleport2
9
+ } else if (VueDemi.isVue3) {
10
+ const v: any = VueDemi
11
+ DlTeleport = v.Teleport
12
+ }
13
+
14
+ export default DlTeleport
@@ -0,0 +1,2 @@
1
+ export const getThemeModeAttr = (isDark: boolean): string =>
2
+ isDark ? 'dark-mode' : ''
@@ -0,0 +1,16 @@
1
+ // used directly by docs too
2
+ export function getParentVm(vm: any) {
3
+ if (Object(vm?.$parent) === vm?.$parent) {
4
+ return vm.$parent
5
+ }
6
+
7
+ vm = vm.$?.parent
8
+
9
+ while (Object(vm) === vm) {
10
+ if (Object(vm.proxy) === vm.proxy) {
11
+ return vm.proxy
12
+ }
13
+
14
+ vm = vm?.parent
15
+ }
16
+ }
package/storybook.js ADDED
@@ -0,0 +1,8 @@
1
+ const express = require('express')
2
+ const app = express()
3
+ const path = require('path')
4
+ const PORT = 3000
5
+
6
+ app.use(express.static(`${path.join(__dirname)}/storybook-static`))
7
+
8
+ app.listen(PORT, () => console.log(`Server listening on port: ${PORT}`))
package/tsconfig.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "esnext",
4
+ "module": "esnext",
5
+ "useDefineForClassFields": true,
6
+ "moduleResolution": "node",
7
+ "strict": true,
8
+ "jsx": "preserve",
9
+ "sourceMap": true,
10
+ "resolveJsonModule": true,
11
+ "isolatedModules": true,
12
+ "esModuleInterop": true,
13
+ "lib": ["esnext", "dom"],
14
+ "skipLibCheck": true,
15
+ "paths": {
16
+ "@/*": ["./src/components"]
17
+ },
18
+ "types": [
19
+ "vite/client",
20
+ "@types/jest",
21
+ "@types/lodash",
22
+ "@types/node"
23
+ ],
24
+ "experimentalDecorators": true,
25
+ "allowSyntheticDefaultImports": true,
26
+ "strictPropertyInitialization": false,
27
+ "noImplicitAny": true,
28
+ "noImplicitThis": true,
29
+ "alwaysStrict": true,
30
+ "strictBindCallApply": true,
31
+ "strictNullChecks": false,
32
+ "allowJs": true,
33
+ "importHelpers": true,
34
+ "declaration": true,
35
+ "declarationMap": true,
36
+ },
37
+ "vueCompilerOptions": {
38
+ "target": 2.7,
39
+ "experimentalDisableTemplateSupport": true
40
+ },
41
+ "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
42
+ "exclude": ["node_modules", "**/*.stories.ts"],
43
+ "references": [{ "path": "./tsconfig.node.json" }]
44
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "compilerOptions": {
3
+ "composite": true,
4
+ "module": "esnext",
5
+ "moduleResolution": "node"
6
+ },
7
+ "include": ["vite.config.ts"]
8
+ }
package/types.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './src/types'
package/vite.config.ts ADDED
@@ -0,0 +1,13 @@
1
+ import { defineConfig } from 'vite'
2
+ import vue from '@vitejs/plugin-vue'
3
+
4
+ // https://vitejs.dev/config/
5
+ export default defineConfig({
6
+ plugins: [vue()],
7
+ optimizeDeps: {
8
+ exclude: ['vue-demi']
9
+ },
10
+ define: {
11
+ 'process.env': process.env
12
+ }
13
+ })