@saooti/octopus-sdk 40.2.19 → 41.0.0-SNAPSHOT

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 (204) hide show
  1. package/package.json +2 -3
  2. package/src/App.vue +68 -88
  3. package/src/components/composable/player/usePlayerLive.ts +12 -3
  4. package/src/components/composable/player/usePlayerLogic.ts +6 -6
  5. package/src/components/composable/podcasts/usePodcastView.ts +3 -3
  6. package/src/components/composable/useInit.ts +2 -2
  7. package/src/components/composable/useMetaTitleWatch.ts +2 -2
  8. package/src/components/display/accessibility/AccessibilityModal.vue +56 -68
  9. package/src/components/display/categories/CategoryChooser.vue +142 -145
  10. package/src/components/display/categories/CategoryFilter.vue +172 -198
  11. package/src/components/display/categories/CategoryList.vue +122 -147
  12. package/src/components/display/comments/CommentInput.vue +100 -122
  13. package/src/components/display/comments/CommentList.vue +169 -191
  14. package/src/components/display/comments/CommentName.vue +35 -45
  15. package/src/components/display/comments/CommentParentInfo.vue +28 -34
  16. package/src/components/display/comments/CommentPlayer.vue +38 -50
  17. package/src/components/display/comments/CommentSection.vue +85 -103
  18. package/src/components/display/comments/item/CommentBasicView.vue +48 -61
  19. package/src/components/display/comments/item/CommentItem.vue +101 -116
  20. package/src/components/display/comments/item/CommentMoreActions.vue +174 -189
  21. package/src/components/display/comments/item/CommentMoreActionsAdmin.vue +1 -3
  22. package/src/components/display/comments/like/LikeButton.vue +36 -41
  23. package/src/components/display/comments/like/LikeSection.vue +128 -136
  24. package/src/components/display/comments/modal/CheckIdentityModal.vue +35 -40
  25. package/src/components/display/comments/modal/EditCommentModal.vue +72 -78
  26. package/src/components/display/comments/modal/RecaptchaModal.vue +58 -63
  27. package/src/components/display/comments/modal/ReportAbuseModal.vue +59 -66
  28. package/src/components/display/edit/EditBox.vue +6 -9
  29. package/src/components/display/edit/EditBoxRadio.vue +1 -5
  30. package/src/components/display/emission/EmissionInlineList.vue +82 -97
  31. package/src/components/display/emission/EmissionItem.vue +57 -69
  32. package/src/components/display/emission/EmissionList.vue +192 -218
  33. package/src/components/display/emission/EmissionPlayerItem.vue +47 -64
  34. package/src/components/display/emission/EmissionPresentationItem.vue +44 -54
  35. package/src/components/display/emission/EmissionPresentationList.vue +51 -61
  36. package/src/components/display/filter/AdvancedSearch.vue +154 -176
  37. package/src/components/display/filter/CategorySearchFilter.vue +43 -46
  38. package/src/components/display/filter/DateFilter.vue +76 -91
  39. package/src/components/display/filter/MonetizableFilter.vue +27 -30
  40. package/src/components/display/filter/ProductorSearch.vue +87 -90
  41. package/src/components/display/filter/RubriqueChoice.vue +58 -63
  42. package/src/components/display/filter/RubriqueFilter.vue +154 -169
  43. package/src/components/display/filter/SearchOrder.vue +35 -35
  44. package/src/components/display/list/ListPaginate.vue +80 -93
  45. package/src/components/display/list/PaginateParams.vue +36 -40
  46. package/src/components/display/list/PaginateSection.vue +113 -124
  47. package/src/components/display/list/SwiperList.vue +97 -109
  48. package/src/components/display/live/CountDown.vue +15 -9
  49. package/src/components/display/live/CountdownOctopus.vue +16 -10
  50. package/src/components/display/live/LiveHorizontalList.vue +95 -103
  51. package/src/components/display/live/LiveItem.vue +65 -73
  52. package/src/components/display/live/LiveList.vue +125 -137
  53. package/src/components/display/live/RadioCurrently.vue +66 -73
  54. package/src/components/display/live/RadioImage.vue +39 -50
  55. package/src/components/display/live/RadioItem.vue +9 -14
  56. package/src/components/display/live/RadioList.vue +39 -53
  57. package/src/components/display/live/RadioPlanning.vue +210 -222
  58. package/src/components/display/organisation/OrganisationChooser.vue +116 -122
  59. package/src/components/display/organisation/OrganisationChooserLight.vue +44 -52
  60. package/src/components/display/participant/ParticipantInlineList.vue +42 -58
  61. package/src/components/display/participant/ParticipantItem.vue +66 -74
  62. package/src/components/display/participant/ParticipantList.vue +119 -141
  63. package/src/components/display/playlist/PlaylistItem.vue +33 -46
  64. package/src/components/display/playlist/PlaylistList.vue +118 -144
  65. package/src/components/display/playlist/PodcastList.vue +79 -101
  66. package/src/components/display/playlist/PodcastPlaylistInlineList.vue +58 -70
  67. package/src/components/display/podcastmaker/PodcastmakerHeader.vue +21 -22
  68. package/src/components/display/podcasts/AnimatorsItem.vue +15 -16
  69. package/src/components/display/podcasts/DownloadPodcastButton.vue +21 -29
  70. package/src/components/display/podcasts/ParticipantDescription.vue +22 -24
  71. package/src/components/display/podcasts/PodcastFilterList.vue +48 -53
  72. package/src/components/display/podcasts/PodcastImage.vue +96 -99
  73. package/src/components/display/podcasts/PodcastInlineList.vue +30 -28
  74. package/src/components/display/podcasts/PodcastInlineListTemplate.vue +107 -114
  75. package/src/components/display/podcasts/PodcastIsPlaying.vue +4 -12
  76. package/src/components/display/podcasts/PodcastItem.vue +48 -63
  77. package/src/components/display/podcasts/PodcastItemInfo.vue +19 -35
  78. package/src/components/display/podcasts/PodcastList.vue +183 -206
  79. package/src/components/display/podcasts/PodcastModuleBox.vue +100 -137
  80. package/src/components/display/podcasts/PodcastPlannedSpinner.vue +4 -6
  81. package/src/components/display/podcasts/PodcastPlayBar.vue +50 -61
  82. package/src/components/display/podcasts/PodcastPlayBasicButton.vue +38 -41
  83. package/src/components/display/podcasts/PodcastPlayButton.vue +164 -175
  84. package/src/components/display/podcasts/PodcastRawTranscript.vue +69 -80
  85. package/src/components/display/podcasts/PodcastRubriqueList.vue +35 -38
  86. package/src/components/display/podcasts/PodcastSwiperList.vue +100 -110
  87. package/src/components/display/podcasts/TagList.vue +48 -50
  88. package/src/components/display/podcasts/VideoModuleBox.vue +13 -24
  89. package/src/components/display/rubriques/RubriqueChooser.vue +135 -140
  90. package/src/components/display/rubriques/RubriqueList.vue +140 -160
  91. package/src/components/display/sharing/ChooseEpisodesNumber.vue +34 -33
  92. package/src/components/display/sharing/FormatSwitch.vue +16 -11
  93. package/src/components/display/sharing/PlayerAnonymousModal.vue +24 -27
  94. package/src/components/display/sharing/PlayerCommonParameters.vue +20 -13
  95. package/src/components/display/sharing/PlayerParameters.vue +69 -71
  96. package/src/components/display/sharing/QrCode.vue +55 -67
  97. package/src/components/display/sharing/ShareAnonymous.vue +160 -178
  98. package/src/components/display/sharing/ShareDistribution.vue +103 -117
  99. package/src/components/display/sharing/ShareNewsletter.vue +154 -161
  100. package/src/components/display/sharing/SharePlayer.vue +273 -295
  101. package/src/components/display/sharing/SharePlayerColors.vue +25 -16
  102. package/src/components/display/sharing/SharePlayerRadio.vue +61 -69
  103. package/src/components/display/sharing/SharePlayerTypes.vue +176 -176
  104. package/src/components/display/sharing/ShareSocialsButtons.vue +63 -75
  105. package/src/components/display/sharing/SubscribeButtons.vue +184 -207
  106. package/src/components/display/studio/RecordingItemButton.vue +1 -4
  107. package/src/components/form/ClassicCheckbox.vue +26 -30
  108. package/src/components/form/ClassicContentEditable.vue +37 -33
  109. package/src/components/form/ClassicCopyButton.vue +40 -44
  110. package/src/components/form/ClassicDatePicker.vue +114 -114
  111. package/src/components/form/ClassicEmojiPicker.vue +20 -28
  112. package/src/components/form/ClassicInputText.vue +116 -120
  113. package/src/components/form/ClassicLoading.vue +7 -12
  114. package/src/components/form/ClassicMultiselect.vue +106 -116
  115. package/src/components/form/ClassicRadio.vue +21 -16
  116. package/src/components/form/ClassicRadioLabel.vue +23 -22
  117. package/src/components/form/ClassicSearch.vue +24 -19
  118. package/src/components/form/ClassicSelect.vue +47 -38
  119. package/src/components/form/ClassicWysiwyg.vue +116 -123
  120. package/src/components/icons/AmazonMusicIcon.vue +7 -10
  121. package/src/components/icons/ApplePodcastIcon.vue +7 -11
  122. package/src/components/icons/BlueSkyIcon.vue +8 -11
  123. package/src/components/icons/DeezerIcon.vue +8 -11
  124. package/src/components/icons/EditFtpIcon.vue +8 -11
  125. package/src/components/icons/IHeartIcon.vue +8 -11
  126. package/src/components/icons/PlayVideoIcon.vue +7 -10
  127. package/src/components/icons/PlayerFmIcon.vue +7 -10
  128. package/src/components/icons/PocketCastIcon.vue +8 -11
  129. package/src/components/icons/PodcastAddictIcon.vue +7 -10
  130. package/src/components/icons/RadiolineIcon.vue +8 -11
  131. package/src/components/icons/TuninIcon.vue +8 -11
  132. package/src/components/icons/XIcon.vue +7 -10
  133. package/src/components/misc/AcpmImage.vue +6 -7
  134. package/src/components/misc/ClassicAccordion.vue +26 -31
  135. package/src/components/misc/ClassicLazy.vue +86 -90
  136. package/src/components/misc/ClassicNav.vue +16 -20
  137. package/src/components/misc/ClassicPopover.vue +266 -282
  138. package/src/components/misc/ClassicSpinner.vue +5 -27
  139. package/src/components/misc/ErrorMessage.vue +11 -12
  140. package/src/components/misc/FooterGarSection.vue +33 -41
  141. package/src/components/misc/FooterSection.vue +109 -130
  142. package/src/components/misc/HomeDropdown.vue +83 -105
  143. package/src/components/misc/MobileMenu.vue +101 -111
  144. package/src/components/misc/ProgressBar.vue +53 -62
  145. package/src/components/misc/TopBar.vue +97 -120
  146. package/src/components/misc/TopBarMainContent.vue +114 -133
  147. package/src/components/misc/modal/ClassicModal.vue +40 -33
  148. package/src/components/misc/modal/ClassicModalInBody.vue +34 -28
  149. package/src/components/misc/modal/ClipboardModal.vue +27 -30
  150. package/src/components/misc/modal/ContractPreviewModal.vue +64 -62
  151. package/src/components/misc/modal/MessageModal.vue +50 -47
  152. package/src/components/misc/modal/NewsletterModal.vue +30 -31
  153. package/src/components/misc/modal/QrCodeModal.vue +21 -21
  154. package/src/components/misc/modal/ShareModalPlayer.vue +43 -52
  155. package/src/components/misc/player/PlayerCompact.vue +6 -4
  156. package/src/components/misc/player/PlayerComponent.vue +8 -9
  157. package/src/components/misc/player/PlayerLarge.vue +9 -8
  158. package/src/components/misc/player/ads/AdsProgressBar.vue +8 -11
  159. package/src/components/misc/player/ads/AdsSkipButton.vue +24 -30
  160. package/src/components/misc/player/chaptering/ChapteringModal.vue +44 -54
  161. package/src/components/misc/player/chaptering/PlayerChaptering.vue +50 -62
  162. package/src/components/misc/player/elements/PlayerImage.vue +51 -57
  163. package/src/components/misc/player/elements/PlayerPlayButton.vue +81 -92
  164. package/src/components/misc/player/elements/PlayerSpeedButton.vue +23 -27
  165. package/src/components/misc/player/elements/PlayerTitle.vue +85 -111
  166. package/src/components/misc/player/progressbar/PlayerProgressBar.vue +18 -29
  167. package/src/components/misc/player/progressbar/PodcastProgressBar.vue +45 -56
  168. package/src/components/misc/player/radio/RadioHistory.vue +80 -99
  169. package/src/components/misc/player/radio/RadioProgressBar.vue +43 -54
  170. package/src/components/misc/player/video/PlayerVideo.vue +27 -40
  171. package/src/components/misc/player/video/PlayerVideoDigiteka.vue +32 -37
  172. package/src/components/misc/player/video/PlayerVideoHls.vue +199 -198
  173. package/src/components/misc/player/video/PlayerYoutubeEmbed.vue +10 -12
  174. package/src/components/pages/CategoryPage.vue +28 -33
  175. package/src/components/pages/EmissionPage.vue +99 -132
  176. package/src/components/pages/EmissionsPage.vue +2 -0
  177. package/src/components/pages/Error403Page.vue +21 -20
  178. package/src/components/pages/HomePage.vue +91 -100
  179. package/src/components/pages/LivesPage.vue +35 -37
  180. package/src/components/pages/MapPage.vue +209 -241
  181. package/src/components/pages/PageLogout.vue +8 -11
  182. package/src/components/pages/PageNotFound.vue +9 -5
  183. package/src/components/pages/ParticipantPage.vue +82 -110
  184. package/src/components/pages/ParticipantsPage.vue +3 -0
  185. package/src/components/pages/PlaylistPage.vue +97 -115
  186. package/src/components/pages/PlaylistsPage.vue +9 -2
  187. package/src/components/pages/PodcastPage.vue +223 -238
  188. package/src/components/pages/PodcastsPage.vue +9 -2
  189. package/src/components/pages/RadioPage.vue +56 -70
  190. package/src/components/pages/RubriquePage.vue +7 -3
  191. package/src/components/pages/SearchPage.vue +31 -36
  192. package/src/components/pages/TagPage.vue +11 -9
  193. package/src/components/pages/VideoPage.vue +14 -11
  194. package/src/helper/displayHelper.ts +1 -1
  195. package/src/i18n.ts +2 -2
  196. package/src/main.ts +1 -1
  197. package/src/stores/class/general/player.ts +1 -0
  198. package/public/css/fonts/icomoon.eot +0 -0
  199. package/public/css/fonts/icomoon.svg +0 -113
  200. package/public/css/fonts/icomoon.ttf +0 -0
  201. package/public/css/fonts/icomoon.woff +0 -0
  202. package/public/css/fonts/icomoon.woff2 +0 -0
  203. package/public/css/fonts/style.css +0 -352
  204. package/sonarqube-scanner.js +0 -10
