renusify 2.5.2 → 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.
Files changed (212) hide show
  1. package/components/app/index.vue +74 -22
  2. package/components/app/toast/index.vue +76 -71
  3. package/components/app/toast/toast.vue +62 -44
  4. package/components/avatar/index.vue +208 -84
  5. package/components/button/buttonConfirm.vue +53 -26
  6. package/components/button/buttonGroup.js +0 -2
  7. package/components/button/buttonGroup.vue +310 -62
  8. package/components/button/index.vue +584 -100
  9. package/components/calendar/index.js +0 -2
  10. package/components/calendar/index.vue +326 -262
  11. package/components/calendar/month.vue +64 -55
  12. package/components/calendar/year.vue +30 -25
  13. package/components/card/index.vue +139 -59
  14. package/components/codeEditor/highlightCss.vue +38 -39
  15. package/components/codeEditor/highlightHtml.vue +64 -64
  16. package/components/codeEditor/highlightJs.vue +37 -38
  17. package/components/codeEditor/index.vue +129 -79
  18. package/components/codeEditor/run.vue +225 -39
  19. package/components/codeEditor/useCodeFormatter.js +150 -0
  20. package/components/confirm/index.vue +139 -80
  21. package/components/container/col.vue +5 -4
  22. package/components/container/divider.vue +28 -19
  23. package/components/container/index.vue +34 -15
  24. package/components/container/row.vue +26 -9
  25. package/components/container/spacer.vue +2 -4
  26. package/components/container/style.scss +3 -0
  27. package/components/content/index.vue +49 -32
  28. package/components/cropper/index.vue +401 -244
  29. package/components/float/index.vue +542 -415
  30. package/components/form/addressInput/index.vue +184 -109
  31. package/components/form/camInput/index.vue +370 -244
  32. package/components/form/checkInput/index.vue +138 -71
  33. package/components/form/checkboxInput/index.vue +87 -47
  34. package/components/form/colorInput/Alpha.vue +81 -83
  35. package/components/form/colorInput/Hue.vue +91 -68
  36. package/components/form/colorInput/Preview.vue +43 -47
  37. package/components/form/colorInput/Saturation.vue +101 -86
  38. package/components/form/colorInput/index.vue +71 -39
  39. package/components/form/colorInput/picker.vue +111 -106
  40. package/components/form/colorInput/useColor.js +153 -0
  41. package/components/form/dateInput/index.vue +691 -356
  42. package/components/form/dateInput/month.vue +63 -54
  43. package/components/form/dateInput/year.vue +35 -25
  44. package/components/form/fileInput/index.js +0 -1
  45. package/components/form/fileInput/index.vue +263 -106
  46. package/components/form/fileInput/single.vue +323 -164
  47. package/components/form/groupInput/index.vue +199 -101
  48. package/components/form/index.vue +189 -83
  49. package/components/form/input/index.vue +416 -377
  50. package/components/form/jsonInput/JsonView.vue +54 -56
  51. package/components/form/jsonInput/index.vue +247 -165
  52. package/components/form/maskInput/index.vue +252 -132
  53. package/components/form/numberInput/index.js +0 -1
  54. package/components/form/numberInput/index.vue +226 -117
  55. package/components/form/passwordInput/index.js +2 -1
  56. package/components/form/passwordInput/index.vue +269 -102
  57. package/components/form/radioInput/index.vue +143 -72
  58. package/components/form/rangeInput/index.vue +280 -167
  59. package/components/form/ratingInput/index.vue +57 -57
  60. package/components/form/selectInput/index.js +1 -3
  61. package/components/form/selectInput/index.vue +584 -296
  62. package/components/form/switchInput/index.vue +73 -59
  63. package/components/form/telInput/index.js +0 -1
  64. package/components/form/telInput/index.vue +238 -135
  65. package/components/form/textArea/index.vue +72 -35
  66. package/components/form/textEditor/index.vue +739 -0
  67. package/components/form/{text-editor → textEditor}/style.scss +8 -16
  68. package/components/form/textInput/index.vue +54 -32
  69. package/components/form/timeInput/index.vue +82 -55
  70. package/components/form/timeInput/range.vue +115 -94
  71. package/components/form/timeInput/timepicker.vue +382 -449
  72. package/components/form/uniqueInput/index.vue +105 -48
  73. package/components/form/unitInput/index.vue +139 -84
  74. package/components/formCreator/index.js +0 -1
  75. package/components/formCreator/index.vue +314 -148
  76. package/components/highlight/index.vue +41 -25
  77. package/components/highlight/style.scss +2 -2
  78. package/components/highlight/{mixin.js → useHighlight.js} +181 -160
  79. package/components/icon/index.vue +79 -33
  80. package/components/img/index.vue +249 -147
  81. package/components/img/preview.vue +180 -198
  82. package/components/img/svgImg.vue +42 -39
  83. package/components/index.js +5 -20
  84. package/components/infinite/index.js +1 -2
  85. package/components/infinite/index.vue +248 -66
  86. package/components/map/index.vue +428 -261
  87. package/components/map/route.vue +794 -487
  88. package/components/map/select.vue +118 -58
  89. package/components/menu/index.vue +201 -91
  90. package/components/meta/meta.js +26 -3
  91. package/components/modal/index.vue +382 -156
  92. package/components/notify/index.vue +204 -86
  93. package/components/notify/notification.vue +38 -55
  94. package/components/progress/circle.vue +189 -70
  95. package/components/progress/line.vue +266 -46
  96. package/components/searchBox/index.js +1 -3
  97. package/components/searchBox/index.vue +194 -101
  98. package/components/skeleton/index.vue +45 -20
  99. package/components/slider/index.vue +318 -156
  100. package/components/swiper/index.vue +254 -106
  101. package/components/table/crud/footer.vue +77 -53
  102. package/components/table/crud/header.vue +71 -72
  103. package/components/table/crud/index.vue +629 -399
  104. package/components/table/index.vue +721 -278
  105. package/components/timeAgo/index.vue +145 -96
  106. package/components/tour/index.vue +338 -235
  107. package/components/tree/index.vue +235 -89
  108. package/components/tree/tree-element.vue +106 -106
  109. package/directive/animate/index.js +77 -0
  110. package/directive/clickOutSide/index.js +98 -0
  111. package/directive/drag/index.js +153 -0
  112. package/directive/index.js +11 -13
  113. package/directive/intersect/index.js +263 -0
  114. package/directive/mask/index.js +67 -0
  115. package/directive/parallax/index.js +78 -0
  116. package/directive/ripple/index.js +14 -0
  117. package/directive/scroll/index.js +244 -0
  118. package/directive/sortable/index.js +274 -0
  119. package/directive/title/index.js +75 -0
  120. package/directive/touch/index.js +268 -0
  121. package/index.js +10 -8
  122. package/package.json +5 -2
  123. package/plugins/validation/Validate.js +88 -79
  124. package/scripts/generate-docs.mjs +226 -0
  125. package/scripts/menu.mjs +240 -0
  126. package/scripts/parser.mjs +1086 -0
  127. package/style/_index.scss +7 -0
  128. package/style/app.scss +13 -65
  129. package/style/colors.scss +5 -22
  130. package/style/functions/index.scss +8 -0
  131. package/style/mixins/index.scss +17 -5
  132. package/style/variables/base.scss +154 -175
  133. package/style/variables/color.scss +0 -12
  134. package/style/variables/utilities.scss +0 -180
  135. package/tools/helper.js +0 -8
  136. package/tools/icons.js +6 -1
  137. package/tools/root.js +71 -0
  138. package/components/app/style.scss +0 -41
  139. package/components/app/toast/style.scss +0 -20
  140. package/components/avatar/style.scss +0 -32
  141. package/components/bar/bottomNav.js +0 -1
  142. package/components/bar/bottomNav.vue +0 -28
  143. package/components/bar/bottomNavigationCircle.js +0 -2
  144. package/components/bar/bottomNavigationCircle.vue +0 -99
  145. package/components/bar/scss/bottomNav.scss +0 -67
  146. package/components/bar/scss/toolbar.scss +0 -174
  147. package/components/bar/toolbar/index.js +0 -8
  148. package/components/bar/toolbar/index.vue +0 -35
  149. package/components/bar/toolbar/laptop.vue +0 -33
  150. package/components/bar/toolbar/menuChilds.vue +0 -41
  151. package/components/bar/toolbar/menuLaptop.vue +0 -41
  152. package/components/bar/toolbar/menuMob.vue +0 -39
  153. package/components/bar/toolbar/mixin.js +0 -43
  154. package/components/bar/toolbar/mobile.vue +0 -34
  155. package/components/breadcrumb/bredcrumbItem.vue +0 -39
  156. package/components/breadcrumb/index.js +0 -3
  157. package/components/breadcrumb/index.vue +0 -71
  158. package/components/breadcrumb/style.scss +0 -51
  159. package/components/button/style.scss +0 -411
  160. package/components/card/style.scss +0 -86
  161. package/components/chart/chart.js +0 -1
  162. package/components/chart/chart.vue +0 -69
  163. package/components/chart/worldMap.js +0 -2
  164. package/components/chart/worldMap.vue +0 -1112
  165. package/components/chat/MessageList.vue +0 -163
  166. package/components/chat/chatInput.vue +0 -150
  167. package/components/chat/chatMsg.vue +0 -276
  168. package/components/chat/index.js +0 -11
  169. package/components/chat/index.vue +0 -113
  170. package/components/chip/index.js +0 -3
  171. package/components/chip/index.vue +0 -77
  172. package/components/chip/style.scss +0 -199
  173. package/components/codeEditor/mixin.js +0 -145
  174. package/components/countdown/index.js +0 -1
  175. package/components/countdown/index.vue +0 -105
  176. package/components/form/colorInput/mixin.js +0 -132
  177. package/components/form/fileInput/file.js +0 -148
  178. package/components/form/telInput/assets/flags.png +0 -0
  179. package/components/form/telInput/assets/flags@2x.png +0 -0
  180. package/components/form/text-editor/index.vue +0 -705
  181. package/components/icon/style.scss +0 -17
  182. package/components/infinite/div.js +0 -6
  183. package/components/infinite/div.vue +0 -193
  184. package/components/infinite/page.js +0 -3
  185. package/components/infinite/page.vue +0 -105
  186. package/components/list/index.js +0 -3
  187. package/components/list/index.vue +0 -122
  188. package/components/list/style.scss +0 -66
  189. package/components/message/index.js +0 -4
  190. package/components/message/index.vue +0 -40
  191. package/components/modal/style.scss +0 -146
  192. package/components/nestable/NestableItem.vue +0 -307
  193. package/components/nestable/editable.js +0 -44
  194. package/components/nestable/index.js +0 -1
  195. package/components/nestable/index.vue +0 -226
  196. package/components/nestable/methods.js +0 -416
  197. package/components/progress/style.scss +0 -229
  198. package/components/table/style.scss +0 -338
  199. package/components/tabs/index.js +0 -3
  200. package/components/tabs/index.vue +0 -151
  201. package/components/timeline/index.js +0 -6
  202. package/components/timeline/index.vue +0 -76
  203. package/directive/resize/index.js +0 -30
  204. package/directive/skeleton/index.js +0 -27
  205. package/directive/skeleton/style.scss +0 -37
  206. package/plugins/request/Request.js +0 -68
  207. package/style/animation.scss +0 -94
  208. package/style/style.scss +0 -8
  209. package/tools/rootable.js +0 -75
  210. /package/components/form/{text-editor → textEditor}/index.js +0 -0
  211. /package/components/form/{text-editor → textEditor}/preview.js +0 -0
  212. /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="emit"
