새로운 Svelte 컴포넌트 추가 및 기존 컴포넌트의 내보내기 수정

This commit is contained in:
김인섭 2025-11-14 00:30:46 +09:00
commit a2df477507
406 changed files with 14600 additions and 0 deletions

1
.env Normal file
View File

@ -0,0 +1 @@
DATABASE_URL=file:local.db

1
.env.example Normal file
View File

@ -0,0 +1 @@
DATABASE_URL=file:local.db

23
.github/copilot-instructions.md vendored Normal file
View File

@ -0,0 +1,23 @@
You are able to use the Svelte MCP server, where you have access to comprehensive Svelte 5 and SvelteKit documentation. Here's how to use the available tools effectively:
## Available MCP Tools:
### 1. list-sections
Use this FIRST to discover all available documentation sections. Returns a structured list with titles, use_cases, and paths.
When asked about Svelte or SvelteKit topics, ALWAYS use this tool at the start of the chat to find relevant sections.
### 2. get-documentation
Retrieves full documentation content for specific sections. Accepts single or multiple sections.
After calling the list-sections tool, you MUST analyze the returned documentation sections (especially the use_cases field) and then use the get-documentation tool to fetch ALL documentation sections that are relevant for the user's task.
### 3. svelte-autofixer
Analyzes Svelte code and returns issues and suggestions.
You MUST use this tool whenever writing Svelte code before sending it to the user. Keep calling it until no issues or suggestions are returned.
### 4. playground-link
Generates a Svelte Playground link with the provided code.
After completing the code, ask the user if they want a playground link. Only call this tool after user confirmation and NEVER if code was written to files in their project.

26
.gitignore vendored Normal file
View File

@ -0,0 +1,26 @@
node_modules
# Output
.output
.vercel
.netlify
.wrangler
/.svelte-kit
/build
# OS
.DS_Store
Thumbs.db
# Env
.env
.env.*
!.env.example
!.env.test
# Vite
vite.config.js.timestamp-*
vite.config.ts.timestamp-*
# SQLite
*.db

8
.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,8 @@
# 디폴트 무시된 파일
/shelf/
/workspace.xml
# 에디터 기반 HTTP 클라이언트 요청
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

63
.idea/codeStyles/Project.xml generated Normal file
View File

@ -0,0 +1,63 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<HTMLCodeStyleSettings>
<option name="HTML_SPACE_INSIDE_EMPTY_TAG" value="true" />
</HTMLCodeStyleSettings>
<JSCodeStyleSettings version="0">
<option name="FORCE_SEMICOLON_STYLE" value="true" />
<option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
<option name="USE_DOUBLE_QUOTES" value="false" />
<option name="FORCE_QUOTE_STYlE" value="true" />
<option name="ENFORCE_TRAILING_COMMA" value="Remove" />
<option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" />
<option name="SPACES_WITHIN_IMPORTS" value="true" />
</JSCodeStyleSettings>
<TypeScriptCodeStyleSettings version="0">
<option name="FORCE_SEMICOLON_STYLE" value="true" />
<option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
<option name="USE_DOUBLE_QUOTES" value="false" />
<option name="FORCE_QUOTE_STYlE" value="true" />
<option name="ENFORCE_TRAILING_COMMA" value="Remove" />
<option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" />
<option name="SPACES_WITHIN_IMPORTS" value="true" />
</TypeScriptCodeStyleSettings>
<VueCodeStyleSettings>
<option name="INTERPOLATION_NEW_LINE_AFTER_START_DELIMITER" value="false" />
<option name="INTERPOLATION_NEW_LINE_BEFORE_END_DELIMITER" value="false" />
</VueCodeStyleSettings>
<codeStyleSettings language="HTML">
<option name="SOFT_MARGINS" value="100" />
<indentOptions>
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="2" />
<option name="TAB_SIZE" value="2" />
<option name="USE_TAB_CHARACTER" value="true" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="JavaScript">
<option name="SOFT_MARGINS" value="100" />
<indentOptions>
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="2" />
<option name="TAB_SIZE" value="2" />
<option name="USE_TAB_CHARACTER" value="true" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="TypeScript">
<option name="SOFT_MARGINS" value="100" />
<indentOptions>
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="2" />
<option name="TAB_SIZE" value="2" />
<option name="USE_TAB_CHARACTER" value="true" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="Vue">
<option name="SOFT_MARGINS" value="100" />
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="2" />
<option name="USE_TAB_CHARACTER" value="true" />
</indentOptions>
</codeStyleSettings>
</code_scheme>
</component>

5
.idea/codeStyles/codeStyleConfig.xml generated Normal file
View File

@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>

6
.idea/copilot.data.migration.agent.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AgentMigrationStateService">
<option name="migrationStatus" value="COMPLETED" />
</component>
</project>

6
.idea/copilot.data.migration.ask.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AskMigrationStateService">
<option name="migrationStatus" value="COMPLETED" />
</component>
</project>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Ask2AgentMigrationStateService">
<option name="migrationStatus" value="COMPLETED" />
</component>
</project>

6
.idea/copilot.data.migration.edit.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EditMigrationStateService">
<option name="migrationStatus" value="COMPLETED" />
</component>
</project>

7
.idea/misc.xml generated Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="KubernetesApiProvider"><![CDATA[{}]]></component>
<component name="ProjectRootManager">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

8
.idea/modules.xml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/taisai-svelte.iml" filepath="$PROJECT_DIR$/.idea/taisai-svelte.iml" />
</modules>
</component>
</project>

6
.idea/prettier.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PrettierConfiguration">
<option name="myConfigurationMode" value="AUTOMATIC" />
</component>
</project>

9
.idea/taisai-svelte.iml generated Normal file
View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

6
.idea/vcs.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

508
.idea/workspace.xml generated Normal file
View File