@@ -18,14 +18,11 @@
18
18
  </span>
19
19
  </template>
20
20
 
21
- <script lang="ts">
22
- import { defineComponent } from "vue";
23
- export default defineComponent({
24
- name: "PlayerFmIcon",
25
- props: {
26
- size: { default: 24, type: Number },
27
- title: { default: undefined, type: String },
28
- fillColor: { default: "currentColor", type: String },
29
- },
30
- });
21
+ <script setup lang="ts">
22
+ //Props
23
+ defineProps({
24
+ size: { default: 24, type: Number },
25
+ title: { default: undefined, type: String },
26
+ fillColor: { default: "currentColor", type: String },
27
+ })
31
28
  </script>
@@ -18,14 +18,11 @@
18
18
  </span>
19
19
  </template>
20
20
 
21
- <script lang="ts">
22
- import { defineComponent } from "vue";
23
- export default defineComponent({
24
- name: "PocketCastIcon",
25
- props: {
26
- size: { default: 24, type: Number },
27
- title: { default: undefined, type: String },
28
- fillColor: { default: "currentColor", type: String },
29
- },
30
- });
31
- </script>
21
+ <script setup lang="ts">
22
+ //Props
23
+ defineProps({
24
+ size: { default: 24, type: Number },
25
+ title: { default: undefined, type: String },
26
+ fillColor: { default: "currentColor", type: String },
27
+ })
28
+ </script>
@@ -19,14 +19,11 @@
19
19
  </span>
