App.svelte 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. <script>
  2. import { setContext } from 'svelte';
  3. import { Button, Cell, Icon, Calendar } from 'stdf';
  4. import { STDFTheme, switchTheme, darkMode } from 'stdf/theme';
  5. import NintendoTheme from './data/nintendo';
  6. import { en_US, zh_CN } from 'stdf/lang';
  7. import Counter from './Counter.svelte';
  8. //解决 ios 不支持按钮:active 伪类
  9. // Solve the problem that ios does not support the button: active pseudo class
  10. document.body.addEventListener('touchstart', function () {
  11. //...空函数即可
  12. // ... Empty function is OK
  13. });
  14. //切换亮暗模式 (toggle light or dark mode)
  15. let mode = $state(sessionStorage.getItem('mode') === 'dark' ? 'dark' : 'light');
  16. $effect(() => {
  17. if (mode === 'dark') {
  18. darkMode(true);
  19. } else {
  20. darkMode(false);
  21. }
  22. });
  23. const toggleModeFun = () => {
  24. if (mode === 'dark') {
  25. // 切换到 (light switch to light)
  26. mode = 'light';
  27. darkMode(false);
  28. sessionStorage.setItem('mode', 'light');
  29. } else {
  30. // 切换到 (dark switch to dark)
  31. mode = 'dark';
  32. darkMode(true);
  33. sessionStorage.setItem('mode', 'dark');
  34. }
  35. };
  36. // 设置语言 (setting language)
  37. let lang = $state(localStorage.getItem('lang') === 'en_US' ? 'en_US' : 'zh_CN');
  38. setContext('STDF_lang', localStorage.getItem('lang') === 'en_US' ? en_US : zh_CN);
  39. const toggleLangFun = () => {
  40. lang = lang === 'zh_CN' ? 'en_US' : 'zh_CN';
  41. localStorage.setItem('lang', lang);
  42. window.location.reload();
  43. };
  44. // 进度条 (percent)
  45. let percent = $state(20);
  46. const reduceFunc = () => {
  47. if (percent > 0) {
  48. percent -= 10;
  49. }
  50. };
  51. const increaseFunc = () => {
  52. if (percent < 100) {
  53. percent += 10;
  54. }
  55. };
  56. // 日历(calendar)
  57. let visible = $state(false);
  58. // 主题(theme)
  59. let theme = $state('STDF');
  60. const toggleThemeFun = () => {
  61. if (theme === 'STDF') {
  62. theme = 'Nintendo';
  63. switchTheme(NintendoTheme);
  64. } else {
  65. theme = 'STDF';
  66. switchTheme(STDFTheme);
  67. }
  68. };
  69. </script>
  70. <div class="flex items-center justify-center gap-2 pt-10 text-center">
  71. <a class="flex w-10 flex-col items-center" href="https://vite.dev" target="_blank" rel="noreferrer">
  72. <img src="/vite.svg" alt="Vite Logo" />
  73. </a>
  74. <a class="flex w-10 flex-col items-center" href="https://svelte.dev" target="_blank" rel="noreferrer">
  75. <img src="/svelte.svg" alt="Svelte Logo" />
  76. </a>
  77. <a class="flex w-10 flex-col items-center" href="https://tailwindcss.com" target="_blank" rel="noreferrer">
  78. <img src="/tailwindcss.svg" alt="Tailwind Logo" />
  79. </a>
  80. <a class="flex w-8 flex-col items-center" href="https://stdf.design" target="_blank" rel="noreferrer" aria-label="STDF Logo">
  81. <svg viewBox="0 0 90 80" fill="currentColor">
  82. <path
  83. class="text-primary dark:text-dark"
  84. d="M0 0H20H40H50C64.8056 0 77.7325 8.04398 84.6487 20H50H40V22.6757V30H50C55.5229 30 60 34.4771 60 40C60 45.5229 55.5229 50 50 50H40V57.3243V78.7398V80H20V66.4583V20H15.3513H0V0ZM50 80C72.0914 80 90 62.0914 90 40C90 36.547 89.5625 33.1962 88.7398 30H67.3244C69.0261 32.9417 70 36.3571 70 40C70 51.0457 61.0457 60 50 60V80Z"
  85. />
  86. <path class="text-dark dark:text-primary" d="M20 30V0L0 50H20V80L40 30H20Z" />
  87. </svg>
  88. </a>
  89. </div>
  90. <div class="my-6 text-center text-xs">
  91. {#if lang === 'zh_CN'}
  92. <p>这是 Vite & Svelte & Tailwind & STDF 构建的模板</p>
  93. <p class="mt-2">点击上方 LOGO 了解更多</p>
  94. {:else}
  95. <p>This is a template using Vite & Svelte & TailwindCSS & STDF</p>
  96. <p class="mt-2">Click the logo above to learn more</p>
  97. {/if}
  98. </div>
  99. <div class="my-6">
  100. <Cell
  101. title={lang === 'zh_CN' ? '暗模式' : 'Dark mode'}
  102. right={{ type: 'switch', switch: { active: mode === 'dark' } }}
  103. onclick={toggleModeFun}
  104. />
  105. </div>
  106. <div class="mt-8">
  107. <Counter bind:percent />
  108. </div>
  109. <div class="mb-8">
  110. <Button heightIn="0" group fill="lineTheme">
  111. <div class="flex w-full">
  112. <button class="border-primary dark:border-dark flex-1 border-r py-2 active:opacity-80" onclick={reduceFunc}>-10</button>
  113. <button class="border-primary dark:border-dark flex-1 border-r py-2 active:opacity-80" onclick={increaseFunc}>+10</button>
  114. <button class="flex-1 py-2 active:opacity-80" onclick={() => (percent = 20)}>
  115. {lang === 'zh_CN' ? '重置' : 'Reset'}
  116. </button>
  117. </div>
  118. </Button>
  119. </div>
  120. <div class="my-6">
  121. <Button fill="lineTheme" onclick={() => (visible = true)}>{lang === 'zh_CN' ? '日历' : 'Calendar'}</Button>
  122. </div>
  123. <Calendar bind:visible />
  124. <div class="my-6">
  125. <Button onclick={toggleLangFun}>{lang === 'zh_CN' ? '切换语言' : 'Toggle language'}</Button>
  126. <Button fill="lineTheme" onclick={toggleThemeFun}>{lang === 'zh_CN' ? '切换主题' : 'Toggle theme'}</Button>
  127. </div>