@ -0,0 +1,508 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="027e6af4-a007-480d-9766-cd603cf60fb1" name="변경" comment="">
<change afterPath="$PROJECT_DIR$/.env" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.env.example" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.github/copilot-instructions.md" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/.gitignore" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/codeStyles/Project.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/codeStyles/codeStyleConfig.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/copilot.data.migration.agent.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/copilot.data.migration.ask.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/copilot.data.migration.ask2agent.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/copilot.data.migration.edit.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/modules.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/prettier.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/taisai-svelte.iml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.npmrc" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.prettierignore" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.prettierrc" afterDir="false" />
<change afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
<change afterPath="$PROJECT_DIR$/components.json" afterDir="false" />
<change afterPath="$PROJECT_DIR$/drizzle.config.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/package.json" afterDir="false" />
<change afterPath="$PROJECT_DIR$/pnpm-lock.yaml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/pnpm-workspace.yaml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/app.css" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/app.d.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/app.html" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/hooks.server.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/assets/favicon.svg" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/accordion/accordion-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/accordion/accordion-item.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/accordion/accordion-trigger.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/accordion/accordion.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/accordion/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/alert-dialog/alert-dialog-action.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/alert-dialog/alert-dialog-cancel.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/alert-dialog/alert-dialog-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/alert-dialog/alert-dialog-description.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/alert-dialog/alert-dialog-footer.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/alert-dialog/alert-dialog-header.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/alert-dialog/alert-dialog-overlay.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/alert-dialog/alert-dialog-title.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/alert-dialog/alert-dialog-trigger.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/alert-dialog/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/alert/alert-description.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/alert/alert-title.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/alert/alert.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/alert/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/aspect-ratio/aspect-ratio.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/aspect-ratio/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/avatar/avatar-fallback.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/avatar/avatar-image.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/avatar/avatar.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/avatar/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/badge/badge.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/badge/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/breadcrumb/breadcrumb-ellipsis.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/breadcrumb/breadcrumb-item.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/breadcrumb/breadcrumb-link.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/breadcrumb/breadcrumb-list.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/breadcrumb/breadcrumb-page.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/breadcrumb/breadcrumb-separator.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/breadcrumb/breadcrumb.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/breadcrumb/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/button-group/button-group-separator.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/button-group/button-group-text.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/button-group/button-group.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/button-group/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/button/button.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/button/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/calendar/calendar-caption.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/calendar/calendar-cell.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/calendar/calendar-day.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/calendar/calendar-grid-body.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/calendar/calendar-grid-head.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/calendar/calendar-grid-row.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/calendar/calendar-grid.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/calendar/calendar-head-cell.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/calendar/calendar-header.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/calendar/calendar-heading.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/calendar/calendar-month-select.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/calendar/calendar-month.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/calendar/calendar-months.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/calendar/calendar-nav.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/calendar/calendar-next-button.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/calendar/calendar-prev-button.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/calendar/calendar-year-select.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/calendar/calendar.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/calendar/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/card/card-action.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/card/card-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/card/card-description.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/card/card-footer.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/card/card-header.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/card/card-title.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/card/card.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/card/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/carousel/carousel-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/carousel/carousel-item.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/carousel/carousel-next.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/carousel/carousel-previous.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/carousel/carousel.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/carousel/context.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/carousel/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/chart/chart-container.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/chart/chart-style.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/chart/chart-tooltip.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/chart/chart-utils.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/chart/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/checkbox/checkbox.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/checkbox/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/collapsible/collapsible-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/collapsible/collapsible-trigger.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/collapsible/collapsible.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/collapsible/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/command/command-dialog.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/command/command-empty.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/command/command-group.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/command/command-input.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/command/command-item.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/command/command-link-item.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/command/command-list.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/command/command-separator.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/command/command-shortcut.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/command/command.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/command/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/context-menu/context-menu-checkbox-item.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/context-menu/context-menu-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/context-menu/context-menu-group-heading.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/context-menu/context-menu-group.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/context-menu/context-menu-item.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/context-menu/context-menu-label.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/context-menu/context-menu-radio-group.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/context-menu/context-menu-radio-item.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/context-menu/context-menu-separator.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/context-menu/context-menu-shortcut.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/context-menu/context-menu-sub-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/context-menu/context-menu-sub-trigger.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/context-menu/context-menu-trigger.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/context-menu/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/data-table/data-table.svelte.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/data-table/flex-render.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/data-table/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/data-table/render-helpers.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dialog/dialog-close.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dialog/dialog-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dialog/dialog-description.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dialog/dialog-footer.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dialog/dialog-header.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dialog/dialog-overlay.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dialog/dialog-title.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dialog/dialog-trigger.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dialog/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/drawer/drawer-close.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/drawer/drawer-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/drawer/drawer-description.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/drawer/drawer-footer.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/drawer/drawer-header.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/drawer/drawer-nested.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/drawer/drawer-overlay.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/drawer/drawer-title.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/drawer/drawer-trigger.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/drawer/drawer.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/drawer/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dropdown-menu/dropdown-menu-group.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dropdown-menu/dropdown-menu-trigger.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/dropdown-menu/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/empty/empty-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/empty/empty-description.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/empty/empty-header.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/empty/empty-media.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/empty/empty-title.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/empty/empty.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/empty/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/field/field-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/field/field-description.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/field/field-error.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/field/field-group.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/field/field-label.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/field/field-legend.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/field/field-separator.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/field/field-set.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/field/field-title.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/field/field.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/field/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/form/form-button.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/form/form-description.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/form/form-element-field.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/form/form-field-errors.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/form/form-field.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/form/form-fieldset.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/form/form-label.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/form/form-legend.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/form/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/hover-card/hover-card-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/hover-card/hover-card-trigger.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/hover-card/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/input-group/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/input-group/input-group-addon.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/input-group/input-group-button.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/input-group/input-group-input.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/input-group/input-group-text.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/input-group/input-group-textarea.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/input-group/input-group.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/input-otp/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/input-otp/input-otp-group.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/input-otp/input-otp-separator.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/input-otp/input-otp-slot.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/input-otp/input-otp.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/input/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/input/input.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/item/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/item/item-actions.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/item/item-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/item/item-description.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/item/item-footer.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/item/item-group.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/item/item-header.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/item/item-media.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/item/item-separator.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/item/item-title.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/item/item.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/kbd/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/kbd/kbd-group.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/kbd/kbd.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/label/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/label/label.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/menubar/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/menubar/menubar-checkbox-item.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/menubar/menubar-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/menubar/menubar-group-heading.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/menubar/menubar-group.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/menubar/menubar-item.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/menubar/menubar-label.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/menubar/menubar-radio-item.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/menubar/menubar-separator.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/menubar/menubar-shortcut.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/menubar/menubar-sub-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/menubar/menubar-sub-trigger.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/menubar/menubar-trigger.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/menubar/menubar.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/native-select/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/native-select/native-select-opt-group.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/native-select/native-select-option.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/native-select/native-select.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/navigation-menu/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/navigation-menu/navigation-menu-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/navigation-menu/navigation-menu-indicator.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/navigation-menu/navigation-menu-item.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/navigation-menu/navigation-menu-link.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/navigation-menu/navigation-menu-list.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/navigation-menu/navigation-menu-trigger.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/navigation-menu/navigation-menu-viewport.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/navigation-menu/navigation-menu.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/pagination/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/pagination/pagination-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/pagination/pagination-ellipsis.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/pagination/pagination-item.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/pagination/pagination-link.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/pagination/pagination-next-button.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/pagination/pagination-prev-button.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/pagination/pagination.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/popover/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/popover/popover-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/popover/popover-trigger.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/progress/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/progress/progress.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/radio-group/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/radio-group/radio-group-item.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/radio-group/radio-group.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/range-calendar/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/range-calendar/range-calendar-caption.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/range-calendar/range-calendar-cell.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/range-calendar/range-calendar-day.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/range-calendar/range-calendar-grid-row.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/range-calendar/range-calendar-grid.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/range-calendar/range-calendar-head-cell.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/range-calendar/range-calendar-header.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/range-calendar/range-calendar-heading.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/range-calendar/range-calendar-month-select.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/range-calendar/range-calendar-month.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/range-calendar/range-calendar-months.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/range-calendar/range-calendar-nav.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/range-calendar/range-calendar-next-button.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/range-calendar/range-calendar-prev-button.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/range-calendar/range-calendar-year-select.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/range-calendar/range-calendar.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/resizable/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/resizable/resizable-handle.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/resizable/resizable-pane-group.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/scroll-area/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/scroll-area/scroll-area.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/select/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/select/select-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/select/select-group-heading.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/select/select-group.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/select/select-item.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/select/select-label.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/select/select-scroll-down-button.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/select/select-scroll-up-button.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/select/select-separator.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/select/select-trigger.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/separator/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/separator/separator.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sheet/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sheet/sheet-close.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sheet/sheet-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sheet/sheet-description.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sheet/sheet-footer.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sheet/sheet-header.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sheet/sheet-overlay.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sheet/sheet-title.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sheet/sheet-trigger.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/constants.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/context.svelte.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar-footer.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar-group-action.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar-group-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar-group-label.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar-group.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar-header.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar-input.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar-inset.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar-menu-action.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar-menu-badge.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar-menu-button.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar-menu-item.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar-menu-skeleton.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar-menu-sub-button.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar-menu-sub-item.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar-menu-sub.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar-menu.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar-provider.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar-rail.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar-separator.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar-trigger.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sidebar/sidebar.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/skeleton/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/skeleton/skeleton.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/slider/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/slider/slider.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sonner/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/sonner/sonner.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/spinner/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/spinner/spinner.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/switch/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/switch/switch.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/table/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/table/table-body.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/table/table-caption.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/table/table-cell.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/table/table-footer.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/table/table-head.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/table/table-header.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/table/table-row.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/table/table.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/tabs/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/tabs/tabs-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/tabs/tabs-list.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/tabs/tabs-trigger.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/tabs/tabs.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/textarea/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/textarea/textarea.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/toggle-group/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/toggle-group/toggle-group-item.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/toggle-group/toggle-group.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/toggle/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/toggle/toggle.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/tooltip/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/tooltip/tooltip-content.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/components/ui/tooltip/tooltip-trigger.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/hooks/is-mobile.svelte.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/server/auth.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/server/db/index.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/server/db/schema.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/lib/utils.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/routes/+layout.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/routes/+page.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/routes/demo/+page.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/routes/demo/lucia/+page.server.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/routes/demo/lucia/+page.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/routes/demo/lucia/login/+page.server.ts" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/routes/demo/lucia/login/+page.svelte" afterDir="false" />
<change afterPath="$PROJECT_DIR$/static/robots.txt" afterDir="false" />
<change afterPath="$PROJECT_DIR$/svelte-mcp-instruction.md" afterDir="false" />
<change afterPath="$PROJECT_DIR$/svelte.config.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/tsconfig.json" afterDir="false" />
<change afterPath="$PROJECT_DIR$/vite.config.ts" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="ProjectColorInfo"><![CDATA[{
"associatedIndex": 4
}]]></component>
<component name="ProjectId" id="35QZk9eFiT4PzUegrfJTvpdLB6i" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"ModuleVcsDetector.initialDetectionPerformed": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
"com.intellij.ml.llm.matterhorn.ej.ui.settings.DefaultModelSelectionForGA.v1": "true",
"git-widget-placeholder": "master",
"ignore.virus.scanning.warn.message": "true",
"junie.onboarding.icon.badge.shown": "true",
"kotlin-language-version-configured": "true",
"last_opened_file_path": "C:/gitea/taisai-svelte",
"node.js.detected.package.eslint": "true",
"node.js.detected.package.tslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
"node.js.selected.package.tslint": "(autodetect)",
"nodejs_package_manager_path": "pnpm",
"npm.dev.executor": "Run",
"prettierjs.PrettierConfiguration.Package": "C:\\gitea\\taisai-svelte\\node_modules\\prettier",
"settings.editor.selected.configurable": "com.github.copilot.settings.customization.CustomizationConfigurable",
"to.speed.mode.migration.done": "true",
"ts.external.directory.path": "C:\\gitea\\taisai-svelte\\node_modules\\typescript\\lib",
"vue.rearranger.settings.migration": "true"
}
}]]></component>
<component name="RunManager" selected="npm.dev">
<configuration name="이름이 지정되지 않았습니다" type="NodeJSConfigurationType" nameIsGenerated="true" working-dir="$PROJECT_DIR$">
<method v="2" />
</configuration>
<configuration name="dev" type="js.build_tools.npm" nameIsGenerated="true">
<package-json value="$PROJECT_DIR$/package.json" />
<command value="run" />
<scripts>
<script value="dev" />
</scripts>
<node-interpreter value="project" />
<envs />
<method v="2" />
</configuration>
<list>
<item itemvalue="Node.js.이름이 지정되지 않았습니다" />
<item itemvalue="npm.dev" />
</list>
</component>
<component name="SharedIndexes">
<attachedChunks>
<set>
<option value="bundled-jdk-9823dce3aa75-bf35d07a577b-intellij.indexing.shared.core-IU-252.27397.103" />
<option value="bundled-js-predefined-d6986cc7102b-3aa1da707db6-JavaScript-IU-252.27397.103" />
</set>
</attachedChunks>
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="디폴트 작업">
<changelist id="027e6af4-a007-480d-9766-cd603cf60fb1" name="변경" comment="" />
<created>1763044396291</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1763044396291</updated>
<workItem from="1763044399917" duration="3349000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="XSLT-Support.FileAssociations.UIState">
<expand />
<select />
</component>
<component name="github-copilot-workspace">
<instructionFileLocations>
<option value=".github/instructions" />
</instructionFileLocations>
<promptFileLocations>
<option value=".github/prompts" />
</promptFileLocations>
</component>
</project>

1
.npmrc Normal file
View File

@ -0,0 +1 @@
engine-strict=true

10
.prettierignore Normal file
View File