20
20
  </template>
21
21
 
22
- <script lang="ts">
23
- import { defineComponent } from "vue";
24
- export default defineComponent({
25
- name: "PodcastAddictIcon",
26
- props: {
27
- size: { default: 24, type: Number },
28
- title: { default: undefined, type: String },
29
- fillColor: { default: "currentColor", type: String },
30
- },
31
- });
22
+ <script setup lang="ts">
23
+ //Props
24
+ defineProps({
25
+ size: { default: 24, type: Number },
26
+ title: { default: undefined, type: String },
27
+ fillColor: { default: "currentColor", type: String },
28
+ })
32
29
  </script>
@@ -19,14 +19,11 @@
19
19
  </span>
20
20
  </template>
21
21
 
22
- <script lang="ts">
23
- import { defineComponent } from "vue";
24
- export default defineComponent({
25
- name: "RadiolineIcon",
26
- props: {
27
- size: { default: 24, type: Number },
28
- title: { default: undefined, type: String },
29
- fillColor: { default: "currentColor", type: String },
30
- },
31
- });
32
- </script>
22
+ <script setup lang="ts">
23
+ //Props
24
+ defineProps({
25
+ size: { default: 24, type: Number },
26
+ title: { default: undefined, type: String },
27
+ fillColor: { default: "currentColor", type: String },
28
+ })
29
+ </script>
@@ -18,14 +18,11 @@
18
18
  </span>