7
+ @update:model-value="emitValue"
8
8
  ></r-map>
9
9
  </div>
10
10
  </template>
11
- <script>
12
- export default {
13
- name: 'r-map-select',
14
- props: {
15
- modelValue: Array,
16
- height: {type: String, default: "500px"},
17
- zoom: {type: Number, default: 13},
18
- mapImageMarker: String
19
- },
20
- emits: ['update:modelValue'],
21
- data() {
22
- return {
23
- map: null,
24
- L: null,
25
- marker: null,
26
- center: this.modelValue || [35.69973857757377, 51.33806092139637]
27
- }
28
- },
29
- computed: {
30
- iconMarker() {
31
- if (this.mapImageMarker) {
32
- return this.mapImageMarker
33
- }
34
- return require('./images/marker-icon.png')
35
- }
36
- },
37
- methods: {
38
- handleLEvent(e) {
39
- this.L = e
40
- },
41
- handleMapEvent(e) {
42
- this.map = e
43
- this.selection()
44
- },
45
- selection() {
46
- this.$emit("update:modelValue", this.center);
47
- this.marker = new this.L.Marker(this.center, {
48
- icon: new this.L.icon({
49
- iconUrl: this.iconMarker,
50
- iconSize: [30, 30],
51
- iconAnchor: [15, 30],
52
- popupAnchor: [0, -30]
53
- }),
54
- });
55
- this.map.addLayer(this.marker);
56
- this.marker.bindPopup(this.$t("map_move_to_location", 'renusify')).openPopup();
57
-
58
- },
59
- emit(e) {
60
- this.center = e
61
- this.$emit("update:modelValue", this.center);
62
- if (this.marker) {
63
- this.marker.setLatLng(this.center);
64
- this.map.closePopup();
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 :class="$r.prefix+'menu'" v-click-outside="close" ref="menu">
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="emit(item)">
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
- <script>
38
-
39
- export default {
40
- name: 'r-menu',
41
-
42
- props: {
43
- modelValue: {
44
- type: [String, Number, Object]
45
- },
46
- label: String,
47
- icon: {
48
- type: String
49
- },
50
- value: {
51
- type: String,
52
- default: 'value'
53
- },
54
- justValue: Boolean,
55
- reverse: Boolean,
56
- overlay: Boolean,
57
- items: Array
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
- emits:['update:modelValue'],
60
- data() {
61
- return {
62
- show: false,
63
- top: null,
64
- left: null,
65
- right: null,
66
- opacity: 0
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
- computed: {
70
- list() {
71
- let r = []
72
- if (this.items) {
73
- this.items.forEach((item) => {
74
- if (typeof item === 'object') {
75
- r.push(item)
76
- } else {
77
- r.push({'name': item, [this.value]: item})
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
- methods: {
91
- emit(item) {
92
- this.$emit('update:modelValue', this.justValue ? item[this.value] : item)
93
- this.close()
94
- },
95
- open() {
96
- const elm = this.$refs.menu.getBoundingClientRect()
97
- this.top = -20
98
- if (!this.overlay) {
99
- this.top += elm.height
100
- }
101
- this.opacity = 0
102
- if (this.reverse) {
103
- if (!this.$r.rtl) {
104
- this.right = 0
105
- } else {
106
- this.left = 0
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
- if (!this.$r.rtl) {
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
- this.show = true
117
- setTimeout(() => {
118
- this.top = this.top + 20
119
- this.opacity = 1
120
- }, 10)
195
+ const open = () => {
196
+ if (!menuRef.value) return
121
197
 
122
- }, close() {
123
- this.top = this.top - 20
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
- .dropdown-menu {
158
- border: 1px solid var(--color-border);
267
+ .dropdown-menu {
268
+ border: 1px solid var(--color-border-low);
159
269
 
160
- &-item:hover {
161
- background-color: var(--color-sheet-container-high);
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;
@@ -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 = this.$helper.replacer(property[1], "]", "");
88
- property = this.$helper.replacer(property, '"', "");
89
- property = this.$helper.replacer(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);