HEX
Server: nginx/1.18.0
System: Linux test-ipsremont 5.4.0-214-generic #234-Ubuntu SMP Fri Mar 14 23:50:27 UTC 2025 x86_64
User: ips (1000)
PHP: 8.0.30
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/quadcode.com/src/components/header/CountdownTimer.svelte
<script lang="ts">
  import { onMount } from 'svelte';
  import moment, { type Moment } from 'moment/moment';

  export let time;
  export let internalTime = { h: '00', m: '00', s: '00' };

  const getNextTarget = (): Moment => {
    const now = moment().utc();

    if (time.includes('T')) {
      return moment(time).utc();
    }

    const [startHour, startMinute] = time.split(':');
    let target = now.clone().hour(startHour).minute(startMinute).second(0).millisecond(0);
    if (now.isAfter(target)) {
      target.add(1, 'day');
    }
    return target;
  };

  onMount(() => {
    const update = () => {
      const diff = getNextTarget().unix() - moment().utc().unix();
      const pad = (n: number) => n.toString().padStart(2, '0');
      internalTime = {
        h: pad(Math.floor(diff / 3600)),
        m: pad(Math.floor((diff % 3600) / 60)),
        s: pad(Math.floor(diff % 60)),
      };
    };

    update();
    const interval = setInterval(update, 1000);
    return () => clearInterval(interval);
  });
</script>

<div class="countdown-wrapper">
  <div class="countdown-unit">
    <span class="countdown-value">{internalTime.h}</span>
  </div>
  <div class="countdown-separator">:</div>
  <div class="countdown-unit">
    <span class="countdown-value">{internalTime.m}</span>
  </div>
  <div class="countdown-separator">:</div>
  <div class="countdown-unit">
    <span class="countdown-value">{internalTime.s}</span>
  </div>
</div>

<style lang="scss">
  @import 'src/scss/variables';
  @import 'src/scss/mixins';
  @import 'src/scss/media';

  .countdown-wrapper {
    display: flex;
    align-items: center;
    gap: 3px;
  }

  .countdown-unit {
    display: flex;
    width: 24px;
    padding: 8px 5px;
    justify-content: center;
    align-items: center;
    gap: 3px;
    border-radius: 10px;
    border: 1px solid #313135;

    @media (min-width: 1441px) {
      width: 32px;
    }

    @media (max-width: 1440px) {
      padding: 6px 4px;
    }

    @media (max-width: 1366px) {
      width: 24px;
      border-radius: 8px;
      gap: 2px;
    }
  }

  .countdown-value {
    color: #fff;
    font-size: 16px;
    font-weight: 400;
    line-height: 1;

    @media (max-width: 1440px) {
      font-size: 12px;
    }
  }
</style>