renusify 2.5.1 → 3.0.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.
- package/components/app/index.vue +74 -22
- package/components/app/toast/index.vue +76 -71
- package/components/app/toast/toast.vue +62 -44
- package/components/avatar/index.vue +208 -84
- package/components/button/buttonConfirm.vue +53 -26
- package/components/button/buttonGroup.js +0 -2
- package/components/button/buttonGroup.vue +310 -62
- package/components/button/index.vue +584 -100
- package/components/calendar/index.js +0 -2
- package/components/calendar/index.vue +326 -262
- package/components/calendar/month.vue +64 -55
- package/components/calendar/year.vue +30 -25
- package/components/card/index.vue +139 -59
- package/components/codeEditor/highlightCss.vue +38 -39
- package/components/codeEditor/highlightHtml.vue +64 -64
- package/components/codeEditor/highlightJs.vue +37 -38
- package/components/codeEditor/index.vue +129 -79
- package/components/codeEditor/run.vue +225 -39
- package/components/codeEditor/useCodeFormatter.js +150 -0
- package/components/confirm/index.vue +140 -81
- package/components/container/col.vue +5 -4
- package/components/container/divider.vue +28 -19
- package/components/container/index.vue +34 -15
- package/components/container/row.vue +26 -9
- package/components/container/spacer.vue +2 -4
- package/components/container/style.scss +3 -0
- package/components/content/index.vue +49 -32
- package/components/cropper/index.vue +401 -244
- package/components/float/index.vue +542 -415
- package/components/form/addressInput/index.vue +184 -109
- package/components/form/camInput/index.vue +370 -244
- package/components/form/checkInput/index.vue +138 -71
- package/components/form/checkboxInput/index.vue +87 -47
- package/components/form/colorInput/Alpha.vue +81 -83
- package/components/form/colorInput/Hue.vue +91 -68
- package/components/form/colorInput/Preview.vue +43 -47
- package/components/form/colorInput/Saturation.vue +101 -86
- package/components/form/colorInput/index.vue +72 -40
- package/components/form/colorInput/picker.vue +111 -106
- package/components/form/colorInput/useColor.js +153 -0
- package/components/form/dateInput/index.vue +691 -356
- package/components/form/dateInput/month.vue +63 -54
- package/components/form/dateInput/year.vue +35 -25
- package/components/form/fileInput/index.js +0 -1
- package/components/form/fileInput/index.vue +263 -106
- package/components/form/fileInput/single.vue +323 -164
- package/components/form/groupInput/index.vue +199 -101
- package/components/form/index.vue +189 -83
- package/components/form/input/index.vue +416 -377
- package/components/form/jsonInput/JsonView.vue +54 -56
- package/components/form/jsonInput/index.vue +247 -165
- package/components/form/maskInput/index.vue +252 -132
- package/components/form/numberInput/index.js +0 -1
- package/components/form/numberInput/index.vue +226 -117
- package/components/form/passwordInput/index.js +2 -1
- package/components/form/passwordInput/index.vue +269 -102
- package/components/form/radioInput/index.vue +143 -72
- package/components/form/rangeInput/index.vue +280 -167
- package/components/form/ratingInput/index.vue +57 -57
- package/components/form/selectInput/index.js +1 -3
- package/components/form/selectInput/index.vue +584 -296
- package/components/form/switchInput/index.vue +73 -59
- package/components/form/telInput/index.js +0 -1
- package/components/form/telInput/index.vue +238 -135
- package/components/form/textArea/index.vue +72 -35
- package/components/form/textEditor/index.vue +739 -0
- package/components/form/{text-editor → textEditor}/style.scss +8 -16
- package/components/form/textInput/index.vue +54 -32
- package/components/form/timeInput/index.vue +83 -56
- package/components/form/timeInput/range.vue +116 -95
- package/components/form/timeInput/timepicker.vue +382 -449
- package/components/form/uniqueInput/index.vue +105 -48
- package/components/form/unitInput/index.vue +139 -84
- package/components/formCreator/index.js +0 -1
- package/components/formCreator/index.vue +314 -148
- package/components/highlight/index.vue +41 -25
- package/components/highlight/style.scss +2 -2
- package/components/highlight/{mixin.js → useHighlight.js} +181 -160
- package/components/icon/index.vue +79 -33
- package/components/img/index.vue +249 -147
- package/components/img/preview.vue +180 -198
- package/components/img/svgImg.vue +42 -39
- package/components/index.js +5 -20
- package/components/infinite/index.js +1 -2
- package/components/infinite/index.vue +248 -66
- package/components/map/index.vue +428 -261
- package/components/map/route.vue +794 -487
- package/components/map/select.vue +118 -58
- package/components/menu/index.vue +201 -91
- package/components/meta/meta.js +26 -3
- package/components/modal/index.vue +383 -158
- package/components/notify/index.vue +204 -86
- package/components/notify/notification.vue +38 -55
- package/components/progress/circle.vue +189 -70
- package/components/progress/line.vue +266 -46
- package/components/searchBox/index.js +1 -3
- package/components/searchBox/index.vue +194 -101
- package/components/skeleton/index.vue +45 -20
- package/components/slider/index.vue +318 -156
- package/components/swiper/index.vue +254 -106
- package/components/table/crud/footer.vue +77 -53
- package/components/table/crud/header.vue +71 -72
- package/components/table/crud/index.vue +631 -401
- package/components/table/index.vue +721 -278
- package/components/timeAgo/index.vue +145 -96
- package/components/tour/index.vue +338 -235
- package/components/tree/index.vue +235 -89
- package/components/tree/tree-element.vue +107 -106
- package/directive/animate/index.js +77 -0
- package/directive/clickOutSide/index.js +98 -0
- package/directive/drag/index.js +153 -0
- package/directive/index.js +11 -13
- package/directive/intersect/index.js +263 -0
- package/directive/mask/index.js +67 -0
- package/directive/parallax/index.js +78 -0
- package/directive/ripple/index.js +14 -0
- package/directive/scroll/index.js +244 -0
- package/directive/sortable/index.js +274 -0
- package/directive/title/index.js +75 -0
- package/directive/touch/index.js +268 -0
- package/index.js +10 -8
- package/package.json +5 -2
- package/plugins/validation/Validate.js +88 -79
- package/scripts/generate-docs.mjs +226 -0
- package/scripts/menu.mjs +240 -0
- package/scripts/parser.mjs +1086 -0
- package/style/_index.scss +7 -0
- package/style/app.scss +13 -65
- package/style/colors.scss +5 -22
- package/style/functions/index.scss +8 -0
- package/style/mixins/index.scss +17 -5
- package/style/variables/base.scss +154 -175
- package/style/variables/color.scss +0 -12
- package/style/variables/utilities.scss +0 -180
- package/tools/helper.js +0 -8
- package/tools/icons.js +6 -1
- package/tools/root.js +71 -0
- package/components/app/style.scss +0 -41
- package/components/app/toast/style.scss +0 -20
- package/components/avatar/style.scss +0 -32
- package/components/bar/bottomNav.js +0 -1
- package/components/bar/bottomNav.vue +0 -28
- package/components/bar/bottomNavigationCircle.js +0 -2
- package/components/bar/bottomNavigationCircle.vue +0 -99
- package/components/bar/scss/bottomNav.scss +0 -67
- package/components/bar/scss/toolbar.scss +0 -174
- package/components/bar/toolbar/index.js +0 -8
- package/components/bar/toolbar/index.vue +0 -35
- package/components/bar/toolbar/laptop.vue +0 -33
- package/components/bar/toolbar/menuChilds.vue +0 -41
- package/components/bar/toolbar/menuLaptop.vue +0 -41
- package/components/bar/toolbar/menuMob.vue +0 -39
- package/components/bar/toolbar/mixin.js +0 -43
- package/components/bar/toolbar/mobile.vue +0 -34
- package/components/breadcrumb/bredcrumbItem.vue +0 -39
- package/components/breadcrumb/index.js +0 -3
- package/components/breadcrumb/index.vue +0 -71
- package/components/breadcrumb/style.scss +0 -51
- package/components/button/style.scss +0 -411
- package/components/card/style.scss +0 -86
- package/components/chart/chart.js +0 -1
- package/components/chart/chart.vue +0 -69
- package/components/chart/worldMap.js +0 -2
- package/components/chart/worldMap.vue +0 -1112
- package/components/chat/MessageList.vue +0 -163
- package/components/chat/chatInput.vue +0 -150
- package/components/chat/chatMsg.vue +0 -276
- package/components/chat/index.js +0 -11
- package/components/chat/index.vue +0 -113
- package/components/chip/index.js +0 -3
- package/components/chip/index.vue +0 -77
- package/components/chip/style.scss +0 -199
- package/components/codeEditor/mixin.js +0 -145
- package/components/countdown/index.js +0 -1
- package/components/countdown/index.vue +0 -105
- package/components/form/colorInput/mixin.js +0 -132
- package/components/form/fileInput/file.js +0 -148
- package/components/form/telInput/assets/flags.png +0 -0
- package/components/form/telInput/assets/flags@2x.png +0 -0
- package/components/form/text-editor/index.vue +0 -710
- package/components/icon/style.scss +0 -17
- package/components/infinite/div.js +0 -6
- package/components/infinite/div.vue +0 -193
- package/components/infinite/page.js +0 -3
- package/components/infinite/page.vue +0 -105
- package/components/list/index.js +0 -3
- package/components/list/index.vue +0 -122
- package/components/list/style.scss +0 -66
- package/components/message/index.js +0 -4
- package/components/message/index.vue +0 -40
- package/components/modal/style.scss +0 -146
- package/components/nestable/NestableItem.vue +0 -307
- package/components/nestable/editable.js +0 -44
- package/components/nestable/index.js +0 -1
- package/components/nestable/index.vue +0 -226
- package/components/nestable/methods.js +0 -416
- package/components/progress/style.scss +0 -229
- package/components/table/style.scss +0 -338
- package/components/tabs/index.js +0 -3
- package/components/tabs/index.vue +0 -151
- package/components/timeline/index.js +0 -6
- package/components/timeline/index.vue +0 -76
- package/directive/resize/index.js +0 -30
- package/directive/skeleton/index.js +0 -27
- package/directive/skeleton/style.scss +0 -37
- package/plugins/request/Request.js +0 -68
- package/style/animation.scss +0 -94
- package/style/style.scss +0 -8
- package/tools/rootable.js +0 -75
- /package/components/form/{text-editor → textEditor}/index.js +0 -0
- /package/components/form/{text-editor → textEditor}/preview.js +0 -0
- /package/components/form/{text-editor → textEditor}/preview.vue +0 -0
|
@@ -4,67 +4,127 @@
|
|
|
4
4
|
:height="height"
|
|
5
5
|
:zoom="zoom" search-box @leaflet="handleLEvent"
|
|
6
6
|
@map="handleMapEvent"
|
|
7
|
-
@update:model-value="
|
|
7
|
+
@update:model-value="emitValue"
|
|
8
8
|
></r-map>
|
|
9
9
|
</div>
|
|
10
10
|
</template>
|
|
11
|
-
<script>
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
},
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
11
|
+
<script setup>
|
|
12
|
+
import {ref, inject, computed} from 'vue'
|
|
13
|
+
|
|
14
|
+
const props = defineProps({
|
|
15
|
+
/**
|
|
16
|
+
* Selected location coordinates
|
|
17
|
+
* @type {Array<Number>}
|
|
18
|
+
* @model
|
|
19
|
+
* @description Two-way binding for the selected [latitude, longitude] coordinates.
|
|
20
|
+
* Updates when user clicks or drags the marker on the map.
|
|
21
|
+
* @example [35.6997, 51.3380] // Tehran coordinates
|
|
22
|
+
* @example [40.7128, -74.0060] // New York coordinates
|
|
23
|
+
*/
|
|
24
|
+
modelValue: Array,
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Map container height
|
|
28
|
+
* @type {String}
|
|
29
|
+
* @default '500px'
|
|
30
|
+
* @description CSS height for the map container.
|
|
31
|
+
* Accepts any valid CSS height value.
|
|
32
|
+
* @example '300px'
|
|
33
|
+
* @example '70vh'
|
|
34
|
+
* @example '100%'
|
|
35
|
+
*/
|
|
36
|
+
height: {type: String, default: "500px"},
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Initial zoom level
|
|
40
|
+
* @type {Number}
|
|
41
|
+
* @default 13
|
|
42
|
+
* @description Initial zoom level of the map (0-20 typical range).
|
|
43
|
+
* Higher values = more zoomed in.
|
|
44
|
+
* @example 10 // City overview
|
|
45
|
+
* @example 15 // Neighborhood view
|
|
46
|
+
* @example 18 // Street view
|
|
47
|
+
*/
|
|
48
|
+
zoom: {type: Number, default: 13},
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Custom marker icon image URL
|
|
52
|
+
* @type {String}
|
|
53
|
+
* @description URL to a custom marker icon image.
|
|
54
|
+
* Overrides the default marker icon.
|
|
55
|
+
* Recommended size: 30x30 pixels with anchor at bottom center.
|
|
56
|
+
* @example '/assets/custom-marker.png'
|
|
57
|
+
* @example 'https://example.com/pin-icon.png'
|
|
58
|
+
*/
|
|
59
|
+
mapImageMarker: String
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
const emit = defineEmits([
|
|
63
|
+
/**
|
|
64
|
+
* Updated [latitude, longitude] coordinates
|
|
65
|
+
*/
|
|
66
|
+
'update:modelValue'
|
|
67
|
+
])
|
|
68
|
+
|
|
69
|
+
const {$t, $r} = inject('renusify')
|
|
70
|
+
|
|
71
|
+
const map = ref(null)
|
|
72
|
+
const L = ref(null)
|
|
73
|
+
const marker = ref(null)
|
|
74
|
+
const center = ref(props.modelValue || [35.69973857757377, 51.33806092139637])
|
|
75
|
+
|
|
76
|
+
const iconMarker = computed(() => {
|
|
77
|
+
if (props.mapImageMarker) {
|
|
78
|
+
return props.mapImageMarker
|
|
79
|
+
}
|
|
80
|
+
return require('./images/marker-icon.png')
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
const handleLEvent = (e) => {
|
|
84
|
+
L.value = e
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const handleMapEvent = (e) => {
|
|
88
|
+
map.value = e
|
|
89
|
+
selection()
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const selection = () => {
|
|
93
|
+
emit("update:modelValue", center.value);
|
|
94
|
+
|
|
95
|
+
marker.value = new L.value.Marker(center.value, {
|
|
96
|
+
icon: new L.value.icon({
|
|
97
|
+
iconUrl: iconMarker.value,
|
|
98
|
+
iconSize: [30, 30],
|
|
99
|
+
iconAnchor: [15, 30],
|
|
100
|
+
popupAnchor: [0, -30]
|
|
101
|
+
}),
|
|
102
|
+
draggable: true
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
map.value.addLayer(marker.value);
|
|
106
|
+
|
|
107
|
+
marker.value.bindPopup($t("map_move_to_location", 'renusify')).openPopup();
|
|
108
|
+
|
|
109
|
+
marker.value.on('dragend', function (event) {
|
|
110
|
+
const marker = event.target;
|
|
111
|
+
const position = marker.getLatLng();
|
|
112
|
+
emitValue([position.lat, position.lng]);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
map.value.on('click', function (event) {
|
|
116
|
+
emitValue([event.latlng.lat, event.latlng.lng]);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const emitValue = (e) => {
|
|
121
|
+
center.value = e
|
|
122
|
+
emit("update:modelValue", center.value);
|
|
123
|
+
|
|
124
|
+
if (marker.value) {
|
|
125
|
+
marker.value.setLatLng(center.value);
|
|
126
|
+
map.value.closePopup();
|
|
68
127
|
}
|
|
69
128
|
}
|
|
70
129
|
</script>
|
|
130
|
+
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div
|
|
2
|
+
<div ref="menuRef" v-click-outside="close" :class="$r.prefix+'menu'">
|
|
3
3
|
<div class="d-flex h-start flex-row v-center">
|
|
4
4
|
<span class="menu-label" v-if="label" @click.prevent="open">{{ label }}</span>
|
|
5
5
|
<transition name="fade" mode="out-in">
|
|
@@ -23,7 +23,11 @@
|
|
|
23
23
|
<r-card>
|
|
24
24
|
<div class="dropdown-menu-item pa-2" v-for="(item,i) in list" :key="i"
|
|
25
25
|
:class="{'menu-selected':selected===item[value]}"
|
|
26
|
-
@click.prevent="
|
|
26
|
+
@click.prevent="emitItem(item)">
|
|
27
|
+
<!--
|
|
28
|
+
Default slot for custom menu item rendering
|
|
29
|
+
@binding {Object|String|Number} item - The current menu item
|
|
30
|
+
-->
|
|
27
31
|
<slot :item="item">
|
|
28
32
|
{{ item }}
|
|
29
33
|
</slot>
|
|
@@ -34,102 +38,208 @@
|
|
|
34
38
|
</div>
|
|
35
39
|
</div>
|
|
36
40
|
</template>
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
41
|
+
|
|
42
|
+
<script setup>
|
|
43
|
+
import {ref, computed, inject, nextTick} from 'vue'
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* @example // Menu usage
|
|
48
|
+
* <template>
|
|
49
|
+
* <r-menu
|
|
50
|
+
* v-model="modelValue"
|
|
51
|
+
* :label="modelValue?modelValue.name:label"
|
|
52
|
+
* :icon="icon"
|
|
53
|
+
* :value="value"
|
|
54
|
+
* :just-Value="justValue"
|
|
55
|
+
* :reverse="reverse"
|
|
56
|
+
* :overlay="overlay"
|
|
57
|
+
* :items="items"
|
|
58
|
+
* @update:model-Value="log(`update:modelValue`,$event)" ></r-menu>
|
|
59
|
+
* </template>
|
|
60
|
+
* <script>
|
|
61
|
+
* import { ref } from 'vue'
|
|
62
|
+
*
|
|
63
|
+
* const modelValue=ref(null)
|
|
64
|
+
* const icon=ref(null)
|
|
65
|
+
* const label=ref("label")
|
|
66
|
+
* const value=ref("value")
|
|
67
|
+
* const justValue=ref(false)
|
|
68
|
+
* const reverse=ref(false)
|
|
69
|
+
* const overlay=ref(false)
|
|
70
|
+
* const items=ref([
|
|
71
|
+
* { name: `home`,value:1 },
|
|
72
|
+
* { name: `blog`,value:2 },
|
|
73
|
+
* { name: `contact`,value:3 },
|
|
74
|
+
* { name: `about`,value:4 },
|
|
75
|
+
* ])
|
|
76
|
+
* const log=(name,e)=>{
|
|
77
|
+
* console.log(name,e)
|
|
78
|
+
* }
|
|
79
|
+
* <//script>
|
|
80
|
+
*
|
|
81
|
+
* */
|
|
82
|
+
const props = defineProps({
|
|
83
|
+
/**
|
|
84
|
+
* Currently selected value (v-model)
|
|
85
|
+
* @model
|
|
86
|
+
* @type {String|Number|Object}
|
|
87
|
+
*/
|
|
88
|
+
modelValue: {
|
|
89
|
+
type: [String, Number, Object]
|
|
58
90
|
},
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Menu label text
|
|
94
|
+
* @type {String}
|
|
95
|
+
*/
|
|
96
|
+
label: String,
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Custom icon for the open button
|
|
100
|
+
* @type {String}
|
|
101
|
+
* @default Chevron down icon from Renusify icons
|
|
102
|
+
*/
|
|
103
|
+
icon: {
|
|
104
|
+
type: String
|
|
68
105
|
},
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
}
|
|
79
|
-
})
|
|
80
|
-
}
|
|
81
|
-
return r
|
|
82
|
-
},
|
|
83
|
-
selected() {
|
|
84
|
-
if (!this.modelValue) {
|
|
85
|
-
return null
|
|
86
|
-
}
|
|
87
|
-
return this.justValue ? this.modelValue : this.modelValue[this.value]
|
|
88
|
-
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Property name to use as value key in item objects
|
|
109
|
+
* @type {String}
|
|
110
|
+
* @default 'value'
|
|
111
|
+
*/
|
|
112
|
+
value: {
|
|
113
|
+
type: String,
|
|
114
|
+
default: 'value'
|
|
89
115
|
},
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* If true, emits only the value property instead of the whole item object
|
|
119
|
+
* @type {Boolean}
|
|
120
|
+
* @default false
|
|
121
|
+
*/
|
|
122
|
+
justValue: Boolean,
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* If true, reverses the menu positioning
|
|
126
|
+
* @type {Boolean}
|
|
127
|
+
* @default false
|
|
128
|
+
*/
|
|
129
|
+
reverse: Boolean,
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* If true, menu overlays the trigger instead of pushing content down
|
|
133
|
+
* @type {Boolean}
|
|
134
|
+
* @default false
|
|
135
|
+
*/
|
|
136
|
+
overlay: Boolean,
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Array of menu items
|
|
140
|
+
* Can be array of objects or primitives (strings/numbers)
|
|
141
|
+
* @type {Array}
|
|
142
|
+
* @example
|
|
143
|
+
* // Array of objects
|
|
144
|
+
* [{ value: 1, name: 'Option 1' }, { value: 2, name: 'Option 2' }]
|
|
145
|
+
* // Array of primitives
|
|
146
|
+
* ['Option 1', 'Option 2']
|
|
147
|
+
*/
|
|
148
|
+
items: Array
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
const emit = defineEmits([
|
|
152
|
+
/**
|
|
153
|
+
* Emitted when selected value changes
|
|
154
|
+
* @event update:modelValue
|
|
155
|
+
* @param {String|Number|Object} value - Selected value
|
|
156
|
+
*/
|
|
157
|
+
'update:modelValue'
|
|
158
|
+
])
|
|
159
|
+
|
|
160
|
+
const {$r} = inject('renusify')
|
|
161
|
+
|
|
162
|
+
const show = ref(false)
|
|
163
|
+
const top = ref(null)
|
|
164
|
+
const left = ref(null)
|
|
165
|
+
const right = ref(null)
|
|
166
|
+
const opacity = ref(0)
|
|
167
|
+
const menuRef = ref(null)
|
|
168
|
+
|
|
169
|
+
const list = computed(() => {
|
|
170
|
+
const result = []
|
|
171
|
+
if (props.items) {
|
|
172
|
+
props.items.forEach((item) => {
|
|
173
|
+
if (typeof item === 'object') {
|
|
174
|
+
result.push(item)
|
|
108
175
|
} else {
|
|
109
|
-
|
|
110
|
-
this.left = 0
|
|
111
|
-
} else {
|
|
112
|
-
this.right = 0
|
|
113
|
-
}
|
|
176
|
+
result.push({'name': item, [props.value]: item})
|
|
114
177
|
}
|
|
178
|
+
})
|
|
179
|
+
}
|
|
180
|
+
return result
|
|
181
|
+
})
|
|
182
|
+
|
|
183
|
+
const selected = computed(() => {
|
|
184
|
+
if (!props.modelValue) {
|
|
185
|
+
return null
|
|
186
|
+
}
|
|
187
|
+
return props.justValue ? props.modelValue : props.modelValue[props.value]
|
|
188
|
+
})
|
|
189
|
+
|
|
190
|
+
const emitItem = (item) => {
|
|
191
|
+
emit('update:modelValue', props.justValue ? item[props.value] : item)
|
|
192
|
+
close()
|
|
193
|
+
}
|
|
115
194
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
this.top = this.top + 20
|
|
119
|
-
this.opacity = 1
|
|
120
|
-
}, 10)
|
|
195
|
+
const open = () => {
|
|
196
|
+
if (!menuRef.value) return
|
|
121
197
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
this.opacity = 0
|
|
125
|
-
setTimeout(() => {
|
|
126
|
-
this.show = false
|
|
127
|
-
}, 200)
|
|
198
|
+
const elm = menuRef.value.getBoundingClientRect()
|
|
199
|
+
top.value = -20
|
|
128
200
|
|
|
201
|
+
if (!props.overlay) {
|
|
202
|
+
top.value += elm.height
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
opacity.value = 0
|
|
206
|
+
|
|
207
|
+
if (props.reverse) {
|
|
208
|
+
if (!$r.rtl) {
|
|
209
|
+
right.value = 0
|
|
210
|
+
left.value = null
|
|
211
|
+
} else {
|
|
212
|
+
left.value = 0
|
|
213
|
+
right.value = null
|
|
214
|
+
}
|
|
215
|
+
} else {
|
|
216
|
+
if (!$r.rtl) {
|
|
217
|
+
left.value = 0
|
|
218
|
+
right.value = null
|
|
219
|
+
} else {
|
|
220
|
+
right.value = 0
|
|
221
|
+
left.value = null
|
|
129
222
|
}
|
|
130
223
|
}
|
|
224
|
+
|
|
225
|
+
show.value = true
|
|
226
|
+
|
|
227
|
+
nextTick(() => {
|
|
228
|
+
top.value = top.value + 20
|
|
229
|
+
opacity.value = 1
|
|
230
|
+
})
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
const close = () => {
|
|
234
|
+
top.value = top.value - 20
|
|
235
|
+
opacity.value = 0
|
|
236
|
+
|
|
237
|
+
setTimeout(() => {
|
|
238
|
+
show.value = false
|
|
239
|
+
}, 200)
|
|
131
240
|
}
|
|
132
241
|
</script>
|
|
242
|
+
|
|
133
243
|
<style lang="scss">
|
|
134
244
|
@use "sass:map";
|
|
135
245
|
@use "../../style/variables/base";
|
|
@@ -154,13 +264,13 @@ export default {
|
|
|
154
264
|
}
|
|
155
265
|
}
|
|
156
266
|
|
|
157
|
-
|
|
158
|
-
|
|
267
|
+
.dropdown-menu {
|
|
268
|
+
border: 1px solid var(--color-border-low);
|
|
159
269
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
}
|
|
270
|
+
&-item:hover {
|
|
271
|
+
background-color: var(--color-sheet-container-high);
|
|
163
272
|
}
|
|
273
|
+
}
|
|
164
274
|
|
|
165
275
|
.menu-label {
|
|
166
276
|
cursor: pointer;
|
package/components/meta/meta.js
CHANGED
|
@@ -1,3 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @example // Basic usage
|
|
3
|
+
* <template>
|
|
4
|
+
* <r-meta
|
|
5
|
+
* title="pageTitle"
|
|
6
|
+
* description="pageDescription"
|
|
7
|
+
* keywords="test,test2"
|
|
8
|
+
* />
|
|
9
|
+
* </template>
|
|
10
|
+
*
|
|
11
|
+
* @example // Advanced usage with HTML and HEAD attributes
|
|
12
|
+
* <template>
|
|
13
|
+
* <r-meta
|
|
14
|
+
* :html="{ body: { id: 'page-id', class: 'home-page' } }"
|
|
15
|
+
* :head="{ 'meta[charset]': { charset: 'utf-8' } }"
|
|
16
|
+
* title="Dynamic Page Title"
|
|
17
|
+
* description="Dynamic page description for SEO"
|
|
18
|
+
* image="https://example.com/og-image.jpg"
|
|
19
|
+
* url="https://example.com/current-page"
|
|
20
|
+
* lang="en-US"
|
|
21
|
+
* />
|
|
22
|
+
*</template>
|
|
23
|
+
*/
|
|
1
24
|
//https://github.com/troxler/headful/blob/master/src/headful.js
|
|
2
25
|
export default {
|
|
3
26
|
name: "r-meta",
|
|
@@ -84,9 +107,9 @@ export default {
|
|
|
84
107
|
let property = selector;
|
|
85
108
|
property = property.split("[");
|
|
86
109
|
const name = property[0];
|
|
87
|
-
property =
|
|
88
|
-
property =
|
|
89
|
-
property =
|
|
110
|
+
property = property[1].replaceAll("]", "");
|
|
111
|
+
property = property.replaceAll('"', "");
|
|
112
|
+
property = property.replaceAll("'", "");
|
|
90
113
|
property = property.trim(" ");
|
|
91
114
|
property = property.split("=");
|
|
92
115
|
let meta = document.createElement(name);
|