@ -0,0 +1,10 @@
# Package Managers
package-lock.json
pnpm-lock.yaml
yarn.lock
bun.lock
bun.lockb
# Miscellaneous
/static/
/drizzle/

19
.prettierrc Normal file
View File

@ -0,0 +1,19 @@
{
"useTabs": true,
"singleQuote": true,
"trailingComma": "none",
"printWidth": 100,
"plugins": [
"prettier-plugin-svelte",
"prettier-plugin-tailwindcss"
],
"overrides": [
{
"files": "*.svelte",
"options": {
"parser": "svelte"
}
}
],
"tailwindStylesheet": "./src/app.css"
}

38
README.md Normal file
View File

@ -0,0 +1,38 @@
# sv
Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli).
## Creating a project
If you're seeing this, you've probably already done this step. Congrats!
```sh
# create a new project in the current directory
npx sv create
# create a new project in my-app
npx sv create my-app
```
## Developing
Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
```sh
npm run dev
# or start the server and open the app in a new browser tab
npm run dev -- --open
```
## Building
To create a production version of your app:
```sh
npm run build
```
You can preview the production build with `npm run preview`.
> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment.

16
components.json Normal file
View File

@ -0,0 +1,16 @@
{
"$schema": "https://shadcn-svelte.com/schema.json",
"tailwind": {
"css": "src\\app.css",
"baseColor": "slate"
},
"aliases": {
"components": "$lib/components",
"utils": "$lib/utils",
"ui": "$lib/components/ui",
"hooks": "$lib/hooks",
"lib": "$lib"
},
"typescript": true,
"registry": "https://shadcn-svelte.com/registry"
}

11
drizzle.config.ts Normal file
View File

@ -0,0 +1,11 @@
import { defineConfig } from 'drizzle-kit';
if (!process.env.DATABASE_URL) throw new Error('DATABASE_URL is not set');
export default defineConfig({
schema: './src/lib/server/db/schema.ts',
dialect: 'sqlite',
dbCredentials: { url: process.env.DATABASE_URL },
verbose: true,
strict: true
});

60
package.json Normal file
View File

@ -0,0 +1,60 @@
{
"name": "taisai-svelte",
"private": true,
"version": "0.0.1",
"type": "module",
"scripts": {
"dev": "vite dev",
"build": "vite build",
"preview": "vite preview",
"prepare": "svelte-kit sync || echo ''",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
"format": "prettier --write .",
"lint": "prettier --check .",
"db:push": "drizzle-kit push",
"db:generate": "drizzle-kit generate",
"db:migrate": "drizzle-kit migrate",
"db:studio": "drizzle-kit studio"
},
"devDependencies": {
"@internationalized/date": "^3.10.0",
"@libsql/client": "^0.15.15",
"@lucide/svelte": "^0.544.0",
"@oslojs/crypto": "^1.0.1",
"@oslojs/encoding": "^1.1.0",
"@sveltejs/adapter-auto": "^7.0.0",
"@sveltejs/kit": "^2.47.1",
"@sveltejs/vite-plugin-svelte": "^6.2.1",
"@tailwindcss/vite": "^4.1.14",
"@tanstack/table-core": "^8.21.3",
"@types/node": "^24",
"bits-ui": "^2.14.3",
"clsx": "^2.1.1",
"drizzle-kit": "^0.31.5",
"drizzle-orm": "^0.44.6",
"embla-carousel-svelte": "^8.6.0",
"formsnap": "^2.0.1",
"layerchart": "2.0.0-next.27",
"mode-watcher": "^1.1.0",
"paneforge": "^1.0.2",
"prettier": "^3.6.2",
"prettier-plugin-svelte": "^3.4.0",
"prettier-plugin-tailwindcss": "^0.7.1",
"svelte": "^5.41.0",
"svelte-check": "^4.3.3",
"svelte-sonner": "^1.0.6",
"sveltekit-superforms": "^2.28.1",
"tailwind-merge": "^3.4.0",
"tailwind-variants": "^3.1.1",
"tailwindcss": "^4.1.14",
"tw-animate-css": "^1.4.0",
"typescript": "^5.9.3",
"vaul-svelte": "1.0.0-next.7",
"vite": "^7.1.10"
},
"dependencies": {
"@node-rs/argon2": "^2.0.2",
"lucide-svelte": "^0.553.0"
}
}

3444
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

3
pnpm-workspace.yaml Normal file
View File

@ -0,0 +1,3 @@
onlyBuiltDependencies:
- esbuild
- '@tailwindcss/oxide'

121
src/app.css Normal file
View File

@ -0,0 +1,121 @@
@import "tailwindcss";
@import "tw-animate-css";
@custom-variant dark (&:is(.dark *));
:root {
--radius: 0.625rem;
--background: oklch(1 0 0);
--foreground: oklch(0.129 0.042 264.695);
--card: oklch(1 0 0);
--card-foreground: oklch(0.129 0.042 264.695);
--popover: oklch(1 0 0);
--popover-foreground: oklch(0.129 0.042 264.695);
--primary: oklch(0.208 0.042 265.755);
--primary-foreground: oklch(0.984 0.003 247.858);
--secondary: oklch(0.968 0.007 247.896);
--secondary-foreground: oklch(0.208 0.042 265.755);
--muted: oklch(0.968 0.007 247.896);
--muted-foreground: oklch(0.554 0.046 257.417);
--accent: oklch(0.968 0.007 247.896);
--accent-foreground: oklch(0.208 0.042 265.755);
--destructive: oklch(0.577 0.245 27.325);
--border: oklch(0.929 0.013 255.508);
--input: oklch(0.929 0.013 255.508);
--ring: oklch(0.704 0.04 256.788);
--chart-1: oklch(0.646 0.222 41.116);
--chart-2: oklch(0.6 0.118 184.704);
--chart-3: oklch(0.398 0.07 227.392);
--chart-4: oklch(0.828 0.189 84.429);
--chart-5: oklch(0.769 0.188 70.08);
--sidebar: oklch(0.984 0.003 247.858);
--sidebar-foreground: oklch(0.129 0.042 264.695);
--sidebar-primary: oklch(0.208 0.042 265.755);
--sidebar-primary-foreground: oklch(0.984 0.003 247.858);
--sidebar-accent: oklch(0.968 0.007 247.896);
--sidebar-accent-foreground: oklch(0.208 0.042 265.755);
--sidebar-border: oklch(0.929 0.013 255.508);
--sidebar-ring: oklch(0.704 0.04 256.788);
}
.dark {
--background: oklch(0.129 0.042 264.695);
--foreground: oklch(0.984 0.003 247.858);
--card: oklch(0.208 0.042 265.755);
--card-foreground: oklch(0.984 0.003 247.858);
--popover: oklch(0.208 0.042 265.755);
--popover-foreground: oklch(0.984 0.003 247.858);
--primary: oklch(0.929 0.013 255.508);
--primary-foreground: oklch(0.208 0.042 265.755);
--secondary: oklch(0.279 0.041 260.031);
--secondary-foreground: oklch(0.984 0.003 247.858);
--muted: oklch(0.279 0.041 260.031);
--muted-foreground: oklch(0.704 0.04 256.788);
--accent: oklch(0.279 0.041 260.031);
--accent-foreground: oklch(0.984 0.003 247.858);
--destructive: oklch(0.704 0.191 22.216);
--border: oklch(1 0 0 / 10%);
--input: oklch(1 0 0 / 15%);
--ring: oklch(0.551 0.027 264.364);
--chart-1: oklch(0.488 0.243 264.376);
--chart-2: oklch(0.696 0.17 162.48);
--chart-3: oklch(0.769 0.188 70.08);
--chart-4: oklch(0.627 0.265 303.9);
--chart-5: oklch(0.645 0.246 16.439);
--sidebar: oklch(0.208 0.042 265.755);
--sidebar-foreground: oklch(0.984 0.003 247.858);
--sidebar-primary: oklch(0.488 0.243 264.376);
--sidebar-primary-foreground: oklch(0.984 0.003 247.858);
--sidebar-accent: oklch(0.279 0.041 260.031);
--sidebar-accent-foreground: oklch(0.984 0.003 247.858);
--sidebar-border: oklch(1 0 0 / 10%);
--sidebar-ring: oklch(0.551 0.027 264.364);
}
@theme inline {
--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px);
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-card: var(--card);
--color-card-foreground: var(--card-foreground);
--color-popover: var(--popover);
--color-popover-foreground: var(--popover-foreground);
--color-primary: var(--primary);
--color-primary-foreground: var(--primary-foreground);
--color-secondary: var(--secondary);
--color-secondary-foreground: var(--secondary-foreground);
--color-muted: var(--muted);
--color-muted-foreground: var(--muted-foreground);
--color-accent: var(--accent);
--color-accent-foreground: var(--accent-foreground);
--color-destructive: var(--destructive);
--color-border: var(--border);
--color-input: var(--input);
--color-ring: var(--ring);
--color-chart-1: var(--chart-1);
--color-chart-2: var(--chart-2);
--color-chart-3: var(--chart-3);
--color-chart-4: var(--chart-4);
--color-chart-5: var(--chart-5);
--color-sidebar: var(--sidebar);
--color-sidebar-foreground: var(--sidebar-foreground);
--color-sidebar-primary: var(--sidebar-primary);
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
--color-sidebar-accent: var(--sidebar-accent);
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-ring: var(--sidebar-ring);
}
@layer base {
* {
@apply border-border outline-ring/50;
}
body {
@apply bg-background text-foreground;
}
}

15
src/app.d.ts vendored Normal file
View File

@ -0,0 +1,15 @@
// See https://svelte.dev/docs/kit/types#app.d.ts
// for information about these interfaces
declare global {
namespace App {
interface Locals {
user: import('$lib/server/auth').SessionValidationResult['user'];
session: import('$lib/server/auth').SessionValidationResult['session'];
}
} // interface Error {}
// interface Locals {}
} // interface PageData {}
// interface PageState {}
// interface Platform {}
export {};