19
19
  </template>
20
20
 
21
- <script lang="ts">
22
- import { defineComponent } from "vue";
23
- export default defineComponent({
24
- name: "TuninIcon",
25
- props: {
26
- size: { default: 24, type: Number },
27
- title: { default: undefined, type: String },
28
- fillColor: { default: "currentColor", type: String },
29
- },
30
- });
31
- </script>
21
+ <script setup lang="ts">
22
+ //Props
23
+ defineProps({
24
+ size: { default: 24, type: Number },
25
+ title: { default: undefined, type: String },
26
+ fillColor: { default: "currentColor", type: String },
27
+ })
28
+ </script>
@@ -18,14 +18,11 @@
18
18
  </span>
19
19
  </template>
20
20
 
21
- <script lang="ts">
22
- import { defineComponent } from "vue";
23
- export default defineComponent({
24
- name: "XIcon",
25
- props: {
26
- size: { default: 24, type: Number },
27
- title: { default: undefined, type: String },
28
- fillColor: { default: "currentColor", type: String },
29
- },
30
- });
21
+ <script setup lang="ts">
22
+ //Props
23
+ defineProps({
24
+ size: { default: 24, type: Number },
25
+ title: { default: undefined, type: String },
26
+ fillColor: { default: "currentColor", type: String },
27
+ })
31
28
  </script>
