/
Netrunners
/
Millenium_UI
Обзор
Документация
Войти
/
Netrunners
/
Millenium_UI
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/lib/components/common/Collapsible.svelte
147 строк
4 KB
Валерий Конюхов
first_commit
08 июл 2025, 22:20
08 июл 2025, 22:20
a4e8dc9
Код
Авторство
О чём код?
<script lang="ts"> import { getContext, createEventDispatcher } from 'svelte'; const i18n = getContext('i18n'); import dayjs from '$lib/dayjs'; import duration from 'dayjs/plugin/duration'; import relativeTime from 'dayjs/plugin/relativeTime'; dayjs.extend(duration); dayjs.extend(relativeTime); async function loadLocale(locales) { for (const locale of locales) { try { dayjs.locale(locale); break; // Stop after successfully loading the first available locale } catch (error) { console.error(`Could not load locale '${locale}':`, error); } } } // Assuming $i18n.languages is an array of language codes $: loadLocale($i18n.languages); const dispatch = createEventDispatcher(); $: dispatch('change', open); import { slide } from 'svelte/transition'; import { quintOut } from 'svelte/easing'; import ChevronUp from '../icons/ChevronUp.svelte'; import ChevronDown from '../icons/ChevronDown.svelte'; import Spinner from './Spinner.svelte'; export let open = false; export let id = ''; export let className = ''; export let buttonClassName = 'w-fit text-gray-500 hover:text-gray-700 dark:hover:text-gray-300 transition'; export let title = null; export let attributes = null; export let grow = false; export let disabled = false; export let hide = false; </script> <div {id} class={className}> {#if title !== null} <!-- svelte-ignore a11y-no-static-element-interactions --> <!-- svelte-ignore a11y-click-events-have-key-events --> <div class="{buttonClassName} cursor-pointer" on:pointerup={() => { if (!disabled) { open = !open; } }} > <div class=" w-full font-medium flex items-center justify-between gap-2 {attributes?.done && attributes?.done !== 'true' ? 'shimmer' : ''} " > {#if attributes?.done && attributes?.done !== 'true'} <div> <Spinner className="size-4" /> </div> {/if} <div class=""> {#if attributes?.type === 'reasoning'} {#if attributes?.done === 'true' && attributes?.duration} {#if attributes.duration < 60} {$i18n.t('Thought for {{DURATION}} seconds', { DURATION: attributes.duration })} {:else} {$i18n.t('Thought for {{DURATION}}', { DURATION: dayjs.duration(attributes.duration, 'seconds').humanize() })} {/if} {:else} {$i18n.t('Thinking...')} {/if} {:else if attributes?.type === 'code_interpreter'} {#if attributes?.done === 'true'} {$i18n.t('Analyzed')} {:else} {$i18n.t('Analyzing...')} {/if} {:else} {title} {/if} </div> <div class="flex self-center translate-y-[1px]"> {#if open} <ChevronUp strokeWidth="3.5" className="size-3.5" /> {:else} <ChevronDown strokeWidth="3.5" className="size-3.5" /> {/if} </div> </div> </div> {:else} <!-- svelte-ignore a11y-no-static-element-interactions --> <!-- svelte-ignore a11y-click-events-have-key-events --> <div class="{buttonClassName} cursor-pointer" on:pointerup={() => { if (!disabled) { open = !open; } }} > <div> <slot /> {#if grow} {#if open && !hide} <div transition:slide={{ duration: 300, easing: quintOut, axis: 'y' }} on:pointerup={(e) => { e.stopPropagation(); }} > <slot name="content" /> </div> {/if} {/if} </div> </div> {/if} {#if !grow} {#if open && !hide} <div transition:slide={{ duration: 300, easing: quintOut, axis: 'y' }}> <slot name="content" /> </div> {/if} {/if} </div>