NavBar.svelte 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <script>
  2. import { createEventDispatcher, getContext } from 'svelte';
  3. import Icon from '../icon/Icon.svelte';
  4. import zh_CN from '../../lang/zh_CN';
  5. // 定义事件派发器
  6. // Define event dispatcher
  7. const dispatch = createEventDispatcher();
  8. // 当前语言
  9. // current language
  10. const currentLang = getContext('STDF_lang') || zh_CN;
  11. const navBarLang = currentLang.navBar;
  12. const commonLang = currentLang.common;
  13. // 标题
  14. // Title
  15. export let title = navBarLang.title;
  16. //标题是否使用slot
  17. //Whether to use slot for title
  18. export let titleSlot = false;
  19. //左侧图标
  20. //Left icon
  21. export let left = 'back';
  22. //左侧图标参数
  23. //Left icon parameters
  24. export let leftIcon = {};
  25. //左侧是否使用slot
  26. //Whether to use slot for left
  27. export let leftSlot = false;
  28. //右侧 Icon 数组
  29. //Right Icon array
  30. export let rights = [];
  31. //右侧是否使用slot
  32. //Whether to use slot for right
  33. export let rightSlot = false;
  34. //是否显示底部分割线
  35. //Whether to show bottom line
  36. export let line = true;
  37. //注入CSS
  38. //Inject CSS
  39. export let injClass = '';
  40. //是否开启关爱版
  41. //Whether to open love version
  42. export let love = false;
  43. //图标大小
  44. //Icon size
  45. $: iconSize = love ? 30 : 24;
  46. //左侧图标点击事件
  47. //Left icon click event
  48. const clickLeftFun = () => {
  49. dispatch('clickleft');
  50. };
  51. //右侧图标点击事件
  52. //Right icon click event
  53. const clickRightFun = i => {
  54. dispatch('clickright', i);
  55. };
  56. </script>
  57. <div
  58. class={`h-12 w-full border-black/10 dark:border-white/10 flex justify-between leading-[3rem] ${
  59. line ? 'border-b ' : ' '
  60. }bg-white dark:bg-black/50${love ? ' text-xl' : ''}${injClass === '' ? '' : ' ' + injClass}`}
  61. >
  62. {#if leftSlot}
  63. <slot name="left">
  64. {commonLang.slotEmpty}
  65. </slot>
  66. {:else if left === 'back'}
  67. <!-- svelte-ignore a11y-click-events-have-key-events -->
  68. <!-- svelte-ignore a11y-no-static-element-interactions -->
  69. <div class="text-center lining-nums min-w-[3rem] active:opacity-80" on:click={clickLeftFun}>
  70. <Icon name="ri-arrow-left-s-line" size={iconSize} top={-2} />
  71. </div>
  72. {:else if left === 'customIcon'}
  73. <!-- svelte-ignore a11y-click-events-have-key-events -->
  74. <!-- svelte-ignore a11y-no-static-element-interactions -->
  75. <div class="text-center lining-nums min-w-[3rem] active:opacity-80" on:click={clickLeftFun}>
  76. <Icon {...leftIcon} />
  77. </div>
  78. {:else}
  79. <div class="w-4 h-full" />
  80. {/if}
  81. <div class="flex-1 truncate" class:pl-2={left === 'none'}>
  82. {#if titleSlot}
  83. <slot name="title">
  84. {commonLang.slotEmpty}
  85. </slot>
  86. {:else}
  87. {title}
  88. {/if}
  89. </div>
  90. <div class="flex">
  91. {#if rightSlot}
  92. <slot name="right">{commonLang.slotEmpty}</slot>
  93. {:else if rights.length > 0}
  94. {#each rights as icon, i}
  95. <!-- svelte-ignore a11y-click-events-have-key-events -->
  96. <!-- svelte-ignore a11y-no-static-element-interactions -->
  97. <div class="w-12 text-center active:opacity-80" on:click={() => clickRightFun(i)}>
  98. <Icon {...icon} size={iconSize} />
  99. </div>
  100. {/each}
  101. {:else}
  102. <!-- none -->
  103. {/if}
  104. </div>
  105. </div>