11
src/app.html Normal file
View File

@ -0,0 +1,11 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
%sveltekit.head%
</head>
<body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div>
</body>
</html>

26
src/hooks.server.ts Normal file
View File

@ -0,0 +1,26 @@
import type { Handle } from '@sveltejs/kit';
import * as auth from '$lib/server/auth';
const handleAuth: Handle = async ({ event, resolve }) => {
const sessionToken = event.cookies.get(auth.sessionCookieName);
if (!sessionToken) {
event.locals.user = null;
event.locals.session = null;
return resolve(event);
}
const { session, user } = await auth.validateSessionToken(sessionToken);
if (session) {
auth.setSessionTokenCookie(event, sessionToken, session.expiresAt);
} else {
auth.deleteSessionTokenCookie(event);
}
event.locals.user = user;
event.locals.session = session;
return resolve(event);
};
export const handle: Handle = handleAuth;

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="107" height="128" viewBox="0 0 107 128"><title>svelte-logo</title><path d="M94.157 22.819c-10.4-14.885-30.94-19.297-45.792-9.835L22.282 29.608A29.92 29.92 0 0 0 8.764 49.65a31.5 31.5 0 0 0 3.108 20.231 30 30 0 0 0-4.477 11.183 31.9 31.9 0 0 0 5.448 24.116c10.402 14.887 30.942 19.297 45.791 9.835l26.083-16.624A29.92 29.92 0 0 0 98.235 78.35a31.53 31.53 0 0 0-3.105-20.232 30 30 0 0 0 4.474-11.182 31.88 31.88 0 0 0-5.447-24.116" style="fill:#ff3e00"/><path d="M45.817 106.582a20.72 20.72 0 0 1-22.237-8.243 19.17 19.17 0 0 1-3.277-14.503 18 18 0 0 1 .624-2.435l.49-1.498 1.337.981a33.6 33.6 0 0 0 10.203 5.098l.97.294-.09.968a5.85 5.85 0 0 0 1.052 3.878 6.24 6.24 0 0 0 6.695 2.485 5.8 5.8 0 0 0 1.603-.704L69.27 76.28a5.43 5.43 0 0 0 2.45-3.631 5.8 5.8 0 0 0-.987-4.371 6.24 6.24 0 0 0-6.698-2.487 5.7 5.7 0 0 0-1.6.704l-9.953 6.345a19 19 0 0 1-5.296 2.326 20.72 20.72 0 0 1-22.237-8.243 19.17 19.17 0 0 1-3.277-14.502 17.99 17.99 0 0 1 8.13-12.052l26.081-16.623a19 19 0 0 1 5.3-2.329 20.72 20.72 0 0 1 22.237 8.243 19.17 19.17 0 0 1 3.277 14.503 18 18 0 0 1-.624 2.435l-.49 1.498-1.337-.98a33.6 33.6 0 0 0-10.203-5.1l-.97-.294.09-.968a5.86 5.86 0 0 0-1.052-3.878 6.24 6.24 0 0 0-6.696-2.485 5.8 5.8 0 0 0-1.602.704L37.73 51.72a5.42 5.42 0 0 0-2.449 3.63 5.79 5.79 0 0 0 .986 4.372 6.24 6.24 0 0 0 6.698 2.486 5.8 5.8 0 0 0 1.602-.704l9.952-6.342a19 19 0 0 1 5.295-2.328 20.72 20.72 0 0 1 22.237 8.242 19.17 19.17 0 0 1 3.277 14.503 18 18 0 0 1-8.13 12.053l-26.081 16.622a19 19 0 0 1-5.3 2.328" style="fill:#fff"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,22 @@
<script lang="ts">
import { Accordion as AccordionPrimitive } from "bits-ui";
import { cn, type WithoutChild } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
children,
...restProps
}: WithoutChild<AccordionPrimitive.ContentProps> = $props();
</script>
<AccordionPrimitive.Content
bind:ref
data-slot="accordion-content"
class="data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm"
{...restProps}
>
<div class={cn("pb-4 pt-0", className)}>
{@render children?.()}
</div>
</AccordionPrimitive.Content>

View File

@ -0,0 +1,17 @@
<script lang="ts">
import { Accordion as AccordionPrimitive } from "bits-ui";
import { cn } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
...restProps
}: AccordionPrimitive.ItemProps = $props();
</script>
<AccordionPrimitive.Item
bind:ref
data-slot="accordion-item"
class={cn("border-b last:border-b-0", className)}
{...restProps}
/>

View File

@ -0,0 +1,32 @@
<script lang="ts">
import { Accordion as AccordionPrimitive } from "bits-ui";
import ChevronDownIcon from "@lucide/svelte/icons/chevron-down";
import { cn, type WithoutChild } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
level = 3,
children,
...restProps
}: WithoutChild<AccordionPrimitive.TriggerProps> & {
level?: AccordionPrimitive.HeaderProps["level"];
} = $props();
</script>
<AccordionPrimitive.Header {level} class="flex">
<AccordionPrimitive.Trigger
data-slot="accordion-trigger"
bind:ref
class={cn(
"focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium outline-none transition-all hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180",
className
)}
{...restProps}
>
{@render children?.()}
<ChevronDownIcon
class="text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200"
/>
</AccordionPrimitive.Trigger>
</AccordionPrimitive.Header>

View File

@ -0,0 +1,16 @@
<script lang="ts">
import { Accordion as AccordionPrimitive } from "bits-ui";
let {
ref = $bindable(null),
value = $bindable(),
...restProps
}: AccordionPrimitive.RootProps = $props();
</script>
<AccordionPrimitive.Root
bind:ref
bind:value={value as never}
data-slot="accordion"
{...restProps}
/>

View File

@ -0,0 +1,16 @@
import Root from "./accordion.svelte";
import Content from "./accordion-content.svelte";
import Item from "./accordion-item.svelte";
import Trigger from "./accordion-trigger.svelte";
export {
Root,
Content,
Item,
Trigger,
//
Root as Accordion,
Content as AccordionContent,
Item as AccordionItem,
Trigger as AccordionTrigger,
};

View File

@ -0,0 +1,18 @@
<script lang="ts">
import { AlertDialog as AlertDialogPrimitive } from "bits-ui";
import { buttonVariants } from "$lib/components/ui/button/index.js";
import { cn } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
...restProps
}: AlertDialogPrimitive.ActionProps = $props();
</script>
<AlertDialogPrimitive.Action
bind:ref
data-slot="alert-dialog-action"
class={cn(buttonVariants(), className)}
{...restProps}
/>

View File

@ -0,0 +1,18 @@
<script lang="ts">
import { AlertDialog as AlertDialogPrimitive } from "bits-ui";
import { buttonVariants } from "$lib/components/ui/button/index.js";
import { cn } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
...restProps
}: AlertDialogPrimitive.CancelProps = $props();
</script>
<AlertDialogPrimitive.Cancel
bind:ref
data-slot="alert-dialog-cancel"
class={cn(buttonVariants({ variant: "outline" }), className)}
{...restProps}
/>

View File

@ -0,0 +1,27 @@
<script lang="ts">
import { AlertDialog as AlertDialogPrimitive } from "bits-ui";
import AlertDialogOverlay from "./alert-dialog-overlay.svelte";
import { cn, type WithoutChild, type WithoutChildrenOrChild } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
portalProps,
...restProps
}: WithoutChild<AlertDialogPrimitive.ContentProps> & {
portalProps?: WithoutChildrenOrChild<AlertDialogPrimitive.PortalProps>;
} = $props();
</script>
<AlertDialogPrimitive.Portal {...portalProps}>
<AlertDialogOverlay />
<AlertDialogPrimitive.Content
bind:ref
data-slot="alert-dialog-content"
class={cn(
"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed left-[50%] top-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg",
className
)}
{...restProps}
/>
</AlertDialogPrimitive.Portal>

View File

@ -0,0 +1,17 @@
<script lang="ts">
import { AlertDialog as AlertDialogPrimitive } from "bits-ui";
import { cn } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
...restProps
}: AlertDialogPrimitive.DescriptionProps = $props();
</script>
<AlertDialogPrimitive.Description
bind:ref
data-slot="alert-dialog-description"
class={cn("text-muted-foreground text-sm", className)}
{...restProps}
/>

View File

@ -0,0 +1,20 @@
<script lang="ts">
import { cn, type WithElementRef } from "$lib/utils.js";
import type { HTMLAttributes } from "svelte/elements";
let {
ref = $bindable(null),
class: className,
children,
...restProps
}: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props();
</script>
<div
bind:this={ref}
data-slot="alert-dialog-footer"
class={cn("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", className)}
{...restProps}
>
{@render children?.()}
</div>

View File

@ -0,0 +1,20 @@
<script lang="ts">
import type { HTMLAttributes } from "svelte/elements";
import { cn, type WithElementRef } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
children,
...restProps
}: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props();
</script>
<div
bind:this={ref}
data-slot="alert-dialog-header"
class={cn("flex flex-col gap-2 text-center sm:text-left", className)}
{...restProps}
>
{@render children?.()}
</div>

View File

@ -0,0 +1,20 @@
<script lang="ts">
import { AlertDialog as AlertDialogPrimitive } from "bits-ui";
import { cn } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
...restProps
}: AlertDialogPrimitive.OverlayProps = $props();
</script>
<AlertDialogPrimitive.Overlay
bind:ref
data-slot="alert-dialog-overlay"
class={cn(
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",
className
)}
{...restProps}
/>

View File

@ -0,0 +1,17 @@
<script lang="ts">
import { AlertDialog as AlertDialogPrimitive } from "bits-ui";
import { cn } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
...restProps
}: AlertDialogPrimitive.TitleProps = $props();
</script>
<AlertDialogPrimitive.Title
bind:ref
data-slot="alert-dialog-title"
class={cn("text-lg font-semibold", className)}
{...restProps}
/>

