@gorse/shards-vue 1.0.8

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 (173) hide show
  1. package/.editorconfig +13 -0
  2. package/CHANGELOG.md +49 -0
  3. package/CONTRIBUTING.md +92 -0
  4. package/ISSUE_TEMPLATE.md +19 -0
  5. package/LICENSE +21 -0
  6. package/README.md +157 -0
  7. package/build/optimize.js +49 -0
  8. package/build/paths.js +12 -0
  9. package/build/rollup.config.js +106 -0
  10. package/dist/shards-vue.common.js +13994 -0
  11. package/dist/shards-vue.common.js.map +1 -0
  12. package/dist/shards-vue.common.min.js +1 -0
  13. package/dist/shards-vue.common.min.map +1 -0
  14. package/dist/shards-vue.esm.js +13990 -0
  15. package/dist/shards-vue.esm.js.map +1 -0
  16. package/dist/shards-vue.esm.min.js +1 -0
  17. package/dist/shards-vue.esm.min.map +1 -0
  18. package/dist/shards-vue.umd.js +13997 -0
  19. package/dist/shards-vue.umd.js.map +1 -0
  20. package/dist/shards-vue.umd.min.js +1 -0
  21. package/dist/shards-vue.umd.min.map +1 -0
  22. package/logo.jpg +0 -0
  23. package/package.json +121 -0
  24. package/sandbox/Sandbox.vue +45 -0
  25. package/src/components/alert/Alert.vue +156 -0
  26. package/src/components/alert/README.md +86 -0
  27. package/src/components/alert/index.js +17 -0
  28. package/src/components/badge/Badge.vue +62 -0
  29. package/src/components/badge/README.md +112 -0
  30. package/src/components/badge/index.js +17 -0
  31. package/src/components/breadcrumb/Breadcrumb.vue +55 -0
  32. package/src/components/breadcrumb/BreadcrumbItem.vue +42 -0
  33. package/src/components/breadcrumb/BreadcrumbLink.vue +56 -0
  34. package/src/components/breadcrumb/README.md +53 -0
  35. package/src/components/breadcrumb/index.js +23 -0
  36. package/src/components/button/Button.vue +107 -0
  37. package/src/components/button/ButtonClose.vue +47 -0
  38. package/src/components/button/README.md +197 -0
  39. package/src/components/button/index.js +21 -0
  40. package/src/components/button-group/ButtonGroup.vue +66 -0
  41. package/src/components/button-group/README.md +72 -0
  42. package/src/components/button-group/index.js +18 -0
  43. package/src/components/button-toolbar/ButtonToolbar.vue +29 -0
  44. package/src/components/button-toolbar/README.md +24 -0
  45. package/src/components/button-toolbar/index.js +18 -0
  46. package/src/components/card/Card.vue +57 -0
  47. package/src/components/card/CardBody.vue +92 -0
  48. package/src/components/card/CardFooter.vue +61 -0
  49. package/src/components/card/CardGroup.vue +47 -0
  50. package/src/components/card/CardHeader.vue +61 -0
  51. package/src/components/card/CardImg.vue +64 -0
  52. package/src/components/card/README.md +96 -0
  53. package/src/components/card/index.js +27 -0
  54. package/src/components/collapse/Collapse.vue +209 -0
  55. package/src/components/collapse/README.md +86 -0
  56. package/src/components/collapse/index.js +17 -0
  57. package/src/components/container/Col.vue +125 -0
  58. package/src/components/container/Container.vue +31 -0
  59. package/src/components/container/README.md +91 -0
  60. package/src/components/container/Row.vue +64 -0
  61. package/src/components/container/index.js +21 -0
  62. package/src/components/datepicker/Datepicker.vue +391 -0
  63. package/src/components/datepicker/README.md +185 -0
  64. package/src/components/datepicker/index.js +17 -0
  65. package/src/components/dropdown/Dropdown.vue +442 -0
  66. package/src/components/dropdown/DropdownDivider.vue +22 -0
  67. package/src/components/dropdown/DropdownHeader.vue +29 -0
  68. package/src/components/dropdown/DropdownItem.vue +25 -0
  69. package/src/components/dropdown/README.md +177 -0
  70. package/src/components/dropdown/index.js +23 -0
  71. package/src/components/embed/Embed.vue +47 -0
  72. package/src/components/embed/README.md +23 -0
  73. package/src/components/embed/index.js +17 -0
  74. package/src/components/form/Form.vue +40 -0
  75. package/src/components/form/FormFeedback.vue +39 -0
  76. package/src/components/form/FormInvalidFeedback.vue +39 -0
  77. package/src/components/form/FormRow.vue +21 -0
  78. package/src/components/form/FormText.vue +41 -0
  79. package/src/components/form/FormValidFeedback.vue +39 -0
  80. package/src/components/form/README.md +84 -0
  81. package/src/components/form/index.js +29 -0
  82. package/src/components/form-checkbox/FormCheckbox.vue +200 -0
  83. package/src/components/form-checkbox/README.md +131 -0
  84. package/src/components/form-checkbox/index.js +18 -0
  85. package/src/components/form-input/FormInput.vue +176 -0
  86. package/src/components/form-input/README.md +110 -0
  87. package/src/components/form-input/index.js +18 -0
  88. package/src/components/form-radio/FormRadio.vue +155 -0
  89. package/src/components/form-radio/README.md +61 -0
  90. package/src/components/form-radio/index.js +18 -0
  91. package/src/components/form-select/FormSelect.vue +246 -0
  92. package/src/components/form-select/README.md +180 -0
  93. package/src/components/form-select/index.js +18 -0
  94. package/src/components/form-textarea/FormTextarea.vue +250 -0
  95. package/src/components/form-textarea/README.md +74 -0
  96. package/src/components/form-textarea/index.js +18 -0
  97. package/src/components/image/Image.vue +123 -0
  98. package/src/components/image/README.md +32 -0
  99. package/src/components/image/index.js +18 -0
  100. package/src/components/index.js +63 -0
  101. package/src/components/input-group/InputGroup.vue +125 -0
  102. package/src/components/input-group/InputGroupAddon.vue +58 -0
  103. package/src/components/input-group/InputGroupText.vue +20 -0
  104. package/src/components/input-group/README.md +188 -0
  105. package/src/components/input-group/index.js +21 -0
  106. package/src/components/link/Link.vue +157 -0
  107. package/src/components/link/README.md +27 -0
  108. package/src/components/link/create-link-props.js +54 -0
  109. package/src/components/link/index.js +17 -0
  110. package/src/components/list-group/ListGroup.vue +30 -0
  111. package/src/components/list-group/ListGroupItem.vue +90 -0
  112. package/src/components/list-group/README.md +23 -0
  113. package/src/components/list-group/index.js +19 -0
  114. package/src/components/modal/Modal.vue +121 -0
  115. package/src/components/modal/ModalBody.vue +20 -0
  116. package/src/components/modal/ModalFooter.vue +21 -0
  117. package/src/components/modal/ModalHeader.vue +39 -0
  118. package/src/components/modal/ModalTitle.vue +21 -0
  119. package/src/components/modal/README.md +74 -0
  120. package/src/components/modal/index.js +25 -0
  121. package/src/components/nav/Nav.vue +62 -0
  122. package/src/components/nav/NavItem.vue +23 -0
  123. package/src/components/nav/NavText.vue +21 -0
  124. package/src/components/nav/README.md +94 -0
  125. package/src/components/nav/index.js +19 -0
  126. package/src/components/navbar/Navbar.vue +63 -0
  127. package/src/components/navbar/NavbarBrand.vue +41 -0
  128. package/src/components/navbar/NavbarNav.vue +38 -0
  129. package/src/components/navbar/NavbarToggle.vue +55 -0
  130. package/src/components/navbar/README.md +51 -0
  131. package/src/components/navbar/index.js +23 -0
  132. package/src/components/popover/Popover.vue +126 -0
  133. package/src/components/popover/README.md +73 -0
  134. package/src/components/popover/index.js +17 -0
  135. package/src/components/progress/Progress.vue +93 -0
  136. package/src/components/progress/ProgressBar.vue +123 -0
  137. package/src/components/progress/README.md +95 -0
  138. package/src/components/progress/index.js +19 -0
  139. package/src/components/slider/README.md +120 -0
  140. package/src/components/slider/Slider.vue +103 -0
  141. package/src/components/slider/index.js +17 -0
  142. package/src/components/tabs/README.md +111 -0
  143. package/src/components/tabs/Tab.vue +132 -0
  144. package/src/components/tabs/Tabs.vue +290 -0
  145. package/src/components/tabs/_TabButton.vue +130 -0
  146. package/src/components/tabs/index.js +19 -0
  147. package/src/components/tooltip/README.md +70 -0
  148. package/src/components/tooltip/Tooltip.vue +115 -0
  149. package/src/components/tooltip/index.js +17 -0
  150. package/src/directives/index.js +7 -0
  151. package/src/directives/toggle/index.js +16 -0
  152. package/src/directives/toggle/toggle.js +45 -0
  153. package/src/directives/tooltip/README.md +42 -0
  154. package/src/directives/tooltip/index.js +16 -0
  155. package/src/directives/tooltip/meta.json +5 -0
  156. package/src/directives/tooltip/tooltip.js +145 -0
  157. package/src/index.js +27 -0
  158. package/src/markdown/getting-started/README.md +80 -0
  159. package/src/markdown/getting-started/meta.json +4 -0
  160. package/src/markdown/roadmap/README.md +3 -0
  161. package/src/markdown/roadmap/meta.json +4 -0
  162. package/src/mixins/checkbox-radio.mixin.js +73 -0
  163. package/src/mixins/root-listener.mixin.js +32 -0
  164. package/src/mixins/tooltip-popover.mixin.js +292 -0
  165. package/src/scripts/utils.js +18 -0
  166. package/src/utils/constants.js +191 -0
  167. package/src/utils/events.js +48 -0
  168. package/src/utils/index.js +251 -0
  169. package/src/utils/observer.js +56 -0
  170. package/src/utils/popover.class.js +91 -0
  171. package/src/utils/target.js +50 -0
  172. package/src/utils/tooltip.class.js +60 -0
  173. package/src/utils/tpmanager.class.js +730 -0