@@ -4,16 +4,15 @@
4
4
  height="44"
5
5
  class="acpm-image"
6
6
  src="/img/ACPM.webp"
7
- :title="$t('Octopus is ACPM Podcast accredited')"
8
- :alt="$t('Octopus is ACPM Podcast accredited')"
7
+ :title="t('Octopus is ACPM Podcast accredited')"
8
+ :alt="t('Octopus is ACPM Podcast accredited')"
9
9
  />
10
10
  </template>
11
11
 
12
- <script lang="ts">
13
- import { defineComponent } from "vue";
14
- export default defineComponent({
15
- name: "AcpmImage",
16
- });
12
+ <script setup lang="ts">
13
+ import { useI18n } from "vue-i18n";
14
+ //Composables
15
+ const { t } = useI18n();
17
16
  </script>
18
17
 
19
18
  <style lang="scss">
@@ -19,7 +19,8 @@
19
19
  height="30"
20
20
  class="img-accordion"
21
21
  :src="imageUrl"
22
- role="presentation"
22
+ aria-hidden="true"
23
+ alt=""
23
24
 
24
25
  />
25
26
  <span class="flex-grow-1">{{ title }}</span>
@@ -33,42 +34,36 @@
33
34
  </div>
34
35
  </template>
35
36
 
