From 2cd3d54ab3b9ff27e7277b6bf06e81b7065bbf54 Mon Sep 17 00:00:00 2001 From: Exelo Date: Thu, 28 May 2026 11:01:36 +0900 Subject: [PATCH 01/24] chore: clean pnpm workspace from unused elements --- pnpm-workspace.yaml | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 9fb5654..817245e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -75,24 +75,3 @@ catalogs: playwright: ^1.60.0 vitest: ^4.1.7 vitest-browser-svelte: ^2.1.1 - -minimumReleaseAgeExclude: - - '@iconify-json/material-icon-theme@1.2.66' - - '@nanoforge-dev/actions@2.0.0' - - '@nanoforge-dev/common@1.3.0' - - '@nanoforge-dev/ecs-lib@1.3.0' - - '@typescript-eslint/eslint-plugin@8.60.0' - - '@typescript-eslint/parser@8.60.0' - - '@typescript-eslint/project-service@8.60.0' - - '@typescript-eslint/scope-manager@8.60.0' - - '@typescript-eslint/tsconfig-utils@8.60.0' - - '@typescript-eslint/type-utils@8.60.0' - - '@typescript-eslint/types@8.60.0' - - '@typescript-eslint/typescript-estree@8.60.0' - - '@typescript-eslint/utils@8.60.0' - - '@typescript-eslint/visitor-keys@8.60.0' - - typescript-eslint@8.60.0 - -onlyBuiltDependencies: - - bun - - esbuild From 212641c30e83fa730ae8b9aed169b63e01335b9f Mon Sep 17 00:00:00 2001 From: Exelo Date: Thu, 28 May 2026 11:02:11 +0900 Subject: [PATCH 02/24] feat: add library and get packages routes --- .../action/repositories/library.repository.ts | 8 +++ .../action/repositories/package.repository.ts | 20 ++++-- src/lib/client/action/types/index.ts | 1 + src/lib/client/action/types/library.type.ts | 6 ++ src/lib/client/action/types/package.type.ts | 9 +-- .../project/library/install-library.action.ts | 16 +++++ .../project/package/add-components.action.ts | 4 +- .../project/package/add-systems.action.ts | 4 +- .../package/create-component.action.ts | 4 +- .../project/package/create-system.action.ts | 4 +- .../project/package/get-components.action.ts | 9 +++ .../project/package/get-systems.action.ts | 7 +++ src/lib/server/cli/cli.ts | 4 +- src/lib/server/project/library/index.ts | 1 + .../server/project/library/library-handler.ts | 36 +++++++++++ .../server/project/library/library.type.ts | 5 ++ src/lib/server/project/package/index.ts | 1 + .../server/project/package/package-handler.ts | 35 +++++++---- .../server/project/package/package.type.ts | 4 +- src/lib/server/project/project-handler.ts | 7 +++ src/lib/utils/format.ts | 61 +++++++++++++------ src/lib/utils/types/save.type.ts | 1 + .../actions/project/library/+page.server.ts | 5 ++ .../actions/project/package/+page.server.ts | 4 ++ 24 files changed, 201 insertions(+), 55 deletions(-) create mode 100644 src/lib/client/action/repositories/library.repository.ts create mode 100644 src/lib/client/action/types/library.type.ts create mode 100644 src/lib/server/actions/project/library/install-library.action.ts create mode 100644 src/lib/server/actions/project/package/get-components.action.ts create mode 100644 src/lib/server/actions/project/package/get-systems.action.ts create mode 100644 src/lib/server/project/library/index.ts create mode 100644 src/lib/server/project/library/library-handler.ts create mode 100644 src/lib/server/project/library/library.type.ts create mode 100644 src/lib/server/project/package/index.ts create mode 100644 src/routes/actions/project/library/+page.server.ts diff --git a/src/lib/client/action/repositories/library.repository.ts b/src/lib/client/action/repositories/library.repository.ts new file mode 100644 index 0000000..5ed4341 --- /dev/null +++ b/src/lib/client/action/repositories/library.repository.ts @@ -0,0 +1,8 @@ +import { BaseRepository } from '../base.repository'; +import type { InstallLibraryActionInput, InstallLibraryPackageResult } from '../types'; + +export class ProjectLibraryRepository extends BaseRepository { + install(input: InstallLibraryActionInput): Promise { + return this.run(`/actions/project/library?/install`, input); + } +} diff --git a/src/lib/client/action/repositories/package.repository.ts b/src/lib/client/action/repositories/package.repository.ts index a3e98d7..daeb816 100644 --- a/src/lib/client/action/repositories/package.repository.ts +++ b/src/lib/client/action/repositories/package.repository.ts @@ -4,28 +4,28 @@ import { BaseRepository } from '../base.repository'; import type { AddComponentsActionInput, AddSystemsActionInput, + ComponentPackageResult, CreateComponentActionInput, CreateSystemActionInput, GetComponentsManifestsActionInput, GetSystemsManifestsActionInput, - NewComponentPackageResult, - NewSystemPackageResult, + SystemPackageResult, } from '../types'; export class ProjectPackageRepository extends BaseRepository { - addComponents(input: AddComponentsActionInput): Promise { + addComponents(input: AddComponentsActionInput): Promise { return this.run(`/actions/project/package?/add-components`, input); } - addSystems(input: AddSystemsActionInput): Promise { + addSystems(input: AddSystemsActionInput): Promise { return this.run(`/actions/project/package?/add-systems`, input); } - createComponent(input: CreateComponentActionInput): Promise { + createComponent(input: CreateComponentActionInput): Promise { return this.run(`/actions/project/package?/create-component`, input); } - createSystem(input: CreateSystemActionInput): Promise { + createSystem(input: CreateSystemActionInput): Promise { return this.run(`/actions/project/package?/create-system`, input); } @@ -38,4 +38,12 @@ export class ProjectPackageRepository extends BaseRepository { getSystemsManifests(input: GetSystemsManifestsActionInput): Promise { return this.run(`/actions/project/package?/get-systems-manifests`, input); } + + getComponents(): Promise { + return this.run(`/actions/project/package?/get-components`); + } + + getSystems(): Promise { + return this.run(`/actions/project/package?/get-systems`); + } } diff --git a/src/lib/client/action/types/index.ts b/src/lib/client/action/types/index.ts index 78759b4..bd622f2 100644 --- a/src/lib/client/action/types/index.ts +++ b/src/lib/client/action/types/index.ts @@ -1,4 +1,5 @@ export * from './fs.type'; +export * from './library.type'; export * from './loader.type'; export * from './project.type'; export * from './package.type'; diff --git a/src/lib/client/action/types/library.type.ts b/src/lib/client/action/types/library.type.ts new file mode 100644 index 0000000..c3a3880 --- /dev/null +++ b/src/lib/client/action/types/library.type.ts @@ -0,0 +1,6 @@ +import type { InstallLibraryBody } from '$lib/server/actions/project/library/install-library.action'; +import type { LibraryPackage } from '$lib/server/project/library'; + +export type InstallLibraryActionInput = InstallLibraryBody; + +export type InstallLibraryPackageResult = LibraryPackage; diff --git a/src/lib/client/action/types/package.type.ts b/src/lib/client/action/types/package.type.ts index c347943..645db8c 100644 --- a/src/lib/client/action/types/package.type.ts +++ b/src/lib/client/action/types/package.type.ts @@ -4,14 +4,11 @@ import type { CreateComponentBody } from '$lib/server/actions/project/package/cr import type { CreateSystemBody } from '$lib/server/actions/project/package/create-system.action'; import type { GetComponentManifestBody } from '$lib/server/actions/project/package/get-components-manifests.action'; import type { GetSystemManifestBody } from '$lib/server/actions/project/package/get-systems-manifests.action'; -import type { - NewComponentPackage, - NewSystemPackage, -} from '$lib/server/project/package/package.type'; +import type { ComponentPackage, SystemPackage } from '$lib/server/project/package/package.type'; -export type NewComponentPackageResult = NewComponentPackage; +export type ComponentPackageResult = ComponentPackage; -export type NewSystemPackageResult = NewSystemPackage; +export type SystemPackageResult = SystemPackage; export type AddComponentsActionInput = AddComponentBody; diff --git a/src/lib/server/actions/project/library/install-library.action.ts b/src/lib/server/actions/project/library/install-library.action.ts new file mode 100644 index 0000000..5109b9c --- /dev/null +++ b/src/lib/server/actions/project/library/install-library.action.ts @@ -0,0 +1,16 @@ +import type { LibraryPackage } from '$lib/server/project/library'; + +import { useActionHandler } from '@utils-server/request-handler'; + +export class InstallLibraryBody { + libraryName!: string; +} + +export const installLibraryProjectAction = useActionHandler( + async ({ body, project }): Promise => { + return await project.client.library.installLibrary(body.libraryName); + }, + { + body: InstallLibraryBody, + }, +); diff --git a/src/lib/server/actions/project/package/add-components.action.ts b/src/lib/server/actions/project/package/add-components.action.ts index 670c0e6..1d7e495 100644 --- a/src/lib/server/actions/project/package/add-components.action.ts +++ b/src/lib/server/actions/project/package/add-components.action.ts @@ -1,4 +1,4 @@ -import type { NewComponentPackage } from '$lib/server/project/package/package.type'; +import type { ComponentPackage } from '$lib/server/project/package/package.type'; import { useActionHandler } from '@utils-server/request-handler'; @@ -7,7 +7,7 @@ export class AddComponentBody { } export const addComponentsProjectAction = useActionHandler( - async ({ body, project }): Promise => { + async ({ body, project }): Promise => { return await Promise.all( body.componentNames.map((componentName) => project.client.package.installComponent(componentName), diff --git a/src/lib/server/actions/project/package/add-systems.action.ts b/src/lib/server/actions/project/package/add-systems.action.ts index 96a4e92..96d7658 100644 --- a/src/lib/server/actions/project/package/add-systems.action.ts +++ b/src/lib/server/actions/project/package/add-systems.action.ts @@ -1,4 +1,4 @@ -import type { NewSystemPackage } from '$lib/server/project/package/package.type'; +import type { SystemPackage } from '$lib/server/project/package/package.type'; import { useActionHandler } from '@utils-server/request-handler'; @@ -7,7 +7,7 @@ export class AddSystemBody { } export const addSystemsProjectAction = useActionHandler( - async ({ body, project }): Promise => { + async ({ body, project }): Promise => { return await Promise.all( body.systemNames.map((systemName) => project.client.package.installSystem(systemName)), ); diff --git a/src/lib/server/actions/project/package/create-component.action.ts b/src/lib/server/actions/project/package/create-component.action.ts index 01adc91..a826e9d 100644 --- a/src/lib/server/actions/project/package/create-component.action.ts +++ b/src/lib/server/actions/project/package/create-component.action.ts @@ -1,4 +1,4 @@ -import type { NewComponentPackage } from '$lib/server/project/package/package.type'; +import type { ComponentPackage } from '$lib/server/project/package/package.type'; import { useActionHandler } from '@utils-server/request-handler'; @@ -7,7 +7,7 @@ export class CreateComponentBody { } export const createComponentProjectAction = useActionHandler( - async ({ body, project }): Promise => { + async ({ body, project }): Promise => { return project.client.package.createComponent(body.componentName); }, { diff --git a/src/lib/server/actions/project/package/create-system.action.ts b/src/lib/server/actions/project/package/create-system.action.ts index 12c102d..97963ef 100644 --- a/src/lib/server/actions/project/package/create-system.action.ts +++ b/src/lib/server/actions/project/package/create-system.action.ts @@ -1,4 +1,4 @@ -import type { NewSystemPackage } from '$lib/server/project/package/package.type'; +import type { SystemPackage } from '$lib/server/project/package/package.type'; import { useActionHandler } from '@utils-server/request-handler'; @@ -7,7 +7,7 @@ export class CreateSystemBody { } export const createSystemProjectAction = useActionHandler( - async ({ body, project }): Promise => { + async ({ body, project }): Promise => { return project.client.package.createSystem(body.systemName); }, { diff --git a/src/lib/server/actions/project/package/get-components.action.ts b/src/lib/server/actions/project/package/get-components.action.ts new file mode 100644 index 0000000..31387d8 --- /dev/null +++ b/src/lib/server/actions/project/package/get-components.action.ts @@ -0,0 +1,9 @@ +import type { ComponentPackage } from '$lib/server/project/package'; + +import { useActionHandler } from '@utils-server/request-handler'; + +export const getComponentsAction = useActionHandler( + async ({ project }): Promise => { + return await project.client.package.getComponents(); + }, +); diff --git a/src/lib/server/actions/project/package/get-systems.action.ts b/src/lib/server/actions/project/package/get-systems.action.ts new file mode 100644 index 0000000..53b9c0b --- /dev/null +++ b/src/lib/server/actions/project/package/get-systems.action.ts @@ -0,0 +1,7 @@ +import type { SystemPackage } from '$lib/server/project/package'; + +import { useActionHandler } from '@utils-server/request-handler'; + +export const getSystemsAction = useActionHandler(async ({ project }): Promise => { + return await project.client.package.getSystems(); +}); diff --git a/src/lib/server/cli/cli.ts b/src/lib/server/cli/cli.ts index 67f8da6..7eb578a 100644 --- a/src/lib/server/cli/cli.ts +++ b/src/lib/server/cli/cli.ts @@ -10,7 +10,7 @@ import { CLI_START_DEFAULTS, } from '$lib/server/cli/cli-defaults'; -import { camelToKebab } from '@utils/format'; +import { formatFrom } from '@utils/format'; import type { Context } from '@utils-server/request-handler'; @@ -173,7 +173,7 @@ export class Cli { ): string[] { const params = []; for (const [key, value] of Object.entries(this.mergeParams(defaultOpts, opts))) { - const name = camelToKebab(key); + const name = formatFrom.camel(key).toKebab(); if (typeof value === 'boolean') { if (value) params.push(`--${name}`); diff --git a/src/lib/server/project/library/index.ts b/src/lib/server/project/library/index.ts new file mode 100644 index 0000000..a08aaeb --- /dev/null +++ b/src/lib/server/project/library/index.ts @@ -0,0 +1 @@ +export * from './library.type'; diff --git a/src/lib/server/project/library/library-handler.ts b/src/lib/server/project/library/library-handler.ts new file mode 100644 index 0000000..7373816 --- /dev/null +++ b/src/lib/server/project/library/library-handler.ts @@ -0,0 +1,36 @@ +import { type ProjectHandler } from '$lib/server/project'; + +import { formatFrom } from '@utils/format'; + +import { type LibraryPackage } from './library.type'; + +export class LibraryHandler { + private readonly handler: ProjectHandler; + + constructor(handler: ProjectHandler) { + this.handler = handler; + } + + async installLibrary(name: string): Promise { + this.handler._cli.install([name], { + server: this.handler._part === 'server' || undefined, + lib: true, + }); + + return { + save: { + id: this._resolveIdFromName(name), + type: '', + name: '', + path: name, + }, + }; + } + + private _resolveIdFromName(name: string): string { + const [org, pkg] = name.split('/'); + if (!org || !pkg) throw new Error('Invalid library name'); + const id = !pkg ? org : pkg; + return `${formatFrom.kebab(id).toCamel()}Library`; + } +} diff --git a/src/lib/server/project/library/library.type.ts b/src/lib/server/project/library/library.type.ts new file mode 100644 index 0000000..20096aa --- /dev/null +++ b/src/lib/server/project/library/library.type.ts @@ -0,0 +1,5 @@ +import type { SaveLibrary } from '@utils/types'; + +export interface LibraryPackage { + save: SaveLibrary; +} diff --git a/src/lib/server/project/package/index.ts b/src/lib/server/project/package/index.ts new file mode 100644 index 0000000..defaadf --- /dev/null +++ b/src/lib/server/project/package/index.ts @@ -0,0 +1 @@ +export * from './package.type'; diff --git a/src/lib/server/project/package/package-handler.ts b/src/lib/server/project/package/package-handler.ts index 4ec20ed..e86083f 100644 --- a/src/lib/server/project/package/package-handler.ts +++ b/src/lib/server/project/package/package-handler.ts @@ -4,10 +4,10 @@ import { join } from 'path'; import { FileSystemError } from '$lib/server/file-system/file-system-error'; import { type ProjectHandler } from '$lib/server/project'; -import { toCamelCase, toKebabCase, toPascalCase } from '@utils/format'; +import { formatFrom } from '@utils/format'; import { resolveManifest } from './manifest-resolver'; -import { type NewComponentPackage, type NewSystemPackage, PackageTypeEnum } from './package.type'; +import { type ComponentPackage, PackageTypeEnum, type SystemPackage } from './package.type'; export class PackageHandler { private readonly handler: ProjectHandler; @@ -16,7 +16,7 @@ export class PackageHandler { this.handler = handler; } - async installComponent(name: string): Promise { + async installComponent(name: string): Promise { const rc = await this.handler._api.registry.getPackage(name); if (rc.type !== 'component') throw new Error(`Can only add component: ${name} is a ${rc.type}`); this.handler._cli.install([name], { server: this.handler._part === 'server' || undefined }); @@ -24,7 +24,7 @@ export class PackageHandler { return this._getNewComponentPackage(rc.name, rc._file); } - async installSystem(name: string): Promise { + async installSystem(name: string): Promise { const rs = await this.handler._api.registry.getPackage(name); if (rs.type !== 'system') throw new Error(`Can only add system: ${name} is a ${rs.type}`); this.handler._cli.install([name], { server: this.handler._part === 'server' || undefined }); @@ -38,11 +38,11 @@ export class PackageHandler { * * @param {string} name - Name of the component */ - createComponent(name: string): NewComponentPackage { + createComponent(name: string): ComponentPackage { this._createPackage(PackageTypeEnum.COMPONENT, name); return this._getNewComponentPackage( - toPascalCase(name) + 'Component', - toKebabCase(name) + '.component', + formatFrom.all(name).toPascal() + 'Component', + formatFrom.all(name).toKebab() + '.component', ); } @@ -52,9 +52,12 @@ export class PackageHandler { * * @param {string} name - Name of the system */ - createSystem(name: string): NewSystemPackage { + createSystem(name: string): SystemPackage { this._createPackage(PackageTypeEnum.SYSTEM, name); - return this._getNewSystemPackage(toCamelCase(name) + 'System', toKebabCase(name) + '.system'); + return this._getNewSystemPackage( + formatFrom.all(name).toCamel() + 'System', + formatFrom.all(name).toKebab() + '.system', + ); } /** @@ -81,7 +84,17 @@ export class PackageHandler { return this._getPackageManifest(PackageTypeEnum.SYSTEM, path); } - private _getNewComponentPackage(name: string, fileName: string): NewComponentPackage { + async getComponents(): Promise { + // @todo implement it + return Promise.reject('Not implemented yet'); + } + + async getSystems(): Promise { + // @todo implement it + return Promise.reject('Not implemented yet'); + } + + private _getNewComponentPackage(name: string, fileName: string): ComponentPackage { const path = `./components/${fileName}`; const manifest = this._findPackageManifest(this.getComponentManifest, path); @@ -96,7 +109,7 @@ export class PackageHandler { }; } - private _getNewSystemPackage(name: string, fileName: string): NewSystemPackage { + private _getNewSystemPackage(name: string, fileName: string): SystemPackage { const path = `./systems/${fileName}`; return { manifest: this._findPackageManifest(this.getSystemManifest, path), diff --git a/src/lib/server/project/package/package.type.ts b/src/lib/server/project/package/package.type.ts index ce231b2..6858487 100644 --- a/src/lib/server/project/package/package.type.ts +++ b/src/lib/server/project/package/package.type.ts @@ -7,12 +7,12 @@ export enum PackageTypeEnum { SYSTEM = 'system', } -export interface NewComponentPackage { +export interface ComponentPackage { manifest: EditorComponentManifest; save: SaveComponent; } -export interface NewSystemPackage { +export interface SystemPackage { manifest: EditorSystemManifest; save: SaveSystem; } diff --git a/src/lib/server/project/project-handler.ts b/src/lib/server/project/project-handler.ts index f5af6fd..dc3cdd2 100644 --- a/src/lib/server/project/project-handler.ts +++ b/src/lib/server/project/project-handler.ts @@ -9,6 +9,7 @@ import type { Part } from '@utils/types'; import { type Context, type Handler } from '@utils-server/request-handler'; +import { LibraryHandler } from './library/library-handler'; import { Loader } from './loader'; import { PackageHandler } from './package/package-handler'; import { SaveHandler } from './save/save-handler'; @@ -24,6 +25,7 @@ export class ProjectHandler { private _loader: Loader | undefined; private _save: SaveHandler | undefined; private _package: PackageHandler | undefined; + private _library: LibraryHandler | undefined; constructor(handler: Handler, context: Context, part: Part) { if (!context.project) throw new Exception('Bad Request', 'Project missing in context', 400); @@ -60,4 +62,9 @@ export class ProjectHandler { if (!this._package) this._package = new PackageHandler(this); return this._package; } + + get library(): LibraryHandler { + if (!this._library) this._library = new LibraryHandler(this); + return this._library; + } } diff --git a/src/lib/utils/format.ts b/src/lib/utils/format.ts index de3e61e..5d45c6e 100644 --- a/src/lib/utils/format.ts +++ b/src/lib/utils/format.ts @@ -1,3 +1,27 @@ +class WordList { + words: string[]; + + constructor(words: string[]) { + this.words = words; + } + + toKebab() { + return this.words.join('-'); + } + + toPascal() { + return this.words.map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(''); + } + + toCamel() { + return this.words + .map((word, i) => + i === 0 ? word.toLowerCase() : word.charAt(0).toUpperCase() + word.slice(1), + ) + .join(''); + } +} + const toWords = (str: string): string[] => { return str .replace(/([a-z])([A-Z])/g, '$1 $2') @@ -8,26 +32,23 @@ const toWords = (str: string): string[] => { .filter(Boolean); }; -export const toKebabCase = (str: string): string => { - return toWords(str) - .map((word) => word.toLowerCase()) - .join('-'); -}; +const fromKebab = (str: string): WordList => new WordList(str.split('-')); -export const toPascalCase = (str: string): string => { - return toWords(str) - .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) - .join(''); -}; +const fromPascal = (str: string): WordList => + new WordList(str.split(/(?=[A-Z])/).map((word) => word.toLowerCase())); -export const toCamelCase = (str: string): string => { - const words = toWords(str); - return words - .map((word, i) => - i === 0 ? word.toLowerCase() : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(), - ) - .join(''); -}; +const fromCamel = (str: string): WordList => + new WordList(str.split(/(?=[A-Z])/).map((word) => word.toLowerCase())); + +const fromSnake = (str: string): WordList => new WordList(str.split('_')); -export const camelToKebab = (str: string) => - str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`); +const fromAll = (str: string): WordList => + new WordList(toWords(str).map((word) => word.toLowerCase())); + +export const formatFrom = { + kebab: fromKebab, + pascal: fromPascal, + camel: fromCamel, + snake: fromSnake, + all: fromAll, +}; diff --git a/src/lib/utils/types/save.type.ts b/src/lib/utils/types/save.type.ts index efadb04..1f79a46 100644 --- a/src/lib/utils/types/save.type.ts +++ b/src/lib/utils/types/save.type.ts @@ -27,6 +27,7 @@ export interface SaveSystem { export interface SaveEntity { id: string; + treePath: string; components: Record>; } diff --git a/src/routes/actions/project/library/+page.server.ts b/src/routes/actions/project/library/+page.server.ts new file mode 100644 index 0000000..a9ca426 --- /dev/null +++ b/src/routes/actions/project/library/+page.server.ts @@ -0,0 +1,5 @@ +import { installLibraryProjectAction } from '$lib/server/actions/project/library/install-library.action'; + +export const actions = { + install: installLibraryProjectAction, +}; diff --git a/src/routes/actions/project/package/+page.server.ts b/src/routes/actions/project/package/+page.server.ts index c3e244e..2650b05 100644 --- a/src/routes/actions/project/package/+page.server.ts +++ b/src/routes/actions/project/package/+page.server.ts @@ -3,7 +3,9 @@ import { addSystemsProjectAction } from '$lib/server/actions/project/package/add import { createComponentProjectAction } from '$lib/server/actions/project/package/create-component.action'; import { createSystemProjectAction } from '$lib/server/actions/project/package/create-system.action'; import { getComponentsManifestsAction } from '$lib/server/actions/project/package/get-components-manifests.action'; +import { getComponentsAction } from '$lib/server/actions/project/package/get-components.action'; import { getSystemsManifestsAction } from '$lib/server/actions/project/package/get-systems-manifests.action'; +import { getSystemsAction } from '$lib/server/actions/project/package/get-systems.action'; export const actions = { 'add-components': addComponentsProjectAction, @@ -12,4 +14,6 @@ export const actions = { 'create-system': createSystemProjectAction, 'get-components-manifests': getComponentsManifestsAction, 'get-systems-manifests': getSystemsManifestsAction, + 'get-components': getComponentsAction, + 'get-systems': getSystemsAction, }; From 537e667e78b26daf36cae8a05c4b7cca98515658 Mon Sep 17 00:00:00 2001 From: Exelo Date: Thu, 28 May 2026 12:39:51 +0900 Subject: [PATCH 03/24] feat: add shadcn context menu --- .../context-menu-checkbox-item.svelte | 41 +++++++++++++++ .../context-menu/context-menu-content.svelte | 28 ++++++++++ .../context-menu-group-heading.svelte | 21 ++++++++ .../ui/context-menu/context-menu-group.svelte | 7 +++ .../ui/context-menu/context-menu-item.svelte | 27 ++++++++++ .../ui/context-menu/context-menu-label.svelte | 27 ++++++++++ .../context-menu/context-menu-portal.svelte | 7 +++ .../context-menu-radio-group.svelte | 16 ++++++ .../context-menu-radio-item.svelte | 35 +++++++++++++ .../context-menu-separator.svelte | 17 ++++++ .../context-menu/context-menu-shortcut.svelte | 23 ++++++++ .../context-menu-sub-content.svelte | 20 +++++++ .../context-menu-sub-trigger.svelte | 29 +++++++++++ .../ui/context-menu/context-menu-sub.svelte | 7 +++ .../context-menu/context-menu-trigger.svelte | 17 ++++++ .../ui/context-menu/context-menu.svelte | 7 +++ src/lib/components/ui/context-menu/index.ts | 52 +++++++++++++++++++ 17 files changed, 381 insertions(+) create mode 100644 src/lib/components/ui/context-menu/context-menu-checkbox-item.svelte create mode 100644 src/lib/components/ui/context-menu/context-menu-content.svelte create mode 100644 src/lib/components/ui/context-menu/context-menu-group-heading.svelte create mode 100644 src/lib/components/ui/context-menu/context-menu-group.svelte create mode 100644 src/lib/components/ui/context-menu/context-menu-item.svelte create mode 100644 src/lib/components/ui/context-menu/context-menu-label.svelte create mode 100644 src/lib/components/ui/context-menu/context-menu-portal.svelte create mode 100644 src/lib/components/ui/context-menu/context-menu-radio-group.svelte create mode 100644 src/lib/components/ui/context-menu/context-menu-radio-item.svelte create mode 100644 src/lib/components/ui/context-menu/context-menu-separator.svelte create mode 100644 src/lib/components/ui/context-menu/context-menu-shortcut.svelte create mode 100644 src/lib/components/ui/context-menu/context-menu-sub-content.svelte create mode 100644 src/lib/components/ui/context-menu/context-menu-sub-trigger.svelte create mode 100644 src/lib/components/ui/context-menu/context-menu-sub.svelte create mode 100644 src/lib/components/ui/context-menu/context-menu-trigger.svelte create mode 100644 src/lib/components/ui/context-menu/context-menu.svelte create mode 100644 src/lib/components/ui/context-menu/index.ts diff --git a/src/lib/components/ui/context-menu/context-menu-checkbox-item.svelte b/src/lib/components/ui/context-menu/context-menu-checkbox-item.svelte new file mode 100644 index 0000000..4b36704 --- /dev/null +++ b/src/lib/components/ui/context-menu/context-menu-checkbox-item.svelte @@ -0,0 +1,41 @@ + + + + {#snippet children({ checked })} + + {#if checked} + + {/if} + + {@render childrenProp?.()} + {/snippet} + diff --git a/src/lib/components/ui/context-menu/context-menu-content.svelte b/src/lib/components/ui/context-menu/context-menu-content.svelte new file mode 100644 index 0000000..b924d91 --- /dev/null +++ b/src/lib/components/ui/context-menu/context-menu-content.svelte @@ -0,0 +1,28 @@ + + + + + diff --git a/src/lib/components/ui/context-menu/context-menu-group-heading.svelte b/src/lib/components/ui/context-menu/context-menu-group-heading.svelte new file mode 100644 index 0000000..446e838 --- /dev/null +++ b/src/lib/components/ui/context-menu/context-menu-group-heading.svelte @@ -0,0 +1,21 @@ + + + diff --git a/src/lib/components/ui/context-menu/context-menu-group.svelte b/src/lib/components/ui/context-menu/context-menu-group.svelte new file mode 100644 index 0000000..19f694b --- /dev/null +++ b/src/lib/components/ui/context-menu/context-menu-group.svelte @@ -0,0 +1,7 @@ + + + diff --git a/src/lib/components/ui/context-menu/context-menu-item.svelte b/src/lib/components/ui/context-menu/context-menu-item.svelte new file mode 100644 index 0000000..a59c9e5 --- /dev/null +++ b/src/lib/components/ui/context-menu/context-menu-item.svelte @@ -0,0 +1,27 @@ + + + diff --git a/src/lib/components/ui/context-menu/context-menu-label.svelte b/src/lib/components/ui/context-menu/context-menu-label.svelte new file mode 100644 index 0000000..f08196c --- /dev/null +++ b/src/lib/components/ui/context-menu/context-menu-label.svelte @@ -0,0 +1,27 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/context-menu/context-menu-portal.svelte b/src/lib/components/ui/context-menu/context-menu-portal.svelte new file mode 100644 index 0000000..2897cc0 --- /dev/null +++ b/src/lib/components/ui/context-menu/context-menu-portal.svelte @@ -0,0 +1,7 @@ + + + diff --git a/src/lib/components/ui/context-menu/context-menu-radio-group.svelte b/src/lib/components/ui/context-menu/context-menu-radio-group.svelte new file mode 100644 index 0000000..b1abdf3 --- /dev/null +++ b/src/lib/components/ui/context-menu/context-menu-radio-group.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/context-menu/context-menu-radio-item.svelte b/src/lib/components/ui/context-menu/context-menu-radio-item.svelte new file mode 100644 index 0000000..9354465 --- /dev/null +++ b/src/lib/components/ui/context-menu/context-menu-radio-item.svelte @@ -0,0 +1,35 @@ + + + + {#snippet children({ checked })} + + {#if checked} + + {/if} + + {@render childrenProp?.({ checked })} + {/snippet} + diff --git a/src/lib/components/ui/context-menu/context-menu-separator.svelte b/src/lib/components/ui/context-menu/context-menu-separator.svelte new file mode 100644 index 0000000..9dcf853 --- /dev/null +++ b/src/lib/components/ui/context-menu/context-menu-separator.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/lib/components/ui/context-menu/context-menu-shortcut.svelte b/src/lib/components/ui/context-menu/context-menu-shortcut.svelte new file mode 100644 index 0000000..5e13d6c --- /dev/null +++ b/src/lib/components/ui/context-menu/context-menu-shortcut.svelte @@ -0,0 +1,23 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/context-menu/context-menu-sub-content.svelte b/src/lib/components/ui/context-menu/context-menu-sub-content.svelte new file mode 100644 index 0000000..bc441dd --- /dev/null +++ b/src/lib/components/ui/context-menu/context-menu-sub-content.svelte @@ -0,0 +1,20 @@ + + + diff --git a/src/lib/components/ui/context-menu/context-menu-sub-trigger.svelte b/src/lib/components/ui/context-menu/context-menu-sub-trigger.svelte new file mode 100644 index 0000000..d309e4c --- /dev/null +++ b/src/lib/components/ui/context-menu/context-menu-sub-trigger.svelte @@ -0,0 +1,29 @@ + + + + {@render children?.()} + + diff --git a/src/lib/components/ui/context-menu/context-menu-sub.svelte b/src/lib/components/ui/context-menu/context-menu-sub.svelte new file mode 100644 index 0000000..0ba70c9 --- /dev/null +++ b/src/lib/components/ui/context-menu/context-menu-sub.svelte @@ -0,0 +1,7 @@ + + + diff --git a/src/lib/components/ui/context-menu/context-menu-trigger.svelte b/src/lib/components/ui/context-menu/context-menu-trigger.svelte new file mode 100644 index 0000000..3831cca --- /dev/null +++ b/src/lib/components/ui/context-menu/context-menu-trigger.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/lib/components/ui/context-menu/context-menu.svelte b/src/lib/components/ui/context-menu/context-menu.svelte new file mode 100644 index 0000000..4b6908e --- /dev/null +++ b/src/lib/components/ui/context-menu/context-menu.svelte @@ -0,0 +1,7 @@ + + + diff --git a/src/lib/components/ui/context-menu/index.ts b/src/lib/components/ui/context-menu/index.ts new file mode 100644 index 0000000..4177ab6 --- /dev/null +++ b/src/lib/components/ui/context-menu/index.ts @@ -0,0 +1,52 @@ +import CheckboxItem from './context-menu-checkbox-item.svelte'; +import Content from './context-menu-content.svelte'; +import GroupHeading from './context-menu-group-heading.svelte'; +import Group from './context-menu-group.svelte'; +import Item from './context-menu-item.svelte'; +import Label from './context-menu-label.svelte'; +import Portal from './context-menu-portal.svelte'; +import RadioGroup from './context-menu-radio-group.svelte'; +import RadioItem from './context-menu-radio-item.svelte'; +import Separator from './context-menu-separator.svelte'; +import Shortcut from './context-menu-shortcut.svelte'; +import SubContent from './context-menu-sub-content.svelte'; +import SubTrigger from './context-menu-sub-trigger.svelte'; +import Sub from './context-menu-sub.svelte'; +import Trigger from './context-menu-trigger.svelte'; +import Root from './context-menu.svelte'; + +export { + Root, + Sub, + Portal, + Item, + GroupHeading, + Label, + Group, + Trigger, + Content, + Shortcut, + Separator, + RadioItem, + SubContent, + SubTrigger, + RadioGroup, + CheckboxItem, + // + Root as ContextMenu, + Sub as ContextMenuSub, + Portal as ContextMenuPortal, + Item as ContextMenuItem, + GroupHeading as ContextMenuGroupHeading, + Group as ContextMenuGroup, + Content as ContextMenuContent, + Trigger as ContextMenuTrigger, + Shortcut as ContextMenuShortcut, + RadioItem as ContextMenuRadioItem, + Separator as ContextMenuSeparator, + RadioGroup as ContextMenuRadioGroup, + SubContent as ContextMenuSubContent, + SubTrigger as ContextMenuSubTrigger, + CheckboxItem as ContextMenuCheckboxItem, + Label as ContextMenuLabel, +}; From bf6c658439548beda44c3e85d44cb60cc271c90a Mon Sep 17 00:00:00 2001 From: Exelo Date: Thu, 28 May 2026 12:46:16 +0900 Subject: [PATCH 04/24] feat: add shadcn tabs --- src/lib/components/ui/tabs/index.ts | 18 +++++++++ .../components/ui/tabs/tabs-content.svelte | 17 ++++++++ src/lib/components/ui/tabs/tabs-list.svelte | 40 +++++++++++++++++++ .../components/ui/tabs/tabs-trigger.svelte | 23 +++++++++++ src/lib/components/ui/tabs/tabs.svelte | 19 +++++++++ 5 files changed, 117 insertions(+) create mode 100644 src/lib/components/ui/tabs/index.ts create mode 100644 src/lib/components/ui/tabs/tabs-content.svelte create mode 100644 src/lib/components/ui/tabs/tabs-list.svelte create mode 100644 src/lib/components/ui/tabs/tabs-trigger.svelte create mode 100644 src/lib/components/ui/tabs/tabs.svelte diff --git a/src/lib/components/ui/tabs/index.ts b/src/lib/components/ui/tabs/index.ts new file mode 100644 index 0000000..d0de3b1 --- /dev/null +++ b/src/lib/components/ui/tabs/index.ts @@ -0,0 +1,18 @@ +import Content from './tabs-content.svelte'; +import List, { type TabsListVariant, tabsListVariants } from './tabs-list.svelte'; +import Trigger from './tabs-trigger.svelte'; +import Root from './tabs.svelte'; + +export { + Root, + Content, + List, + Trigger, + tabsListVariants, + type TabsListVariant, + // + Root as Tabs, + Content as TabsContent, + List as TabsList, + Trigger as TabsTrigger, +}; diff --git a/src/lib/components/ui/tabs/tabs-content.svelte b/src/lib/components/ui/tabs/tabs-content.svelte new file mode 100644 index 0000000..091c3e4 --- /dev/null +++ b/src/lib/components/ui/tabs/tabs-content.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/lib/components/ui/tabs/tabs-list.svelte b/src/lib/components/ui/tabs/tabs-list.svelte new file mode 100644 index 0000000..89f5a27 --- /dev/null +++ b/src/lib/components/ui/tabs/tabs-list.svelte @@ -0,0 +1,40 @@ + + + + + diff --git a/src/lib/components/ui/tabs/tabs-trigger.svelte b/src/lib/components/ui/tabs/tabs-trigger.svelte new file mode 100644 index 0000000..0f4d47b --- /dev/null +++ b/src/lib/components/ui/tabs/tabs-trigger.svelte @@ -0,0 +1,23 @@ + + + diff --git a/src/lib/components/ui/tabs/tabs.svelte b/src/lib/components/ui/tabs/tabs.svelte new file mode 100644 index 0000000..6ed5951 --- /dev/null +++ b/src/lib/components/ui/tabs/tabs.svelte @@ -0,0 +1,19 @@ + + + From e73f407d0e7c92e358be430b9fa6627bc4c3f96e Mon Sep 17 00:00:00 2001 From: Exelo Date: Thu, 28 May 2026 12:47:13 +0900 Subject: [PATCH 05/24] feat: add shadcn kbd --- src/lib/components/ui/kbd/index.ts | 10 ++++++++++ src/lib/components/ui/kbd/kbd-group.svelte | 20 +++++++++++++++++++ src/lib/components/ui/kbd/kbd.svelte | 23 ++++++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 src/lib/components/ui/kbd/index.ts create mode 100644 src/lib/components/ui/kbd/kbd-group.svelte create mode 100644 src/lib/components/ui/kbd/kbd.svelte diff --git a/src/lib/components/ui/kbd/index.ts b/src/lib/components/ui/kbd/index.ts new file mode 100644 index 0000000..185d5ff --- /dev/null +++ b/src/lib/components/ui/kbd/index.ts @@ -0,0 +1,10 @@ +import Group from './kbd-group.svelte'; +import Root from './kbd.svelte'; + +export { + Root, + Group, + // + Root as Kbd, + Group as KbdGroup, +}; diff --git a/src/lib/components/ui/kbd/kbd-group.svelte b/src/lib/components/ui/kbd/kbd-group.svelte new file mode 100644 index 0000000..d84d187 --- /dev/null +++ b/src/lib/components/ui/kbd/kbd-group.svelte @@ -0,0 +1,20 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/kbd/kbd.svelte b/src/lib/components/ui/kbd/kbd.svelte new file mode 100644 index 0000000..4911b45 --- /dev/null +++ b/src/lib/components/ui/kbd/kbd.svelte @@ -0,0 +1,23 @@ + + + + {@render children?.()} + From 973b121d99535d7c130ae82495ea4e1e30a80662 Mon Sep 17 00:00:00 2001 From: Exelo Date: Thu, 28 May 2026 12:49:30 +0900 Subject: [PATCH 06/24] feat: add shadcn badge --- src/lib/components/ui/badge/badge.svelte | 50 ++++++++++++++++++++++++ src/lib/components/ui/badge/index.ts | 2 + 2 files changed, 52 insertions(+) create mode 100644 src/lib/components/ui/badge/badge.svelte create mode 100644 src/lib/components/ui/badge/index.ts diff --git a/src/lib/components/ui/badge/badge.svelte b/src/lib/components/ui/badge/badge.svelte new file mode 100644 index 0000000..16be78a --- /dev/null +++ b/src/lib/components/ui/badge/badge.svelte @@ -0,0 +1,50 @@ + + + + + + {@render children?.()} + diff --git a/src/lib/components/ui/badge/index.ts b/src/lib/components/ui/badge/index.ts new file mode 100644 index 0000000..f05fb87 --- /dev/null +++ b/src/lib/components/ui/badge/index.ts @@ -0,0 +1,2 @@ +export { default as Badge } from './badge.svelte'; +export { badgeVariants, type BadgeVariant } from './badge.svelte'; From 8cfceb9e3de456e223a33d856987a6193f3a1e80 Mon Sep 17 00:00:00 2001 From: Exelo Date: Thu, 28 May 2026 18:32:19 +0900 Subject: [PATCH 07/24] feat: add shadcn dropdown menu --- .../dropdown-menu-checkbox-group.svelte | 16 ++++++ .../dropdown-menu-checkbox-item.svelte | 44 +++++++++++++++ .../dropdown-menu-content.svelte | 31 +++++++++++ .../dropdown-menu-group-heading.svelte | 22 ++++++++ .../dropdown-menu/dropdown-menu-group.svelte | 7 +++ .../dropdown-menu/dropdown-menu-item.svelte | 27 ++++++++++ .../dropdown-menu/dropdown-menu-label.svelte | 27 ++++++++++ .../dropdown-menu/dropdown-menu-portal.svelte | 7 +++ .../dropdown-menu-radio-group.svelte | 16 ++++++ .../dropdown-menu-radio-item.svelte | 34 ++++++++++++ .../dropdown-menu-separator.svelte | 17 ++++++ .../dropdown-menu-shortcut.svelte | 23 ++++++++ .../dropdown-menu-sub-content.svelte | 20 +++++++ .../dropdown-menu-sub-trigger.svelte | 29 ++++++++++ .../ui/dropdown-menu/dropdown-menu-sub.svelte | 7 +++ .../dropdown-menu-trigger.svelte | 7 +++ .../ui/dropdown-menu/dropdown-menu.svelte | 7 +++ src/lib/components/ui/dropdown-menu/index.ts | 54 +++++++++++++++++++ 18 files changed, 395 insertions(+) create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-group.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-portal.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-sub.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu-trigger.svelte create mode 100644 src/lib/components/ui/dropdown-menu/dropdown-menu.svelte create mode 100644 src/lib/components/ui/dropdown-menu/index.ts diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte new file mode 100644 index 0000000..6b4d728 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte new file mode 100644 index 0000000..4f59a7d --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte @@ -0,0 +1,44 @@ + + + + {#snippet children({ checked, indeterminate })} + + {#if indeterminate} + + {:else if checked} + + {/if} + + {@render childrenProp?.()} + {/snippet} + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte new file mode 100644 index 0000000..4e9143f --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte @@ -0,0 +1,31 @@ + + + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte new file mode 100644 index 0000000..321802b --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte @@ -0,0 +1,22 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-group.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-group.svelte new file mode 100644 index 0000000..bf972af --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-group.svelte @@ -0,0 +1,7 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte new file mode 100644 index 0000000..38a5269 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte @@ -0,0 +1,27 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte new file mode 100644 index 0000000..9066564 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte @@ -0,0 +1,27 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-portal.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-portal.svelte new file mode 100644 index 0000000..130c20f --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-portal.svelte @@ -0,0 +1,7 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte new file mode 100644 index 0000000..7452366 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte new file mode 100644 index 0000000..b37cfd3 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte @@ -0,0 +1,34 @@ + + + + {#snippet children({ checked })} + + {#if checked} + + {/if} + + {@render childrenProp?.({ checked })} + {/snippet} + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte new file mode 100644 index 0000000..343ae2c --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte new file mode 100644 index 0000000..02254af --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte @@ -0,0 +1,23 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte new file mode 100644 index 0000000..05fe6a2 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte @@ -0,0 +1,20 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte new file mode 100644 index 0000000..4f3e045 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte @@ -0,0 +1,29 @@ + + + + {@render children?.()} + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-sub.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub.svelte new file mode 100644 index 0000000..02f5f63 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub.svelte @@ -0,0 +1,7 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-trigger.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-trigger.svelte new file mode 100644 index 0000000..7409c77 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-trigger.svelte @@ -0,0 +1,7 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu.svelte new file mode 100644 index 0000000..5c2776c --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu.svelte @@ -0,0 +1,7 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/index.ts b/src/lib/components/ui/dropdown-menu/index.ts new file mode 100644 index 0000000..6ec2de8 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/index.ts @@ -0,0 +1,54 @@ +import CheckboxGroup from './dropdown-menu-checkbox-group.svelte'; +import CheckboxItem from './dropdown-menu-checkbox-item.svelte'; +import Content from './dropdown-menu-content.svelte'; +import GroupHeading from './dropdown-menu-group-heading.svelte'; +import Group from './dropdown-menu-group.svelte'; +import Item from './dropdown-menu-item.svelte'; +import Label from './dropdown-menu-label.svelte'; +import Portal from './dropdown-menu-portal.svelte'; +import RadioGroup from './dropdown-menu-radio-group.svelte'; +import RadioItem from './dropdown-menu-radio-item.svelte'; +import Separator from './dropdown-menu-separator.svelte'; +import Shortcut from './dropdown-menu-shortcut.svelte'; +import SubContent from './dropdown-menu-sub-content.svelte'; +import SubTrigger from './dropdown-menu-sub-trigger.svelte'; +import Sub from './dropdown-menu-sub.svelte'; +import Trigger from './dropdown-menu-trigger.svelte'; +import Root from './dropdown-menu.svelte'; + +export { + CheckboxGroup, + CheckboxItem, + Content, + Portal, + Root as DropdownMenu, + CheckboxGroup as DropdownMenuCheckboxGroup, + CheckboxItem as DropdownMenuCheckboxItem, + Content as DropdownMenuContent, + Portal as DropdownMenuPortal, + Group as DropdownMenuGroup, + Item as DropdownMenuItem, + Label as DropdownMenuLabel, + RadioGroup as DropdownMenuRadioGroup, + RadioItem as DropdownMenuRadioItem, + Separator as DropdownMenuSeparator, + Shortcut as DropdownMenuShortcut, + Sub as DropdownMenuSub, + SubContent as DropdownMenuSubContent, + SubTrigger as DropdownMenuSubTrigger, + Trigger as DropdownMenuTrigger, + GroupHeading as DropdownMenuGroupHeading, + Group, + GroupHeading, + Item, + Label, + RadioGroup, + RadioItem, + Root, + Separator, + Shortcut, + Sub, + SubContent, + SubTrigger, + Trigger, +}; From 4946d17981e39c3e96eae6d5cc267d7be6a5c1e6 Mon Sep 17 00:00:00 2001 From: Exelo Date: Fri, 29 May 2026 12:15:50 +0900 Subject: [PATCH 08/24] feat: add shadcn text area --- src/lib/components/ui/textarea/index.ts | 7 ++++++ .../components/ui/textarea/textarea.svelte | 23 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 src/lib/components/ui/textarea/index.ts create mode 100644 src/lib/components/ui/textarea/textarea.svelte diff --git a/src/lib/components/ui/textarea/index.ts b/src/lib/components/ui/textarea/index.ts new file mode 100644 index 0000000..a1bd626 --- /dev/null +++ b/src/lib/components/ui/textarea/index.ts @@ -0,0 +1,7 @@ +import Root from './textarea.svelte'; + +export { + Root, + // + Root as Textarea, +}; diff --git a/src/lib/components/ui/textarea/textarea.svelte b/src/lib/components/ui/textarea/textarea.svelte new file mode 100644 index 0000000..cb58edf --- /dev/null +++ b/src/lib/components/ui/textarea/textarea.svelte @@ -0,0 +1,23 @@ + + + From 55bc475df5146e88cc13c9789ad51fe578f72c17 Mon Sep 17 00:00:00 2001 From: Exelo Date: Fri, 29 May 2026 12:16:09 +0900 Subject: [PATCH 09/24] feat: add shadcn input group --- src/lib/components/ui/input-group/index.ts | 22 ++++++++ .../ui/input-group/input-group-addon.svelte | 53 +++++++++++++++++++ .../ui/input-group/input-group-button.svelte | 49 +++++++++++++++++ .../ui/input-group/input-group-input.svelte | 23 ++++++++ .../ui/input-group/input-group-text.svelte | 22 ++++++++ .../input-group/input-group-textarea.svelte | 23 ++++++++ .../ui/input-group/input-group.svelte | 24 +++++++++ 7 files changed, 216 insertions(+) create mode 100644 src/lib/components/ui/input-group/index.ts create mode 100644 src/lib/components/ui/input-group/input-group-addon.svelte create mode 100644 src/lib/components/ui/input-group/input-group-button.svelte create mode 100644 src/lib/components/ui/input-group/input-group-input.svelte create mode 100644 src/lib/components/ui/input-group/input-group-text.svelte create mode 100644 src/lib/components/ui/input-group/input-group-textarea.svelte create mode 100644 src/lib/components/ui/input-group/input-group.svelte diff --git a/src/lib/components/ui/input-group/index.ts b/src/lib/components/ui/input-group/index.ts new file mode 100644 index 0000000..00f6d4f --- /dev/null +++ b/src/lib/components/ui/input-group/index.ts @@ -0,0 +1,22 @@ +import Addon from './input-group-addon.svelte'; +import Button from './input-group-button.svelte'; +import Input from './input-group-input.svelte'; +import Text from './input-group-text.svelte'; +import Textarea from './input-group-textarea.svelte'; +import Root from './input-group.svelte'; + +export { + Root, + Addon, + Button, + Input, + Text, + Textarea, + // + Root as InputGroup, + Addon as InputGroupAddon, + Button as InputGroupButton, + Input as InputGroupInput, + Text as InputGroupText, + Textarea as InputGroupTextarea, +}; diff --git a/src/lib/components/ui/input-group/input-group-addon.svelte b/src/lib/components/ui/input-group/input-group-addon.svelte new file mode 100644 index 0000000..5a27b20 --- /dev/null +++ b/src/lib/components/ui/input-group/input-group-addon.svelte @@ -0,0 +1,53 @@ + + + + +
{ + if ((e.target as HTMLElement).closest('button')) { + return; + } + e.currentTarget.parentElement?.querySelector('input')?.focus(); + }} + {...restProps} +> + {@render children?.()} +
diff --git a/src/lib/components/ui/input-group/input-group-button.svelte b/src/lib/components/ui/input-group/input-group-button.svelte new file mode 100644 index 0000000..e52202d --- /dev/null +++ b/src/lib/components/ui/input-group/input-group-button.svelte @@ -0,0 +1,49 @@ + + + + + diff --git a/src/lib/components/ui/input-group/input-group-input.svelte b/src/lib/components/ui/input-group/input-group-input.svelte new file mode 100644 index 0000000..d8adc72 --- /dev/null +++ b/src/lib/components/ui/input-group/input-group-input.svelte @@ -0,0 +1,23 @@ + + + diff --git a/src/lib/components/ui/input-group/input-group-text.svelte b/src/lib/components/ui/input-group/input-group-text.svelte new file mode 100644 index 0000000..af33024 --- /dev/null +++ b/src/lib/components/ui/input-group/input-group-text.svelte @@ -0,0 +1,22 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/input-group/input-group-textarea.svelte b/src/lib/components/ui/input-group/input-group-textarea.svelte new file mode 100644 index 0000000..f01d918 --- /dev/null +++ b/src/lib/components/ui/input-group/input-group-textarea.svelte @@ -0,0 +1,23 @@ + + +