View File

@ -0,0 +1,7 @@
<script lang="ts">
import { AlertDialog as AlertDialogPrimitive } from "bits-ui";
let { ref = $bindable(null), ...restProps }: AlertDialogPrimitive.TriggerProps = $props();
</script>
<AlertDialogPrimitive.Trigger bind:ref data-slot="alert-dialog-trigger" {...restProps} />

View File

@ -0,0 +1,39 @@
import { AlertDialog as AlertDialogPrimitive } from "bits-ui";
import Trigger from "./alert-dialog-trigger.svelte";
import Title from "./alert-dialog-title.svelte";
import Action from "./alert-dialog-action.svelte";
import Cancel from "./alert-dialog-cancel.svelte";
import Footer from "./alert-dialog-footer.svelte";
import Header from "./alert-dialog-header.svelte";
import Overlay from "./alert-dialog-overlay.svelte";
import Content from "./alert-dialog-content.svelte";
import Description from "./alert-dialog-description.svelte";
const Root = AlertDialogPrimitive.Root;
const Portal = AlertDialogPrimitive.Portal;
export {
Root,
Title,
Action,
Cancel,
Portal,
Footer,
Header,
Trigger,
Overlay,
Content,
Description,
//
Root as AlertDialog,
Title as AlertDialogTitle,
Action as AlertDialogAction,
Cancel as AlertDialogCancel,
Portal as AlertDialogPortal,
Footer as AlertDialogFooter,
Header as AlertDialogHeader,
Trigger as AlertDialogTrigger,
Overlay as AlertDialogOverlay,
Content as AlertDialogContent,
Description as AlertDialogDescription,
};

View File

@ -0,0 +1,23 @@
<script lang="ts">
import type { HTMLAttributes } from "svelte/elements";
import { cn, type WithElementRef } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
children,
...restProps
}: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props();
</script>
<div
bind:this={ref}
data-slot="alert-description"
class={cn(
"text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed",
className
)}
{...restProps}
>
{@render children?.()}
</div>

View File

@ -0,0 +1,20 @@
<script lang="ts">
import type { HTMLAttributes } from "svelte/elements";
import { cn, type WithElementRef } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
children,
...restProps
}: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props();
</script>
<div
bind:this={ref}
data-slot="alert-title"
class={cn("col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight", className)}
{...restProps}
>
{@render children?.()}
</div>

View File

@ -0,0 +1,44 @@
<script lang="ts" module>
import { type VariantProps, tv } from "tailwind-variants";
export const alertVariants = tv({
base: "relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",
variants: {
variant: {
default: "bg-card text-card-foreground",
destructive:
"text-destructive bg-card *:data-[slot=alert-description]:text-destructive/90 [&>svg]:text-current",
},
},
defaultVariants: {
variant: "default",
},
});
export type AlertVariant = VariantProps<typeof alertVariants>["variant"];
</script>
<script lang="ts">
import type { HTMLAttributes } from "svelte/elements";
import { cn, type WithElementRef } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
variant = "default",
children,
...restProps
}: WithElementRef<HTMLAttributes<HTMLDivElement>> & {
variant?: AlertVariant;
} = $props();
</script>
<div
bind:this={ref}
data-slot="alert"
class={cn(alertVariants({ variant }), className)}
{...restProps}
role="alert"
>
{@render children?.()}
</div>

View File

@ -0,0 +1,14 @@
import Root from "./alert.svelte";
import Description from "./alert-description.svelte";
import Title from "./alert-title.svelte";
export { alertVariants, type AlertVariant } from "./alert.svelte";
export {
Root,
Description,
Title,
//
Root as Alert,
Description as AlertDescription,
Title as AlertTitle,
};

View File

@ -0,0 +1,7 @@
<script lang="ts">
import { AspectRatio as AspectRatioPrimitive } from "bits-ui";
let { ref = $bindable(null), ...restProps }: AspectRatioPrimitive.RootProps = $props();
</script>
<AspectRatioPrimitive.Root bind:ref data-slot="aspect-ratio" {...restProps} />

View File

@ -0,0 +1,3 @@
import Root from "./aspect-ratio.svelte";
export { Root, Root as AspectRatio };

View File

@ -0,0 +1,17 @@
<script lang="ts">
import { Avatar as AvatarPrimitive } from "bits-ui";
import { cn } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
...restProps
}: AvatarPrimitive.FallbackProps = $props();
</script>
<AvatarPrimitive.Fallback
bind:ref
data-slot="avatar-fallback"
class={cn("bg-muted flex size-full items-center justify-center rounded-full", className)}
{...restProps}
/>

View File

@ -0,0 +1,17 @@
<script lang="ts">
import { Avatar as AvatarPrimitive } from "bits-ui";
import { cn } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
...restProps
}: AvatarPrimitive.ImageProps = $props();
</script>
<AvatarPrimitive.Image
bind:ref
data-slot="avatar-image"
class={cn("aspect-square size-full", className)}
{...restProps}
/>

View File

@ -0,0 +1,19 @@
<script lang="ts">
import { Avatar as AvatarPrimitive } from "bits-ui";
import { cn } from "$lib/utils.js";
let {
ref = $bindable(null),
loadingStatus = $bindable("loading"),
class: className,
...restProps
}: AvatarPrimitive.RootProps = $props();
</script>
<AvatarPrimitive.Root
bind:ref
bind:loadingStatus
data-slot="avatar"
class={cn("relative flex size-8 shrink-0 overflow-hidden rounded-full", className)}
{...restProps}
/>

View File

@ -0,0 +1,13 @@
import Root from "./avatar.svelte";
import Image from "./avatar-image.svelte";
import Fallback from "./avatar-fallback.svelte";
export {
Root,
Image,
Fallback,
//
Root as Avatar,
Image as AvatarImage,
Fallback as AvatarFallback,
};

View File

@ -0,0 +1,50 @@
<script lang="ts" module>
import { type VariantProps, tv } from "tailwind-variants";
export const badgeVariants = tv({
base: "focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden whitespace-nowrap rounded-full border px-2 py-0.5 text-xs font-medium transition-[color,box-shadow] focus-visible:ring-[3px] [&>svg]:pointer-events-none [&>svg]:size-3",
variants: {
variant: {
default:
"bg-primary text-primary-foreground [a&]:hover:bg-primary/90 border-transparent",
secondary:
"bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90 border-transparent",
destructive:
"bg-destructive [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/70 border-transparent text-white",
outline: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
},
},
defaultVariants: {
variant: "default",
},
});
export type BadgeVariant = VariantProps<typeof badgeVariants>["variant"];
</script>
<script lang="ts">
import type { HTMLAnchorAttributes } from "svelte/elements";
import { cn, type WithElementRef } from "$lib/utils.js";
let {
ref = $bindable(null),
href,
class: className,
variant = "default",
children,
...restProps
}: WithElementRef<HTMLAnchorAttributes> & {
variant?: BadgeVariant;
} = $props();
</script>
<svelte:element
this={href ? "a" : "span"}
bind:this={ref}
data-slot="badge"
{href}
class={cn(badgeVariants({ variant }), className)}
{...restProps}
>
{@render children?.()}
</svelte:element>

View File

@ -0,0 +1,2 @@
export { default as Badge } from "./badge.svelte";
export { badgeVariants, type BadgeVariant } from "./badge.svelte";

View File

@ -0,0 +1,23 @@
<script lang="ts">
import EllipsisIcon from "@lucide/svelte/icons/ellipsis";
import type { HTMLAttributes } from "svelte/elements";
import { cn, type WithElementRef, type WithoutChildren } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
...restProps
}: WithoutChildren<WithElementRef<HTMLAttributes<HTMLSpanElement>>> = $props();
</script>
<span
bind:this={ref}
data-slot="breadcrumb-ellipsis"
role="presentation"
aria-hidden="true"
class={cn("flex size-9 items-center justify-center", className)}
{...restProps}
>
<EllipsisIcon class="size-4" />
<span class="sr-only">More</span>
</span>

View File

@ -0,0 +1,20 @@
<script lang="ts">
import type { HTMLLiAttributes } from "svelte/elements";
import { cn, type WithElementRef } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
children,
...restProps
}: WithElementRef<HTMLLiAttributes> = $props();
</script>
<li
bind:this={ref}
data-slot="breadcrumb-item"
class={cn("inline-flex items-center gap-1.5", className)}
{...restProps}
>
{@render children?.()}
</li>

View File

@ -0,0 +1,31 @@
<script lang="ts">
import type { HTMLAnchorAttributes } from "svelte/elements";
import type { Snippet } from "svelte";
import { cn, type WithElementRef } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
href = undefined,
child,
children,
...restProps
}: WithElementRef<HTMLAnchorAttributes> & {
child?: Snippet<[{ props: HTMLAnchorAttributes }]>;
} = $props();
const attrs = $derived({
"data-slot": "breadcrumb-link",
class: cn("hover:text-foreground transition-colors", className),
href,
...restProps,
});
</script>
{#if child}
{@render child({ props: attrs })}
{:else}
<a bind:this={ref} {...attrs}>
{@render children?.()}
</a>
{/if}

View File

@ -0,0 +1,23 @@
<script lang="ts">
import type { HTMLOlAttributes } from "svelte/elements";
import { cn, type WithElementRef } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
children,
...restProps
}: WithElementRef<HTMLOlAttributes> = $props();
</script>
<ol
bind:this={ref}
data-slot="breadcrumb-list"
class={cn(
"text-muted-foreground flex flex-wrap items-center gap-1.5 break-words text-sm sm:gap-2.5",
className
)}
{...restProps}
>
{@render children?.()}
</ol>

View File

@ -0,0 +1,23 @@
<script lang="ts">
import type { HTMLAttributes } from "svelte/elements";
import { cn, type WithElementRef } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
children,
...restProps
}: WithElementRef<HTMLAttributes<HTMLSpanElement>> = $props();
</script>
<span
bind:this={ref}
data-slot="breadcrumb-page"
role="link"
aria-disabled="true"
aria-current="page"
class={cn("text-foreground font-normal", className)}
{...restProps}
>
{@render children?.()}
</span>

