Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
fdbe390
minimal test
jovyntls Mar 18, 2022
7508691
Working modal
jovyntls Mar 21, 2022
4107622
Fix overflow
jovyntls Mar 22, 2022
6d4b8db
Fix SSR and add zoom effect
jovyntls Mar 23, 2022
d5ab037
Remove accidental files
jovyntls Mar 23, 2022
2d272e5
Minor cleanup
jovyntls Mar 23, 2022
ccc423e
Restore deprecated modal-header and modal-footer
jovyntls Mar 23, 2022
e04d4aa
Fix tests and deprecated slots
jovyntls Mar 23, 2022
938b56a
Add tests
jovyntls Mar 23, 2022
6243e26
Upgrade Vue to v2.6.14
jovyntls Mar 23, 2022
c209f0d
Update vue-final-modal to v2.4.1
jovyntls Mar 23, 2022
87e0092
minimal
jovyntls Mar 25, 2022
70e625a
Working popovers tooltips triggers
jovyntls Mar 25, 2022
d9f1be3
Replicate existing behaviour
jovyntls Mar 25, 2022
82cff18
Replicate styles
jovyntls Mar 25, 2022
7ac6715
Fix package-lock
jovyntls Mar 25, 2022
fa1eae1
Add snapshot tests
jovyntls Mar 25, 2022
f095cb5
Update vue-components README
jovyntls Mar 25, 2022
cd596ec
Fix package-lock.json
jovyntls Mar 27, 2022
ed411d4
Update package-lock.json
jovyntls Mar 27, 2022
6622078
Fix merge mistakes
jovyntls Mar 27, 2022
696d529
Fix merge mistakes again
jovyntls Mar 27, 2022
46671fb
Remove extra eslint disable
jovyntls Mar 27, 2022
bd35db7
Update tests
jovyntls Mar 27, 2022
589b1cf
Fix test
jovyntls Mar 27, 2022
8b6415b
Fix missing modal triggers
jovyntls Mar 28, 2022
e166c57
Replicate existing tooltips
jovyntls Mar 28, 2022
3b86f5b
Linting
jovyntls Mar 28, 2022
6500e0d
Update snapshot tests
jovyntls Mar 28, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 3 additions & 10 deletions packages/vue-components/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,16 @@ Most of the styles are based on Bootstrap's markup and CSS, but no dependency on