@@ -0,0 +1,442 @@
1
+ <template>
2
+ <component :is="computedTag" :id="computedID"
3
+ v-on-clickaway="away"
4
+ :class="[
5
+ 'dropdown',
6
+ 'd-dropdown',
7
+ !isNav ? 'btn-group' : '',
8
+ isNav ? 'nav-item' : '',
9
+ dropup ? 'dropup' : '',
10
+ visible ? 'show' : '',
11
+ (boundary !== 'scrollParent' || !boundary) ? 'position-static' : ''
12
+ ]">
13
+
14
+ <!-- Dropdown Split -->
15
+ <d-button v-if="split && !isNav"
16
+ ref="button"
17
+ :disabled="disabled"
18
+ :theme="theme"
19
+ :size="size"
20
+ :id="computedSplitID"
21
+ @click="click">
22
+ <slot name="button-content">{{ text }}</slot>
23
+ </d-button>
24
+
25
+ <!-- Dropdown Toggle -->
26
+ <component :is="computedToggleTag" ref="toggle"
27
+ :id="computedToggleID"
28
+ :class="[
29
+ isNav ? 'nav-link' : '',
30
+ !noCaret || split ? 'dropdown-toggle' : '',
31
+ split && !isNav ? 'dropdown-toggle-split' : '',
32
+ toggleClass
33
+ ]"
34
+ :theme="theme"
35
+ :size="size"
36
+ :disabled="disabled"
37
+ :aria-expanded="visible ? 'true' : 'false'"
38
+ aria-haspopup="true"
39
+ @click="toggle"
40
+ @keydown="toggle">
41
+ <span v-if="split" class="sr-only">{{ toggleText }}</span>
42
+ <slot v-else name="button-content">{{ text }}</slot>
43
+ </component>
44
+
45
+ <!-- Dropdown Menu -->
46
+ <div ref="menu"
47
+ role="menu"
48
+ :class="[
49
+ 'dropdown-menu',
50
+ right ? 'dropdown-menu-right' : '',
51
+ visible ? 'show' : '',
52
+ menuClass
53
+ ]"
54
+ :id="computedMenuID"
55
+ :aria-labeledby="computedMenuID"
56
+ @mouseover="onMouseOver">
57
+ <slot />
58
+ </div>
59
+ </component>
60
+ </template>
61
+
62
+ <script>
63
+ import Popper from 'popper.js'
64
+ import { guid, closest } from '../../utils'
65
+ import { THEMECOLORS, DROPDOWN_EVENTS, KEYCODES, LINK_EVENTS } from '../../utils/constants'
66
+ import { CancelableEvent } from '../../utils/events'
67
+ import { mixin as clickAwayMixin } from 'vue-clickaway';
68
+ import rootListenerMixin from '../../mixins/root-listener.mixin'
69
+
70
+ export default {
71
+ name: 'd-dropdown',
72
+ mixins: [
73
+ rootListenerMixin,
74
+ clickAwayMixin
75
+ ],
76
+ data() {
77
+ return {
78
+ visible: false,
79
+ isNavbar: null,
80
+ visibleChangePrevented: false
81
+ }
82
+ },
83
+ props: {
84
+ /**
85
+ * The element ID.
86
+ */
87
+ id: {
88
+ type: String,
89
+ default: null
90
+ },
91
+ /**
92
+ * The dropdown menu ID.
93
+ */
94
+ menuId: {
95
+ type: String,
96
+ default: null
97
+ },
98
+ /**
99
+ * The toggle ID.
100
+ */
101
+ toggleId: {
102
+ type: String,
103
+ default: null
104
+ },
105
+ /**
106
+ * The dropdown menu class(es).
107
+ */
108
+ menuClass: {
109
+ type: [String, Array],
110
+ default: null
111
+ },
112
+ /**
113
+ * The dropdown toggle class(es).
114
+ */
115
+ toggleClass: {
116
+ type: [String, Array],
117
+ default: null
118
+ },
119
+ /**
120
+ * Align the menu to the right.
121
+ */
122
+ right: {
123
+ type: Boolean,
124
+ default: false
125
+ },
126
+ /**
127
+ * Whether to display the caret, or not.
128
+ */
129
+ noCaret: {
130
+ type: Boolean,
131
+ default: false
132
+ },
133
+ /**
134
+ * Whether to split the dropdown, or not.
135
+ */
136
+ split: {
137
+ type: Boolean,
138
+ default: false
139
+ },
140
+ /**
141
+ * The color theme.
142
+ */
143
+ theme: {
144
+ type: String,
145
+ default: 'primary',
146
+ validator: v => THEMECOLORS.includes(v)
147
+ },
148
+ /**
149
+ * The dropdown toggle's size.
150
+ */
151
+ size: {
152
+ type: String,
153
+ default: null
154
+ },
155
+ /**
156
+ * The dropdown's disabled state.
157
+ */
158
+ disabled: {
159
+ type: Boolean,
160
+ default: false
161
+ },
162
+ /**
163
+ * The dropdown toggle's text.
164
+ */
165
+ toggleText: {
166
+ type: String,
167
+ default: 'Toggle Dropdown'
168
+ },
169
+ /**
170
+ * The button label's text.
171
+ */
172
+ text: {
173
+ type: String,
174
+ default: ''
175
+ },
176
+ /**
177
+ * The dropdown's boundary.
178
+ */
179
+ boundary: {
180
+ type: String,
181
+ default: 'scrollParent',
182
+ validator: v => ['scrollParent', 'window', 'viewport'].includes(v)
183
+ },
184
+ /**
185
+ * The offset value.
186
+ */
187
+ offset: {
188
+ type: [Number, String],
189
+ default: null
190
+ },
191
+ /**
192
+ * Display on top.
193
+ */
194
+ dropup: {
195
+ type: Boolean,
196
+ default: false
197
+ },
198
+ /**
199
+ * The Popper options.
200
+ */
201
+ popperOptions: {
202
+ type: Object,
203
+ default() {
204
+ return {}
205
+ }
206
+ },
207
+ /**
208
+ * Disable autoflipping.
209
+ */
210
+ noFlip: {
211
+ type: Boolean,
212
+ default: false
213
+ },
214
+ /**
215
+ * Whether the dropdown is displayed inside a nav, or not.
216
+ */
217
+ isNav: {
218
+ type: Boolean,
219
+ default: false
220
+ }
221
+ },
222
+ watch: {
223
+ visible(newVal, oldVal) {
224
+ if (this.visibleChangePrevented) {
225
+ this.visibleChangePrevented = false
226
+ return
227
+ }
228
+
229
+ if (newVal === oldVal) {
230
+ return
231
+ }
232
+
233
+ const eventName = newVal ? 'show' : 'hide'
234
+ let _visibleChangeEvent = new CancelableEvent(eventName, {
235
+ cancelable: true,
236
+ vueTarget: this,
237
+ target: this.$refs.menu,
238
+ relatedTarget: null
239
+ })
240
+
241
+ this.$emit(_visibleChangeEvent.type, _visibleChangeEvent)
242
+ this.emitOnRoot(DROPDOWN_EVENTS[_visibleChangeEvent.type.toUpperCase()])
243
+
244
+ if (_visibleChangeEvent.defaultPrevented) {
245
+ this.visibleChangePrevented = true
246
+ this.visible = oldVal
247
+ return
248
+ }
249
+
250
+ if (eventName === 'show') {
251
+ this.showMenu()
252
+ return
253
+ }
254
+
255
+ this.hideMenu()
256
+ },
257
+ disabled(newVal, oldVal) {
258
+ if (newVal !== oldVal && newVal && this.visible) {
259
+ this.visible = false
260
+ }
261
+ }
262
+ },
263
+ computed: {
264
+ computedTag() {
265
+ return this.isNav ? 'li' : 'div'
266
+ },
267
+ computedToggleTag() {
268
+ return this.isNav ? 'a' : 'd-button'
269
+ },
270
+ computedID() {
271
+ return this.id || `d-dropdown-${guid()}`
272
+ },
273
+ computedMenuID() {
274
+ return this.menuId || `d-dropdown-menu-${guid()}`
275
+ },
276
+ computedToggleID() {
277
+ return this.toggleId || `d-dropdown-toggle-${guid()}`
278
+ },
279
+ computedSplitID() {
280
+ return this.splitId || `d-dropdown-split-${guid()}`
281
+ },
282
+ toggler() {
283
+ return this.$refs.toggle.$el || this.$refs.toggle
284
+ }
285
+ },
286
+ methods: {
287
+ onMouseOver(event) {
288
+ const item = event.target
289
+ if (
290
+ item.classList.contains('dropdown-item')
291
+ && !item.disabled
292
+ && !item.classList.contains('disabled')
293
+ && item.focus
294
+ ) {
295
+ item.focus()
296
+ }
297
+ },
298
+ toggle(event) {
299
+ event = event || {}
300
+
301
+ // Enter, Space or Down
302
+ const KEY_ESD = event.keyCode === KEYCODES.ENTER
303
+ || event.keyCode === KEYCODES.SPACE
304
+ || event.keyCode === KEYCODES.DOWN
305
+
306
+ if (event.type !== 'click' && !(event.type === 'keydown' && KEY_ESD)) {
307
+ return
308
+ }
309
+
310
+ if (this.disabled) {
311
+ this.visible = false
312
+ return
313
+ }
314
+
315
+ this.$emit('toggle', event)
316
+
317
+ if (event.defaultPrevented) {
318
+ return
319
+ }
320
+
321
+ event.preventDefault()
322
+ event.stopPropagation()
323
+
324
+ this.visible = !this.visible
325
+ },
326
+ click(event) {
327
+ if (this.disabled) {
328
+ this.visible = false
329
+ return
330
+ }
331
+ this.$emit('click', event)
332
+ },
333
+ createPopper(element) {
334
+ this.removePopper()
335
+
336
+ // Define placement
337
+ let placement = 'bottom-start'
338
+
339
+ if (this.dropup && this.right) {
340
+ placement = 'top-end'
341
+ } else if (this.dropup) {
342
+ placement = 'top-start'
343
+ } else if (this.right) {
344
+ placement = 'bottom-end'
345
+ }
346
+
347
+ // Build Popper config
348
+ const popperConfig = {
349
+ placement,
350
+ modifiers: {
351
+ offset: {
352
+ offset: this.offset || 0
353
+ },
354
+ flip: {
355
+ enabled: !this.noFlip
356
+ },
357
+ computeStyle: {
358
+ enabled: true
359
+ }
360
+ }
361
+ }
362
+
363
+ // Define Popper boundaries
364
+ if (this.boundary) {
365
+ popperConfig.modifiers.preventOverflow = {
366
+ boundariesElement: this.boundary
367
+ }
368
+ }
369
+
370
+ // Create Popper instance
371
+ this._popperInstance = new Popper(
372
+ element,
373
+ this.$refs.menu,
374
+ {
375
+ ...popperConfig,
376
+ ...this.popperOptions
377
+ }
378
+ )
379
+ },
380
+ removePopper() {
381
+ if (this._popper) {
382
+ this._popper.destroy()
383
+ }
384
+ this._popperInstance = null
385
+ },
386
+ showMenu() {
387
+ if (this.disabled) {
388
+ return
389
+ }
390
+
391
+ this.emitOnRoot(DROPDOWN_EVENTS.SHOWN, this)
392
+
393
+ if (this.inNavbar === null && this.isNav) {
394
+ this.inNavbar = Boolean(closest('.navbar', this.$el))
395
+ }
396
+
397
+ if (!this.inNavbar) {
398
+ let _element = ((this.dropup && this.right) || this.split) ? this.$el : this.$refs.toggle
399
+ _element = _element.$el || _element
400
+ this.createPopper(_element)
401
+ }
402
+
403
+ this.$emit('shown')
404
+ this.$nextTick(this.focusFirstItem)
405
+ },
406
+ hideMenu() {
407
+ this.emitOnRoot(DROPDOWN_EVENTS.HIDDEN, this)
408
+ this.$emit('hidden')
409
+ this.removePopper()
410
+ },
411
+ away() {
412
+ this.visible = false
413
+ }
414
+ },
415
+ created() {
416
+ this._popperInstance = null
417
+ },
418
+ mounted() {
419
+ this.listenOnRoot(DROPDOWN_EVENTS.SHOWN, function(vm) {
420
+ if (vm !== this) {
421
+ this.visible = false
422
+ }
423
+ })
424
+
425
+ this.listenOnRoot(LINK_EVENTS.CLICKED, this.away)
426
+ },
427
+ deactivated() {
428
+ this.visible = false
429
+ this.removePopper()
430
+ },
431
+ beforeDestroy() {
432
+ this.visible = false
433
+ this.removePopper()
434
+ }
435
+ }
436
+ </script>
437
+
438
+ <style scoped>
439
+ .nav-link:hover {
440
+ cursor: pointer;
441
+ }
442
+ </style>
@@ -0,0 +1,22 @@
1
+ <template>
2
+ <component role="separator"
3
+ class="dropdown-divier"
4
+ :is="tag">
5
+ <slot />
6
+ </component>
7
+ </template>
8
+
9
+ <script>
10
+ export default {
11
+ name: 'd-dropdown-divider',
12
+ props: {
13
+ /**
14
+ * The component tag.
15
+ */
16
+ tag: {
17
+ type: String,
18
+ default: 'div'
19
+ }
20
+ }
21
+ }
22
+ </script>
@@ -0,0 +1,29 @@
1
+ <template>
2
+ <component :is="tag"
3
+ class="dropdown-header"
4
+ :id="id">
5
+ <slot />
6
+ </component>
7
+ </template>
8
+
9
+ <script>
10
+ export default {
11
+ name: 'd-dropdown-header',
12
+ props: {
13
+ /**
14
+ * The component tag.
15
+ */
16
+ tag: {
17
+ type: String,
18
+ default: 'h6'
19
+ },
20
+ /**
21
+ * The component ID.
22
+ */
23
+ id: {
24
+ type: String,
25
+ default: null
26
+ }
27
+ }
28
+ }
29
+ </script>
@@ -0,0 +1,25 @@
1
+ <template>
2
+ <d-link class="dropdown-item" role="menuitem" v-bind="$props">
3
+ <slot />
4
+ </d-link>
5
+ </template>
6
+
7
+ <script>
8
+ import createLinkProps from '../link/create-link-props'
9
+
10
+ /**
11
+ * This subcomponent is inheriting <a href="/docs/components/link">Link</a> component's props.
12
+ */
13
+ export default {
14
+ name: 'd-dropdown-item',
15
+ props: {
16
+ ...createLinkProps()
17
+ }
18
+ }
19
+ </script>
20
+
21
+ <style scoped>
22
+ .dropdown-item:focus {
23
+ outline: 0;
24
+ }
25
+ </style>
@@ -0,0 +1,177 @@
1
+ # Dropdowns
2
+
3
+ You can use dropdowns to display accessible contextual overlays for displaying lists of links and more.
4
+
5
+
6
+ ## Basic Example
7
+
8
+ You can create dropdowns using the `<d-dropdown>` component.
9
+
10
+ :::demo
11
+ ```html
12
+ <d-dropdown text="Dropdown">
13
+ <d-dropdown-item>Action</d-dropdown-item>
14
+ <d-dropdown-item>Another action</d-dropdown-item>
15
+ <d-dropdown-item>Something else here</d-dropdown-item>
16
+ <d-dropdown-divider />
17
+ <d-dropdown-item>Separated link</d-dropdown-item>
18
+ </d-dropdown>
19
+
20
+ <!-- dropdown-1.vue -->
21
+ ```
22
+ :::
23
+
24
+
25
+ ## Theme Color
26
+
27
+ Changing the theme color can be easily achieved using the `theme` prop.
28
+
29
+ :::demo
30
+ ```html
31
+ <d-dropdown text="Dropdown" theme="success">
32
+ <d-dropdown-item>Action</d-dropdown-item>
33
+ <d-dropdown-item>Another action</d-dropdown-item>
34
+ <d-dropdown-item>Something else here</d-dropdown-item>
35
+ <d-dropdown-divider />
36
+ <d-dropdown-item>Separated link</d-dropdown-item>
37
+ </d-dropdown>
38
+
39
+ <!-- dropdown-2.vue -->
40
+ ```
41
+ :::
42
+
43
+
44
+ ## Positioning
45
+
46
+ By default dropdown menus are left aligned. However, you can change this by applying a right alignment using the `right` prop.
47
+
48
+ :::demo
49
+ ```html
50
+
51
+ <div>
52
+ <d-dropdown text="Left Align" class="mr-2">
53
+ <d-dropdown-item>Action</d-dropdown-item>
54
+ <d-dropdown-item>Another action</d-dropdown-item>
55
+ <d-dropdown-item>Something else here</d-dropdown-item>
56
+ <d-dropdown-divider />
57
+ <d-dropdown-item>Separated link</d-dropdown-item>
58
+ </d-dropdown>
59
+
60
+ <d-dropdown text="Right Align" right>
61
+ <d-dropdown-item>Action</d-dropdown-item>
62
+ <d-dropdown-item>Another action</d-dropdown-item>
63
+ <d-dropdown-item>Something else here</d-dropdown-item>
64
+ <d-dropdown-divider />
65
+ <d-dropdown-item>Separated link</d-dropdown-item>
66
+ </d-dropdown>
67
+ </div>
68
+
69
+ <!-- dropdown-3.vue -->
70
+ ```
71
+ :::
72
+
73
+
74
+ ## Drop-up
75
+
76
+ Turning dropdown menus into drop-up menus can be easily achieved using the `dropup` prop.
77
+
78
+ :::demo
79
+ ```html
80
+ <d-dropdown text="Dropdown" dropup>
81
+ <d-dropdown-item>Action</d-dropdown-item>
82
+ <d-dropdown-item>Another action</d-dropdown-item>
83
+ <d-dropdown-item>Something else here</d-dropdown-item>
84
+ <d-dropdown-divider />
85
+ <d-dropdown-item>Separated link</d-dropdown-item>
86
+ </d-dropdown>
87
+
88
+ <!-- dropdown-4.vue -->
89
+ ```
90
+ :::
91
+
92
+
93
+ ## Split Buttons
94
+
95
+ Using the `split` prop you can create split-type dropdowns. You can hook into the `click` event for the left-side button.
96
+
97
+ :::demo
98
+ ```html
99
+ <template>
100
+ <d-dropdown text="Dropdown" split @click="handleClick">
101
+ <d-dropdown-item>Action</d-dropdown-item>
102
+ <d-dropdown-item>Another action</d-dropdown-item>
103
+ <d-dropdown-item>Something else here</d-dropdown-item>
104
+ <d-dropdown-divider />
105
+ <d-dropdown-item>Separated link</d-dropdown-item>
106
+ </d-dropdown>
107
+ </template>
108
+
109
+ <script>
110
+ export default {
111
+ methods: {
112
+ handleClick() {
113
+ alert('Split button was clicked!')
114
+ }
115
+ }
116
+ }
117
+ </script>
118
+
119
+ <!-- dropdown-5.vue -->
120
+ ```
121
+ :::
122
+
123
+
124
+ ## Sizing
125
+
126
+ Using the `size` prop you can control the dropdown button's size.
127
+
128
+ :::demo
129
+ ```html
130
+ <div>
131
+ <d-dropdown text="Large" size="lg">
132
+ <d-dropdown-item>Action</d-dropdown-item>
133
+ <d-dropdown-item>Another action</d-dropdown-item>
134
+ <d-dropdown-item>Something else here</d-dropdown-item>
135
+ <d-dropdown-divider />
136
+ <d-dropdown-item>Separated link</d-dropdown-item>
137
+ </d-dropdown>
138
+
139
+ <d-dropdown text="Normal">
140
+ <d-dropdown-item>Action</d-dropdown-item>
141
+ <d-dropdown-item>Another action</d-dropdown-item>
142
+ <d-dropdown-item>Something else here</d-dropdown-item>
143
+ <d-dropdown-divider />
144
+ <d-dropdown-item>Separated link</d-dropdown-item>
145
+ </d-dropdown>
146
+
147
+ <d-dropdown text="Small" size="sm">
148
+ <d-dropdown-item>Action</d-dropdown-item>
149
+ <d-dropdown-item>Another action</d-dropdown-item>
150
+ <d-dropdown-item>Something else here</d-dropdown-item>
151
+ <d-dropdown-divider />
152
+ <d-dropdown-item>Separated link</d-dropdown-item>
153
+ </d-dropdown>
154
+ </div>
155
+
156
+ <!-- dropdown-6.vue -->
157
+ ```
158
+ :::
159
+
160
+
161
+ ## Offsets
162
+
163
+ If you'd like to offset your dropdown menu, you can use the `offset` propto specify the number of pixels you would like to push the menu to either left or right depending on the value you are using *(positive for pushing, negative for pulling)*.
164
+
165
+ :::demo
166
+ ```html
167
+ <d-dropdown text="Dropdown" offset="30">
168
+ <d-dropdown-item>Action</d-dropdown-item>
169
+ <d-dropdown-item>Another action</d-dropdown-item>
170
+ <d-dropdown-item>Something else here</d-dropdown-item>
171
+ <d-dropdown-divider />
172
+ <d-dropdown-item>Separated link</d-dropdown-item>
173
+ </d-dropdown>
174
+
175
+ <!-- dropdown-7.vue -->
176
+ ```
177
+ :::