View File

@ -0,0 +1,27 @@
<script lang="ts">
import ChevronRightIcon from "@lucide/svelte/icons/chevron-right";
import { cn, type WithElementRef } from "$lib/utils.js";
import type { HTMLLiAttributes } from "svelte/elements";
let {
ref = $bindable(null),
class: className,
children,
...restProps
}: WithElementRef<HTMLLiAttributes> = $props();
</script>
<li
bind:this={ref}
data-slot="breadcrumb-separator"
role="presentation"
aria-hidden="true"
class={cn("[&>svg]:size-3.5", className)}
{...restProps}
>
{#if children}
{@render children?.()}
{:else}
<ChevronRightIcon />
{/if}
</li>

View File

@ -0,0 +1,21 @@
<script lang="ts">
import type { WithElementRef } from "$lib/utils.js";
import type { HTMLAttributes } from "svelte/elements";
let {
ref = $bindable(null),
class: className,
children,
...restProps
}: WithElementRef<HTMLAttributes<HTMLElement>> = $props();
</script>
<nav
bind:this={ref}
data-slot="breadcrumb"
class={className}
aria-label="breadcrumb"
{...restProps}
>
{@render children?.()}
</nav>

View File

@ -0,0 +1,25 @@
import Root from "./breadcrumb.svelte";
import Ellipsis from "./breadcrumb-ellipsis.svelte";
import Item from "./breadcrumb-item.svelte";
import Separator from "./breadcrumb-separator.svelte";
import Link from "./breadcrumb-link.svelte";
import List from "./breadcrumb-list.svelte";
import Page from "./breadcrumb-page.svelte";
export {
Root,
Ellipsis,
Item,
Separator,
Link,
List,
Page,
//
Root as Breadcrumb,
Ellipsis as BreadcrumbEllipsis,
Item as BreadcrumbItem,
Separator as BreadcrumbSeparator,
Link as BreadcrumbLink,
List as BreadcrumbList,
Page as BreadcrumbPage,
};

View File

@ -0,0 +1,20 @@
<script lang="ts">
import { cn } from "$lib/utils.js";
import type { ComponentProps } from "svelte";
import { Separator } from "$lib/components/ui/separator/index.js";
let {
ref = $bindable(null),
class: className,
orientation = "vertical",
...restProps
}: ComponentProps<typeof Separator> = $props();
</script>
<Separator
bind:ref
data-slot="button-group-separator"
{orientation}
class={cn("bg-input relative !m-0 self-stretch data-[orientation=vertical]:h-auto", className)}
{...restProps}
/>

View File

@ -0,0 +1,30 @@
<script lang="ts">
import { cn, type WithElementRef } from "$lib/utils.js";
import type { HTMLAttributes } from "svelte/elements";
import type { Snippet } from "svelte";
let {
ref = $bindable(null),
class: className,
child,
...restProps
}: WithElementRef<HTMLAttributes<HTMLDivElement>> & {
child?: Snippet<[{ props: Record<string, unknown> }]>;
} = $props();
const mergedProps = $derived({
...restProps,
class: cn(
"bg-muted shadow-xs flex items-center gap-2 rounded-md border px-4 text-sm font-medium [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none",
className
),
});
</script>
{#if child}
{@render child({ props: mergedProps })}
{:else}
<div bind:this={ref} {...mergedProps}>
{@render mergedProps.children?.()}
</div>
{/if}

View File

@ -0,0 +1,46 @@
<script lang="ts" module>
import { tv, type VariantProps } from "tailwind-variants";
export const buttonGroupVariants = tv({
base: "flex w-fit items-stretch has-[>[data-slot=button-group]]:gap-2 [&>*]:focus-visible:relative [&>*]:focus-visible:z-10 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1",
variants: {
orientation: {
horizontal:
"[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none",
vertical:
"flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none",
},
},
defaultVariants: {
orientation: "horizontal",
},
});
export type ButtonGroupOrientation = VariantProps<typeof buttonGroupVariants>["orientation"];
</script>
<script lang="ts">
import { cn, type WithElementRef } from "$lib/utils.js";
import type { HTMLAttributes } from "svelte/elements";
let {
ref = $bindable(null),
class: className,
children,
orientation = "horizontal",
...restProps
}: WithElementRef<HTMLAttributes<HTMLDivElement>> & {
orientation?: ButtonGroupOrientation;
} = $props();
</script>
<div
bind:this={ref}
role="group"
data-slot="button-group"
data-orientation={orientation}
class={cn(buttonGroupVariants({ orientation }), className)}
{...restProps}
>
{@render children?.()}
</div>

View File

@ -0,0 +1,13 @@
import Root from "./button-group.svelte";
import Text from "./button-group-text.svelte";
import Separator from "./button-group-separator.svelte";
export {
Root,
Text,
Separator,
//
Root as ButtonGroup,
Text as ButtonGroupText,
Separator as ButtonGroupSeparator,
};

View File

@ -0,0 +1,82 @@
<script lang="ts" module>
import { cn, type WithElementRef } from "$lib/utils.js";
import type { HTMLAnchorAttributes, HTMLButtonAttributes } from "svelte/elements";
import { type VariantProps, tv } from "tailwind-variants";
export const buttonVariants = tv({
base: "focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium outline-none transition-all focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0",
variants: {
variant: {
default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
destructive:
"bg-destructive shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60 text-white",
outline:
"bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 border",
secondary: "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
link: "text-primary underline-offset-4 hover:underline",
},
size: {
default: "h-9 px-4 py-2 has-[>svg]:px-3",
sm: "h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5",
lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
icon: "size-9",
"icon-sm": "size-8",
"icon-lg": "size-10",
},
},
defaultVariants: {
variant: "default",
size: "default",
},
});
export type ButtonVariant = VariantProps<typeof buttonVariants>["variant"];
export type ButtonSize = VariantProps<typeof buttonVariants>["size"];
export type ButtonProps = WithElementRef<HTMLButtonAttributes> &
WithElementRef<HTMLAnchorAttributes> & {
variant?: ButtonVariant;
size?: ButtonSize;
};
</script>
<script lang="ts">
let {
class: className,
variant = "default",
size = "default",
ref = $bindable(null),
href = undefined,
type = "button",
disabled,
children,
...restProps
}: ButtonProps = $props();
</script>
{#if href}
<a
bind:this={ref}
data-slot="button"
class={cn(buttonVariants({ variant, size }), className)}
href={disabled ? undefined : href}
aria-disabled={disabled}
role={disabled ? "link" : undefined}
tabindex={disabled ? -1 : undefined}
{...restProps}
>
{@render children?.()}
</a>
{:else}
<button
bind:this={ref}
data-slot="button"
class={cn(buttonVariants({ variant, size }), className)}
{type}
{disabled}
{...restProps}
>
{@render children?.()}
</button>
{/if}

View File

@ -0,0 +1,17 @@
import Root, {
type ButtonProps,
type ButtonSize,
type ButtonVariant,
buttonVariants,
} from "./button.svelte";
export {
Root,
type ButtonProps as Props,
//
Root as Button,
buttonVariants,
type ButtonProps,
type ButtonSize,
type ButtonVariant,
};

View File

@ -0,0 +1,76 @@
<script lang="ts">
import type { ComponentProps } from "svelte";
import type Calendar from "./calendar.svelte";
import CalendarMonthSelect from "./calendar-month-select.svelte";
import CalendarYearSelect from "./calendar-year-select.svelte";
import { DateFormatter, getLocalTimeZone, type DateValue } from "@internationalized/date";
let {
captionLayout,
months,
monthFormat,
years,
yearFormat,
month,
locale,
placeholder = $bindable(),
monthIndex = 0,
}: {
captionLayout: ComponentProps<typeof Calendar>["captionLayout"];
months: ComponentProps<typeof CalendarMonthSelect>["months"];
monthFormat: ComponentProps<typeof CalendarMonthSelect>["monthFormat"];
years: ComponentProps<typeof CalendarYearSelect>["years"];
yearFormat: ComponentProps<typeof CalendarYearSelect>["yearFormat"];
month: DateValue;
placeholder: DateValue | undefined;
locale: string;
monthIndex: number;
} = $props();
function formatYear(date: DateValue) {
const dateObj = date.toDate(getLocalTimeZone());
if (typeof yearFormat === "function") return yearFormat(dateObj.getFullYear());
return new DateFormatter(locale, { year: yearFormat }).format(dateObj);
}
function formatMonth(date: DateValue) {
const dateObj = date.toDate(getLocalTimeZone());
if (typeof monthFormat === "function") return monthFormat(dateObj.getMonth() + 1);
return new DateFormatter(locale, { month: monthFormat }).format(dateObj);
}
</script>
{#snippet MonthSelect()}
<CalendarMonthSelect
{months}
{monthFormat}
value={month.month}
onchange={(e) => {
if (!placeholder) return;
const v = Number.parseInt(e.currentTarget.value);
const newPlaceholder = placeholder.set({ month: v });
placeholder = newPlaceholder.subtract({ months: monthIndex });
}}
/>
{/snippet}
{#snippet YearSelect()}
<CalendarYearSelect {years} {yearFormat} value={month.year} />
{/snippet}
{#if captionLayout === "dropdown"}
{@render MonthSelect()}
{@render YearSelect()}
{:else if captionLayout === "dropdown-months"}
{@render MonthSelect()}
{#if placeholder}
{formatYear(placeholder)}
{/if}
{:else if captionLayout === "dropdown-years"}
{#if placeholder}
{formatMonth(placeholder)}
{/if}
{@render YearSelect()}
{:else}
{formatMonth(month)} {formatYear(month)}
{/if}

View File

@ -0,0 +1,19 @@
<script lang="ts">
import { Calendar as CalendarPrimitive } from "bits-ui";
import { cn } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
...restProps
}: CalendarPrimitive.CellProps = $props();
</script>
<CalendarPrimitive.Cell
bind:ref
class={cn(
"size-(--cell-size) relative p-0 text-center text-sm focus-within:z-20 [&:first-child[data-selected]_[data-bits-day]]:rounded-l-md [&:last-child[data-selected]_[data-bits-day]]:rounded-r-md",
className
)}
{...restProps}
/>

View File

@ -0,0 +1,35 @@
<script lang="ts">
import { buttonVariants } from "$lib/components/ui/button/index.js";
import { cn } from "$lib/utils.js";
import { Calendar as CalendarPrimitive } from "bits-ui";
let {
ref = $bindable(null),
class: className,
...restProps
}: CalendarPrimitive.DayProps = $props();
</script>
<CalendarPrimitive.Day
bind:ref
class={cn(
buttonVariants({ variant: "ghost" }),
"size-(--cell-size) flex select-none flex-col items-center justify-center gap-1 whitespace-nowrap p-0 font-normal leading-none",
"[&[data-today]:not([data-selected])]:bg-accent [&[data-today]:not([data-selected])]:text-accent-foreground [&[data-today][data-disabled]]:text-muted-foreground",
"data-[selected]:bg-primary dark:data-[selected]:hover:bg-accent/50 data-[selected]:text-primary-foreground",
// Outside months
"[&[data-outside-month]:not([data-selected])]:text-muted-foreground [&[data-outside-month]:not([data-selected])]:hover:text-accent-foreground",
// Disabled
"data-[disabled]:text-muted-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
// Unavailable
"data-[unavailable]:text-muted-foreground data-[unavailable]:line-through",
// hover
"dark:hover:text-accent-foreground",
// focus
"focus:border-ring focus:ring-ring/50 focus:relative",
// inner spans
"[&>span]:text-xs [&>span]:opacity-70",
className
)}
{...restProps}
/>

View File

@ -0,0 +1,12 @@
<script lang="ts">
import { Calendar as CalendarPrimitive } from "bits-ui";
import { cn } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
...restProps
}: CalendarPrimitive.GridBodyProps = $props();
</script>
<CalendarPrimitive.GridBody bind:ref class={cn(className)} {...restProps} />

View File

@ -0,0 +1,12 @@
<script lang="ts">
import { Calendar as CalendarPrimitive } from "bits-ui";
import { cn } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
...restProps
}: CalendarPrimitive.GridHeadProps = $props();
</script>
<CalendarPrimitive.GridHead bind:ref class={cn(className)} {...restProps} />

View File

@ -0,0 +1,12 @@
<script lang="ts">
import { Calendar as CalendarPrimitive } from "bits-ui";
import { cn } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
...restProps
}: CalendarPrimitive.GridRowProps = $props();
</script>
<CalendarPrimitive.GridRow bind:ref class={cn("flex", className)} {...restProps} />

View File

@ -0,0 +1,16 @@
<script lang="ts">
import { Calendar as CalendarPrimitive } from "bits-ui";
import { cn } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
...restProps
}: CalendarPrimitive.GridProps = $props();
</script>
<CalendarPrimitive.Grid
bind:ref
class={cn("mt-4 flex w-full border-collapse flex-col gap-1", className)}
{...restProps}
/>

View File

@ -0,0 +1,19 @@
<script lang="ts">
import { Calendar as CalendarPrimitive } from "bits-ui";
import { cn } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
...restProps
}: CalendarPrimitive.HeadCellProps = $props();
</script>
<CalendarPrimitive.HeadCell
bind:ref
class={cn(
"text-muted-foreground w-(--cell-size) rounded-md text-[0.8rem] font-normal",
className
)}
{...restProps}
/>

View File

@ -0,0 +1,19 @@
<script lang="ts">
import { Calendar as CalendarPrimitive } from "bits-ui";
import { cn } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
...restProps
}: CalendarPrimitive.HeaderProps = $props();
</script>
<CalendarPrimitive.Header
bind:ref
class={cn(
"h-(--cell-size) flex w-full items-center justify-center gap-1.5 text-sm font-medium",
className
)}
{...restProps}
/>

View File

@ -0,0 +1,16 @@
<script lang="ts">
import { Calendar as CalendarPrimitive } from "bits-ui";
import { cn } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
...restProps
}: CalendarPrimitive.HeadingProps = $props();
</script>
<CalendarPrimitive.Heading
bind:ref
class={cn("px-(--cell-size) text-sm font-medium", className)}
{...restProps}
/>