Many of the components under this folder were originally from [MarkBind/vue-strap](https://github.com/MarkBind/vue-strap), forked from [yuche/vue-strap](https://github.com/yuche/vue-strap), and modified to suit MarkBind's needs for educational and documentation websites.

The generated bundle also includes some of [BootstrapVue's](https://bootstrap-vue.org/) components.

Some custom components and directives are also added for MarkBind's use.

### MarkBind components newly created or revamped since moving here
- Modal.vue (built on [Vue Final Modal](https://vue-final-modal.org/))
- Question.vue
- QOption.vue
- Quiz.vue
- Popover.vue (built on bootstrap-vue's popovers)
- Tooltip.vue (built on bootstrap-vue's tooltips)
- Trigger.vue (built on bootstrap-vue's popovers and tooltips)
- Popover.vue (built on floating-vue's [Menu](https://floating-vue.starpad.dev/guide/component.html#hover-menu) component)
- Tooltip.vue (built on floating-vue's [Tooltip](https://floating-vue.starpad.dev/guide/component.html#tooltip) component)
- Trigger.vue (built on vue-final-modal's [$vfm API](https://vue-final-modal.org/api#api) and Floating Vue's Menus and Tooltips)

### MarkBind components ported from [MarkBind/vue-strap](https://github.com/MarkBind/vue-strap):

Expand All @@ -50,11 +48,6 @@ Some custom components and directives are also added for MarkBind's use.
- Tabset.vue
- Typeahead.vue

### BootstrapVue components included in the bundle

- Popover.vue
- Tooltip.vue

## Installation

### Browser globals
Expand Down
1 change: 1 addition & 0 deletions packages/vue-components/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
"bootstrap-vue": "^2.16.0",
"css-loader": "^3.6.0",
"eslint-plugin-vue": "^7.9.0",
"floating-vue": "^1.0.0-beta.14",
"jest": "^27.5.1",
"jest-serializer-vue": "^2.0.2",
"portal-vue": "^2.1.7",
Expand Down
66 changes: 45 additions & 21 deletions packages/vue-components/src/Popover.vue
Original file line number Diff line number Diff line change
Expand Up @@ -4,43 +4,50 @@
data-mb-component-type="popover"
tabindex="0"
>
<portal v-if="targetEl.id" :to="'header:' + targetEl.id">
<slot name="header"></slot>
</portal>
<portal v-if="targetEl.id" :to="'content:' + targetEl.id">
<div class="popover-content">
<portal v-if="targetEl.id" :to="'popover:' + targetEl.id">
<h3 v-if="hasHeader" class="popover-header">
<slot name="header"></slot>
</h3>
<div class="popover-body">
<slot name="content"></slot>
</div>
</portal>

<b-popover
<v-popover
v-if="isMounted"
:target="targetEl"
:triggers="trigger"
:triggers="triggers"
:popper-triggers="triggers"
:placement="placement"
:delay="0"
popper-class="v-popper__popper--skip-transition"
shift-cross-axis
>
<template #title>
<slot name="header"></slot>
<!-- floating-vue triggers must be elements that receive mouse events, hence an empty @click -->
<span @click.stop>
<slot></slot>
</span>
<template #popper>
<div class="popover-container">
<h3 v-if="hasHeader" class="popover-header">
<slot name="header"></slot>
</h3>
<div class="popover-body">
<slot name="content"></slot>
</div>
</div>
</template>
<div class="popover-content">
<slot name="content"></slot>
</div>
</b-popover>
<slot></slot>
</v-popover>
</span>
</template>

<script>
/* eslint-disable import/no-extraneous-dependencies */
// eslint-disable-next-line import/no-extraneous-dependencies
import { Portal } from 'portal-vue';
import { BPopover } from 'bootstrap-vue';
/* eslint-enable import/no-extraneous-dependencies */

export default {
name: 'Popover',
components: {
Portal,
BPopover,
},
props: {
trigger: {
Expand All @@ -58,16 +65,33 @@ export default {
isMounted: false,
};
},
computed: {
triggers() {
return this.trigger.split(' ');
},
hasHeader() {
return !!this.$slots.header;
},
},
mounted() {
this.targetEl = this.$el;
this.isMounted = true;
},
};
</script>

<style scoped>
.popover-content {
<style>
.popover-container {
overflow: auto;
max-height: 50vh;
max-width: 276px; /* following bootstrap */
}

.popover-body {
font-size: 0.875rem; /* following bootstrap */
}

.v-popper {
display: inline;
}
</style>
41 changes: 30 additions & 11 deletions packages/vue-components/src/Tooltip.vue
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,36 @@
data-mb-component-type="tooltip"
tabindex="0"
>
<portal v-if="targetEl.id" :to="targetEl.id">
<portal v-if="targetEl.id" :to="'tooltip:' + targetEl.id">
<slot name="content"></slot>
</portal>

<b-tooltip
<v-tooltip
v-if="isMounted"
:target="targetEl"
:triggers="trigger"
:triggers="triggers"
:popper-triggers="triggers"
:hide-triggers="triggers"
:placement="placement"
:delay="0"
popper-class="v-popper__popper--skip-transition"
shift-cross-axis
>
<slot name="content"></slot>
</b-tooltip>
<slot></slot>
<template #popper>
<slot name="content"></slot>
</template>
<slot></slot>
</v-tooltip>
</span>
</template>

<script>
/* eslint-disable import/no-extraneous-dependencies */
// eslint-disable-next-line import/no-extraneous-dependencies
import { Portal } from 'portal-vue';
import { BTooltip } from 'bootstrap-vue';
/* eslint-enable import/no-extraneous-dependencies */

export default {
name: 'Tooltip',
components: {
Portal,
BTooltip,
},
props: {
trigger: {
Expand All @@ -48,9 +51,25 @@ export default {
isMounted: false,
};
},
computed: {
triggers() {
return this.trigger.split(' ');
},
},
mounted() {
this.targetEl = this.$el;
this.isMounted = true;
},
};
</script>

<style>
.v-popper--theme-tooltip .v-popper__inner {
/* following bootstrap */
background: rgba(0, 0, 0, 0.9);
padding: 4px 8px;
font-size: 0.875rem;
max-width: 200px;
text-align: center;
}
</style>
Loading