36
- <script lang="ts">
37
+ <script setup lang="ts">
37
38
  import ChevronDownIcon from "vue-material-design-icons/ChevronDown.vue";
38
- import { defineAsyncComponent, defineComponent } from "vue";
39
+ import { defineAsyncComponent, onMounted, ref, watch } from "vue";
39
40
  const AlertIcon = defineAsyncComponent(
40
41
  () => import("vue-material-design-icons/Alert.vue"),
41
42
  );
42
43
 
43
- export default defineComponent({
44
- name: "ClassicAccordion",
45
- components: {
46
- ChevronDownIcon,
47
- AlertIcon,
48
- },
49
- props: {
50
- title: { default: "", type: String },
51
- idComposer: { default: "", type: String },
52
- isWarning: { default: false, type: Boolean },
53
- imageUrl: { default: undefined, type: String },
54
- displayAccordion: { default: true, type: Boolean },
55
- initOpen: { default: false, type: Boolean },
56
- },
57
- emits: ["open"],
58
- data() {
59
- return {
60
- isOpen: false as boolean,
61
- };
62
- },
63
- watch: {
64
- isOpen() {
65
- this.$emit("open");
66
- },
67
- },
68
- created() {
69
- this.isOpen = this.initOpen;
70
- },
44
+ //Props
45
+ const props = defineProps({
46
+ title: { default: "", type: String },
47
+ idComposer: { default: "", type: String },
48
+ isWarning: { default: false, type: Boolean },
49
+ imageUrl: { default: undefined, type: String },
50
+ displayAccordion: { default: true, type: Boolean },
51
+ initOpen: { default: false, type: Boolean },
71
52
  });
53
+
54
+ //Emits
55
+ const emit = defineEmits(["open"]);
56
+
57
+ //Data
58
+ const isOpen = ref(false);
59
+
60
+ //Watch
61
+ watch(isOpen, () => emit("open"));
62
+
63
+ onMounted(()=>{
64
+ isOpen.value = props.initOpen;
65
+ })
66
+
72
67
  </script>
73
68
  <style lang="scss">
74
69
 
@@ -4,10 +4,95 @@
4
4
  <slot v-else name="preview" />
5
5
  </div>
6
6
  </template>
7
- <script lang="ts">
7
+ <script setup lang="ts">
8
8
  import { useIntersectionObserver } from "@vueuse/core";
9
9
  import { ref, nextTick, watch } from "vue";
10
10
 
11
+ //Props
12
+ const props = defineProps({
13
+ renderOnIdle: Boolean,
14
+ unrender: Boolean,
15
+ minHeight: {type: Number,default: 0},
16
+ initRenderDelay: {type: Number, default: 0},
17
+ unrenderDelay: {type: Number,default: 10000},
18
+ });
19
+
20
+ //Emits
21
+ const emit = defineEmits(["isRender"]);
22
+
23
+ //Data
24
+ const waitBeforeInit = ref(true);
25
+ const shouldRender = ref(false);
26
+ const targetEl = ref();
27
+ let unrenderTimer: ReturnType<typeof setTimeout> | undefined;
28
+ let renderTimer: ReturnType<typeof setTimeout> | undefined;
29
+
30
+ //Composables
31
+ const { pause, resume } = useIntersectionObserver(
32
+ targetEl,
33
+ ([{ isIntersecting }]) => {
34
+ if (waitBeforeInit.value) {
35
+ return;
36
+ }
37
+ if (isIntersecting) {
38
+ // perhaps the user re-scrolled to a component that was set to unrender. In that case stop the unrendering timer
39
+ clearTimeout(unrenderTimer);
40
+ // if we're dealing underndering lets add a waiting period of 200ms before rendering. If a component enters the viewport and also leaves it within 200ms it will not render at all. This saves work and improves performance when user scrolls very fast
41
+
42
+ renderTimer = setTimeout(
43
+ () => {
44
+ shouldRender.value = true;
45
+ emit("isRender", true);
46
+ },
47
+ props.unrender ? 200 : 0,
48
+ );
49
+ if (!props.unrender) {
50
+ pause();
51
+ }
52
+ } else if (props.unrender) {
53
+ // if the component was set to render, cancel that
54
+ clearTimeout(renderTimer);
55
+ unrenderTimer = setTimeout(() => {
56
+ shouldRender.value = false;
57
+ emit("isRender", false);
58
+ }, props.unrenderDelay);
59
+ }
60
+ },
61
+ {
62
+ rootMargin: "600px",
63
+ },
64
+ );
65
+
66
+ //Logic
67
+ setTimeout(() => {
68
+ waitBeforeInit.value = false;
69
+ }, props.initRenderDelay);
70
+ if (props.renderOnIdle) {
71
+ onIdle(() => {
72
+ shouldRender.value = true;
73
+ emit("isRender", true);
74
+ if (!props.unrender) {
75
+ pause();
76
+ }
77
+ });
78
+ }
79
+
80
+ //Watch
81
+ watch(
82
+ () => props.unrender,
83
+ (newValue) => {
84
+ if (newValue) {
85
+ clearTimeout(renderTimer);
86
+ unrenderTimer = setTimeout(() => {
87
+ shouldRender.value = false;
88
+ emit("isRender", false);
89
+ resume();
90
+ }, props.unrenderDelay);
91
+ }
92
+ },
93
+ );
94
+
95
+ //Methods
11
96
  function onIdle(cb = () => {}) {
12
97
  if ("requestIdleCallback" in window) {
13
98
  window.requestIdleCallback(cb);
@@ -17,93 +102,4 @@ function onIdle(cb = () => {}) {
17
102
  }, 300);
18
103
  }
19
104
  }
20
-
21
- export default {
22
- props: {
23
- renderOnIdle: Boolean,
24
- unrender: Boolean,
25
- minHeight: {
26
- type: Number,
27
- default: 0,
28
- },
29
- initRenderDelay: {
30
- type: Number,
31
- default: 0,
32
- },
33
- unrenderDelay: {
34
- type: Number,
35
- default: 10000,
36
- },
37
- },
38
- emits: ["isRender"],
39
- setup(props, context) {
40
- const waitBeforeInit = ref(true);
41
- const shouldRender = ref(false);
42
- const targetEl = ref();
43
- let unrenderTimer: ReturnType<typeof setTimeout> | undefined;
44
- let renderTimer: ReturnType<typeof setTimeout> | undefined;
45
- setTimeout(() => {
46
- waitBeforeInit.value = false;
47
- }, props.initRenderDelay);
48
- const { pause, resume } = useIntersectionObserver(
49
- targetEl,
50
- ([{ isIntersecting }]) => {
51
- if (waitBeforeInit.value) {
52
- return;
53
- }
54
- if (isIntersecting) {
55
- // perhaps the user re-scrolled to a component that was set to unrender. In that case stop the unrendering timer
56
- clearTimeout(unrenderTimer);
57
- // if we're dealing underndering lets add a waiting period of 200ms before rendering. If a component enters the viewport and also leaves it within 200ms it will not render at all. This saves work and improves performance when user scrolls very fast
58
-
59
- renderTimer = setTimeout(
60
- () => {
61
- shouldRender.value = true;
62
- context.emit("isRender", true);
63
- },
64
- props.unrender ? 200 : 0,
65
- );
66
- if (!props.unrender) {
67
- pause();
68
- }
69
- } else if (props.unrender) {
70
- // if the component was set to render, cancel that
71
- clearTimeout(renderTimer);
72
- unrenderTimer = setTimeout(() => {
73
- shouldRender.value = false;
74
- context.emit("isRender", false);
75
- }, props.unrenderDelay);
76
- }
77
- },
78
- {
79
- rootMargin: "600px",
80
- },
81
- );
82
-
83
- if (props.renderOnIdle) {
84
- onIdle(() => {
85
- shouldRender.value = true;
86
- context.emit("isRender", true);
87
- if (!props.unrender) {
88
- pause();
89
- }
90
- });
91
- }
92
- watch(
93
- () => props.unrender,
94
- (newValue) => {
95
- if (newValue) {
96
- clearTimeout(renderTimer);
97
- unrenderTimer = setTimeout(() => {
98
- shouldRender.value = false;
99
- context.emit("isRender", false);
100
- resume();
101
- }, props.unrenderDelay);
102
- }
103
- },
104
- );
105
-
106
- return { targetEl, shouldRender };
107
- },
108
- };
109
105
  </script>
@@ -2,14 +2,14 @@
2
2
  <ul class="octopus-nav" :class="light ? 'light' : ''">
3
3
  <li
4
4
  v-for="index in tabNumber"
5
- v-show="hasSlot(index - 1)"
5
+ v-show="$slots[index - 1]"
6
6
  :key="index - 1"
7
7
  class="octopus-nav-item"
8
8
  >
9
9
  <button
10
10
  class="octopus-nav-link"
11
11
  :class="activeTab === index - 1 ? 'active' : ''"
12
- @click="$emit('update:activeTab', index - 1)"
12
+ @click="emit('update:activeTab', index - 1)"
13
13
  >
14
14
  <slot :name="index - 1" />
15
15
  </button>
@@ -24,7 +24,7 @@
24
24
  >
25
25
  <div
26
26
  v-for="index in tabNumber"
27
- v-show="hasSlot('tab' + (index - 1))"
27
+ v-show="$slots['tab' + (index - 1)]"
28
28
  :key="index - 1"
29
29
  class="octopus-tab-pane"
30
30
  :class="activeTab === index - 1 ? 'active' : ''"
@@ -34,23 +34,19 @@
34
34
  </div>
35
35
  </template>
36
36
 
37
- <script lang="ts">
38
- import { defineComponent } from "vue";
39
- export default defineComponent({
40
- name: "ClassicNav",
41
- props: {
42
- tabNumber: { default: 0, type: Number },
43
- activeTab: { default: 0, type: Number },
44
- transparent: { default: false, type: Boolean },
45
- light: { default: false, type: Boolean },
46
- },
47
- emits: ["update:activeTab"],
48
- methods: {
49
- hasSlot(name = "default") {
50
- return !!this.$slots[name];
51
- },
52
- },
53
- });
37
+ <script setup lang="ts">
38
+
39
+ //Props
40
+ defineProps({
41
+ tabNumber: { default: 0, type: Number },
42
+ activeTab: { default: 0, type: Number },
43
+ transparent: { default: false, type: Boolean },
44
+ light: { default: false, type: Boolean },
45
+ })
46
+
47
+ //Emits
48
+ const emit = defineEmits(["update:activeTab"]);
49
+
54
50
  </script>
55
51
 
56
52
  <style lang="scss">