View File

@ -0,0 +1,44 @@
<script lang="ts">
import { Calendar as CalendarPrimitive } from "bits-ui";
import { cn, type WithoutChildrenOrChild } from "$lib/utils.js";
import ChevronDownIcon from "@lucide/svelte/icons/chevron-down";
let {
ref = $bindable(null),
class: className,
value,
onchange,
...restProps
}: WithoutChildrenOrChild<CalendarPrimitive.MonthSelectProps> = $props();
</script>
<span
class={cn(
"has-focus:border-ring border-input shadow-xs has-focus:ring-ring/50 has-focus:ring-[3px] relative flex rounded-md border",
className
)}
>
<CalendarPrimitive.MonthSelect bind:ref class="absolute inset-0 opacity-0" {...restProps}>
{#snippet child({ props, monthItems, selectedMonthItem })}
<select {...props} {value} {onchange}>
{#each monthItems as monthItem (monthItem.value)}
<option
value={monthItem.value}
selected={value !== undefined
? monthItem.value === value
: monthItem.value === selectedMonthItem.value}
>
{monthItem.label}
</option>
{/each}
</select>
<span
class="[&>svg]:text-muted-foreground flex h-8 select-none items-center gap-1 rounded-md pl-2 pr-1 text-sm font-medium [&>svg]:size-3.5"
aria-hidden="true"
>
{monthItems.find((item) => item.value === value)?.label || selectedMonthItem.label}
<ChevronDownIcon class="size-4" />
</span>
{/snippet}
</CalendarPrimitive.MonthSelect>
</span>

View File

@ -0,0 +1,15 @@
<script lang="ts">
import { type WithElementRef, cn } from "$lib/utils.js";
import type { HTMLAttributes } from "svelte/elements";
let {
ref = $bindable(null),
class: className,
children,
...restProps
}: WithElementRef<HTMLAttributes<HTMLElement>> = $props();
</script>
<div {...restProps} bind:this={ref} class={cn("flex flex-col", className)}>
{@render children?.()}
</div>

View File

@ -0,0 +1,19 @@
<script lang="ts">
import type { HTMLAttributes } from "svelte/elements";
import { cn, type WithElementRef } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
children,
...restProps
}: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props();
</script>
<div
bind:this={ref}
class={cn("relative flex flex-col gap-4 md:flex-row", className)}
{...restProps}
>
{@render children?.()}
</div>

View File

@ -0,0 +1,19 @@
<script lang="ts">
import { cn, type WithElementRef } from "$lib/utils.js";
import type { HTMLAttributes } from "svelte/elements";
let {
ref = $bindable(null),
class: className,
children,
...restProps
}: WithElementRef<HTMLAttributes<HTMLElement>> = $props();
</script>
<nav
{...restProps}
bind:this={ref}
class={cn("absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1", className)}
>
{@render children?.()}
</nav>

View File

@ -0,0 +1,31 @@
<script lang="ts">
import { Calendar as CalendarPrimitive } from "bits-ui";
import ChevronRightIcon from "@lucide/svelte/icons/chevron-right";
import { buttonVariants, type ButtonVariant } from "$lib/components/ui/button/index.js";
import { cn } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
children,
variant = "ghost",
...restProps
}: CalendarPrimitive.NextButtonProps & {
variant?: ButtonVariant;
} = $props();
</script>
{#snippet Fallback()}
<ChevronRightIcon class="size-4" />
{/snippet}
<CalendarPrimitive.NextButton
bind:ref
class={cn(
buttonVariants({ variant }),
"size-(--cell-size) select-none bg-transparent p-0 disabled:opacity-50 rtl:rotate-180",
className
)}
children={children || Fallback}
{...restProps}
/>

View File

@ -0,0 +1,31 @@
<script lang="ts">
import { Calendar as CalendarPrimitive } from "bits-ui";
import ChevronLeftIcon from "@lucide/svelte/icons/chevron-left";
import { buttonVariants, type ButtonVariant } from "$lib/components/ui/button/index.js";
import { cn } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
children,
variant = "ghost",
...restProps
}: CalendarPrimitive.PrevButtonProps & {
variant?: ButtonVariant;
} = $props();
</script>
{#snippet Fallback()}
<ChevronLeftIcon class="size-4" />
{/snippet}
<CalendarPrimitive.PrevButton
bind:ref
class={cn(
buttonVariants({ variant }),
"size-(--cell-size) select-none bg-transparent p-0 disabled:opacity-50 rtl:rotate-180",
className
)}
children={children || Fallback}
{...restProps}
/>

View File

@ -0,0 +1,43 @@
<script lang="ts">
import { Calendar as CalendarPrimitive } from "bits-ui";
import { cn, type WithoutChildrenOrChild } from "$lib/utils.js";
import ChevronDownIcon from "@lucide/svelte/icons/chevron-down";
let {
ref = $bindable(null),
class: className,
value,
...restProps
}: WithoutChildrenOrChild<CalendarPrimitive.YearSelectProps> = $props();
</script>
<span
class={cn(
"has-focus:border-ring border-input shadow-xs has-focus:ring-ring/50 has-focus:ring-[3px] relative flex rounded-md border",
className
)}
>
<CalendarPrimitive.YearSelect bind:ref class="absolute inset-0 opacity-0" {...restProps}>
{#snippet child({ props, yearItems, selectedYearItem })}
<select {...props} {value}>
{#each yearItems as yearItem (yearItem.value)}
<option
value={yearItem.value}
selected={value !== undefined
? yearItem.value === value
: yearItem.value === selectedYearItem.value}
>
{yearItem.label}
</option>
{/each}
</select>
<span
class="[&>svg]:text-muted-foreground flex h-8 select-none items-center gap-1 rounded-md pl-2 pr-1 text-sm font-medium [&>svg]:size-3.5"
aria-hidden="true"
>
{yearItems.find((item) => item.value === value)?.label || selectedYearItem.label}
<ChevronDownIcon class="size-4" />
</span>
{/snippet}
</CalendarPrimitive.YearSelect>
</span>

View File

@ -0,0 +1,115 @@
<script lang="ts">
import { Calendar as CalendarPrimitive } from "bits-ui";
import * as Calendar from "./index.js";
import { cn, type WithoutChildrenOrChild } from "$lib/utils.js";
import type { ButtonVariant } from "../button/button.svelte";
import { isEqualMonth, type DateValue } from "@internationalized/date";
import type { Snippet } from "svelte";
let {
ref = $bindable(null),
value = $bindable(),
placeholder = $bindable(),
class: className,
weekdayFormat = "short",
buttonVariant = "ghost",
captionLayout = "label",
locale = "en-US",
months: monthsProp,
years,
monthFormat: monthFormatProp,
yearFormat = "numeric",
day,
disableDaysOutsideMonth = false,
...restProps
}: WithoutChildrenOrChild<CalendarPrimitive.RootProps> & {
buttonVariant?: ButtonVariant;
captionLayout?: "dropdown" | "dropdown-months" | "dropdown-years" | "label";
months?: CalendarPrimitive.MonthSelectProps["months"];
years?: CalendarPrimitive.YearSelectProps["years"];
monthFormat?: CalendarPrimitive.MonthSelectProps["monthFormat"];
yearFormat?: CalendarPrimitive.YearSelectProps["yearFormat"];
day?: Snippet<[{ day: DateValue; outsideMonth: boolean }]>;
} = $props();
const monthFormat = $derived.by(() => {
if (monthFormatProp) return monthFormatProp;
if (captionLayout.startsWith("dropdown")) return "short";
return "long";
});
</script>
<!--
Discriminated Unions + Destructing (required for bindable) do not
get along, so we shut typescript up by casting `value` to `never`.
-->
<CalendarPrimitive.Root
bind:value={value as never}
bind:ref
bind:placeholder
{weekdayFormat}
{disableDaysOutsideMonth}
class={cn(
"bg-background group/calendar p-3 [--cell-size:--spacing(8)] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent",
className
)}
{locale}
{monthFormat}
{yearFormat}
{...restProps}
>
{#snippet children({ months, weekdays })}
<Calendar.Months>
<Calendar.Nav>
<Calendar.PrevButton variant={buttonVariant} />
<Calendar.NextButton variant={buttonVariant} />
</Calendar.Nav>
{#each months as month, monthIndex (month)}
<Calendar.Month>
<Calendar.Header>
<Calendar.Caption
{captionLayout}
months={monthsProp}
{monthFormat}
{years}
{yearFormat}
month={month.value}
bind:placeholder
{locale}
{monthIndex}
/>
</Calendar.Header>
<Calendar.Grid>
<Calendar.GridHead>
<Calendar.GridRow class="select-none">
{#each weekdays as weekday (weekday)}
<Calendar.HeadCell>
{weekday.slice(0, 2)}
</Calendar.HeadCell>
{/each}
</Calendar.GridRow>
</Calendar.GridHead>
<Calendar.GridBody>
{#each month.weeks as weekDates (weekDates)}
<Calendar.GridRow class="mt-2 w-full">
{#each weekDates as date (date)}
<Calendar.Cell {date} month={month.value}>
{#if day}
{@render day({
day: date,
outsideMonth: !isEqualMonth(date, month.value),
})}
{:else}
<Calendar.Day />
{/if}
</Calendar.Cell>
{/each}
</Calendar.GridRow>
{/each}
</Calendar.GridBody>
</Calendar.Grid>
</Calendar.Month>
{/each}
</Calendar.Months>
{/snippet}
</CalendarPrimitive.Root>

View File

@ -0,0 +1,40 @@
import Root from "./calendar.svelte";
import Cell from "./calendar-cell.svelte";
import Day from "./calendar-day.svelte";
import Grid from "./calendar-grid.svelte";
import Header from "./calendar-header.svelte";
import Months from "./calendar-months.svelte";
import GridRow from "./calendar-grid-row.svelte";
import Heading from "./calendar-heading.svelte";
import GridBody from "./calendar-grid-body.svelte";
import GridHead from "./calendar-grid-head.svelte";
import HeadCell from "./calendar-head-cell.svelte";
import NextButton from "./calendar-next-button.svelte";
import PrevButton from "./calendar-prev-button.svelte";
import MonthSelect from "./calendar-month-select.svelte";
import YearSelect from "./calendar-year-select.svelte";
import Month from "./calendar-month.svelte";
import Nav from "./calendar-nav.svelte";
import Caption from "./calendar-caption.svelte";
export {
Day,
Cell,
Grid,
Header,
Months,
GridRow,
Heading,
GridBody,
GridHead,
HeadCell,
NextButton,
PrevButton,
Nav,
Month,
YearSelect,
MonthSelect,
Caption,
//
Root as Calendar,
};

View File

@ -0,0 +1,20 @@
<script lang="ts">
import { cn, type WithElementRef } from "$lib/utils.js";
import type { HTMLAttributes } from "svelte/elements";
let {
ref = $bindable(null),
class: className,
children,
...restProps
}: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props();
</script>
<div
bind:this={ref}
data-slot="card-action"
class={cn("col-start-2 row-span-2 row-start-1 self-start justify-self-end", className)}
{...restProps}
>
{@render children?.()}
</div>

View File

@ -0,0 +1,15 @@
<script lang="ts">
import type { HTMLAttributes } from "svelte/elements";
import { cn, type WithElementRef } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
children,
...restProps
}: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props();
</script>
<div bind:this={ref} data-slot="card-content" class={cn("px-6", className)} {...restProps}>
{@render children?.()}
</div>

View File

@ -0,0 +1,20 @@
<script lang="ts">
import type { HTMLAttributes } from "svelte/elements";
import { cn, type WithElementRef } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
children,
...restProps
}: WithElementRef<HTMLAttributes<HTMLParagraphElement>> = $props();
</script>
<p
bind:this={ref}
data-slot="card-description"
class={cn("text-muted-foreground text-sm", className)}
{...restProps}
>
{@render children?.()}
</p>

View File

@ -0,0 +1,20 @@
<script lang="ts">
import { cn, type WithElementRef } from "$lib/utils.js";
import type { HTMLAttributes } from "svelte/elements";
let {
ref = $bindable(null),
class: className,
children,
...restProps
}: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props();
</script>
<div
bind:this={ref}
data-slot="card-footer"
class={cn("[.border-t]:pt-6 flex items-center px-6", className)}
{...restProps}
>
{@render children?.()}
</div>

View File

@ -0,0 +1,23 @@
<script lang="ts">
import { cn, type WithElementRef } from "$lib/utils.js";
import type { HTMLAttributes } from "svelte/elements";
let {
ref = $bindable(null),
class: className,
children,
...restProps
}: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props();
</script>
<div
bind:this={ref}
data-slot="card-header"
class={cn(
"@container/card-header has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6 grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6",
className
)}
{...restProps}
>
{@render children?.()}
</div>

View File

@ -0,0 +1,20 @@
<script lang="ts">
import type { HTMLAttributes } from "svelte/elements";
import { cn, type WithElementRef } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
children,
...restProps
}: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props();
</script>
<div
bind:this={ref}
data-slot="card-title"
class={cn("font-semibold leading-none", className)}
{...restProps}
>
{@render children?.()}
</div>

View File

@ -0,0 +1,23 @@
<script lang="ts">
import type { HTMLAttributes } from "svelte/elements";
import { cn, type WithElementRef } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
children,
...restProps
}: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props();
</script>
<div
bind:this={ref}
data-slot="card"
class={cn(
"bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",
className
)}
{...restProps}
>
{@render children?.()}
</div>

View File

@ -0,0 +1,25 @@
import Root from "./card.svelte";
import Content from "./card-content.svelte";
import Description from "./card-description.svelte";
import Footer from "./card-footer.svelte";
import Header from "./card-header.svelte";
import Title from "./card-title.svelte";
import Action from "./card-action.svelte";
export {
Root,
Content,
Description,
Footer,
Header,
Title,
Action,
//
Root as Card,
Content as CardContent,
Description as CardDescription,
Footer as CardFooter,
Header as CardHeader,
Title as CardTitle,
Action as CardAction,
};

View File

@ -0,0 +1,43 @@
<script lang="ts">
import emblaCarouselSvelte from "embla-carousel-svelte";
import type { HTMLAttributes } from "svelte/elements";
import { getEmblaContext } from "./context.js";
import { cn, type WithElementRef } from "$lib/utils.js";
let {
ref = $bindable(null),
class: className,
children,
...restProps
}: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props();
const emblaCtx = getEmblaContext("<Carousel.Content/>");
</script>
<div
data-slot="carousel-content"
class="overflow-hidden"
use:emblaCarouselSvelte={{
options: {
container: "[data-embla-container]",
slides: "[data-embla-slide]",
...emblaCtx.options,
axis: emblaCtx.orientation === "horizontal" ? "x" : "y",
},
plugins: emblaCtx.plugins,
}}
onemblaInit={emblaCtx.onInit}
>
<div
bind:this={ref}
class={cn(
"flex",
emblaCtx.orientation === "horizontal" ? "-ml-4" : "-mt-4 flex-col",
className
)}
data-embla-container=""
{...restProps}
>
{@render children?.()}
</div>
</div>

Some files were not shown because too many files have changed in this diff Show More